Git サーバーをセルフホスティングしてみた

目次

投稿日: 2021-03-27 土

いままでは GitLab.com という Git のホスティングサービスを使用していたが、 web ブラウザの GNU IceCat を使っていると GitLab.com のログイン時に弾かれる問題が発生した。そこで自分で git サーバーをセルフホストしてプログラムを公開すればこの問題がなくなることに気づいたので git サーバーを構築してみた。

1. Git サーバーの構築

ここでは Git サーバーを構築する際に行なったことについて説明する。

1.1. 使用した VPS

海外 VPS の Vultr を使用した。 主な理由は、既に運用している他のサーバーを Vultr で運用していて十分使い慣れているためである。 管理画面は良い感じだしサーバーの性能に対する金銭的なコストも低いので、いまのところ他の VPS に乗り換える予定はない。

1.2. ISO ファイルのアップロード

Vultr には Upload Custom ISOs という機能があり、Vultr 側が用意していない OS でも ISO ファイルをアップロードすれば任意の OS を使用できる。 私は Vultr が用意していない GNU Guix System を使いたいためこの機能を使用した。

ISO ファイルのアップロードには Vultr Object Storage を使用した。GNU Guix System 1.2.0 を GNU Guix のダウンロードページから x86_64 版をダウンロードして、展開してから iso ファイルを Vultr Object Storage にアップロードして公開した。

Add ISO ページに ISO ファイルの公開 URL を入力してアップロードを実行し、完了した後に Vultr Object Storage から ISO ファイルを削除した。

2. サーバーのデプロイ

下記の設定でサーバーをデプロイした。

  • Location: Tokyo
  • Server Type: 上述した方法でアップロードした Guix System 1.2.0 (x86) のインストール用の iso ファイル
  • Server Size: 25 GB SSD
  • Additional Features
    • Enable ipv6: 有効 (ただし Firewall の設定で拒絶している)
    • Enable Auto Backups: 有効
    • Enable Private Networking: 無効
  • Firewall Group: 特定のサーバーの IP から SSH(22番ポート) のみ許可した Firewall Group を使用
  • Server Hostname & Label: 両方とも git

2.1. Guix System 1.2.0 のインストール

Guix System のグラフィカルインストーラーを使用してインストールした。 デスクトップにインストールする場合との違いとして、 Window Manager のインストールをしないことと、ネットワークの設定に使用するパッケージに dhcpcd を選択することくらいである。 どのみち後で /etc/config.scm を変更して guix system reconfigure /etc/config.scm を実行してシステムの設定を行うのでインストール時は適当でよい。

3. Guix System の設定

インストールが終わったら、まず下記を実行して Guix System が参照するリポジトリのバージョンを最新にした。

sudo -i guix pull

プログラムの公開には cgit を利用した。 push する権限については私一人が持つだけで十分なので、ssh 経由で push できるように設定した。 Firewall の設定は Vultr 側で行なっているため、git サーバーでは特に Firewall の設定は行わない。

なぜか Guix の cgit-service-type では listen するポートを 80 番以外に変更できなかったので、 www.tojo.tokyo サーバーでも利用している web サーバーで https で受けて nginx でリバースプロキシして git サーバーへアクセスしている。 https でサーバーにアクセスしているのにバックエンドでは http 通信をしてしまっている状態になっているが、 https://git.tojo.tokyo にはログイン機能など特定のユーザーにのみ表示される画面があるわけでもないので受容した。 余裕があればインターネットを経由せずに、Vultr のプライベートネットワークで通信できるように設定してみようと考えている。

設定ファイルは下記の通りである。この設定ファイルに著作権が生じるのかどうかについては自信がないが、GNU Guix の設定は GPLv3 のモジュールを利用しているため念のため GPLv3 として公開する。

;;; config.scm -- Git server's config
;;; Copyright © 2021 TojoQK <tojoqk@tojo.tokyo>
;;;
;;; This program is free software: you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published by
;;; the Free Software Foundation, either version 3 of the License, or
;;; (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

(use-modules (gnu))
(use-service-modules desktop networking ssh xorg web version-control certbot cgit)

(operating-system
  (locale "ja_JP.utf8")
  (timezone "Asia/Tokyo")
  (keyboard-layout
   (keyboard-layout "us" "altgr-intl"))
  (host-name "git")
  (users (cons* (user-account
                  (name "tojoqk")
                  (comment "TojoQK")
                  (group "users")
                  (home-directory "/home/tojoqk")
                  (supplementary-groups
                    '("wheel" "netdev" "audio" "video")))
                (user-account
                  (name "git")
                  (comment "git")
                  (group "users")
                  (home-directory "/srv/git"))
                %base-user-accounts))
  (packages
    (append
     (list (specification->package "nss-certs")
           (specification->package "git"))
     %base-packages))
  (services
    (append
     (list (service openssh-service-type
                    (openssh-configuration
                      (password-authentication? #f)
                      (authorized-keys
                       `(("tojoqk" ,(local-file "tojoqk.pub"))
                         ("git" ,(local-file "tojoqk.pub"))))))
           (service dhcp-client-service-type)
           (service ntp-service-type)
           (service fcgiwrap-service-type)
           (service cgit-service-type
                    (cgit-configuration
                     (repository-sort "age"))))
     %base-services))
  (bootloader
    (bootloader-configuration
      (bootloader grub-bootloader)
      (target "/dev/vda")
      (keyboard-layout keyboard-layout)))
  (swap-devices
   (list (uuid "fb7d22b0-2aa6-473f-a4c5-ae7fb8f184d3")))
  (file-systems
    (cons* (file-system
             (mount-point "/")
             (device
               (uuid "16036843-ddcf-4c44-afb8-c7adc7b395a4"
                     'ext4))
             (type "ext4"))
           %base-file-systems)))

/etc/config.scm を上記のように変更した後、 guix system reconfigure /etc/config.scm を実行して、git サーバーに設定を反映した。 これで、 Web サーバー側の設定をして Firewall の設定を変更したところ、 https://git.tojo.tokyo で画面にアクセスできるようになった。

4. 今後の予定

4.1. 公開しているプロジェクトの専用ページを作成する

現在は、git が適当に https://git.tojo.tokyo で公開されているだけの状態になってしまっているため、 リリースノートや、tarball を配布するためのページを作成する。

プロジェクトに貢献したいという人やバグを報告したい人が現われた場合は、パッチをメールで送ってもらいレビューして問題なければ Author を設定してコミットする運用にするので、貢献やバグ報告の方法についてもプロジェクトのページに記載する。 プロジェクトが想定を越えて大きくなったらメーリングリストを作成する必要があるかもしれない(おそらくないと思うが……)。

5. git サーバーをセルフホスティングすることの良さ

構築してしばらく使ってみてから気づいたことだが git サーバーをセルフホスティングすると、自分のプロジェクトに対して貢献したいと思う人に特定のサービスの使用を暗黙的に強制しなくて済むという点で良さそうだと思った。

私生活で依存する外部サービスを一つ減らすことができたという意味でも嬉しい。このサイトにはそれぞれの記事の下の方にある「このページのソースコード」というリンクから記事のソースコードを参照したり、更新された記事については記事タイトルのあたりに「更新履歴」のリンクが表示され git の変更履歴を表示する機能がある。いままではこの機能の実現のために GitLab.com 上の画面に遷移するようにしていたが、今は https://git.tojo.tokyo に遷移するように変更されている。

GNU Guix System を使えば簡単に git サーバーを構築できるので、みなさんも構築してみてはいかがだろうか。

著者: Masaya Tojo

Mastodon: @tojoqk

RSS を購読する

トップページに戻る