commit 7fe17b03f9fb1c51ab14767deadccf7793c294ed
parent dcf7dc272e7e6700af2ba23d824d343bfe7ee0a6
Author: Matsuda Kenji <info@mtkn.jp>
Date: Thu, 15 Feb 2024 15:44:00 +0900
publish
Diffstat:
11 files changed, 926 insertions(+), 426 deletions(-)
diff --git a/data/weblog b/data/weblog
@@ -133,3 +133,7 @@
1707404400 /kitchen/recipe/miso.html
1707490800 /computer/rp2040_1.html
1707490800 /computer/rp2040_1.html
+1707922800 /computer/git_server.html
+1707922800 /computer/index.html
+1707922800 /index.html
+1707922800 /computer/index.html
diff --git a/man/computer/git_server.html b/man/computer/git_server.html
@@ -0,0 +1,327 @@
+<h1>Gitサーバーの設定 on OpenBSD</h1>
+<time>2024-02-15</time>
+
+<h2>はじめに</h2>
+<p>
+GitHubがMicrosoft傘下になり久しい。\
+MincraftがMicrosoftアカウントなしでは遊べなくなった。\
+このままではGitHubもそのうちMicrosoftアカウントを要求するように\
+なるかもしれない。\
+ということでGitサーバーを自前で持つことにした。\
+</p>
+<p>
+ところでOpenBSDの開発者がGotという別のgit実装を作成しているので、\
+この記事は近いうちにいらなくなりそう。
+</p>
+
+<h2>手順</h2>
+<p>
+以下ではssh接続によるpull/push及び、httpsによるpullを設定の上、\
+stagitというウェブフロントエンドを導入する。
+</p>
+
+<h3>概要</h3>
+<ol>
+<li>ドメインの設定(任意)</li>
+<li><code>httpd(8)</code>の設定</li>
+<li>gitパッケージのインストールとchroot環境の整備</li>
+<li>stagitの導入</li>
+</ol>
+
+<h3>ドメインの設定(任意)</h3>
+<p>
+ドメインを設定する。\
+IPアドレスでアクセスできればいいならこの設定はいらない。\
+</p>
+<p>
+今回はgitというサブドメインを登録した:
+</p>
+<table>
+<thead>
+<tr>
+<th>サブドメイン</th>
+<th>種別</th>
+<th>内容</th>
+<th>優先度</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>git</td>
+<td>A</td>
+<td><i>サーバーのIPアドレス</i></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+
+<h3><code>httpd(8)</code>の設定</h3>
+<p>
+httpsで接続する場合、<code>acme-client(8)</code>を設定する\
+(IPアドレスで接続するなら自己証明書を発行することになる)。\
+まず<code>/etc/acme-client.conf</code>にドメインを追加する:
+</p>
+<pre><code>\
+domain git.mtkn.jp {
+ domain key "/etc/ssl/private/git.mtkn.jp.key"
+ domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
+ sign with letsencrypt
+}
+</code></pre>
+
+<p>
+続いて<code>/etc/httpd.conf</code>を設定する。\
+</p>
+<pre><code>\
+server "git.mtkn.jp" {
+ listen on * port 80
+ location "/.well-known/acme-challenge/*" {
+ root "/acme"
+ request strip 2
+ }
+ location "*" {
+ block return 302 "https://$HTTP_HOST$REQUEST_URI"
+ }
+}
+
+server "git.mtkn.jp" {
+ listen on * tls port 443
+ tls {
+ certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
+ key "/etc/ssl/private/git.mtkn.jp.key"
+ }
+ location "/.well-known/acme-challenge/*" {
+ root "/acme"
+ request strip 2
+ }
+ location "/*/git-receive-pack" {
+ block
+ }
+ location "/*/git-upload-pack" {
+ fastcgi {
+ param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
+ param GIT_PROJECT_ROOT "/git"
+ param GIT_HTTP_EXPORT_ALL "true"
+ }
+ }
+ location "/*/info/refs" {
+ fastcgi {
+ param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
+ param GIT_PROJECT_ROOT "/git"
+ param GIT_HTTP_EXPORT_ALL "true"
+ }
+ }
+}
+</code></pre>
+<p>
+<code>location "/*/git-receive-pack"</code>はpushの設定。\
+今回はhttpsでのpushを受付けないので<code>block</code>する。\
+</p>
+<p>
+<code>location "/*/git-upload-pack"</code>は手元のパソコンから\
+<code>git clone</code>や<code>git pull</code>したときのもの。\
+<code>location "/*/info/refs"</code>は上記を含むアクセスがあったときのもの。\
+ここではCGIを使って<code>git-http-backend</code>を呼んでいるだけである。\
+<code>SCRIPT_FILENAME</code>は<code>httpd(8)</code>のchroot環境でのパスである。\
+必要なファイルは後でこのchroot環境にコピーする。
+</p>
+<p>
+この後同じURLでフロントエンドをホストしたいので、上記のように必要なURLからのみ\
+CGIを実行するようにした。\
+gitのhttpクライアントがどのURLを利用しているのかは[2]に書いていた。\
+</p>
+
+
+
+<p>
+httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけ\
+でいい。
+</p>
+<p>
+<code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する:
+</p>
+<pre><code>\
+# echo httpd_flags= >> /etc/rc.conf.local
+# echo slowcgi_flags= >> /etc/rc.conf.local
+# rcctl start httpd
+# rcctl enable httpd
+# rcctl start slowcgi
+# rcctl enable slowcgi
+</code></pre>
+<p>
+サーバー証明書の発行:
+</p>
+<pre><code>\
+# acme-client -v git.mtkn.jp
+</code></pre>
+<p>
+<code>crontab(1)</code>にサーバー証明書の自動更新を登録:
+</p>
+<pre><code>\
+#minute hour mday month wday [flags] command
+~ 2 * * * acme-client git.mtkn.jp && rcctl reload httpd
+</code></pre>
+
+<h3>gitパッケージのインストールとchroot環境の整備</h3>
+<p>
+gitパッケージをインストールし、ssh接続用のユーザーを作成する。\
+httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>\
+下にする:
+</p>
+<pre><code>\
+# pkg_add git
+# useradd -b /var/www -m -s /usr/local/bin/git-shell git
+</code></pre>
+<p>
+ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。\
+ところでこのファイルに公開鍵を書き込むとgitユーザーとしてsshでログインできるので、\
+部外者がこのファイルの編集をできないようにしておく必要がある。\
+一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>なので大丈夫\
+だと思うが、心配なら<code>httpd(8)</code>のchroot環境の外にこのファイルを移動させて\
+おいてもいいかもしれない。\
+</p>
+<p>
+httpsでアクセスするためにchroot環境を整備する。\
+<code>httpd(8)</code>は既定では<code>/var/www</code>にchrootして実行されるので、\
+CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。\
+まずはgitのコマンドをコピー:
+</p>
+<pre><code>\
+# mkdir -p /var/www/usr/local/libexec/git
+# cp /usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/
+# chown www:www /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack}
+# chmod 0500 /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack}
+# mkdir -p /var/www/usr/local/bin
+# cp /usr/local/bin/git /var/www/usr/local/bin/
+# chown www:www /var/www/usr/local/bin/git
+# chmod 0500 /var/www/usr/local/bin/git
+</code></pre>
+<p>
+続いてコマンドの実行に必要なライブラリをコピー:
+</p>
+<pre><code>\
+# mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec
+# find /var/www/{bin,usr} -type f | grep git | xargs ldd | awk '{print $7}' | grep -v -e '^/var/www/' -e '^$' -e 'Name' | sort | uniq | awk '{printf "cp %s /var/www%s && chown www:www /var/www%s && chmod 0400 /var/www%s\n", $1, $1, $1, $1}' | sh -s
+</code></pre>
+<p>
+<code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照):
+</p>
+<pre><code>\
+# mkdir /var/www/dev
+# mknod -m 666 /var/www/dev/null c 2 2
+</code></pre>
+<p>
+最後に、<code>/var/www/dev/null</code>を作成するために\
+<code>/etc/fstab</code>の<code>/var</code>エントリーから\
+<code>nodev</code>オプションを削除し、再起動する。
+</p>
+
+<p>
+gitパッケージやシステムの更新後、chroot環境のコマンドやライブラリも\
+更新しないといけないのでそのためのスクリプトを適当に作った:
+</p>
+<pre><code>\
+#!/bin/sh -xe
+
+oso=$(find /var/www/usr -type f -name '*.so*')
+rm $oso
+
+bin=$(find /var/www/bin /var/www/usr -type f ! -name '*.so*' |
+ grep -v bgpctl |
+ sed 's|^/var/www||'
+ )
+echo "$bin" | sed 's|.*|cp & /var/www&|' | sh -s
+echo "$bin" | sed 's|.*|chown www:www /var/www&|' | sh -s
+echo "$bin" | sed 's|.*|chmod 0500 /var/www&|' | sh -s
+
+nso=$(echo "$bin" | sed 's|^|/var/www|' |
+ xargs ldd | awk '{print $7}' |
+ grep -v -e '^/var/www/' -e '^$' -e 'Name' |
+ sort | uniq
+ )
+echo "$nso" | sed 's|.*|cp & /var/www&|' | sh -s
+echo "$nso" | sed 's|.*|chown www:www /var/www&|' | sh -s
+echo "$nso" | sed 's|.*|chmod 0400 /var/www&|' | sh -s
+</code></pre>
+
+<h3><code>stagit(1)</code>の導入</h3>
+<p>
+ウェブフロントエンドとしてstagitを導入する:
+</p>
+<pre><code>\
+# pkg_add stagit
+</code></pre>
+<p>
+<code>httpd.conf(5)</code>の<code>server "git.mtkn.jp"</code>の中に\
+以下の設定を追加する\
+(<code>location</code>のマッチは上から順番に評価されるので、上で設定した\
+gitのhttpクライアント用の<code>location</code>よりも下に記入する):
+</p>
+<pre><code> location "/" {
+ directory index index.html
+ root "/htdocs/git.mtkn.jp"
+ }
+ location "*" {
+ directory index log.html
+ root "/htdocs/git.mtkn.jp"
+ }
+</code></pre>
+<p>
+stagit用のディレクトリを作成して<code>httpd(8)</code>を再読込する:
+</p>
+<pre><code>\
+# mkdir /var/www/htdocs/git.mtkn.jp
+# chown git:git /var/www/htdocs/git.mtkn.jp
+# rcctl reload httpd
+</code></pre>
+
+<p>
+gitリポジトリが更新されたときにウェブページも更新するように設定する。\
+gitリポジトリはなにか更新があった場合、そのリポジトリのディレクトリの中の\
+<code>hooks/post-receive</code>というファイルを自動で実行する。\
+そのためこのファイルに、stagitの更新をするスクリプトを書いておけばいい:
+</p>
+<pre><code>\
+#!/bin/sh
+
+git_root="/var/www/git"
+stagit_root="/var/www/htdocs/git.mtkn.jp"
+repo="$(basename "$(pwd)" | sed 's/\.git$//')"
+src="$(pwd)"
+stagit_dst="$stagit_root/$repo"
+
+mkdir -p "$stagit_dst"
+(cd "$stagit_dst" && stagit -l 64 "$src")
+(cd "$stagit_root" && stagit-index $git_root/*.git > index.html)
+</code></pre>
+
+<h2>レポジトリの作成</h2>
+<p>
+レポジトリを作成するにはサーバーで以下のようにする。\
+</p>
+<pre><code>\
+$ cd /var/www/git
+$ doas -u git mkdir <i>repo</i>.git
+$ cd <i>repo</i>.git
+$ doas -u git git init --bare
+</code></pre>
+
+<p>
+これで手元のパソコンからクローンできる:
+</p>
+<pre><code>\
+$ git clone git@git.mtkn.jp:<i>repo</i>.git
+</code></pre>
+<p>
+または
+</p>
+<pre><code>\
+$ git clone https://git.mtkn.jp/<i>repo</i>.git
+</code></pre>
+
+<h2>参考</h2>
+<ul>
+<li>[1] <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols">Git - The Protocols.Git</a></li>
+<li>[2] <a href="https://git-scm.com/docs/http-protocol">Git - http-protocol Documentation.Git</a></li>
+<li>[3] <a href="https://codemadness.org/stagit.html">Stagit: a static git page generator - Codemadness</a></li>
+</ul>
diff --git a/man/computer/index.html b/man/computer/index.html
@@ -16,11 +16,16 @@ Small is beautiful.
<li><a href="xlib_playground6.html">Xlibで遊んでみる6</a></li>
</ul>
+<h2>サーバー</h2>
+<ul>
+<li><a href="setting_up_web_server.html">Webサーバーの設定</a></li>
+<li><a href="mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li>
+<li><a href="git_server.html">Gitサーバーの設定 on OpenBSD</a></li>
+</ul>
+
<h2>MISC</h2>
<ul>
<li><a href="what-i-use.html">使用しているソフトウェア、ハードウェア</a></li>
<li><a href="archlinux_installation.html">Arch Linuxインストール</a></li>
<li><a href="rtx1200-qos.html">ルーター(RTX1200)のQoS機能を利用して帯域を制限した</a></li>
-<li><a href="setting_up_web_server.html">Webサーバーの設定</a></li>
-<li><a href="mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li>
</ul>
diff --git a/man/draft/git_server.html b/man/draft/git_server.html
@@ -1,212 +0,0 @@
-<h1>Gitサーバーの設定 on OpenBSD</h1>
-<time>2024-02-14</time>
-
-<h2>はじめに</h2>
-<p>
-GitHubがMicrosoft傘下になり久しい。\
-MincraftがMicrosoftアカウントなしでは遊べなくなった。\
-このままではGitHubもそのうちMicrosoftアカウントを要求するように\
-なるかもしれない。\
-ということでGitサーバーを自前で持つことにした。\
-</p>
-
-<h2>手順</h2>
-<p>
-以下ではssh接続によるpull/push及び、httpsによるpullを設定する。
-<h3>概要</h3>
-<ol>
-<li>ドメインの設定(任意)</li>
-<li><code>httpd(8)</code>の設定</li>
-<li>gitパッケージのインストールとchroot環境の整備</li>
-</ol>
-
-<h3>ドメインの設定(任意)</h3>
-<p>
-ドメインを設定する。\
-IPアドレスでアクセスできればいいならこの工程はいらない。\
-</p>
-<p>
-今回はgitというサブドメインを登録した:
-</p>
-<table>
-<thead>
-<tr>
-<th>サブドメイン</th>
-<th>種別</th>
-<th>内容</th>
-<th>優先度</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>git</td>
-<td>A</td>
-<td><i>サーバーのIPアドレス</i></td>
-<td></td>
-</tr>
-</tbody>
-</table>
-
-<h3><code>httpd(8)</code>の設定</h3>
-<p>
-httpsで接続する場合、<code>acme-client(8)</code>を設定する。\
-まず<code>/etc/acme-client.conf</code>にドメインを追加する:
-</p>
-<pre><code>\
-domain git.mtkn.jp {
- domain key "/etc/ssl/private/git.mtkn.jp.key"
- domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
- sign with letsencrypt
-}
-</code></pre>
-
-<p>
-続いて<code>/etc/httpd.conf</code>を設定する。\
-</p>
-<pre><code>\
-server "git.mtkn.jp" {
- listen on * port 80
- location "/.well-known/acme-challenge/*" {
- root "/acme"
- request strip 2
- }
- location "*" {
- block return 302 "https://$HTTP_HOST$REQUEST_URI"
- }
-}
-
-server "git.mtkn.jp" {
- listen on * tls port 443
- tls {
- certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
- key "/etc/ssl/private/git.mtkn.jp.key"
- }
- location "/.well-known/acme-challenge/*" {
- root "/acme"
- request strip 2
- }
- location "/*/git-receive-pack" {
- block
- }
- location "/*/git-upload-pack" {
- fastcgi {
- param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
- param GIT_PROJECT_ROOT "/git"
- param GIT_HTTP_EXPORT_ALL "true"
- }
- }
- location "/*/info/refs" {
- fastcgi {
- param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
- param GIT_PROJECT_ROOT "/git"
- param GIT_HTTP_EXPORT_ALL "true"
- }
- }
-}
-</code></pre>
-<p>
-<code>location "/*/git-receive-pack"</code>はpushの設定。\
-今回はhttpsでのpushを受付けないので<code>block</code>する。\
-</p>
-<p>
-<code>location "/*/git-upload-pack"</code>は手元のパソコンから\
-<code>git clone</code>や<code>git pull</code>したときのもの。\
-<code>location "/*/info/refs"</code>は上記を含むアクセスがあったときのもの。\
-ここではCGIを使って<code>git-http-backend</code>を呼んでいるだけである。\
-<code>SCRIPT_FILENAME</code>は<code>httpd(8)</code>のchroot環境でのパスである。\
-必要なファイルは後でこのchroot環境にコピーする。
-</p>
-<p>
-httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけ\
-でいい。
-</p>
-<p>
-<code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する:
-</p>
-<pre><code>\
-# echo httpd_flags= >> /etc/rc.conf.local
-# echo slowcgi_flags= >> /etc/rc.conf.local
-# rcctl start httpd
-# rcctl enable httpd
-# rcctl start slowcgi
-# rcctl enable slowcgi
-</code></pre>
-<p>
-サーバー証明書の発行:
-</p>
-<pre><code>\
-# acme-client -b git.mtkn.jp
-</code></pre>
-<p>
-<code>crontab(1)</code>にサーバー証明書の自動更新を登録:
-</p>
-<pre><code>\
-#minute hour mday month wday [flags] command
-~ 2 * * * acme-client git.mtkn.xyz && rcctl reload httpd
-</code></pre>
-
-<h3>gitパッケージのインストールとchroot環境の整備</h3>
-<p>
-gitパッケージをインストールし、ssh接続用のユーザーを作成する。\
-httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>\
-下にする:
-</p>
-<pre><code>\
-# pkg_add git
-# useradd -b /var/www -m -s /usr/local/bin/git-shell git
-</code></pre>
-<p>
-ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。\
-セキュリティ大丈夫かこれ。\
-一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>。\
-</p>
-
-<p>
-httpsでアクセスするためにchroot環境を整備する。\
-<code>httpd(8)</code>は既定では/var/wwwにchrootして実行されるので、\
-CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。\
-まずはgitのコマンドをコピー:
-</p>
-<pre><code>\
-# mkdir -p /var/www/usr/local/libexec/git
-# cp /usr/local/libexec/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/
-# mkdir -p /var/www/usr/local/bin
-# cp /usr/local/bin/git /var/www/usr/local/bin/
-</code></pre>
-<p>
-続いてコマンドの実行に必要なライブラリをコピー:
-</p>
-<pre><code>\
-# mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec
-# find /var/www/{bin,usr} -type f | grep git | xargs ldd | awk '{print $7}' | grep -v -e '^/var/www/' -e '^$' -e 'Name' | sort | uniq | awk '{printf "cp %s /var/www%s\ n", $1, $1}' | sh -s
-</code></pre>
-<p>
-<code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照):
-</p>
-<pre><code>\
-# mkdir /var/www/dev
-# mknod -m 666 /var/www/dev/null c 2 2
-</code></pre>
-<p>
-最後に、<code>/var/www/dev/null</code>を作成するために\
-<code>/etc/fstab</code>の<code>/var</code>エントリーから\
-<code>nodev</code>オプションを削除し、再起動する。
-</p>
-
-<h2>レポジトリの作成</h2>
-<p>
-レポジトリを作成するにはサーバーで以下のようにする。\
-</p>
-<pre><code>\
-$ cd /var/www/git
-$ doas -u git mkdir <i>repo</i>.git
-$ cd <i>repo</i>.git
-$ doas -u git git init --bare
-</code></pre>
-
-<p>
-これで手元のパソコンからクローンできる:
-</p>
-<pre><code>\
-$ git clone https://git.mtkn.jp:<i>repo</i>.git
-</code></pre>
diff --git a/man/index.html b/man/index.html
@@ -9,6 +9,7 @@
<h2>更新履歴</h2>
<a href="/rss.xml">RSS</a>
<ul>
+<li>2024-02-15 <a href="/computer/git_server.html">Gitサーバーの設定 on OpenBSD</a></li>
<li>2024-02-09 <a href="/kitchen/recipe/miso.html">味噌</a></li>
<li>2024-01-19 <a href="/computer/mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li>
<li>2024-01-11 <a href="/computer/what-i-use.html">使用しているハードウェア、ソフトウェア</a></li>
diff --git a/pub/computer/git_server.html b/pub/computer/git_server.html
@@ -0,0 +1,300 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+ <link rel="stylesheet" type="text/css" href="/style.css">
+ <link rel="icon" type="image/x-icon" href="/pics/favicon.ico">
+ <title>Gitサーバーの設定 on OpenBSD</title>
+</head>
+<body>
+ <header>
+ <a href="/">主頁</a> |
+ <a href="/about.html">自己紹介</a> |
+ <a href="/journal">日記</a> |
+ <a href="/farm">農業</a> |
+ <a href="/kitchen">台所</a> |
+ <a href="/computer">電算機</a> |
+ <a href="/poetry">詩</a> |
+ <a href="/books">本棚</a> |
+ <a href="/gallery">絵</a> |
+ <a href="https://git.mtkn.jp">Git</a>
+ </header>
+ <main>
+ <article>
+<h1>Gitサーバーの設定 on OpenBSD</h1>
+<time>2024-02-15</time>
+
+<h2>はじめに</h2>
+<p>
+GitHubがMicrosoft傘下になり久しい。MincraftがMicrosoftアカウントなしでは遊べなくなった。このままではGitHubもそのうちMicrosoftアカウントを要求するようになるかもしれない。ということでGitサーバーを自前で持つことにした。</p>
+<p>
+ところでOpenBSDの開発者がGotという別のgit実装を作成しているので、この記事は近いうちにいらなくなりそう。
+</p>
+
+<h2>手順</h2>
+<p>
+以下ではssh接続によるpull/push及び、httpsによるpullを設定の上、stagitというウェブフロントエンドを導入する。
+</p>
+
+<h3>概要</h3>
+<ol>
+<li>ドメインの設定(任意)</li>
+<li><code>httpd(8)</code>の設定</li>
+<li>gitパッケージのインストールとchroot環境の整備</li>
+<li>stagitの導入</li>
+</ol>
+
+<h3>ドメインの設定(任意)</h3>
+<p>
+ドメインを設定する。IPアドレスでアクセスできればいいならこの設定はいらない。</p>
+<p>
+今回はgitというサブドメインを登録した:
+</p>
+<table>
+<thead>
+<tr>
+<th>サブドメイン</th>
+<th>種別</th>
+<th>内容</th>
+<th>優先度</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>git</td>
+<td>A</td>
+<td><i>サーバーのIPアドレス</i></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+
+<h3><code>httpd(8)</code>の設定</h3>
+<p>
+httpsで接続する場合、<code>acme-client(8)</code>を設定する(IPアドレスで接続するなら自己証明書を発行することになる)。まず<code>/etc/acme-client.conf</code>にドメインを追加する:
+</p>
+<pre><code>domain git.mtkn.jp {
+ domain key "/etc/ssl/private/git.mtkn.jp.key"
+ domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
+ sign with letsencrypt
+}
+</code></pre>
+
+<p>
+続いて<code>/etc/httpd.conf</code>を設定する。</p>
+<pre><code>server "git.mtkn.jp" {
+ listen on * port 80
+ location "/.well-known/acme-challenge/*" {
+ root "/acme"
+ request strip 2
+ }
+ location "*" {
+ block return 302 "https://$HTTP_HOST$REQUEST_URI"
+ }
+}
+
+server "git.mtkn.jp" {
+ listen on * tls port 443
+ tls {
+ certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
+ key "/etc/ssl/private/git.mtkn.jp.key"
+ }
+ location "/.well-known/acme-challenge/*" {
+ root "/acme"
+ request strip 2
+ }
+ location "/*/git-receive-pack" {
+ block
+ }
+ location "/*/git-upload-pack" {
+ fastcgi {
+ param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
+ param GIT_PROJECT_ROOT "/git"
+ param GIT_HTTP_EXPORT_ALL "true"
+ }
+ }
+ location "/*/info/refs" {
+ fastcgi {
+ param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
+ param GIT_PROJECT_ROOT "/git"
+ param GIT_HTTP_EXPORT_ALL "true"
+ }
+ }
+}
+</code></pre>
+<p>
+<code>location "/*/git-receive-pack"</code>はpushの設定。今回はhttpsでのpushを受付けないので<code>block</code>する。</p>
+<p>
+<code>location "/*/git-upload-pack"</code>は手元のパソコンから<code>git clone</code>や<code>git pull</code>したときのもの。<code>location "/*/info/refs"</code>は上記を含むアクセスがあったときのもの。ここではCGIを使って<code>git-http-backend</code>を呼んでいるだけである。<code>SCRIPT_FILENAME</code>は<code>httpd(8)</code>のchroot環境でのパスである。必要なファイルは後でこのchroot環境にコピーする。
+</p>
+<p>
+この後同じURLでフロントエンドをホストしたいので、上記のように必要なURLからのみCGIを実行するようにした。gitのhttpクライアントがどのURLを利用しているのかは[2]に書いていた。</p>
+
+
+
+<p>
+httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけでいい。
+</p>
+<p>
+<code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する:
+</p>
+<pre><code># echo httpd_flags= >> /etc/rc.conf.local
+# echo slowcgi_flags= >> /etc/rc.conf.local
+# rcctl start httpd
+# rcctl enable httpd
+# rcctl start slowcgi
+# rcctl enable slowcgi
+</code></pre>
+<p>
+サーバー証明書の発行:
+</p>
+<pre><code># acme-client -v git.mtkn.jp
+</code></pre>
+<p>
+<code>crontab(1)</code>にサーバー証明書の自動更新を登録:
+</p>
+<pre><code>#minute hour mday month wday [flags] command
+~ 2 * * * acme-client git.mtkn.jp && rcctl reload httpd
+</code></pre>
+
+<h3>gitパッケージのインストールとchroot環境の整備</h3>
+<p>
+gitパッケージをインストールし、ssh接続用のユーザーを作成する。httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>下にする:
+</p>
+<pre><code># pkg_add git
+# useradd -b /var/www -m -s /usr/local/bin/git-shell git
+</code></pre>
+<p>
+ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。ところでこのファイルに公開鍵を書き込むとgitユーザーとしてsshでログインできるので、部外者がこのファイルの編集をできないようにしておく必要がある。一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>なので大丈夫だと思うが、心配なら<code>httpd(8)</code>のchroot環境の外にこのファイルを移動させておいてもいいかもしれない。</p>
+<p>
+httpsでアクセスするためにchroot環境を整備する。<code>httpd(8)</code>は既定では<code>/var/www</code>にchrootして実行されるので、CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。まずはgitのコマンドをコピー:
+</p>
+<pre><code># mkdir -p /var/www/usr/local/libexec/git
+# cp /usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/
+# chown www:www /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack}
+# chmod 0500 /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack}
+# mkdir -p /var/www/usr/local/bin
+# cp /usr/local/bin/git /var/www/usr/local/bin/
+# chown www:www /var/www/usr/local/bin/git
+# chmod 0500 /var/www/usr/local/bin/git
+</code></pre>
+<p>
+続いてコマンドの実行に必要なライブラリをコピー:
+</p>
+<pre><code># mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec
+# find /var/www/{bin,usr} -type f | grep git | xargs ldd | awk '{print $7}' | grep -v -e '^/var/www/' -e '^$' -e 'Name' | sort | uniq | awk '{printf "cp %s /var/www%s && chown www:www /var/www%s && chmod 0400 /var/www%s\n", $1, $1, $1, $1}' | sh -s
+</code></pre>
+<p>
+<code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照):
+</p>
+<pre><code># mkdir /var/www/dev
+# mknod -m 666 /var/www/dev/null c 2 2
+</code></pre>
+<p>
+最後に、<code>/var/www/dev/null</code>を作成するために<code>/etc/fstab</code>の<code>/var</code>エントリーから<code>nodev</code>オプションを削除し、再起動する。
+</p>
+
+<p>
+gitパッケージやシステムの更新後、chroot環境のコマンドやライブラリも更新しないといけないのでそのためのスクリプトを適当に作った:
+</p>
+<pre><code>#!/bin/sh -xe
+
+oso=$(find /var/www/usr -type f -name '*.so*')
+rm $oso
+
+bin=$(find /var/www/bin /var/www/usr -type f ! -name '*.so*' |
+ grep -v bgpctl |
+ sed 's|^/var/www||'
+ )
+echo "$bin" | sed 's|.*|cp & /var/www&|' | sh -s
+echo "$bin" | sed 's|.*|chown www:www /var/www&|' | sh -s
+echo "$bin" | sed 's|.*|chmod 0500 /var/www&|' | sh -s
+
+nso=$(echo "$bin" | sed 's|^|/var/www|' |
+ xargs ldd | awk '{print $7}' |
+ grep -v -e '^/var/www/' -e '^$' -e 'Name' |
+ sort | uniq
+ )
+echo "$nso" | sed 's|.*|cp & /var/www&|' | sh -s
+echo "$nso" | sed 's|.*|chown www:www /var/www&|' | sh -s
+echo "$nso" | sed 's|.*|chmod 0400 /var/www&|' | sh -s
+</code></pre>
+
+<h3><code>stagit(1)</code>の導入</h3>
+<p>
+ウェブフロントエンドとしてstagitを導入する:
+</p>
+<pre><code># pkg_add stagit
+</code></pre>
+<p>
+<code>httpd.conf(5)</code>の<code>server "git.mtkn.jp"</code>の中に以下の設定を追加する(<code>location</code>のマッチは上から順番に評価されるので、上で設定したgitのhttpクライアント用の<code>location</code>よりも下に記入する):
+</p>
+<pre><code> location "/" {
+ directory index index.html
+ root "/htdocs/git.mtkn.jp"
+ }
+ location "*" {
+ directory index log.html
+ root "/htdocs/git.mtkn.jp"
+ }
+</code></pre>
+<p>
+stagit用のディレクトリを作成して<code>httpd(8)</code>を再読込する:
+</p>
+<pre><code># mkdir /var/www/htdocs/git.mtkn.jp
+# chown git:git /var/www/htdocs/git.mtkn.jp
+# rcctl reload httpd
+</code></pre>
+
+<p>
+gitリポジトリが更新されたときにウェブページも更新するように設定する。gitリポジトリはなにか更新があった場合、そのリポジトリのディレクトリの中の<code>hooks/post-receive</code>というファイルを自動で実行する。そのためこのファイルに、stagitの更新をするスクリプトを書いておけばいい:
+</p>
+<pre><code>#!/bin/sh
+
+git_root="/var/www/git"
+stagit_root="/var/www/htdocs/git.mtkn.jp"
+repo="$(basename "$(pwd)" | sed 's/\.git$//')"
+src="$(pwd)"
+stagit_dst="$stagit_root/$repo"
+
+mkdir -p "$stagit_dst"
+(cd "$stagit_dst" && stagit -l 64 "$src")
+(cd "$stagit_root" && stagit-index $git_root/*.git > index.html)
+</code></pre>
+
+<h2>レポジトリの作成</h2>
+<p>
+レポジトリを作成するにはサーバーで以下のようにする。</p>
+<pre><code>$ cd /var/www/git
+$ doas -u git mkdir <i>repo</i>.git
+$ cd <i>repo</i>.git
+$ doas -u git git init --bare
+</code></pre>
+
+<p>
+これで手元のパソコンからクローンできる:
+</p>
+<pre><code>$ git clone git@git.mtkn.jp:<i>repo</i>.git
+</code></pre>
+<p>
+または
+</p>
+<pre><code>$ git clone https://git.mtkn.jp/<i>repo</i>.git
+</code></pre>
+
+<h2>参考</h2>
+<ul>
+<li>[1] <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols">Git - The Protocols.Git</a></li>
+<li>[2] <a href="https://git-scm.com/docs/http-protocol">Git - http-protocol Documentation.Git</a></li>
+<li>[3] <a href="https://codemadness.org/stagit.html">Stagit: a static git page generator - Codemadness</a></li>
+</ul>
+ </article>
+
+ </main>
+ <footer>
+ <address>info(at)mtkn(dot)jp</address>
+ <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a>
+ </footer>
+</body>
+</html>
diff --git a/pub/computer/index.html b/pub/computer/index.html
@@ -40,13 +40,18 @@ Small is beautiful.
<li><a href="xlib_playground6.html">Xlibで遊んでみる6</a></li>
</ul>
+<h2>サーバー</h2>
+<ul>
+<li><a href="setting_up_web_server.html">Webサーバーの設定</a></li>
+<li><a href="mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li>
+<li><a href="git_server.html">Gitサーバーの設定 on OpenBSD</a></li>
+</ul>
+
<h2>MISC</h2>
<ul>
<li><a href="what-i-use.html">使用しているソフトウェア、ハードウェア</a></li>
<li><a href="archlinux_installation.html">Arch Linuxインストール</a></li>
<li><a href="rtx1200-qos.html">ルーター(RTX1200)のQoS機能を利用して帯域を制限した</a></li>
-<li><a href="setting_up_web_server.html">Webサーバーの設定</a></li>
-<li><a href="mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li>
</ul>
</article>
diff --git a/pub/draft/git_server.html b/pub/draft/git_server.html
@@ -1,206 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width,initial-scale=1">
- <link rel="stylesheet" type="text/css" href="/style.css">
- <link rel="icon" type="image/x-icon" href="/pics/favicon.ico">
- <title>Gitサーバーの設定 on OpenBSD</title>
-</head>
-<body>
- <header>
- <a href="/">主頁</a> |
- <a href="/about.html">自己紹介</a> |
- <a href="/journal">日記</a> |
- <a href="/farm">農業</a> |
- <a href="/kitchen">台所</a> |
- <a href="/computer">電算機</a> |
- <a href="/poetry">詩</a> |
- <a href="/books">本棚</a> |
- <a href="/gallery">絵</a> |
- <a href="https://git.mtkn.jp">Git</a>
- </header>
- <main>
- <article>
-<h1>Gitサーバーの設定 on OpenBSD</h1>
-<time>2024-02-14</time>
-
-<h2>はじめに</h2>
-<p>
-GitHubがMicrosoft傘下になり久しい。MincraftがMicrosoftアカウントなしでは遊べなくなった。このままではGitHubもそのうちMicrosoftアカウントを要求するようになるかもしれない。ということでGitサーバーを自前で持つことにした。</p>
-
-<h2>手順</h2>
-<p>
-以下ではssh接続によるpull/push及び、httpsによるpullを設定する。
-<h3>概要</h3>
-<ol>
-<li>ドメインの設定(任意)</li>
-<li><code>httpd(8)</code>の設定</li>
-<li>gitパッケージのインストールとchroot環境の整備</li>
-</ol>
-
-<h3>ドメインの設定(任意)</h3>
-<p>
-ドメインを設定する。IPアドレスでアクセスできればいいならこの工程はいらない。</p>
-<p>
-今回はgitというサブドメインを登録した:
-</p>
-<table>
-<thead>
-<tr>
-<th>サブドメイン</th>
-<th>種別</th>
-<th>内容</th>
-<th>優先度</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>git</td>
-<td>A</td>
-<td><i>サーバーのIPアドレス</i></td>
-<td></td>
-</tr>
-</tbody>
-</table>
-
-<h3><code>httpd(8)</code>の設定</h3>
-<p>
-httpsで接続する場合、<code>acme-client(8)</code>を設定する。まず<code>/etc/acme-client.conf</code>にドメインを追加する:
-</p>
-<pre><code>domain git.mtkn.jp {
- domain key "/etc/ssl/private/git.mtkn.jp.key"
- domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
- sign with letsencrypt
-}
-</code></pre>
-
-<p>
-続いて<code>/etc/httpd.conf</code>を設定する。</p>
-<pre><code>server "git.mtkn.jp" {
- listen on * port 80
- location "/.well-known/acme-challenge/*" {
- root "/acme"
- request strip 2
- }
- location "*" {
- block return 302 "https://$HTTP_HOST$REQUEST_URI"
- }
-}
-
-server "git.mtkn.jp" {
- listen on * tls port 443
- tls {
- certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
- key "/etc/ssl/private/git.mtkn.jp.key"
- }
- location "/.well-known/acme-challenge/*" {
- root "/acme"
- request strip 2
- }
- location "/*/git-receive-pack" {
- block
- }
- location "/*/git-upload-pack" {
- fastcgi {
- param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
- param GIT_PROJECT_ROOT "/git"
- param GIT_HTTP_EXPORT_ALL "true"
- }
- }
- location "/*/info/refs" {
- fastcgi {
- param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
- param GIT_PROJECT_ROOT "/git"
- param GIT_HTTP_EXPORT_ALL "true"
- }
- }
-}
-</code></pre>
-<p>
-<code>location "/*/git-receive-pack"</code>はpushの設定。今回はhttpsでのpushを受付けないので<code>block</code>する。</p>
-<p>
-<code>location "/*/git-upload-pack"</code>は手元のパソコンから<code>git clone</code>や<code>git pull</code>したときのもの。<code>location "/*/info/refs"</code>は上記を含むアクセスがあったときのもの。ここではCGIを使って<code>git-http-backend</code>を呼んでいるだけである。<code>SCRIPT_FILENAME</code>は<code>httpd(8)</code>のchroot環境でのパスである。必要なファイルは後でこのchroot環境にコピーする。
-</p>
-<p>
-httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけでいい。
-</p>
-<p>
-<code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する:
-</p>
-<pre><code># echo httpd_flags= >> /etc/rc.conf.local
-# echo slowcgi_flags= >> /etc/rc.conf.local
-# rcctl start httpd
-# rcctl enable httpd
-# rcctl start slowcgi
-# rcctl enable slowcgi
-</code></pre>
-<p>
-サーバー証明書の発行:
-</p>
-<pre><code># acme-client -b git.mtkn.jp
-</code></pre>
-<p>
-<code>crontab(1)</code>にサーバー証明書の自動更新を登録:
-</p>
-<pre><code>#minute hour mday month wday [flags] command
-~ 2 * * * acme-client git.mtkn.xyz && rcctl reload httpd
-</code></pre>
-
-<h3>gitパッケージのインストールとchroot環境の整備</h3>
-<p>
-gitパッケージをインストールし、ssh接続用のユーザーを作成する。httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>下にする:
-</p>
-<pre><code># pkg_add git
-# useradd -b /var/www -m -s /usr/local/bin/git-shell git
-</code></pre>
-<p>
-ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。セキュリティ大丈夫かこれ。一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>。</p>
-
-<p>
-httpsでアクセスするためにchroot環境を整備する。<code>httpd(8)</code>は既定では/var/wwwにchrootして実行されるので、CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。まずはgitのコマンドをコピー:
-</p>
-<pre><code># mkdir -p /var/www/usr/local/libexec/git
-# cp /usr/local/libexec/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/
-# mkdir -p /var/www/usr/local/bin
-# cp /usr/local/bin/git /var/www/usr/local/bin/
-</code></pre>
-<p>
-続いてコマンドの実行に必要なライブラリをコピー:
-</p>
-<pre><code># mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec
-# find /var/www/{bin,usr} -type f | grep git | xargs ldd | awk '{print $7}' | grep -v -e '^/var/www/' -e '^$' -e 'Name' | sort | uniq | awk '{printf "cp %s /var/www%s\ n", $1, $1}' | sh -s
-</code></pre>
-<p>
-<code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照):
-</p>
-<pre><code># mkdir /var/www/dev
-# mknod -m 666 /var/www/dev/null c 2 2
-</code></pre>
-<p>
-最後に、<code>/var/www/dev/null</code>を作成するために<code>/etc/fstab</code>の<code>/var</code>エントリーから<code>nodev</code>オプションを削除し、再起動する。
-</p>
-
-<h2>レポジトリの作成</h2>
-<p>
-レポジトリを作成するにはサーバーで以下のようにする。</p>
-<pre><code>$ cd /var/www/git
-$ doas -u git mkdir <i>repo</i>.git
-$ cd <i>repo</i>.git
-$ doas -u git git init --bare
-</code></pre>
-
-<p>
-これで手元のパソコンからクローンできる:
-</p>
-<pre><code>$ git clone https://git.mtkn.jp:<i>repo</i>.git
-</code></pre>
- </article>
-
- </main>
- <footer>
- <address>info(at)mtkn(dot)jp</address>
- <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a>
- </footer>
-</body>
-</html>
diff --git a/pub/index.html b/pub/index.html
@@ -33,6 +33,7 @@
<h2>更新履歴</h2>
<a href="/rss.xml">RSS</a>
<ul>
+<li>2024-02-15 <a href="/computer/git_server.html">Gitサーバーの設定 on OpenBSD</a></li>
<li>2024-02-09 <a href="/kitchen/recipe/miso.html">味噌</a></li>
<li>2024-01-19 <a href="/computer/mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li>
<li>2024-01-11 <a href="/computer/what-i-use.html">使用しているハードウェア、ソフトウェア</a></li>
diff --git a/pub/rss.xml b/pub/rss.xml
@@ -5,10 +5,284 @@
<description>ウェブページの更新履歴</description>
<language>ja-jp</language>
<link>https://www.mtkn.jp</link>
-<lastBuildDate>Wed, 14 Feb 2024 13:29:25 +0900</lastBuildDate>
-<pubDate>Wed, 14 Feb 2024 13:29:25 +0900</pubDate>
+<lastBuildDate>Thu, 15 Feb 2024 15:42:57 +0900</lastBuildDate>
+<pubDate>Thu, 15 Feb 2024 15:42:57 +0900</pubDate>
<docs>https://www.rssboard.org/rss-specification</docs>
<item>
+<title>Gitサーバーの設定 on OpenBSD</title>
+<link>https://www.mtkn.jp/computer/git_server.html</link>
+<guid>https://www.mtkn.jp/computer/git_server.html</guid>
+<pubDate>Thu, 15 Feb 2024 00:00:00 +0900</pubDate>
+<description><![CDATA[<h1>Gitサーバーの設定 on OpenBSD</h1>
+<time>2024-02-15</time>
+
+<h2>はじめに</h2>
+<p>
+GitHubがMicrosoft傘下になり久しい。MincraftがMicrosoftアカウントなしでは遊べなくなった。このままではGitHubもそのうちMicrosoftアカウントを要求するようになるかもしれない。ということでGitサーバーを自前で持つことにした。</p>
+<p>
+ところでOpenBSDの開発者がGotという別のgit実装を作成しているので、この記事は近いうちにいらなくなりそう。
+</p>
+
+<h2>手順</h2>
+<p>
+以下ではssh接続によるpull/push及び、httpsによるpullを設定の上、stagitというウェブフロントエンドを導入する。
+</p>
+
+<h3>概要</h3>
+<ol>
+<li>ドメインの設定(任意)</li>
+<li><code>httpd(8)</code>の設定</li>
+<li>gitパッケージのインストールとchroot環境の整備</li>
+<li>stagitの導入</li>
+</ol>
+
+<h3>ドメインの設定(任意)</h3>
+<p>
+ドメインを設定する。IPアドレスでアクセスできればいいならこの設定はいらない。</p>
+<p>
+今回はgitというサブドメインを登録した:
+</p>
+<table>
+<thead>
+<tr>
+<th>サブドメイン</th>
+<th>種別</th>
+<th>内容</th>
+<th>優先度</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>git</td>
+<td>A</td>
+<td><i>サーバーのIPアドレス</i></td>
+<td></td>
+</tr>
+</tbody>
+</table>
+
+<h3><code>httpd(8)</code>の設定</h3>
+<p>
+httpsで接続する場合、<code>acme-client(8)</code>を設定する(IPアドレスで接続するなら自己証明書を発行することになる)。まず<code>/etc/acme-client.conf</code>にドメインを追加する:
+</p>
+<pre><code>domain git.mtkn.jp {
+ domain key "/etc/ssl/private/git.mtkn.jp.key"
+ domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
+ sign with letsencrypt
+}
+</code></pre>
+
+<p>
+続いて<code>/etc/httpd.conf</code>を設定する。</p>
+<pre><code>server "git.mtkn.jp" {
+ listen on * port 80
+ location "/.well-known/acme-challenge/*" {
+ root "/acme"
+ request strip 2
+ }
+ location "*" {
+ block return 302 "https://$HTTP_HOST$REQUEST_URI"
+ }
+}
+
+server "git.mtkn.jp" {
+ listen on * tls port 443
+ tls {
+ certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
+ key "/etc/ssl/private/git.mtkn.jp.key"
+ }
+ location "/.well-known/acme-challenge/*" {
+ root "/acme"
+ request strip 2
+ }
+ location "/*/git-receive-pack" {
+ block
+ }
+ location "/*/git-upload-pack" {
+ fastcgi {
+ param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
+ param GIT_PROJECT_ROOT "/git"
+ param GIT_HTTP_EXPORT_ALL "true"
+ }
+ }
+ location "/*/info/refs" {
+ fastcgi {
+ param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
+ param GIT_PROJECT_ROOT "/git"
+ param GIT_HTTP_EXPORT_ALL "true"
+ }
+ }
+}
+</code></pre>
+<p>
+<code>location "/*/git-receive-pack"</code>はpushの設定。今回はhttpsでのpushを受付けないので<code>block</code>する。</p>
+<p>
+<code>location "/*/git-upload-pack"</code>は手元のパソコンから<code>git clone</code>や<code>git pull</code>したときのもの。<code>location "/*/info/refs"</code>は上記を含むアクセスがあったときのもの。ここではCGIを使って<code>git-http-backend</code>を呼んでいるだけである。<code>SCRIPT_FILENAME</code>は<code>httpd(8)</code>のchroot環境でのパスである。必要なファイルは後でこのchroot環境にコピーする。
+</p>
+<p>
+この後同じURLでフロントエンドをホストしたいので、上記のように必要なURLからのみCGIを実行するようにした。gitのhttpクライアントがどのURLを利用しているのかは[2]に書いていた。</p>
+
+
+
+<p>
+httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけでいい。
+</p>
+<p>
+<code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する:
+</p>
+<pre><code># echo httpd_flags= >> /etc/rc.conf.local
+# echo slowcgi_flags= >> /etc/rc.conf.local
+# rcctl start httpd
+# rcctl enable httpd
+# rcctl start slowcgi
+# rcctl enable slowcgi
+</code></pre>
+<p>
+サーバー証明書の発行:
+</p>
+<pre><code># acme-client -v git.mtkn.jp
+</code></pre>
+<p>
+<code>crontab(1)</code>にサーバー証明書の自動更新を登録:
+</p>
+<pre><code>#minute hour mday month wday [flags] command
+~ 2 * * * acme-client git.mtkn.jp && rcctl reload httpd
+</code></pre>
+
+<h3>gitパッケージのインストールとchroot環境の整備</h3>
+<p>
+gitパッケージをインストールし、ssh接続用のユーザーを作成する。httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>下にする:
+</p>
+<pre><code># pkg_add git
+# useradd -b /var/www -m -s /usr/local/bin/git-shell git
+</code></pre>
+<p>
+ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。ところでこのファイルに公開鍵を書き込むとgitユーザーとしてsshでログインできるので、部外者がこのファイルの編集をできないようにしておく必要がある。一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>なので大丈夫だと思うが、心配なら<code>httpd(8)</code>のchroot環境の外にこのファイルを移動させておいてもいいかもしれない。</p>
+<p>
+httpsでアクセスするためにchroot環境を整備する。<code>httpd(8)</code>は既定では<code>/var/www</code>にchrootして実行されるので、CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。まずはgitのコマンドをコピー:
+</p>
+<pre><code># mkdir -p /var/www/usr/local/libexec/git
+# cp /usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/
+# chown www:www /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack}
+# chmod 0500 /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack}
+# mkdir -p /var/www/usr/local/bin
+# cp /usr/local/bin/git /var/www/usr/local/bin/
+# chown www:www /var/www/usr/local/bin/git
+# chmod 0500 /var/www/usr/local/bin/git
+</code></pre>
+<p>
+続いてコマンドの実行に必要なライブラリをコピー:
+</p>
+<pre><code># mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec
+# find /var/www/{bin,usr} -type f | grep git | xargs ldd | awk '{print $7}' | grep -v -e '^/var/www/' -e '^$' -e 'Name' | sort | uniq | awk '{printf "cp %s /var/www%s && chown www:www /var/www%s && chmod 0400 /var/www%s\n", $1, $1, $1, $1}' | sh -s
+</code></pre>
+<p>
+<code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照):
+</p>
+<pre><code># mkdir /var/www/dev
+# mknod -m 666 /var/www/dev/null c 2 2
+</code></pre>
+<p>
+最後に、<code>/var/www/dev/null</code>を作成するために<code>/etc/fstab</code>の<code>/var</code>エントリーから<code>nodev</code>オプションを削除し、再起動する。
+</p>
+
+<p>
+gitパッケージやシステムの更新後、chroot環境のコマンドやライブラリも更新しないといけないのでそのためのスクリプトを適当に作った:
+</p>
+<pre><code>#!/bin/sh -xe
+
+oso=$(find /var/www/usr -type f -name '*.so*')
+rm $oso
+
+bin=$(find /var/www/bin /var/www/usr -type f ! -name '*.so*' |
+ grep -v bgpctl |
+ sed 's|^/var/www||'
+ )
+echo "$bin" | sed 's|.*|cp & /var/www&|' | sh -s
+echo "$bin" | sed 's|.*|chown www:www /var/www&|' | sh -s
+echo "$bin" | sed 's|.*|chmod 0500 /var/www&|' | sh -s
+
+nso=$(echo "$bin" | sed 's|^|/var/www|' |
+ xargs ldd | awk '{print $7}' |
+ grep -v -e '^/var/www/' -e '^$' -e 'Name' |
+ sort | uniq
+ )
+echo "$nso" | sed 's|.*|cp & /var/www&|' | sh -s
+echo "$nso" | sed 's|.*|chown www:www /var/www&|' | sh -s
+echo "$nso" | sed 's|.*|chmod 0400 /var/www&|' | sh -s
+</code></pre>
+
+<h3><code>stagit(1)</code>の導入</h3>
+<p>
+ウェブフロントエンドとしてstagitを導入する:
+</p>
+<pre><code># pkg_add stagit
+</code></pre>
+<p>
+<code>httpd.conf(5)</code>の<code>server "git.mtkn.jp"</code>の中に以下の設定を追加する(<code>location</code>のマッチは上から順番に評価されるので、上で設定したgitのhttpクライアント用の<code>location</code>よりも下に記入する):
+</p>
+<pre><code> location "/" {
+ directory index index.html
+ root "/htdocs/git.mtkn.jp"
+ }
+ location "*" {
+ directory index log.html
+ root "/htdocs/git.mtkn.jp"
+ }
+</code></pre>
+<p>
+stagit用のディレクトリを作成して<code>httpd(8)</code>を再読込する:
+</p>
+<pre><code># mkdir /var/www/htdocs/git.mtkn.jp
+# chown git:git /var/www/htdocs/git.mtkn.jp
+# rcctl reload httpd
+</code></pre>
+
+<p>
+gitリポジトリが更新されたときにウェブページも更新するように設定する。gitリポジトリはなにか更新があった場合、そのリポジトリのディレクトリの中の<code>hooks/post-receive</code>というファイルを自動で実行する。そのためこのファイルに、stagitの更新をするスクリプトを書いておけばいい:
+</p>
+<pre><code>#!/bin/sh
+
+git_root="/var/www/git"
+stagit_root="/var/www/htdocs/git.mtkn.jp"
+repo="$(basename "$(pwd)" | sed 's/\.git$//')"
+src="$(pwd)"
+stagit_dst="$stagit_root/$repo"
+
+mkdir -p "$stagit_dst"
+(cd "$stagit_dst" && stagit -l 64 "$src")
+(cd "$stagit_root" && stagit-index $git_root/*.git > index.html)
+</code></pre>
+
+<h2>レポジトリの作成</h2>
+<p>
+レポジトリを作成するにはサーバーで以下のようにする。</p>
+<pre><code>$ cd /var/www/git
+$ doas -u git mkdir <i>repo</i>.git
+$ cd <i>repo</i>.git
+$ doas -u git git init --bare
+</code></pre>
+
+<p>
+これで手元のパソコンからクローンできる:
+</p>
+<pre><code>$ git clone git@git.mtkn.jp:<i>repo</i>.git
+</code></pre>
+<p>
+または
+</p>
+<pre><code>$ git clone https://git.mtkn.jp/<i>repo</i>.git
+</code></pre>
+
+<h2>参考</h2>
+<ul>
+<li>[1] <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols">Git - The Protocols.Git</a></li>
+<li>[2] <a href="https://git-scm.com/docs/http-protocol">Git - http-protocol Documentation.Git</a></li>
+<li>[3] <a href="https://codemadness.org/stagit.html">Stagit: a static git page generator - Codemadness</a></li>
+</ul>
+]]></description>
+</item>
+<item>
<title>RP2040 SDKなしでLチカ</title>
<link>https://www.mtkn.jp/computer/rp2040_1.html</link>
<guid>https://www.mtkn.jp/computer/rp2040_1.html</guid>
diff --git a/pub/sitemap.xml b/pub/sitemap.xml
@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+<url><loc>https://www.mtkn.jp/</loc><lastmod>2024-02-15</lastmod></url>
+<url><loc>https://www.mtkn.jp/computer/</loc><lastmod>2024-02-15</lastmod></url>
+<url><loc>https://www.mtkn.jp/computer/git_server.html</loc><lastmod>2024-02-15</lastmod></url>
<url><loc>https://www.mtkn.jp/computer/rp2040_1.html</loc><lastmod>2024-02-10</lastmod></url>
<url><loc>https://www.mtkn.jp/kitchen/recipe/miso.html</loc><lastmod>2024-02-09</lastmod></url>
<url><loc>https://www.mtkn.jp/kitchen/</loc><lastmod>2024-02-09</lastmod></url>
-<url><loc>https://www.mtkn.jp/</loc><lastmod>2024-02-09</lastmod></url>
<url><loc>https://www.mtkn.jp/about.html</loc><lastmod>2024-01-23</lastmod></url>
<url><loc>https://www.mtkn.jp/computer/mailserver.html</loc><lastmod>2024-01-19</lastmod></url>
-<url><loc>https://www.mtkn.jp/computer/</loc><lastmod>2024-01-19</lastmod></url>
<url><loc>https://www.mtkn.jp/computer/what-i-use.html</loc><lastmod>2024-01-13</lastmod></url>
<url><loc>https://www.mtkn.jp/gallery/</loc><lastmod>2024-01-01</lastmod></url>
<url><loc>https://www.mtkn.jp/gallery/20240101.html</loc><lastmod>2024-01-01</lastmod></url>