====== 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
インストールの途中で、インストールしても良いか確認される (''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デーモンの起動 ==== [[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'' にします。
> 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''ファイルを作成します。 {{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サーバーで認証されたユーザーの場合はデフォルトで有効になります。
>【注意】\\ 上の http.receivepack の説明は [[https://git-scm.com/docs/git-http-backend|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'' を新規に作成します。 {{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'' を作成します。
{{fa>file-o}} ''/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'' の内容は以下のようになっています。 {{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 # リポジトリのディレクトリを削除する \\