メインメニュー
XAMPP アレンジ
IED
WSL2
-
道具箱
リポジトリ編
フレームワーク編
公開ソフトウェア
メタ
リンク
- PHP ライブラリ
- PHP 言語
git2:server目次
Gitサーバーの構築 - Gitデーモン/Smart HTTP
Git 2.24
— y2sunlight 2020-06-02
本章では、社内用のGitサーバーの構築について説明します。Gitをグループで利用するには、共有リポジトリが必要になります。この時、リモートのGitサーバーとクライアントとの間で使用されるプロトコルは、一般に、Git(ポート番号:9418)、SSH(21)とSmart HTTP(80)/HTTPS(443)が利用できます。これらのプロトコルを使ったGitの運用方法は以下のようになります。
- Gitプロトコル — 認証のないLAN内のみだけの運用
- SSHプロトコル — sshを利用した方法で、Linuxのユーザとファイルの権限管理をそのまま利用
- Smart HTTPプロトコル — Apacheと連携したHTTP(S)による方法で、認証はBasic認証を使用
また、Git管理用のツールを利用した運用もあります。
- Gitolite — SSHを使ったGitのユーザーとリポジトリの管理ツール
- GitLab Community Edition (CE) — Gitリポジトリホスティング用のオープンソース
本章では、GitプロトコルとSmart HTTPプロトコルによるのGitサーバー構築について説明します。認証の必要のないLAN環境下では、Gitプロトコルは簡単に設置できます。認証を必要とする場合は、Smart HTTPプロトコルを選んで下さい。また、Smart HTTPを使用したとしても、リポジトリ毎にユーザ権限を設定することができません。これを可能にするには、上記のGit管理用のツールに頼るしかありません。筆者としては、GitoliteをSmart HTTP上で作動させるのが良い方法だと思いますが、それはまたの機会に。ご興味のある方は、Arch Linu のサイトやstackoverflowにその方法が紹介されていますので、そちらをご参照下さい。
サーバー環境
- CentOS 7.2 / Apache 2.4 / Git 2.24
関連記事
- Gitサーバーの構築 - Gitデーモン/Smart HTTP
リンク
- Gitサーバー — Pro Git 2'nd Edition(日本語訳)
- Gitサーバー - Git デーモン — Pro Git 2'nd Edition(日本語訳)
- Gitサーバー - Smart HTTP — Pro Git 2'nd Edition(日本語訳)
Pro Git 2'nd Edition は、Englishの方が内容が新しい(2020-06-03現在:こちらを推奨)
- Git on the Server — Pro Git 2'nd Edition(English)
- Git on the Server - Git Daemon — Pro Git 2'nd Edition(English)
- GGit on the Server - Smart HTTP — Pro Git 2'nd Edition(English)
最終的には、Git Referenceが一番役に立ちます
- git-daemon - A really simple server for Git repositories — Gitデーモン(English)
- git-http-backend - Server side implementation of Git over HTTP — Smart HTTP(English)
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)によって提供され、以下のサービスを提供します。
- 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のインストールについての詳細は本編の 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-daemon の実行ユーザとグループは、リポジトリの作成で設定したのと同じ
apache
にします。
Gitプロトコルだけの運用の場合は、gitユーザを新しく作り、リポジトリの所有者をgitにして、git-daemonもgitで実行して下さい。–reuseaddr
は起動時に古い接続がタイムアウトするのを待たずにサーバーを再起動します。–export-all
は指定したディレクトリ以下のリポジトリをすべて公開します。特定のリポジトリのみを公開する場合は、そのリポジトリに、git-daemon-export-ok というファイルを作成して下さい。–base-path
はクライアントに要求されたパスに指定したディレクトリ(ここでは/var/git/
)をベースとして付加します。- 最後に指定したパス(ここでは
/var/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
{ホスト名}
— ホスト名まはた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
ファイルを作成します。/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による運用を想定しています。認証の基本方針は以下の通りです。
- 信頼のある特定の内部ネットワーク(例えば:192.168.1.0/24)からの要求は認証を行わない
- それ以外の内部ネットワークからの要求はBasic認証を行う
- 外部のネットワークからの要求はリバースプロキシ経由(https→httpプロトコル変換)とし、リポジトリ毎にBasic認証を行う (※本章では扱いません)
リポジトリの設定
SmartHTTP プロトコルは、Git HTTPバックエンド(git-http-backend)によって提供され、以下のサービスを提供します。
- http.uploadpack —
git fetch-pack
とgit ls-remote
(デフォルト有効) - http.receivepack —
git send-pack
を提供し、クライアントにgit push
を許可します。匿名ユーザーの場合はデフォルトで無効になり、Webサーバーで認証されたユーザーの場合はデフォルトで有効になります。
【注意】
上の 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>
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
Or127.0.0.1
Or192.168.1.0/24
- Basic認証された場合
ID/パスワードは/var/git/.htpasswd
に格納します
編集が終わったら、Apacheを再起動します。
systemctl restart httpd
.htpasswd
Basic認証で使用するIDとパスワードを格納したファイル
.htpasswd
を作成します。/var/git/.htpasswd
.htpasswd
は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
の内容は以下のようになっています。/var/git
- .htpasswd
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サーバーの運用の運用についてのユースケースをまとめておきます。
新しいプロジェクトを作る
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 # リポジトリのディレクトリを削除する
git2/server.txt · 最終更新: 2020/06/16 15:20 by y2sunlight
コメント