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