目次

Gitサーバーの構築 - Gitデーモン/Smart HTTP

Git 2.24

y2sunlight 2020-06-02

Git に戻る

本章では、社内用のGitサーバーの構築について説明します。Gitをグループで利用するには、共有リポジトリが必要になります。この時、リモートのGitサーバーとクライアントとの間で使用されるプロトコルは、一般に、Git(ポート番号:9418)、SSH(21)とSmart HTTP(80)/HTTPS(443)が利用できます。これらのプロトコルを使ったGitの運用方法は以下のようになります。

また、Git管理用のツールを利用した運用もあります。

本章では、GitプロトコルとSmart HTTPプロトコルによるのGitサーバー構築について説明します。認証の必要のないLAN環境下では、Gitプロトコルは簡単に設置できます。認証を必要とする場合は、Smart HTTPプロトコルを選んで下さい。また、Smart HTTPを使用したとしても、リポジトリ毎にユーザ権限を設定することができません。これを可能にするには、上記のGit管理用のツールに頼るしかありません。筆者としては、GitoliteをSmart HTTP上で作動させるのが良い方法だと思いますが、それはまたの機会に。ご興味のある方は、Arch Linu のサイトやstackoverflowにその方法が紹介されていますので、そちらをご参照下さい。

サーバー環境

関連記事

リンク

Pro Git 2'nd Edition は、Englishの方が内容が新しい(2020-06-03現在:こちらを推奨)

最終的には、Git Referenceが一番役に立ちます


Gitの設定

Git2のインストール

git2.24 を IUSリポジトリからインストールします。以下にその抜粋を示しますが、詳しくは 本編の IUSによるgit2の導入 をご覧ください。

yum remove git                                        # git1.xの削除
yum install https://repo.ius.io/ius-release-el7.rpm   # IUSリポジトリの登録
yum install --enablerepo=ius git224                   # git2.24のインストール


Gitの初期設定

Gitサーバー内でも、テスト等などでリポジトリを取得することがあるので、Gitユーザとしての初期設定が必要になります。

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

ここで設定した内容は ~/.gitconfig に書き込まれます。git config –list で設定内容が確認できます。


リポジトリの作成

リポジトリを保存するルートのディレクトリ /var/git/ を作成します。

mkdir /var/git/    # ディレクトリを作成し
cd /var/git/       # そこに移動する

テスト用の共有リポジトリ sandbox.git を作成します。成功すると、Initialized empty shared Git repository in … のメッセージが表示されます。

# 共有リポジトリ sandbox.git を作成します
git init --bare --shared ./sandbox.git
Initialized empty shared Git repository in /var/git/sandbox.git/

# 作成したリポジトリを確認します
ls -l
合計 0
drwxrwsr-x 7 root root 111  6月  3 13:20 sandbox.git

ディレクトリの所有者とグループを apache にします。

chown -R apache:apache ./sandbox.git


Gitプロトコルによる運用

Gitプロトコルは、Gitデーモン(git-daemon)によって提供され、以下のサービスを提供します。

Gitデーモンのデフォルト動作では、upload-pack サービスのみが有効なので、クライアントが利用できるコマンドは git fetchgit pullgit clone に限られます(即ち、読み取り専用)。この動作は、以下のコマンドで変更する事ができます。LAN内の認証の必要のない場合は、receive-pack を有効にして git push を有効にすることができます。

# これらのコマンドは、リポジトリディレクトリ(例:/var/git/sandbox.git)の中で実行する必要があります
git config daemon.receivepack true   # receivepack を有効にする。

本章では、基本的にSmartHTTPによる運用を想定しているので、Gitプロトコルではデフォルト動作通りの「読み取り専用」とします。


Gitデーモンのインストール

git-daemon を IUSリポジトリからインストールします。本章ではgit2.24を使用しているので、パッケージ名は、git224-daemon です。Gitのインストールについての詳細は本編の IUSによるgit2の導入 をご覧ください。

yum install --enablerepo=ius git224-daemon

インストールの途中で、インストールしても良いか確認される (Is this ok [y/d/N]:) ので y と回答します。正常にインストールされると最後に、完了のメッセージが表示されます。

git-daemon は ポート番号 9418 を使用するので FWを設定する必要があります。

firewall-cmd --add-port=9418/tcp --permanent   # 恒久的に9418を解放します
firewall-cmd --reload                          # FWのリロード
firewall-cmd --list-ports                      # 解放したポード番号の確認
9418/tcp

尚、Gitプロトコルにはユーザ認証が無いので、使用できるネットワークを制限する場合は、上記の設定を以下のようにします。

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9418" accept' --permanent
firewall-cmd --reload            # FWのリロード
firewall-cmd --list-rich-rules   # 設定の確認


Gitデーモンの起動

Gitデーモンの起動は以下のように行います。

sudo -u apache -g apache git daemon --reuseaddr --export-all --base-path=/var/git/ /var/git/ &
Gitプロトコルだけの運用の場合は、gitユーザを新しく作り、リポジトリの所有者をgitにして、git-daemonもgitで実行して下さい。
# 起動の確認
netstat -an | grep 9418
tcp     0    0 0.0.0.0:9418    0.0.0.0:*    LISTEN
tcp6    0    0 :::9418         :::*         LISTEN


Gitプロトコルによる接続

Gitプロトコルによる接続URLは以下の通りです:

git://{ホスト名}/{プロジェクト名}.git
上の接続URLは本章の設定による場合です。接続URLは設定により異なります。

例:

git clone git://localhost/sandboz.git
git clone git://192.168.1.100/sandboz.git


接続テスト

git clone でGitプロトコルのテストを行います。LAN上の他のホストからも同様に行ってみて下さい。

cd ~                                    # ホームに移動
git clone git://localhost/sandbox.git   # リポジトリの取得
Cloning into 'sandbox'...
warning: You appear to have cloned an empty repository.

テストが終了したら、Gitデーモンを停止します。

pgrep -fa git   # 停止の確認
pkill git       # Gitデーモンの停止


サービス

Gitデーモンのサービスを作って、systemctl で操作できるようにします。
以下のように、/etc/systemd/system 下に git-daemon.serviceファイルを作成します。

/etc/systemd/system

git-daemon.service
[Unit]
Description=Start Git Daemon
 
[Service]
ExecStart=/usr/bin/git daemon --reuseaddr --export-all --base-path=/var/git/ /var/git/
 
Restart=always
RestartSec=500ms
 
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=git-daemon
 
User=apache
Group=apache
 
[Install]
WantedBy=multi-user.target

Gitデーモンの起動/状態確認/停止は、以下のsystemctlコマンドできます。

systemctl start git-daemon    # 起動
systemctl status git-daemon   # 状態確認
systemctl stop git-daemon     # 停止

また、OSブート時に起動するように、自動起動を有効にしておきます。

systemctl enable git-daemon                     # 自動起動の有効化
systemctl list-units --type=service|grep git    # 有効化の確認


Smart HTTPプロトコルによる運用

本章では、基本的にSmartHTTPによる運用を想定しています。認証の基本方針は以下の通りです。


リポジトリの設定

SmartHTTP プロトコルは、Git HTTPバックエンド(git-http-backend)によって提供され、以下のサービスを提供します。

【注意】
上の http.receivepack の説明は GitReference によるが、筆者の環境ではBasic認証されている場合でも http.receivepack が有効にならなかった。

HTTPバックエンドのデフォルト動作では、信頼のある特定の内部ネットワークからも git push が出来ないので、以下のコマンドでこれを有効にします。

# これらのコマンドは、リポジトリディレクトリ(例:/var/git/sandbox.git)の中で実行する必要があります
git config http.receivepack true   # receivepack を有効にする。


Apache2.4のインストール

本章の前提条件として CentOS7上で、Apache 2.4 がインストールされているものとします。まだインストールしていない場合は、以下を参考にインストールして下さい。

yum install httpd                             # Apacheのインストール
systemctl enable httpd.service                # httpdサービスの自動起動を有効化
systemctl start httpd.service                 # httpdサービスの開始
firewall-cmd --permanent --add-service=http   # FWでhttpサービスの接続を許可
firewall-cmd --reload                         # FWのリロード


Apacheの設定

Gitサーバー用のバックエンド /usr/libexec/git-core/git-http-backend は、gitに同梱されています。

ls -l /usr/libexec/git-core/git-http-backend
-rwxr-xr-x 1 root root 1785896  4月 16 06:55 /usr/libexec/git-core/git-http-backend

このバックエンドを起動するために、Apacheに設定ファイル git.conf を新規に作成します。

/etc/httpd/conf.d

git.conf
# 環境設定
SetEnv GIT_PROJECT_ROOT /var/git
SetEnv GIT_HTTP_EXPORT_ALL
 
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
 
<LocationMatch "^/git">
 
    <RequireAny>
        <RequireAny>
            # LAN内の特定のホストのみ許可
            Require all denied
            Require host localhost
            Require ip 127.0.0.1
            Require ip 192.168.1.0/24
        </RequireAny>
 
        # Basic認証
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /var/git/.htpasswd
        Require valid-user
    </RequireAny>
 
    # 全開
    # Require all granted
 
</LocationMatch>

編集が終わったら、Apacheを再起動します。

systemctl restart httpd


.htpasswd

Basic認証で使用するIDとパスワードを格納したファイル .htpasswd を作成します。

/var/git/.htpasswd

.htpasswdhtpasswd コマンドで作成します。

cd /var/git                           # 所定のディレクトリ(git.confで指定)に移動
htpasswd -c .htpasswd y2sunlight      # ユーザ(y2sunlight)の作成
New password:                         # パスワードの入力
Re-type new password:                 # (再入力)
Adding password for user y2sunlight
2回目以降は htpasswd .htpasswd new-user-cオプションは不要です。

.htpasswd の内容は以下のようになっています。

/var/git

.htpasswd
y2sunlight:$apr1$hRCALosz$4qIvpmM4NHzMCEdVH3NAM0


Smart HTTPプロトコルによる接続

Smart HTTPプロトコルによる接続URLは以下の通りです:

http://{ホスト名}/git/{プロジェクト名}.git
上の接続URLは本章の設定による場合です。接続URLは設定により異なります。

例:

git clone http://localhost/git/sandbox.git
git clone http//192.168.1.100/git/sandbox.git


接続テスト

git clone でリポジトリのクローンを作成します。

cd ~                                         # ホームに移動
git clone http://localhost/git/sandbox.git   # リポジトリの取得
Cloning into 'sandbox'...
warning: You appear to have cloned an empty repository.

ローカルリポジトリを変更して commit します。

cd ./sandbox                    # プロジェクトディレクトリ(sandbox)に移動する
echo "Hello,Git." > hello.txt   # ファイル(hello.txt)を編集する
git add .                       # ファイルをインデックスに追加する
git commit -m "First Commit"    # インデックスに追加した変更をリポジトリに記録する

ローカルリポジトリの変更内容をリモートリポジトリに push します。

git push origin master   # ローカルリポジトリの変更内容をリモートリポジトリに送信する


Gitサーバーの運用

Gitサーバーの運用の運用についてのユースケースをまとめておきます。

新しいプロジェクトを作る

cd /var/git                                 # 共有リポジトリのルートディレクトリに移動する
git init --bare --shared ./REPOSITORY.git   # 新しい共有リポジトリ(例:REPOSITORY)を作成する
chown -R apache:apache ./REPOSITORY.git     # ディレクトリの所有者とグループを apache に変更する

cd ./REPOSITORY.git                         # リポジトリのディレクトリに移動する
git config http.receivepack true            # receivepack(git push) を有効にする

新しいユーザを作る

cd /var/git               # 共有リポジトリのルートディレクトリに移動する
htpasswd .htpasswd USER   # 新しいユーザ(例:USER)を作成する
New password:             # パスワードの入力
Re-type new password:     # (再入力)

Gitを使う

git clone http://192.168.1.100/git/REPOSITORY.git  # Smart HTTPによる接続(Read/Write)
git clone git://192.168.1.100/REPOSITORY.git       # Gitプロトコルによる接続(Read Only)

共有リポジトリを削除する

cd /var/git                 # 共有リポジトリのルートディレクトリに移動する
rm -rf ./REPOSITORY.git     # リポジトリのディレクトリを削除する