Gitea(Forgejo)を自宅サーバーに立てる:GitHubの個人リポジトリを手元に置く構成

Photo: luis gomes / Pexels
先に結論です。GitHub の個人リポジトリを手元にも置きたいなら、Forgejo(Gitea から分かれたソフト)を Docker Compose で立て、GitHub のリポジトリを「プルミラー」として登録するのが手軽です。
- データベースは SQLite で十分。ラズパイ5や N100 ミニPC で動かせる
- GitHub はそのまま使い続け、自宅側が既定で 8 時間ごとに自動で追いかける
- 外出先から使うときは Tailscale 経由にして、ルーターのポートは開けない
GitHub をやめる話ではありません。「アカウントに何かあっても、コードは家に残っている」状態を作るのが目的です。
Gitea と Forgejo のどちらを選ぶか
Forgejo は 2022 年に Gitea から分かれたフォークで、2024 年からは独自に開発を進める「ハードフォーク」になったとされています。画面や設定ファイル(app.ini)の作りはよく似ていて、この記事の手順は名前を読み替えればほぼそのまま Gitea にも使えます。
| 項目 | Forgejo | Gitea |
|---|---|---|
| 開発の中心 | 非営利団体 Codeberg e.V. の傘下のプロジェクト | Gitea Ltd. とコミュニティ |
| Docker イメージ | codeberg.org/forgejo/forgejo | docker.gitea.com/gitea |
| 環境変数の接頭辞 | FORGEJO__ | GITEA__ |
| 長期サポート版 | あり(v15 は 2027 年 7 月 15 日まで) | 公式ドキュメントで確認 |
2026 年 10 月時点で Forgejo の最新は v17.0(10 月 15 日公開)ですが、これは約 3 か月でサポートが切れる版です。自宅で放っておく用途なら、私は長期サポート版の v15 を選びます。大きな更新が年 1 回程度で済むからです。
Docker Compose で Forgejo を立てる
動かす機械は、Docker が入った Linux なら何でもかまいません。Gitea のドキュメントでは、小規模なら CPU 2 コア・メモリ 1GB で足りるとされています。新しく用意するなら Raspberry Pi 5 8GB でも足りますし、ほかのコンテナも一緒に動かすなら Beelink Mini S12 Pro のような N100 のミニPC のほうが余裕があります。
作業用のフォルダに compose.yaml を作ります。
services:
forgejo:
image: codeberg.org/forgejo/forgejo:15
container_name: forgejo
environment:
- USER_UID=1000
- USER_GID=1000
- FORGEJO__server__SSH_PORT=222
restart: always
volumes:
- ./forgejo:/data
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"
ポイントは 3 つです。
:15のタグ:v15 系の最新版を追いかけます。勝手に v16 以降へ上がることはありません222:22:ホストの 22 番はサーバー自体の SSH で使っているので、Git 用の SSH は 222 番で受けますSSH_PORT=222:画面に出るクローン用 URL を 222 番に合わせる設定です。これがないと、URL が 22 番のまま表示されます
docker compose up -d で起動し、ブラウザで http://サーバーのIPアドレス:3000 を開くと初期設定の画面が出ます(表記は版によって多少違います)。
- データベースは「SQLite3」を選ぶ。個人や家族で使う規模なら十分です
- ベース URL(ROOT_URL)は、実際にブラウザで開く URL にする。例:
http://192.168.1.10:3000/ - 「サーバーと外部サービスの設定」で、セルフ登録を無効にする
- 「管理者アカウントの設定」で管理者を作ってからインストールする
セルフ登録を無効にしておかないと、画面を開けた人なら誰でもアカウントを作れてしまいます。
GitHub のリポジトリをミラーとして取り込む
非公開のリポジトリを取り込むには、GitHub のアクセストークンが要ります。GitHub の Settings > Developer settings から Fine-grained のトークンを作り、対象のリポジトリを選んで、権限は「Contents」を読み取りにします。公開リポジトリだけなら、トークンは不要です。
Forgejo 側の手順は次のとおりです。
- 右上の「+」から「新しい移行」を選び、「GitHub」を選ぶ
- リポジトリの URL とアクセストークンを入れる
- ミラーにするためのチェック(「このリポジトリはミラーになります」のような項目)を入れて移行する
これで定期的に GitHub から取り込まれます。間隔は既定で 8 時間、最短 10 分とされていて、リポジトリの設定から変えられます。すぐ反映したいときは「今すぐ同期」を押します。
注意点が 3 つあります。
- ミラーにできるのは作るときだけ:普通のリポジトリとして作ったものを、後からミラーには変えられないとされています
- 追いかけるのは Git のデータ:ブランチやタグは同期されますが、イシューやプルリクエストを毎回取り込み直す仕組みではありません。イシューまで手元に移したいなら、ミラーにせず「移行」で一度だけ取り込みます
- トークンには期限がある:期限が切れると同期が止まります。作った日に、期限の少し前をカレンダーに入れておくと安心です
逆に、Forgejo を本拠地にして GitHub へ送る「プッシュミラー」もあります。こちらは GitHub 側を強制的に上書きするとされているので、GitHub で直接コミットする運用とは両立しません。
手元からクローンするときは、Forgejo の設定画面で SSH の公開鍵を登録したうえで git clone ssh://[email protected]:222/ユーザー名/リポジトリ名.git のように 222 番を指定します。
外からの接続とバックアップ・更新
外出先から使うときは、ルーターのポートを開けずに Tailscale でつなぐのが安全です。Tailscale の名前(MagicDNS)で開くなら、初期設定で入れたベース URL もその名前に合わせます。ずれていると、画面の中のリンクやクローン用 URL が LAN 用のままになります。
SQLite の構成なら、リポジトリ・データベース・設定は ./forgejo フォルダにすべて入ります。バックアップは次の流れで足ります。
docker compose stop
# ./forgejo フォルダを NAS や外付けドライブへコピー(restic などでも可)
docker compose start
ミラーしたリポジトリは GitHub が元なので作り直せますが、Forgejo 上で直接作ったリポジトリはこのフォルダにしかありません。自宅の他のデータと同じく、家の外にもう 1 つ置くことをおすすめします。
更新は docker compose pull のあと docker compose up -d です。v15 の中の更新ならこれで済みます。次の長期サポート版(v19)は 2027 年 4 月の予定とされているので、そのときにバックアップを取り、リリースノートを読んでからタグを書き換えます。
まとめ
- Forgejo と Gitea は手順がほぼ同じ。自宅で長く放っておくなら Forgejo の長期サポート版(v15)が楽
- Docker Compose で 3000 番(画面)と 222 番(Git 用 SSH)を出し、データベースは SQLite で十分
- 初期設定でセルフ登録を無効にし、管理者を作ってからインストールする
- GitHub のリポジトリは「新しい移行」でプルミラーにする。同期は既定 8 時間ごとで、トークンの期限に注意
- 外からは Tailscale 経由。バックアップは
./forgejoフォルダを止めてコピーする
運営者が作った Excel テンプレートを BOOTH で配布しています。IT 資産管理台帳(無料 Lite 版あり) / IT 資格の学習管理シート


