www.mtkn.jp

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

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