この記事は
# 身の回りの困りごとを楽しく解決! by Works Human Intelligence Advent Calendar 2025 シリーズ7 21日目の記事です。
はじめに
皆さん、自前のサーバや、VPSって持ってますか?
わたしはVPSを契約しています。
が、ズボラな性格も災いしてその有効な活用法を見いだせずに毎月料金を垂れ流していました。
今にして思えばクラウドでも良かった(というかクラウド前世の昨今はクラウドのほうが良かったまである)のですが、当時ビビリだったこともあり(すぐに無料枠使い切ってめちゃ請求きたらどうしよう)と不安になり、月額定額制で動かせるVPSを契約して(法に触れない範囲で)好き勝手いじることができるのが良いだろう、とはじめました。
個人的にGitのホスティングサーバとして取り扱うのがよさそう、という結論に落ち着きました。
他にも良い使い道があればぜひコメントで教えていただきたいです。
きっかけ
そもそもなぜそんな状態になっていたかといいますと、私が新卒で業界に入った際に(あまりにもLinuxサーバについて疎すぎる…!)と危機感を覚え気軽にLinuxサーバをいじりたいなと思ったのがきっかけでした。
最初期と迷走期
はじめの頃は
- Linuxサーバの基本的な内容
- セキュリティ
- ネットワーク
- コマンド類
- 簡単なWebアプリ構築
- ミドルウェア、サーバーのインストール
- その他備忘録置き場
などと学習用途としてつかっていたのですが、慣れとともにだんだんやりたいことがなくなっていき、また私生活で時間を捻出するのが難しくなったこともあり徐々にその役目を果たせなくなり…。ソレデモLinuxゼンゼンワカラナイ
一時は瞑想してゲーム仲間とのマイクラマルチプレイサーバーと化していた時期もありましたが、それも長くは続かず、やがてデータだけ移行しクリーンインストール後最低限の設定だけした後は何もしない時期が数年単位で続きました…。おお!勇者よ! VPSを休ませておくとはもったいない!
そんななか、個人でGitで開発したいなと思っているアプリケーションがありまして、
そのコードのホスティングどうしようかな?と思ったときにもちろんGitHub、GitLabも候補に上がったのですが、ふと気がついたのです。
「あのVPSでGitホスティングできればいいんじゃね?」と。
Forgejoとは
概要
Forgejo is a self-hosted lightweight software forge.
Easy to install and low maintenance, it just does the job.
Forgejo – Beyond coding. We forge.
Forgejo セルフホスト型の軽量ソフトウェアフォージです。
インストールが簡単でメンテナンスも少なく、必要な機能だけを提供します。
(そういえばフォージってどういう意味なんだろうと思ったら鍛冶場とかそういう場所を指す語なんですね…)
要はGitHubやGitLabが備えている機能を自前のサーバで利用できるソフトウェアです。
特にUIはGitHub寄りになっているので、慣れ親しんだ方は特に迷わずお使いいただけるのではないでしょうか?
見たほうが早いと思うので以下はデモ用に Docusaurus の初回コミット(+数コミット)をした状態のリポジトリのキャプチャです。
Gitea との違い
同様のソフトウェアとして Gitea というのもあります。
Giteaからフォークされた経緯や主な違いは こちら に記載されています。
Geminiくんにまとめてもらった内容としては下記のとおりです。
1. 開発の透明性と自由度
- Forgejo: 完全に「自由ソフトウェア(Free Software)」として開発されています。ローカライズにはWeblate、CI/CDには独自のForgejo Actionsを使用するなど、ツールチェーンもオープンなものを徹底しています。
- Gitea: 営利企業が管理しており、一部の機能(SaaS向けのスタックなど)が非公開の「オープンコア」モデルを採用しています。また、開発にはGitHubのインフラ(GitHub Actions等)が使われています。
2. セキュリティと安定性
- セキュリティ: Forgejoは脆弱性の早期修正と、暗号化チャンネルを通じた事前通知を重視しています。一方、Giteaは事前通知を顧客限定にしたり、セキュリティ修正よりも新機能や監査を優先したりすることがあると指摘されています。
- 安定性: Forgejoはエンドツーエンド(E2E)テストやアップグレードテストを導入し、品質向上に注力しています。Giteaはこれらの包括的なテストが不足していると主張されています。
3. ガバナンス(運営方針)
- Forgejo: 非営利団体「Codeberg e.V.」の傘下にあり、公共の利益を最優先としています。
- Gitea: 営利企業が商標やドメインを所有しており、公共の利益よりも利益の最大化が優先される構造にあるとしています。
4. フェデレーション(連合機能)への注力
- Forgejo: 異なるサーバー間を接続する「Forge Federation(連合機能)」の実装を積極的に進めており、毎月の進捗報告を行っています。
- Gitea: 2024年12月時点のForgejo側の認識では、Gitea側に連合機能に関する動きは見られないとしています。
歴史的背景(FAQより)
- Forgejoは2022年10月にGiteaから分岐(フォーク)しました。当初はGiteaと互換性の高い「ソフトフォーク」でしたが、2024年初頭からはコードベースが大きく異なる「ハードフォーク」へ移行しています。
- Giteaからの移行は可能ですが、現在はForgejo独自の機能や修正が進んでいるため、独自の進化を遂げた別のソフトウェアとなっています。
というわけで、私のようなケチ臭い人間にとってはForgejoのほうが合っていそうです。
インストール
インストールの手順としては
- バイナリから
- Dockerを利用
- サードパーティパッケージを利用
の3通りがあるようです。
私は手癖でバイナリからインストールにしましたが、 後述のForgejo Action のことを考えるとDockerを利用するほうがベターかも知れません。
その後は
- Webコンソール画面からDBなどの初期設定
- 管理者ユーザーの登録
といった手順を踏むことで利用することが可能になります。
(セットアップしたのが随分前なのでキャプチャがありません。ご容赦ください)
その他細かい設定など
公式の チートシート を下に設定すると良いと思います。
以下に私の設定を書いておきます。
私の設定
APP_NAME = Home画面に出てくるタイトル
RUN_USER = ********
WORK_PATH = /var/lib/forgejo
RUN_MODE = prod
[database]
DB_TYPE = mysql
HOST = 127.0.0.1:3306
NAME = ********
USER = ********
PASSWD = ********
SCHEMA =
SSL_MODE = disable
PATH = /var/lib/forgejo/data/********.db
LOG_SQL = false
SLOW_QUERY_THRESHOLD = 3
[repository]
ROOT = /var/lib/forgejo/data/forgejo-repositories
FORCE_PRIVATE: true
DEFAULT_PRIVATE: private
DEFAULT_BRANCH: master
[repository.upload]
;; max size for files to the repo via web interface, in MB,
;; defaults to 3 (this sets a limit of about 4GB)
FILE_MAX_SIZE = 4095
;; by default 5 files can be uploaded at once, increase to 20
MAX_FILES = 20
[server]
SSH_DOMAIN = ****.*********.**
DOMAIN = ****.********.**
HTTP_PORT = 3000
ROOT_URL = https://****.********.**/
APP_DATA_PATH = /var/lib/forgejo/data
DISABLE_SSH = false
SSH_PORT = 6601
LFS_START_SERVER = true
LFS_JWT_SECRET = ************************
LFS_HTTP_AUTH_EXPIRY = 180m
OFFLINE_MODE = true
;; Git Operation timeout in seconds
;; increase the timeouts, so importing big repos (and presumably
;; pushing large files?) hopefully won't fail anymore
[git.timeout]
DEFAULT = 360 ; Git operations default timeout seconds
MIGRATE = 600 ; Migrate external repositories timeout seconds
MIRROR = 300 ; Mirror external repositories timeout seconds
CLONE = 300 ; Git clone from internal repositories timeout seconds
PULL = 300 ; Git pull from internal repositories timeout seconds
GC = 60 ; Git repository GC timeout seconds
[lfs]
PATH = /var/lib/forgejo/data/lfs
[cache]
HOST = {"size":100, "recent_ratio":0.25, "ghost_ratio":0.5}
[ui]
ONLY_SHOW_RELEVANT_REPOS = true
[mailer]
ENABLED = false
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION = true
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
ENABLE_CAPTCHA = false
REQUIRE_SIGNIN_VIEW = true
DEFAULT_KEEP_EMAIL_PRIVATE = true
DEFAULT_ALLOW_CREATE_ORGANIZATION = false
DEFAULT_ENABLE_TIMETRACKING = true
NO_REPLY_ADDRESS =
[openid]
ENABLE_OPENID_SIGNIN = false
ENABLE_OPENID_SIGNUP = false
[cron.update_checker]
ENABLED = true
[session]
PROVIDER = file
[log]
MODE = console
LEVEL = info
ROOT_PATH = /var/lib/forgejo/log
[repository.pull-request]
DEFAULT_MERGE_STYLE = merge
[repository.signing]
DEFAULT_TRUST_MODEL = committer
[security]
INSTALL_LOCK = true
INTERNAL_TOKEN = ********.********.********
PASSWORD_HASH_ALGO = pbkdf2_hi
GLOBAL_TWO_FACTOR_REQUIREMENT: admin
[oauth2]
JWT_SECRET = ********************************
[other]
SHOW_FOOTER_POWERED_BY = false
Forgejo Action
ここが最大の特徴かもしれません。
ForgejoにはForgejo Actionという名前のCI/CDツールが標準で付属しています。
(GitHub Action互換、とのことですが私あんまりGitHub Action使ったことなくて、どこまで互換性があるのかわかっていません)
動作フローなどの詳細は 公式 に記載があります。
Forgejo Runner
Forgejo Actionを利用するためには別途Forgejo Runnerのインストールが必要になります。
こちらもインストールはバイナリまたはDockerを利用する方法がありますが、例によって私はバイナリでインストールしました。
インストール手順は 公式 に記載があります。
なお、Forgejo Runnerはその性質上Gitサーバと同じサーバでなくとも動作するみたいですが、私のVPSは暇してるので同一サーバにしています。
Forgejo Action の使い方
1. リポジトリの設定からランナー設定用の登録トークンを確認
- リポジトリの設定>Actions>ランナー からランナーの管理画面を開きます。
- 右上の「新しいランナーを作成」をクリックし表示されるトークンをコピーします。(後の手順で必要になります)
2. ランナーを設定します。
設定ファイルは
$ forgejo-runner generate-config > config.yml
とすることで雛形が出力されるため、こちらをカスタマイズし
$ forgejo-runner register -c config.yml
とすることで登録処理に進みます。
設定ファイルについてはこちらの記事を参考にさせていただきました。ありがとうございます。
Raspberry Pi OS で構築する CI/CD(Forgejo Runner) - Linux 使いになりたい人向け
また、設定ファイルの詳細については 公式 をご参照ください。
3. ランナーに登録するActionを指定します。
先の forgejo-runner register を実行すると実行元のActionについて色々聞かれます。
字下げしている箇所が実際に入力した箇所です。
INFO Registering runner, arch=amd64, os=linux, version=v12.2.0.
INFO Enter the Forgejo instance URL (for example, https://next.forgejo.org/):
http://localhost:3000(GitのURL 同一サーバの場合通常3000ポート)
INFO Enter the runner token:
(先程コピーしたトークン)
INFO Enter the runner name (if set empty, use hostname: blacpans.net):
demo(ランナーの名称。任意)
INFO Registering runner, name=demo, instance=http://localhost:3000, labels=[self-hosted:host, docker:docker://ubuntu:26.04, node-lts:docker://node:lts-bookworm].
DEBU Successfully pinged the Forgejo instance server
INFO Runner registered successfully.
なお、ここではインタラクティブに設定しましたが --no-interactive を指定することでインラインで完結することもできます。
4. ランナーを起動する
一時的に起動する場合は
$ forgejo-runner daemon
で起動できますが、面倒なのでサービスとして登録後、自動起動を設定するとよいかと思います。
ランナーの設定が完了後先の画面をリロードすると次の画面のように登録したランナーが表示されるはずです。
4. ワークフローファイルを配置します。
配置する箇所は <リポジトリルート>/.forgejo/workflows/ 配下です。
今回は 公式 からデモ用として用意されている内容をリポジトリに追加しました。
on: [push]
jobs:
test:
runs-on: docker
steps:
- run: echo All good!
ここで指定している runs-on: docker の docker の部分は予めランナーの設定で labels として定義されている必要があります。
わたしはそれに気づかずあれ?となったのでご注意を
5. ランナーの動作確認
先の設定ファイルでは実行契機プッシュ時としていましたが、任意のタイミングで再実行することもできます。
リポジトリ>Actionsからプッシュしたコミットを選択すると下記のような画面になります。
画面右上の「すべてのジョブを再実行」をクリックすると任意のタイミングでジョブを再実行できます。
(もしここまでの手順で起動しないなどあればラベルの不一致、デーモンプロセスの起動状況をご確認ください)
設定手順がやや面倒ですが使いこなせるとかなり便利そうだなという印象があります。
おわりに
「働かざるもの食うべからず」ならぬ「働かざるもの金もらうべからず」といった具合に、サボらせてしまっていたVPSくんを活用できる見通しが立ったので、これからちょこちょこ個人開発していきたいなあと思う次第です。
説明を途中かなり端折ってしまったので気になる所があれば可能な範囲で返答しますので、コメントお待ちしています。



