Docker上のForgejo:プライベートGitサーバーを軽量にセルフホストする方法

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

インフラを自分の手に取り戻す

サイドプロジェクトのすべてを巨大テック企業のプラットフォームに依存させるのは、問題が起きるまでは便利に感じられるものです。利用規約の変更やサービスの中断は起こり得ますし、最終的には自分のワークフローを本当の意味で所有していないことに気づくでしょう。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は技術的な項目のほとんどを自動的に入力してくれます。

「必ず修正すべき」最初のステップ

インストールをただ進めるのではなく、今のうちにいくつかの微調整を行っておくことで、後々のトラブルシューティングの時間を節約できます:

  1. SSHポート: UIでSSHサーバーポートを 2222 に変更します。これにより、クローンURLがDockerの設定と一致するようになります。
  2. ルートURL: 実際のドメインまたはローカルIP(例: http://git.home.arpa:3000)を使用します。ここをlocalhostのままにすると、他のコンピュータからのクローンリンクが機能しません。
  3. 管理者ユーザー: ここでプライマリアカウントを設定します。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サーバーの速度と、ローカルストレージがもたらす安心感は、一度体験すると手放せなくなるはずです。

Share: