git_server.html (6603B)
1 <h1>Gitサーバーの設定 on OpenBSD</h1> 2 <time>2024-02-14</time> 3 4 <h2>はじめに</h2> 5 <p> 6 GitHubがMicrosoft傘下になり久しい。\ 7 MincraftがMicrosoftアカウントなしでは遊べなくなった。\ 8 このままではGitHubもそのうちMicrosoftアカウントを要求するように\ 9 なるかもしれない。\ 10 ということでGitサーバーを自前で持つことにした。\ 11 </p> 12 13 <h2>手順</h2> 14 <p> 15 以下ではssh接続によるpull/push及び、httpsによるpullを設定する。 16 <h3>概要</h3> 17 <ol> 18 <li>ドメインの設定(任意)</li> 19 <li><code>httpd(8)</code>の設定</li> 20 <li>gitパッケージのインストールとchroot環境の整備</li> 21 </ol> 22 23 <h3>ドメインの設定(任意)</h3> 24 <p> 25 ドメインを設定する。\ 26 IPアドレスでアクセスできればいいならこの工程はいらない。\ 27 </p> 28 <p> 29 今回はgitというサブドメインを登録した: 30 </p> 31 <table> 32 <thead> 33 <tr> 34 <th>サブドメイン</th> 35 <th>種別</th> 36 <th>内容</th> 37 <th>優先度</th> 38 </tr> 39 </thead> 40 <tbody> 41 <tr> 42 <td>git</td> 43 <td>A</td> 44 <td><i>サーバーのIPアドレス</i></td> 45 <td></td> 46 </tr> 47 </tbody> 48 </table> 49 50 <h3><code>httpd(8)</code>の設定</h3> 51 <p> 52 httpsで接続する場合、<code>acme-client(8)</code>を設定する。\ 53 まず<code>/etc/acme-client.conf</code>にドメインを追加する: 54 </p> 55 <pre><code>\ 56 domain git.mtkn.jp { 57 domain key "/etc/ssl/private/git.mtkn.jp.key" 58 domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" 59 sign with letsencrypt 60 } 61 </code></pre> 62 63 <p> 64 続いて<code>/etc/httpd.conf</code>を設定する。\ 65 </p> 66 <pre><code>\ 67 server "git.mtkn.jp" { 68 listen on * port 80 69 location "/.well-known/acme-challenge/*" { 70 root "/acme" 71 request strip 2 72 } 73 location "*" { 74 block return 302 "https://$HTTP_HOST$REQUEST_URI" 75 } 76 } 77 78 server "git.mtkn.jp" { 79 listen on * tls port 443 80 tls { 81 certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" 82 key "/etc/ssl/private/git.mtkn.jp.key" 83 } 84 location "/.well-known/acme-challenge/*" { 85 root "/acme" 86 request strip 2 87 } 88 location "/*/git-receive-pack" { 89 block 90 } 91 location "/*/git-upload-pack" { 92 fastcgi { 93 param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" 94 param GIT_PROJECT_ROOT "/git" 95 param GIT_HTTP_EXPORT_ALL "true" 96 } 97 } 98 location "/*/info/refs" { 99 fastcgi { 100 param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" 101 param GIT_PROJECT_ROOT "/git" 102 param GIT_HTTP_EXPORT_ALL "true" 103 } 104 } 105 } 106 </code></pre> 107 <p> 108 <code>location "/*/git-receive-pack"</code>はpushの設定。\ 109 今回はhttpsでのpushを受付けないので<code>block</code>する。\ 110 </p> 111 <p> 112 <code>location "/*/git-upload-pack"</code>は手元のパソコンから\ 113 <code>git clone</code>や<code>git pull</code>したときのもの。\ 114 <code>location "/*/info/refs"</code>は上記を含むアクセスがあったときのもの。\ 115 ここではCGIを使って<code>git-http-backend</code>を呼んでいるだけである。\ 116 <code>SCRIPT_FILENAME</code>は<code>httpd(8)</code>のchroot環境でのパスである。\ 117 必要なファイルは後でこのchroot環境にコピーする。 118 </p> 119 <p> 120 httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけ\ 121 でいい。 122 </p> 123 <p> 124 <code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する: 125 </p> 126 <pre><code>\ 127 # echo httpd_flags= >> /etc/rc.conf.local 128 # echo slowcgi_flags= >> /etc/rc.conf.local 129 # rcctl start httpd 130 # rcctl enable httpd 131 # rcctl start slowcgi 132 # rcctl enable slowcgi 133 </code></pre> 134 <p> 135 サーバー証明書の発行: 136 </p> 137 <pre><code>\ 138 # acme-client -b git.mtkn.jp 139 </code></pre> 140 <p> 141 <code>crontab(1)</code>にサーバー証明書の自動更新を登録: 142 </p> 143 <pre><code>\ 144 #minute hour mday month wday [flags] command 145 ~ 2 * * * acme-client git.mtkn.xyz && rcctl reload httpd 146 </code></pre> 147 148 <h3>gitパッケージのインストールとchroot環境の整備</h3> 149 <p> 150 gitパッケージをインストールし、ssh接続用のユーザーを作成する。\ 151 httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>\ 152 下にする: 153 </p> 154 <pre><code>\ 155 # pkg_add git 156 # useradd -b /var/www -m -s /usr/local/bin/git-shell git 157 </code></pre> 158 <p> 159 ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。\ 160 セキュリティ大丈夫かこれ。\ 161 一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>。\ 162 </p> 163 164 <p> 165 httpsでアクセスするためにchroot環境を整備する。\ 166 <code>httpd(8)</code>は既定では/var/wwwにchrootして実行されるので、\ 167 CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。\ 168 まずはgitのコマンドをコピー: 169 </p> 170 <pre><code>\ 171 # mkdir -p /var/www/usr/local/libexec/git 172 # cp /usr/local/libexec/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/ 173 # mkdir -p /var/www/usr/local/bin 174 # cp /usr/local/bin/git /var/www/usr/local/bin/ 175 </code></pre> 176 <p> 177 続いてコマンドの実行に必要なライブラリをコピー: 178 </p> 179 <pre><code>\ 180 # mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec 181 # 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 182 </code></pre> 183 <p> 184 <code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照): 185 </p> 186 <pre><code>\ 187 # mkdir /var/www/dev 188 # mknod -m 666 /var/www/dev/null c 2 2 189 </code></pre> 190 <p> 191 最後に、<code>/var/www/dev/null</code>を作成するために\ 192 <code>/etc/fstab</code>の<code>/var</code>エントリーから\ 193 <code>nodev</code>オプションを削除し、再起動する。 194 </p> 195 196 <h2>レポジトリの作成</h2> 197 <p> 198 レポジトリを作成するにはサーバーで以下のようにする。\ 199 </p> 200 <pre><code>\ 201 $ cd /var/www/git 202 $ doas -u git mkdir <i>repo</i>.git 203 $ cd <i>repo</i>.git 204 $ doas -u git git init --bare 205 </code></pre> 206 207 <p> 208 これで手元のパソコンからクローンできる: 209 </p> 210 <pre><code>\ 211 $ git clone https://git.mtkn.jp:<i>repo</i>.git 212 </code></pre>