www.mtkn.jp

Manuscripts for my personal webpage.
git clone https://git.mtkn.jp/www.mtkn.jp
Log | Files | Refs | LICENSE

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= &gt;&gt; /etc/rc.conf.local
    132 # echo slowcgi_flags= &gt;&gt; /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>