インフラの設定も、履歴に残す
第3回で、入口のVPSと自宅のNASがトンネルでつながりました。ここまでで、設定ファイルがずいぶん増えています。Nginxの設定、WireGuardの設定、アプリケーションの設定。どれも、書き換えたら元に戻せなくなると困るものです。
そこで、Gitも自前で立てます。コードだけでなく、インフラの設定もすべて自分のGitで履歴を残す。これが今回の目的です。
なぜ、外部のサービスではなく自前なのか
GitHubのような外部のサービスは便利です。それでも自前で立てたい理由があります。
自分の仕組みを、自分の設備の中に置く
広告配信システムのように、収益の中心になる仕組みのコードは、自分の設備の中に置いておきたい。外部のサービスの規約や障害に、開発そのものを左右されたくありません。
NASが壊れても、作り直せるようにする
インフラの設定をすべてGitに入れておけば、NASが1台壊れても、別の機械に同じ環境を作り直せます。第5回でNASを増やすときも、第7回で拠点を増やすときも、Gitにある設定を別の機械に持っていくだけで済むようにしておきます。
回線が止まっても開発できる
自宅のLANの中にGitがあれば、インターネットの回線が止まっていても、手元でコードを出し入れできます。
GiteaとForgejo
自前のGitサーバーとしてよく使われるのが、GiteaとForgejoです。Forgejoは、Giteaから分かれてできた、コミュニティ主導のプロジェクトです。どちらも軽く、NASのような小さな機械でも動きます。ブラウザから操作でき、リポジトリの管理、課題の管理、プルリクエストといった、GitHubと似た機能がそろっています。
どちらを選んでも、今回の使い方では大きな差はありません。私は、運営の方針が開かれていることを重視して、Forgejoを候補にしています。
NASにDockerで立てる
NASの上で、Dockerのコンテナとして動かします。データは、NASのフォルダに保存するようにしておきます。コンテナを作り直しても、データは消えません。
services:
forgejo:
image: codeberg.org/forgejo/forgejo:(使うバージョン)
restart: always
volumes:
- ./forgejo:/data
ports:
# トンネル内のアドレスだけで待ち受ける
- "10.8.0.2:3000:3000"
ポートの指定で、待ち受けるアドレスを、第3回のトンネル内のアドレスに限っています。こうすると、Gitの画面にはトンネル越しにしか届きません。家のLANにいる他の機器からも見えなくなります。自宅のLANからも使いたい場合は、使う機器を決めて、そのアドレスからだけ通すようにします。
外からは、第2回、第3回と同じ流れで使います。入口のVPSのNginxで、Git用のサブドメインへのリクエストをトンネルの先へ流すだけです。
立ち上げたら、まず誰でもアカウントを作れる設定を止めます。外から見える場所に置く以上、登録を開けたままにしておくと、知らない誰かが使い始めるおそれがあります。
Gitのデータは、三か所に置く
自前で持つということは、消えたときの責任も自分にあるということです。Gitのデータは、次の三か所に置きます。
- NASの中。NASのスナップショット機能で、日ごとの状態を残す。
- 別の拠点。もう一つの拠点のNASへ、定期的に複製する。
- 暗号化して、外の保存先へ。建物ごと失っても戻せるようにする。
加えて、ふだん作業するパソコンにも、リポジトリの写しが残ります。Gitは、写しを持っている機械がそれぞれ全履歴を持つ仕組みなので、これも一つの保険になります。
落とし穴:インフラが壊れると、その設定も見られない
インフラの設定を、そのインフラの上にあるGitに置く。ここには落とし穴があります。NASが壊れたとき、NASを作り直すための設定が、壊れたNASの中にある、ということが起こります。
だから、作り直しに必要な最低限の手順と設定は、NASの外にも必ず置いておく。手元のパソコンの写しと、別の拠点の複製がその役を担います。
この段階でやること
- NASに、ForgejoかGiteaをDockerで立てる。
- アカウントの自由登録を止める。
- 入口のVPSから、トンネル越しにGitの画面へ流す。
- 既存のコードと、Nginx・WireGuard・Dockerの設定をリポジトリに入れる。鍵やパスワードは入れない。
- スナップショット、別の拠点への複製、暗号化した外部の保存先を設定する。
- NASの外にある写しから、実際に作り直せるかを一度試す。
TODO:実際に立てたときの記録(選んだソフト、移したリポジトリ、つまずいた点)をここに追記する。