GitLabは重すぎる ― CentOS 8 EOL騒動から学んだこと
当時チームは4人で、4GB RAMのVPS上にGitLabをセルフホストしていました。コードをpushするたびに、CI pipelineが完了するまでサーバーが1分近くもたついていたんです。CentOS 8がEOLになったとき、1週間で5台のサーバーをRocky Linuxへ急いで移行しなければなりませんでした ― そのときに学んだことがあります:その機会にGitLabをGiteaへ入れ替えてしまったんです。旧1GB RAMのVPSでGiteaはスムーズに動き、レスポンスは2秒以下。チーム全員がpush/pullしてもサーバーには余裕があり、Nginxといくつかのcronjobまで追加で動かせました。
チームが20人以下で複雑な組み込みCI/CDが不要なら、GiteaはGitLabよりはるかに実用的な選択肢です。
Giteaとは何か、なぜこんなに軽いのか
GiteaはGo言語で書かれたセルフホスト型のGitホスティングプラットフォームです ― Goはコンパクトなバイナリと高いパフォーマンスで知られる言語です。Gitea全体が単一のバイナリファイルで構成されており、GitLabのようにRubyも、Node.jsも、PostgreSQLも必須ではありません ― 小規模チームにはSQLiteで十分です。
- 実際のRAM使用量:約200〜300MB
- GitLabの最小要件:4GB RAM
- フル機能対応:リポジトリ、issues、pull requests、webhooks、SSHとHTTPS
- 馴染みやすいUIで、GitHubにとてもよく似た見た目
- バックアップが簡単:フォルダ1つと設定ファイル1つをコピーするだけ
実践:CentOS Stream 9にGiteaをステップごとにインストールする
ステップ1:Gitea用のシステムユーザーを作成する
Giteaをrootで実行してはいけません。アクセス権限を制限するために専用ユーザーを作成します:
sudo useradd -r -m -d /home/gitea -s /bin/bash gitea
ステップ2:Giteaのバイナリをダウンロードする
Giteaのダウンロードページにアクセスして最新バージョンを取得してください。この記事執筆時点では1.22.xです:
wget -O /usr/local/bin/gitea https://dl.gitea.com/gitea/1.22.3/gitea-1.22.3-linux-amd64
chmod 755 /usr/local/bin/gitea
# インストールが成功したか確認する
gitea --version
ステップ3:ディレクトリを作成して権限を設定する
sudo mkdir -p /var/lib/gitea/{custom,data,log}
sudo chown -R gitea:gitea /var/lib/gitea/
sudo chmod -R 750 /var/lib/gitea/
sudo mkdir -p /etc/gitea
sudo chown root:gitea /etc/gitea
sudo chmod 770 /etc/gitea
ステップ4:GiteaのためにSELinuxを設定する
多くの人がここをスキップしてsetenforce 0で済ませてしまいますが、それは避けてください。CentOS Stream 9はデフォルトでSELinuxが有効になっており、Giteaが正しく動作するためにいくつかの特定の権限が必要です。正しく設定するのに必要なのはコマンド3つだけですが、SELinuxを無効にするとサーバー全体のセキュリティが失われます:
# GiteaバイナリにSELinuxコンテキストを割り当てる
sudo semanage fcontext -a -t bin_t "/usr/local/bin/gitea"
sudo restorecon -v /usr/local/bin/gitea
# Giteaがポート3000にバインドすることを許可する
sudo semanage port -a -t http_port_t -p tcp 3000
# ポートがすでに存在するというエラーが出た場合は -a の代わりに -m を使う
# sudo semanage port -m -t http_port_t -p tcp 3000
それでもSELinuxにGiteaがブロックされる場合は、AVCログを確認して不足している権限を正確に把握してください:
sudo ausearch -m avc -ts recent | audit2allow -a
ステップ5:firewalldでポートを開放する
# GiteaのWebインターフェース用にポート3000を開放する
sudo firewall-cmd --permanent --add-port=3000/tcp
# SSHでのcloneができるようSSHを開放したままにする
sudo firewall-cmd --permanent --add-service=ssh
# 変更を適用する
sudo firewall-cmd --reload
# 結果を確認する
sudo firewall-cmd --list-all
ステップ6:systemdサービスを作成する
サーバー再起動時にGiteaが自動起動するよう、systemdサービスファイルを作成します:
sudo nano /etc/systemd/system/gitea.service
以下の内容をファイルに貼り付けます:
[Unit]
Description=Gitea (Git with a cup of tea)
After=network.target
[Service]
RestartSec=2s
Type=simple
User=gitea
Group=gitea
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=gitea HOME=/home/gitea GITEA_WORK_DIR=/var/lib/gitea
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable gitea
sudo systemctl start gitea
# 動作状況を確認する
sudo systemctl status gitea
ステップ7:WebインターフェースからGiteaを初期設定する
ブラウザを開き、http://<IP-server>:3000にアクセスしてください。Giteaの初期設定ページ(Installation Wizard)が表示されます。以下の情報を入力します:
- Database Type:小規模チームには
SQLite3を選択 ― 追加インストール不要 - Site Title:Git Serverの名前、例:「Company Git」
- Repository Root Path:デフォルトの
/home/gitea/gitea-repositoriesのまま - Application URL:実際のURLを入力、例:
http://git.company.comまたはhttp://192.168.1.100:3000 - Admin Account:ここで管理者アカウントを作成します。このステップを飛ばさないでください
Install Giteaをクリックすると ― Giteaが自動的に/etc/gitea/app.iniを作成し、すぐに使える状態になります。
ステップ8:Nginxリバースプロキシを追加する(推奨)
ポート3000を外部に公開するよりも、Nginxを使ってポート80/443でプロキシする方が標準的で、後でHTTPSを追加しやすくなります:
sudo dnf install -y nginx
sudo nano /etc/nginx/conf.d/gitea.conf
server {
listen 80;
server_name git.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# SELinux:NginxがローカルホストのGiteaへ接続することを許可する
sudo setsebool -P httpd_can_network_connect 1
sudo systemctl enable --now nginx
# ポート80/443を開放し、直接公開したくない場合は3000を閉じる
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --remove-port=3000/tcp
sudo firewall-cmd --reload
まとめ
Giteaは「GitLabを使うお金がない人の選択」ではありません ― 小規模チームの規模感に本当に合っているから選んでいます。依存関係が少なく、バックアップもリストアも簡単で、VPSのコストを大幅に節約できます。あのCentOS 8からの緊急移行以来、CentOS Stream 9上でGiteaを使い続けていますが、GitLabに戻る理由は今のところ見つかりません。
CentOS Stream 9へのデプロイで最も重要なこと:SELinuxを無効にせず、正しく設定してください。上記のsemanageコマンド3つで十分です ― setenforce 0に触れる必要はありません。SELinuxを無効にすれば5分早くセットアップできますが、システムの最も重要なセキュリティ層を丸ごと失うことになります。
