Git Daemon サービス化ガイド
Gitワークフロー (制限環境) で紹介した「方法4: Git Daemon + SSHトンネル」を、より恒久的かつ運用しやすくするための設定ガイドです。 ゲストOSの /srv/git にベアリポジトリを配置し、systemd を使ってGit Daemonをバックグラウンドサービスとして常駐させます。
1. サーバー側の準備 (Guest OS)
ゲストOS(Debian)内で作業を行います。
1-1. リポジトリ用ディレクトリの作成
Linuxの標準的な慣習に従い、サーバー用途のデータを /srv 配下に配置します。
# ディレクトリ作成
sudo mkdir -p /srv/git/inception.git
# ベアリポジトリ(作業ツリーを持たない管理用リポジトリ)として初期化
cd /srv/git/inception.git
sudo git init --bare --shared
# メインブランチを作るための空コミット(初回のみ手動でやる場合)
# ※ クライアントからPushする場合は不要ですが、権限設定をしておきます
# サーバー側のデフォルトブランチを 'main' に設定(重要)
sudo git symbolic-ref HEAD refs/heads/main1-2. 権限の設定
Git Daemon (読み取り/書き込み) がアクセスできるよう、所有権を設定します。 ここでは簡易的に nobody ユーザー、または利便性をとって debian ユーザーで実行する場合を想定しますが、権限トラブルを避けるために 「全ユーザー書き込み許可」 または 「debianユーザー所有」 にするのが開発環境では最もスムーズです。
# debianユーザーに所有させる(SSHアクセスとの相性良し)
sudo chown -R debian:debian /srv/git/inception.git1-3. Systemd サービスファイルの作成
Git Daemonをサービスとして登録します。
ファイル: /etc/systemd/system/git-daemon.service (sudo vim /etc/systemd/system/git-daemon.service で作成)
[Unit]
Description=Start Git Daemon
After=network.target
[Service]
# セキュリティのため 127.0.0.1 (localhost) のみでリッスンさせる
# これにより、SSHトンネル経由のアクセス以外(外部からの直接アクセス)を遮断する
ExecStart=/usr/bin/git daemon --reuseaddr --base-path=/srv/git --export-all --enable=receive-pack --verbose --listen=127.0.0.1 /srv/git
# 実行ユーザー (debianにしておくとファイルの読み書きでトラブルが起きにくい)
User=debian
Group=debian
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target1-4. サービスの起動と有効化
# 設定の再読み込み
sudo systemctl daemon-reload
# 起動
sudo systemctl start git-daemon
# 自動起動の有効化
sudo systemctl enable git-daemon
# ステータス確認 (Active: active (running) になっていること)
sudo systemctl status git-daemon2. ホスト側の準備 (Host OS)
ホストOS(手元のPC/Mac)から、このGit Daemonに安全に接続するための設定です。 すでに Gitワークフロー でSSH設定を行っている場合は確認のみでOKです。
SSH Config の確認 (~/.ssh/config)
以下の LocalForward 設定が入っていることを確認してください。
Host debian
# ... (HostName等)
Port 4242
# ホストの 9418 を ゲストの 9418 に転送
LocalForward 9418 127.0.0.1:9418これで、ホストOSで git://localhost/... にアクセスすると、SSHトンネルを通ってゲストOSの 127.0.0.1:9418 (Git Daemon) に繋がるようになります。
3. 運用フロー
A. ホストOSからの Push (アップロード)
手元のエディタで書いたコードを、ゲストOSの管理リポジトリに送ります。
# 初回のみ:リモートリポジトリとして追加
git remote add guest git://localhost/inception.git
# コードを編集、コミット後...
git push guest mainこれで、ゲストOSの /srv/git/inception.git が更新されます。
B. ゲストOSでの Pull (デプロイ/動作確認)
ゲストOS内で、コードを作業ディレクトリ (~/Docker Infrastructure) に展開します。 ゲストOS内であれば、ネットワーク経由ではなく ファイルパス で直接クローン/プルするのが高速です。
# 初回構築時
cd ~
git clone /srv/git/inception.git Docker Infrastructure
# 更新時 (ホストでPushした後)
cd ~/Docker Infrastructure
git pull origin main