Skip to content

Git Daemon サービス化ガイド

Gitワークフロー (制限環境) で紹介した「方法4: Git Daemon + SSHトンネル」を、より恒久的かつ運用しやすくするための設定ガイドです。 ゲストOSの /srv/git にベアリポジトリを配置し、systemd を使ってGit Daemonをバックグラウンドサービスとして常駐させます。

1. サーバー側の準備 (Guest OS)

ゲストOS(Debian)内で作業を行います。

1-1. リポジトリ用ディレクトリの作成

Linuxの標準的な慣習に従い、サーバー用途のデータを /srv 配下に配置します。

bash
# ディレクトリ作成
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/main

1-2. 権限の設定

Git Daemon (読み取り/書き込み) がアクセスできるよう、所有権を設定します。 ここでは簡易的に nobody ユーザー、または利便性をとって debian ユーザーで実行する場合を想定しますが、権限トラブルを避けるために 「全ユーザー書き込み許可」 または 「debianユーザー所有」 にするのが開発環境では最もスムーズです。

bash
# debianユーザーに所有させる(SSHアクセスとの相性良し)
sudo chown -R debian:debian /srv/git/inception.git

1-3. Systemd サービスファイルの作成

Git Daemonをサービスとして登録します。

ファイル: /etc/systemd/system/git-daemon.servicesudo vim /etc/systemd/system/git-daemon.service で作成)

ini
[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.target

1-4. サービスの起動と有効化

bash
# 設定の再読み込み
sudo systemctl daemon-reload

# 起動
sudo systemctl start git-daemon

# 自動起動の有効化
sudo systemctl enable git-daemon

# ステータス確認 (Active: active (running) になっていること)
sudo systemctl status git-daemon

2. ホスト側の準備 (Host OS)

ホストOS(手元のPC/Mac)から、このGit Daemonに安全に接続するための設定です。 すでに Gitワークフロー でSSH設定を行っている場合は確認のみでOKです。

SSH Config の確認 (~/.ssh/config)

以下の LocalForward 設定が入っていることを確認してください。

bash
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の管理リポジトリに送ります。

bash
# 初回のみ:リモートリポジトリとして追加
git remote add guest git://localhost/inception.git

# コードを編集、コミット後...
git push guest main

これで、ゲストOSの /srv/git/inception.git が更新されます。

B. ゲストOSでの Pull (デプロイ/動作確認)

ゲストOS内で、コードを作業ディレクトリ (~/Docker Infrastructure) に展開します。 ゲストOS内であれば、ネットワーク経由ではなく ファイルパス で直接クローン/プルするのが高速です。

bash
# 初回構築時
cd ~
git clone /srv/git/inception.git Docker Infrastructure

# 更新時 (ホストでPushした後)
cd ~/Docker Infrastructure
git pull origin main

4. 構成図まとめ

Released under the MIT License.