純規の暇人趣味ブログ

手を突っ込んで足を洗う

GitoliteをSmart HTTPで利用出来る様にする

      2016/07/18    HimaJyun

前々から「Gitoliteをセットアップ」してみたり、「Redmineをインストール」してみたり、「GitoliteとRedmineを連携」してみたりしています。

これで完璧なGitサーバが出来上がったと満足していたのですが、まるでその僕の意図を見抜いていて打ち砕くかの如く、VisualStudioのGitがHTTP(S)にしか対応していなかったので(半ギレしつつも)対応してみました。

Gitolite += SmartHTTP;

どうせならGitoliteがSmartHTTPで利用出来たらなおよいですね。(そう、まるでGitHubの様に)

例えばVisualStudioの様に、SSHに対応していなくてもHTTPに対応している、など、大抵のGitクライアントはどちらか片方は必ず利用出来るでしょうし。(きょうびそのどちらも使えないのはGitのクライアントとは呼べないでしょう。)

そして、GitoliteにはHTTPと連携する(Basic認証のユーザ名でアカウントの権限を制御する)事も可能な様に設計されています。

すなわち、GitoliteはSSHでもHTTPでも同じ様にアクセス制御などの様々な機能が使えると言う訳です。

前提条件

以下の様な前提条件だとしましょう。

  • WebサーバにはApacheを使用
  • Gitoliteを動作させているユーザ、グループ共に「git」
  • 諸々のファイルは/var/www/gitに配置
  • Gitoliteのインストール先は/var/git/

Gitolite、SmartHTTP(S)

Gitoliteは少々特殊な方なので、一筋縄では行きません。

あと、レポジトリ内のファイルの所有者が散ってしまうのは美しくないためsuEXECを利用します。

必要なファイルを配置

suEXEC氏の機嫌を損ねない様にするためにはパーミッションなどを慎重に設定する必要があるのですが、慣れてしまえばお手玉ですよ。

とりあえず、/var/www/gitディレクトリを配置しましょう、ユーザやパスなどは各自、環境に合わせて設定して下さいね。

#sudo install -d -m 0755 -o [ユーザ名] -g [グループ名] [パス]
sudo install -d -m 0755 -o git -g git /var/www/git

suEXECを利用すると、一部の環境変数がGitoliteに渡らなくなるみたいなので、そこを良しなにしてくれるラッパースクリプトを用意します。

sudo editor /var/www/git/gitolite-suexec-wrapper.sh

以下の内容を書き込みましょう。

#!/bin/sh
# Gitoliteをインストールしたディレクトリ
export GITOLITE_HTTP_HOME="/var/git"
export GIT_PROJECT_ROOT="${GITOLITE_HTTP_HOME}/repositories"
export GIT_HTTP_EXPORT_ALL=1
# gitolite-shellがある場所
exec ${GITOLITE_HTTP_HOME}/bin/gitolite-shell

GIT_HTTP_EXPORT_ALL=1は設定していないと否応なしに動かないので気を付けて下さいね。

これまたsuEXEC氏の機嫌を損ねない様に、先程作成したラッパースクリプトの権限を設定します。

sudo chown git:git /var/www/git/gitolite-suexec-wrapper.sh
sudo chmod 0700 /var/www/git/gitolite-suexec-wrapper.sh

ふと思ったんですけども、ここでspawn-fcgiを使ってこのラッパースクリプトを起動すればnginxでも同じ事が出来るんですかね?

nginxでgitやらredmineが載ったサーバを建てようなどとは思いませんが……

Apacheを設定する

RHEL系ではデフォルトでsuEXECを利用出来るみたいですが、Debian系では別途インストールが必要です。

sudo apt-get install apache2-suexec-custom

また、このGitレポジトリをサブディレクトリ(http://git/repo/、みたいな奴)でも動かす事は出来ますが、suEXECがサーバ全体か、バーチャルホスト単位でしか使えないため今回はサブドメイン形式で行くとしましょう。

とりあえず、新しいサイトを定義します。

sudo editor /etc/apache2/sites-available/git.conf

基本的に以下の様な設定になるかと思われます。

<VirtualHost *:80>
  ServerName (Gitサーバのアドレス)
  ServerAdmin webmaster@localhost

  SuexecUserGroup git git
  ScriptAlias / /var/www/git/gitolite-suexec-wrapper.sh/

  DocumentRoot /var/www/git
  <Directory /var/www/git>
    AllowOverride None
    Options ExecCGI
    Require valid-user
    AuthType Basic
    AuthName "Git with SmartHTTP"
    AuthUserFile "/var/www/git/.htpasswd"
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

お察しの通り、サブディレクトリで動かしたければ「ScriptAlias /」を「ScriptAlias /repo/」みたいにすれば良い訳ですけど、今回はサブドメインを使用するのでこれで良し

あと、Basic認証は必須です。

これは、GitoliteがSmartHTTP経由でのアクセスにBasic認証を通過したユーザ名を利用しているためで、当然ながら、Basic認証のユーザ名はGitoliteのユーザ名と合わせる必要があります。

僕はこの事に気付かずに「Basic認証?出来上がってから設定しますわ~、うふふ……」なんて優雅な事を言っててハマりました。

今回は簡単に利用出来るファイル形式の設定ですが、ここは(ユーザ名さえ合えば)LDAPでもMySQLでも何でも構いません。

LDAPとかだとRedmineと合わせてシングルサインオンで行けます。

一応説明しておきますが、htpasswdの作成は以下のコマンドです。

touch /var/www/git/.htpasswd
htpasswd -b -s /var/www/git/.htpasswd (ユーザ名) (パスワード)

例えば、Gitoliteのユーザ名がadminで、パスワードは123(脆弱ゥ!!)にしたい時は以下の通り

htpasswd -b -s /var/www/git/.htpasswd admin 123

後は、先程作成したVirtualHostの設定と、mod_suexec、mod_cgiを有効にすれば出来上がりです。

Debian系は以下のコマンドだけで行けるので楽ですね、RHELの方は頑張ってシンボリックリンクを張りましょう!!

sudo a2ensite git
sudo a2enmod suexec
sudo a2enmod cgi

後はApacheを再起動してと……

sudo systemctl restart apache2

これで出来上がりです!!

後は、お手持ちのGitクライアントからSmartHTTPでcloneやpush、Gitoliteの権限設定などが使えるかを確認して下さい。

これでどんな場所でもどんなソフトでも開発できるGitサーバが出来上がりましたね!!

 - サーバ運営 ,