インフラを自分の手に取り戻す
サイドプロジェクトのすべてを巨大テック企業のプラットフォームに依存させるのは、問題が起きるまでは便利に感じられるものです。利用規約の変更やサービスの中断は起こり得ますし、最終的には自分のワークフローを本当の意味で所有していないことに気づくでしょう。HomeLabを運用しているなら、自分のハードウェア上で動作し、アイドル状態で4GBものRAMを消費しないようなGitサーバーが欲しくなるはずです。GitHubやGitLabは素晴らしいですが、多くのセルフホスト環境にとってはオーバースペックです。
私が限界を感じたのは、GitLabインスタンスがVPSを圧迫し始めたときでした。GitHubのような操作感でありながら、ネイティブバイナリのような効率で動作するツールが必要だったのです。そこで輝くのがForgejoです。これは2022年末に、プロジェクトが真にオープンソースであり続けることを確実にするために作成されたGiteaのコミュニティ主導のフォークです。私のテストでは、Forgejoは数十のリポジトリを処理しながらRAM消費量は500MB未満であり、控えめなスペックのハードウェアには最適です。
なぜGiteaやGitLabではなくForgejoなのか?
なぜGiteaではなくForgejoを選ぶのか疑問に思うかもしれません。Giteaが商業モデルに移行した後、コミュニティは企業の利益よりもユーザーを優先するためにForgejoを立ち上げました。Giteaとの100%の互換性を維持しつつ、「フリーソフトウェア」としての使命に焦点を当て続けています。
Compared to GitLab… GitLabと比較すると、Forgejoは軽量級のチャンピオンです。GitLabは強力ですが膨大なCPUとメモリを必要とするのに対し、Forgejoは問題追跡(Issue tracking)、プルリクエスト、Wiki、基本的なCI/CD(Actions)といった必須機能を、ごくわずかなコストで提供します。Raspberry Pi 4や、月額5ドルの基本的なクラウドインスタンスでも完璧に動作します。
環境の準備
ターミナルを操作する前に、DockerとDocker Composeが準備されていることを確認してください。今回はデフォルトのSQLiteではなくPostgreSQLを使用します。個人利用であればSQLiteでも十分ですが、リポジトリ数が増えるにつれてPostgreSQLの方が同時接続をより適切に処理できます。また、バックアップ戦略もよりプロフェッショナルなものになります。
設定とデータをまとめて管理するために、構造化されたディレクトリを作成することから始めます:
mkdir -p ~/homelab/forgejo
cd ~/homelab/forgejo
mkdir data db
Docker Composeの設定
ForgejoアプリケーションとPostgreSQL 15データベースの2つのサービスを定義します。この分離は標準的なDevOpsの慣行です。データが管理された環境に置かれるため、アップデートや移行が大幅に安全になります。
docker-compose.yml ファイルを作成します:
services:
server:
image: code.forgejo.org/forgejo/forgejo:latest
container_name: forgejo
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
- FORGEJO__database__DB_TYPE=postgres
- FORGEJO__database__HOST=db:5432
- FORGEJO__database__NAME=forgejo
- FORGEJO__database__USER=forgejo
- FORGEJO__database__PASSWD=your_secure_password
networks:
- forgejo
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:22"
depends_on:
- db
db:
image: postgres:15-alpine
restart: always
environment:
- POSTGRES_USER=forgejo
- POSTGRES_PASSWORD=your_secure_password
- POSTGRES_DB=forgejo
networks:
- forgejo
volumes:
- ./db:/var/lib/postgresql/data
networks:
forgejo:
external: false
重要な設定の注意点
- USER_UID/GID: Forgejoが
./dataフォルダに書き込む際の権限エラーを防ぐため、これらをLinuxユーザー(通常は1000)に合わせて設定します。 - SSHマッピング: ポート
2222をコンテナのポート22にマッピングします。これにより、ホストマシンのメインのSSHサービスとの衝突を防ぎます。 - データベース:
alpineイメージのバリアントを使用することで、ディスク使用量を300MB未満に抑えられます。
サーバーの起動
コマンド一つでサーバーを起動できます。これを実行し、コンテナが初期化されるのを待ちます:
docker compose up -d
コマンドが終了したら、ログを確認してデータベース接続が正常であることを確認します:
docker compose logs -f
ブラウザで http://[your-server-ip]:3000 にアクセスしてください。セットアップ画面が表示されます。環境変数でデータベースの資格情報を定義したため、Forgejoは技術的な項目のほとんどを自動的に入力してくれます。
「必ず修正すべき」最初のステップ
インストールをただ進めるのではなく、今のうちにいくつかの微調整を行っておくことで、後々のトラブルシューティングの時間を節約できます:
- SSHポート: UIでSSHサーバーポートを
2222に変更します。これにより、クローンURLがDockerの設定と一致するようになります。 - ルートURL: 実際のドメインまたはローカルIP(例:
http://git.home.arpa:3000)を使用します。ここをlocalhostのままにすると、他のコンピュータからのクローンリンクが機能しません。 - 管理者ユーザー: ここでプライマリアカウントを設定します。Forgejoでは、最初に作成されたユーザーに完全な管理者権限が付与されます。
高速なコミットのためのSSH設定
HTTPS経由でのコードプッシュはすぐに煩わしくなります。SSHの方が高速で安全です。Forgejoがポート 2222 で待機しているため、ローカルのGitクライアントに接続方法を教える必要があります。~/.ssh/config ファイルを更新してください:
Host forgejo
HostName 192.168.1.100
User git
Port 2222
IdentityFile ~/.ssh/id_rsa
この設定により、git clone forgejo:username/project.git でクローンできるようになります。パスワード入力の手間が省け、GitHubと同じようなワークフローになります。
バックアップとメンテナンス
Dockerボリュームを使用しているため、サーバーのバックアップは簡単です。コンテナを停止して forgejo ディレクトリを圧縮するだけです。毎晩cronジョブを実行して、これらのフォルダを外付けドライブやNASにrsyncすることをお勧めします。
アップデートも同様に簡単です。新しいイメージをプルしてコンテナを再起動するだけです:
docker compose pull
docker compose up -d
Forgejoはデータベースのマイグレーションを自動的に管理します。私は3つのメジャーバージョンアップを行いましたが、データベースのエラーは一度もありませんでした。驚くほど安定しています。
最後に
独自のForgejoサーバーを構築することは、HomeLabプロジェクトの中で最も実用的なものの一つです。コードを完全にコントロールでき、慣れ親しんだコラボレーションインターフェースを手に入れ、ハードウェアを尊重するシステムを運用できます。プライベートなスクリプトを保存する場合でも、複雑な開発プロジェクトを保存する場合でも、自分のGitサーバーを持つことはデジタル主権において大きな勝利です。
ぜひ一週間試してみてください。ローカルGitサーバーの速度と、ローカルストレージがもたらす安心感は、一度体験すると手放せなくなるはずです。

