Gitolite:1GB RAMのVPSでも軽快に動作する軽量Gitサーバー管理術

Git tutorial - IT technology blog
Git tutorial - IT technology blog

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-devdevelopまたはfeature/ブランチで作業することを強制されます。もしHuyが誤ってmasterにプッシュしようとしても、サーバーは即座に拒否し、エラーメッセージを表示します。

運用のための「鉄則」とヒント

設定の構文を間違えてしまいましたか? 心配いりません。プッシュ時にGitoliteがブロックしてくれます。それでもシステムに問題がある場合は、/home/git/.gitolite/logs/にあるログを確認してください。ログは日付ごとに分かれているため、誰が何をしたかを追跡するのが非常に簡単です。

重要な注意点:サーバー上の.gitoliteディレクトリ内のファイルを直接編集しないでください。常にgitolite-adminリポジトリ経由で行います。もし管理者のSSHキーを紛失した場合は、サーバー上のroot権限を使用してセットアップコマンドを再実行し、新しいキーを読み込ませる必要があります。

GitoliteはWebインターフェースがないため、最初は少し取っつきにくく感じるかもしれません。しかし、慣れてしまえば、低スペックなVPSにとって非常に高速で、セキュアで、驚くほど軽量なソリューションであることに気づくはずです。

Share: