====== Gitサーバーの構築 - Gitデーモン/Smart HTTP ======
Git 2.24
--- //[[http://www.y2sunlight.com|y2sunlight]] 2020-06-02//
[[git:top|Git に戻る]]
本章では、社内用のGitサーバーの構築について説明します。Gitをグループで利用するには、共有リポジトリが必要になります。この時、リモートのGitサーバーとクライアントとの間で使用されるプロトコルは、一般に、Git(ポート番号:9418)、SSH(21)とSmart HTTP(80)/HTTPS(443)が利用できます。これらのプロトコルを使ったGitの運用方法は以下のようになります。
* [[https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Git-%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3|Gitプロトコル]] --- 認証のないLAN内のみだけの運用
* [[https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97|SSHプロトコル]] --- sshを利用した方法で、Linuxのユーザとファイルの権限管理をそのまま利用
* [[https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Smart-HTTP|Smart HTTPプロトコル]] --- Apacheと連携したHTTP(S)による方法で、認証はBasic認証を使用
また、Git管理用のツールを利用した運用もあります。
* [[https://gitolite.com/|Gitolite]] --- SSHを使ったGitのユーザーとリポジトリの管理ツール
* [[http://alminium.github.io/alminium/|ALMinium]] --- [[https://redmine.jp/|Redmine]] を利用した [[https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%BB%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88|ALM]] の為のフルスタック環境で、ブラウザ上でGitのユーザーとリポジトリの管理ができる
* [[https://about.gitlab.com/install/ce-or-ee/|GitLab Community Edition (CE)]] --- Gitリポジトリホスティング用のオープンソース
本章では、GitプロトコルとSmart HTTPプロトコルによるのGitサーバー構築について説明します。認証の必要のないLAN環境下では、Gitプロトコルは簡単に設置できます。認証を必要とする場合は、Smart HTTPプロトコルを選んで下さい。また、Smart HTTPを使用したとしても、リポジトリ毎にユーザ権限を設定することができません。これを可能にするには、上記のGit管理用のツールに頼るしかありません。筆者としては、[[https://gitolite.com/gitolite/http.html|Gitolite]]をSmart HTTP上で作動させるのが良い方法だと思いますが、それはまたの機会に。ご興味のある方は、[[https://wiki.archlinux.jp/index.php/Gitolite|Arch Linu]] のサイトや[[https://stackoverflow.com/questions/34850650/how-to-using-gitolite-with-http-mode|stackoverflow]]にその方法が紹介されていますので、そちらをご参照下さい。
サーバー環境
* CentOS 7.2 / Apache 2.4 / Git 2.24
関連記事
* Gitサーバーの構築 - Gitデーモン/Smart HTTP
* [[git2:server:git-web|Gitサーバーの構築 - Git Web]]
* [[git2:client:windows|Git Windowsクライアント]]
リンク
* [[https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB|Gitサーバー]] --- Pro Git 2'nd Edition(日本語訳)
* [[https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Git-%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3|Gitサーバー - Git デーモン]] --- Pro Git 2'nd Edition(日本語訳)
* [[https://git-scm.com/book/ja/v2/Git%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Smart-HTTP|Gitサーバー - Smart HTTP]] --- Pro Git 2'nd Edition(日本語訳)
Pro Git 2'nd Edition は、Englishの方が内容が新しい(2020-06-03現在:こちらを推奨)
* [[https://git-scm.com/book/en/v2/Git-on-the-Server-Git-Daemon|Git on the Server ]] --- Pro Git 2'nd Edition(English)
* [[https://git-scm.com/book/en/v2/Git-on-the-Server-Git-Daemon|Git on the Server - Git Daemon]] --- Pro Git 2'nd Edition(English)
* [[https://git-scm.com/book/en/v2/Git-on-the-Server-Smart-HTTP|GGit on the Server - Smart HTTP]] --- Pro Git 2'nd Edition(English)
最終的には、[[https://git-scm.com/docs|Git Reference]]が一番役に立ちます
* [[https://git-scm.com/docs/git-daemon|git-daemon - A really simple server for Git repositories]] --- Gitデーモン(English)
* [[https://git-scm.com/docs/git-http-backend|git-http-backend - Server side implementation of Git over HTTP]] --- Smart HTTP(English)
----
===== Gitの設定 =====
=== Git2のインストール ===
git2.24 を IUSリポジトリからインストールします。以下にその抜粋を示しますが、詳しくは 本編の [[centos:yum#IUSによるgit2の導入|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デーモン([[https://git-scm.com/docs/git-daemon|git-daemon]])によって提供され、以下のサービスを提供します。
* upload-pack --- ''git fetch-pack'' と ''git ls-remote'' (デフォルト有効)
* upload-archive --- ''git archive --remote'' (デフォルト無効)
* receive-pack --- ''git send-pack'' (デフォルト無効)
Gitデーモンのデフォルト動作では、upload-pack サービスのみが有効なので、クライアントが利用できるコマンドは ''git fetch''、 ''git pull''、''git 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のインストールについての詳細は本編の [[centos:yum#iusによるgit2の導入|IUSによるgit2の導入]] をご覧ください。
yum install --enablerepo=ius git224-daemon
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デーモンの起動 ====
[[https://git-scm.com/docs/git-daemon|Gitデーモン]]の起動は以下のように行います。
sudo -u apache -g apache git daemon --reuseaddr --export-all --base-path=/var/git/ /var/git/ &
* git-daemon の実行ユーザとグループは、[[#リポジトリの作成]]で設定したのと同じ ''apache'' にします。
# 起動の確認
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
* ''{ホスト名}'' --- ホスト名まはたIPアドレスを指定します
* ''{プロジェクト名}.git'' --- ''/var/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''ファイルを作成します。
{{fa>folder-open-o}} ** /etc/systemd/system **
[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による運用を想定しています。認証の基本方針は以下の通りです。
* 信頼のある特定の内部ネットワーク(例えば:192.168.1.0/24)からの要求は認証を行わない
* それ以外の内部ネットワークからの要求はBasic認証を行う
* 外部のネットワークからの要求はリバースプロキシ経由(https→httpプロトコル変換)とし、リポジトリ毎にBasic認証を行う (※本章では扱いません)
\\
==== リポジトリの設定 ====
SmartHTTP プロトコルは、Git HTTPバックエンド([[https://git-scm.com/docs/git-http-backend|git-http-backend]])によって提供され、以下のサービスを提供します。
* http.uploadpack — ''git fetch-pack'' と ''git ls-remote'' (デフォルト有効)
* http.receivepack — ''git send-pack'' を提供し、クライアントに ''git push'' を許可します。匿名ユーザーの場合はデフォルトで無効になり、Webサーバーで認証されたユーザーの場合はデフォルトで有効になります。
# これらのコマンドは、リポジトリディレクトリ(例:/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'' を新規に作成します。
{{fa>folder-open-o}} ** /etc/httpd/conf.d **
# 環境設定
SetEnv GIT_PROJECT_ROOT /var/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
# LAN内の特定のホストのみ許可
Require all denied
Require host localhost
Require ip 127.0.0.1
Require ip 192.168.1.0/24
# Basic認証
AuthType Basic
AuthName "Git Access"
AuthUserFile /var/git/.htpasswd
Require valid-user
# 全開
# Require all granted
* ''SetEnv GIT_PROJECT_ROOT'' --- 環境変数 ''GIT_PROJECT_ROOT'' にリポジトリルート(ここでは ''/var/git'')を設定します
* ''SetEnv GIT_HTTP_EXPORT_ALL'' --- 環境変数 ''GIT_HTTP_EXPORT_ALL'' が定義されている場合、指定したディレクトリ(''/var/git'')以下のリポジトリをすべて公開します。特定のリポジトリのみを公開する場合は、そのリポジトリに、''git-daemon-export-ok'' というファイルを作成して下さい。
* ''ScriptAlias'' --- Gitサーバー用のバックエンド ''git-http-backend'' を ''/git/'' にマッピングします
* ''/git/''のアクセス制御 --- 次のいずれか一方にマッチすればアクセス可能になります
- ''localhost'' Or ''127.0.0.1'' Or ''192.168.1.0/24''
- Basic認証された場合\\ ID/パスワードは ''/var/git/.htpasswd'' に格納します
編集が終わったら、Apacheを再起動します。
systemctl restart httpd
\\
==== .htpasswd ====
Basic認証で使用するIDとパスワードを格納したファイル ''.htpasswd'' を作成します。
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'' の内容は以下のようになっています。
{{fa>folder-open-o}} ** /var/git **
y2sunlight:$apr1$hRCALosz$4qIvpmM4NHzMCEdVH3NAM0
\\
==== Smart HTTPプロトコルによる接続 ====
Smart HTTPプロトコルによる接続URLは以下の通りです:
http://{ホスト名}/git/{プロジェクト名}.git
* ''{ホスト名}'' --- ホスト名まはたIPアドレスを指定します
* ''{プロジェクト名}.git'' --- ''/var/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サーバーの運用の運用についてのユースケースをまとめておきます。
{{fa>question-circle}}新しいプロジェクトを作る
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) を有効にする
{{fa>question-circle}}新しいユーザを作る
cd /var/git # 共有リポジトリのルートディレクトリに移動する
htpasswd .htpasswd USER # 新しいユーザ(例:USER)を作成する
New password: # パスワードの入力
Re-type new password: # (再入力)
{{fa>question-circle}}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)
{{fa>question-circle}}共有リポジトリを削除する
cd /var/git # 共有リポジトリのルートディレクトリに移動する
rm -rf ./REPOSITORY.git # リポジトリのディレクトリを削除する
\\