GitLabが低スペックVPSにとって「重荷」になるとき
予算が限られた受託プロジェクトを運営していますか? 1 vCPU、1GB RAMといった「非力な」VPSにGitLabを詰め込もうとすれば、間違いなく悲鳴を上げるでしょう。軽量と言われるGiteaでさえ、Webインターフェースやデータベースのためにリソースを消費します。
以前、ある困難な状況に直面しました。クライアントから、古いUbuntuサーバー上での厳格なコードセキュリティを求められたのです。GitHubもBitbucketも使えません。その時の「救世主」がGitoliteでした。これはSSH上で動作するアクセス管理レイヤー(access control layer)です。派手なUIはありません。すべてはコマンドラインとテキストファイルで動作しますが、その分、非常に安定しています。
GitLabが安定稼働に少なくとも2〜4GBのRAMを必要とするのに対し、Gitoliteはアイドル時にメモリをほとんど消費しません。最大の魅力は、ブランチやタグ単位での詳細な権限設定ができることです。gitolite-adminという特別なリポジトリにコードをプッシュするだけで、Gitサーバー全体を管理できます。
サーバーへのGitoliteデプロイ
開始するには、Gitがインストールされた Linuxサーバー(Ubuntu/Debian)と、管理者(Admin)として使用するローカルマシンが必要です。
ステップ1:Gitユーザーの作成
リポジトリを分離するために専用のユーザーを作成します。システムの安全性を確保するため、Gitoliteの実行にrootユーザーは絶対に使用しないでください。
# Gitの更新とインストール
sudo apt update && sudo apt install git -y
# セキュアな'git'ユーザーを作成(パスワードなし)
sudo adduser --system --shell /bin/bash --group git
ステップ2:管理者用SSHキーの設定
ローカルマシンでSSHキーを確認します。まだ持っていない場合は、4096ビットの新しいキーペアを作成してください:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_gitadmin
次に、scpコマンドを使って公開鍵ファイルをサーバーの一時ディレクトリにアップロードします:
scp ~/.ssh/id_rsa_gitadmin.pub user@your-server-ip:/tmp/admin.pub
ステップ3:ソースからのインストール
サーバー上のgitユーザーに切り替えて、セットアップを進めます。最新バージョンを利用するために、ソースからのインストールをお勧めします。
# gitユーザーに切り替え
sudo su - git
# ソースコードをクローンしてインストール
git clone https://github.com/sitaramc/gitolite
mkdir -p ~/bin
./gitolite/install -to ~/bin
# 用意した管理者キーでGitoliteを有効化
~/bin/gitolite setup -pk /tmp/admin.pub
システムは自動的にrepositories/ディレクトリを作成します。その中には、gitolite-admin.git(設定用)とtesting.gitという2つのデフォルトリポジトリが含まれています。
Infrastructure as Code(IaC)スタイルでの管理
Gitoliteでは、新しいリポジトリを作成するたびにサーバーにSSH接続する必要はありません。すべての変更はローカルマシンから行えます。
1. 管理リポジトリのクローン
スムーズに操作するために、ローカルマシンの~/.ssh/configファイルに設定を追加します:
Host git-server
HostName your-server-ip
User git
IdentityFile ~/.ssh/id_rsa_gitadmin
管理リポジトリをローカルに取得します:
git clone git-server:gitolite-admin
cd gitolite-admin
2. チームメンバーの追加
例えば、huy-devをチームに追加する必要があるとします。Huyのid_rsa.pubファイルを入手し、keydir/ディレクトリにhuy-dev.pubという名前で保存します。ファイル名がGitoliteシステム内でのユーザー名になります。
3. 権限設定とリポジトリの作成
conf/gitolite.confファイルを開きます。ここが魔法が起きる場所です:
repo secret-project
RW+ = admin
RW = huy-dev
R = @all
基本的な権限の意味:
RW+:全権限(force pushやブランチの削除を含む)。RW:通常のPush/Pull権限。R:読み取り専用(Read-only)。@all:システム内にキーを持つすべてのユーザーに適用。
修正が終わったら、コミットしてプッシュするだけです:
git add .
git commit -m "huy-devの追加とsecret-projectリポジトリの作成"
git push origin master
即座に、Gitoliteはサーバー上にsecret-project.gitリポジトリを作成します。Huyはすぐに作業を開始できます。
高度な機能:ブランチ保護
実際には、開発者がmasterブランチに直接プッシュすることを防ぎたい場合が多いでしょう。Gitoliteは、正規表現(Regex)を使用してこれを非常にスマートに処理します:
repo secret-project
RW+ master = admin
RW develop = huy-dev
RW feature/.* = huy-dev
この設定により、huy-devはdevelopまたはfeature/ブランチで作業することを強制されます。もしHuyが誤ってmasterにプッシュしようとしても、サーバーは即座に拒否し、エラーメッセージを表示します。
運用のための「鉄則」とヒント
設定の構文を間違えてしまいましたか? 心配いりません。プッシュ時にGitoliteがブロックしてくれます。それでもシステムに問題がある場合は、/home/git/.gitolite/logs/にあるログを確認してください。ログは日付ごとに分かれているため、誰が何をしたかを追跡するのが非常に簡単です。
重要な注意点:サーバー上の.gitoliteディレクトリ内のファイルを直接編集しないでください。常にgitolite-adminリポジトリ経由で行います。もし管理者のSSHキーを紛失した場合は、サーバー上のroot権限を使用してセットアップコマンドを再実行し、新しいキーを読み込ませる必要があります。
GitoliteはWebインターフェースがないため、最初は少し取っつきにくく感じるかもしれません。しかし、慣れてしまえば、低スペックなVPSにとって非常に高速で、セキュアで、驚くほど軽量なソリューションであることに気づくはずです。

