lighttpd で git レポジトリを公開

Pocket

コード書くことがあるなら、バージョン管理ソフトを使ったことはありますよね?

個人で作ってるプログラムなどはホームサーバの Subversion で管理してました
apache + subversion のよくあるパターンを使ってました

この度、ホームサーバのウェブサーバを勢いで apache から lighttpd に変更しました
Subversion とかの連携とか何も考えずやってしまったんですよね

しょうがないので、lighttpd 上で Subversion のレポジトリが公開できるか見てみると・・・
プロキシ立てて、subversion は apache で動かすという記事を発見!
せっかく lighttpd にした意味がない!
lighttpd だけで動かせそうなバージョン管理ソフトないか探していると、git が動くっぽい

ということで、lighttpd 上で git レポジトリ公開するまでの旅(1.5d)が始まるのでした

<基本構成>
ディストリビューションは Momonga Linux 7 です。多分、Fedora でも設定同じだと思います。
git と lighttpd は RPM のモノをそのまま使いました
そのままなので、 lighttpd のユーザーとグループは lighttpd:lighttpd です
</基本構成>

<git レポジトリの作成>
git のレポジトリは、/opt/git をgit のレポジトリルートとして作成します
今回は hoge.git を作成します

<br />
$ sudo mkdir -p /opt/git/hoge.git<br />
$ cd /opt/git/hoge.git<br />
$ sudo git --bare init<br />
$ sudo chown -R lighttpd.lighttpd /opt/git<br />

そのままだとサーバーに push してもサーバーのレポジトリの情報が更新されない
情報を反映させるためには下記コマンドを実行する必要がある

<br />
$ git update-server-info<br />

しかし、更新するたびに毎回サーバーに入って コマンドを実行するのは面倒である
/opt/git/hoge.git/hooks に post-update.sample というファイルがあるのでコピーする
<br />
$ cd /opt/git/hoge.git/hooks<br />
# cp -a post-update.sample post-update<br />

post-update の中身を見てもらえばわかるが、 git update-server-info を実行している
</git レポジトリの作成>

<lighttpd.conf の設定>
git を使うのだが、alias、setenvを使うので /etc/lighttpd/lighttpd.conf の server.modules に
mod_alias と mod_setenv を追加する
git レポジトリを公開するのに認証を使うので mod_auth も追加する

<br />
server.modules = (<br />
  &quot;mod_alias&quot;,<br />
  &quot;mod_auth&quot;,<br />
  &quot;mod_setenv&quot; )<br />

git で HTTP ステータス 100 を使うが、バージョンが 1.5 未満の lighttpd だと 100 を認識できずに 417 のステータスコードが出るかもしれない
その場合は、以下の設定を lighttpd.conf に追加する

<br />
server.reject-expect-100-with-417 = &quot;disable&quot;<br />

これで結構苦労したが、こちらを参考にした
これを記述してないとレポジトリにプッシュすると git では return code 22 が返ってくる
そして、アクセスログには 417 のステータスコードのアクセスが出る

これを設定して、ステータスコードが 404 になった場合は違うことが原因だと思う
</lighttpd.conf の設定>

<git.conf の作成>
lighttpd に git レポジトリ用に設定を追加する
今回は https を使うことを前提に設定ファイルを作成する

<br />
$SERVER[&quot;socket&quot;] == &quot;:443&quot; {<br />
  ssl.engine = &quot;enable&quot;<br />
  ssl.pemfile = &quot;/etc/lighttpd/ssl.pem&quot;<br />
  server.name = &quot;git.example.jp&quot;<br />
  server.document-root = &quot;/var/www/html&quot;</p>
<p>  alias.url = (<br />
    &quot;/git&quot; =&gt; &quot;/usr/libexec/git-core/git-http-backend&quot;<br />
  )</p>
<p>  $HTTP[&quot;url&quot;] =~ &quot;^/git&quot; {<br />
    cgi.assign = (&quot;&quot; =&gt; &quot;&quot;)<br />
    setenv.add-environment = (<br />
      &quot;GIT_PROJECT_ROOT&quot; =&gt; &quot;/opt/git&quot;,<br />
      &quot;GIT_HTTP_EXPORT_ALL&quot; =&gt; &quot;&quot;<br />
    )<br />
  }</p>
<p>  auth.backend = &quot;htdigest&quot;<br />
  auth.backend.htdigest.userfile = &quot;/etc/lighttpd/lighttpd.user.htdigest&quot;<br />
  auth.require = (<br />
    &quot;/git&quot; =&gt;<br />
    (<br />
      &quot;method&quot; =&gt; &quot;digest&quot;,<br />
      &quot;realm&quot; =&gt; &quot;git&quot;,<br />
      &quot;require&quot; =&gt; &quot;valid-user&quot;<br />
    )<br />
  )<br />
}<br />

ssl.pem は下記コマンドで多分作れると思う
ここでは詳しく述べない
<br />
$ cd /etc/lighttpd<br />
# openssl req -new -x509 -keyout ssl.pem -out ssl.pem -days 365 -nodes<br />

上の設定だと認証用のファイルもつくらないといけない
hoge ユーザーを作る設定は下記コマンドで

<br />
# htdigest -c /etc/lighttpd/lighttpd.user.htdigest &quot;git&quot; hoge<br />

</git.conf の作成>

<レポジトリを取得してみる>
クライアントマシンで作ったレポジトリを取得してみる
すると、下記のようなメッセージが出て上手くいかないかもしれない

<br />
$ git clone https://git.example.jp/git/hoge.git<br />
error: Peer certificate cannot be authenticated with given CA certificates while accessing https://git.example.jp/git/hoge.git/info/refs<br />
fatal: HTTP request failed<br />

手作り認証局なので SSL のエラーになってしまう

その場合は、クライアントで下記コマンドで SSL のチェックをしないようにしてしまう
もちろん自己責任ですよ

<br />
$ git config --global http.sslVerify false<br />

あともう一つ refs 関係でエラーが出たような・・・

<br />
$ git clone https://git.example.jp/git/hoge.git<br />
Cloning info 'config'...<br />
fatal: https://git.example.jp/git/hoge.git/info/refs not found: did you run git update-server-info on the server?<br />

と表示されたら、サーバーで言われたとおり git update-server-info を実行します

<br />
$ cd /opt/git/hoge.git<br />
# sudo su lighttpd -c &quot;git update-server-info&quot;<br />

ここまでで clone などの取得はできる?と思います
</レポジトリを取得してみる>

<ハマったこと>
最初、clone と push できるようにしてから
認証をかけるようにしようとした

どうやら、 git-http-backend は anonymous だと デフォルトだと push 出来ない
下記のようなエラーが表示される

<br />
$ git push origin master<br />
error: Cannot access URL https://git.example.jp/git/hoge.git/, return code 22<br />
fatal: git-http-push failed<br />

アクセスログには下記のようなエラーが。
<br />
&quot;PROPFIND /git/hoge.git/ HTTP/1.1&quot; 404<br />

man を見たら /opt/git/hoge.git/config に書いておけば anonymous でも書き込みできる

<br />
[http]<br />
  receivepack = true<br />

そんなことはせずに git レポジトリに認証設定までやってからテストしましょう
</ハマったこと>

コメントを残す