Raspberry Pi 5 で Git システム Forgejo を動かす - Linux 使いになりたい人向け
はじめに
これは、Linux 使いになりたい人向けに Raspberry Pi 5 で Git リポジトリ管理システム Forgejo を動かす環境を構築する方法を解説するものです。Raspberry Pi 5 を入手できたので、勢いで用意してみました。
Raspberry Pi 5 の箱
在庫がなくなりそうな中、手を震わせながら急いでポチりました。CPU が結構な温度になるので、冷却ファンは必須だという印象ですが、まだケースは購入していないので、むきだしで使います。
Raspberry Pi 5
ここで使用する Raspberry Pi 5 の仕様は次のものを前提とします。
項目 | 内容 |
---|---|
OS | Raspberry Pi OS 2023-12-05 版 |
メモリ | 8 GB |
microSD | 16 GB |
ここでは、自己署名のサーバー証明書による HTTPS 対応の Forgejo を用意します。SSH クローンもできるようにします。
最初に、Raspberry Pi OS のインストールは済ませてあるとします。また、ホスト名は pi5
と設定してあるとします。
参考までに、今回使用した環境についての説明は「Raspberry Pi OS」として最後の方に用意してあります。
Git リポジトリ管理システム Forgejo
Git リポジトリ管理システムを動かしたいので、Forgejo をインストールします。公式のドキュメントには Installation from binary にインストールについての説明があります。これに従います。
なお、SSH を使うにあたっては、OpenSSH サーバーを使うか、Forgejo のビルトイン SSH サーバーを使うかという選択肢があります。ここでは Raspberry Pi OS をインストールするときに SSH を有効として OpenSSH サーバーが動くようにしてあるので、これをそのまま使うことにします。
forgejo ファイルのダウンロード
まず、必要なファイルをダウンロードします。実行するコマンドは次のようになります。
DL_BASE=https://codeberg.org/forgejo/forgejo/releases/download
DL_FILE=${DL_BASE}/v1.21.5-0/forgejo-1.21.5-0-linux-arm64
curl -o forgejo ${DL_FILE}
curl -o forgejo.asc ${DL_FILE}
chmod +x forgejo
ダウンロードした forgejo.asc
を使って forgejo
ファイルが正しいものだということをチェックします。最初の gpg
コマンドで所有者が署名に使った鍵の公開鍵を入手します。それから gpg --verify
コマンドで検証します。
gpg --keyserver keys.openpgp.org --recv EB114F5E6C0DC2BCDD183550A4B61A2DC5923710
gpg --verify forgejo.asc forgejo
実際の実行結果は次のようになります。
pi@pi5: ~$ DL_BASE=https://codeberg.org/forgejo/forgejo/releases/download
pi@pi5: ~$ DL_FILE=${DL_BASE}/v1.21.5-0/forgejo-1.21.5-0-linux-arm64
pi@pi5: ~$ curl -o forgejo ${DL_FILE}
(略)
pi@pi5: ~$ chmod +x forgejo
pi@pi5: ~$ gpg --keyserver keys.openpgp.org --recv EB114F5E6C0DC2BCDD183550A4B61A2DC5923710
gpg: ディレクトリ'/home/pi/.gnupg'が作成されました
gpg: keybox'/home/pi/.gnupg/pubring.kbx'が作成されました
gpg: /home/pi/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵A4B61A2DC5923710: 公開鍵"Forgejo <(略)>"をインポートしました
gpg: 処理数の合計: 1
gpg: インポート: 1
pi@pi5: ~$ curl -o forgejo.asc ${DL_FILE}
(略)
pi@pi5: ~$ gpg --verify forgejo.asc forgejo
gpg: 2024年02月01日 04時43分24秒 JSTに施された署名
gpg: EDDSA鍵EB114F5E6C0DC2BCDD183550A4B61A2DC5923710を使用
gpg: "Forgejo <(略)>"からの正しい署名 [不明の]
gpg: 別名"Forgejo Releases <release@forgejo.org>" [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg: この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガープリント: EB11 4F5E 6C0D C2BC DD18 3550 A4B6 1A2D C592 3710
ここで、検証の結果で gpg: "Forgejo <(略)>"からの正しい署名 [不明の]
と表示されているので大丈夫です。信用できる署名で証明されていませんが、本家のサイトの指示通りに作業しているため、サイトの改ざん、ファイルの改ざん、署名に使われた鍵の改ざんのすべてがされる確率は低いはずなので、大丈夫だと判断しています。
git ユーザーの用意
Forgejo を動かすための Linux ユーザーとして git ユーザーを追加します。
sudo adduser --system --shell /bin/bash \
--gecos 'Git Version Control' \
--group --disabled-password --home /home/git git
forgejo
コマンドのインストール
ファイルをダウンロードして確認したら、/usr/local/bin
へインストールします。また、必要な git
関連のパッケージもインストールします。
sudo apt-get -y install git git-lfs
sudo cp forgejo /usr/local/bin/forgejo
sudo chmod 755 /usr/local/bin/forgejo
Forgejo が使用するディレクトリの用意
Forgejo が使用するディレクトリを用意します。具体的には /var/lib/forgejo
と /etc/forgejo
があり、コマンドは次のようになります。
sudo mkdir /var/lib/forgejo
sudo chown git:git /var/lib/forgejo && sudo chmod 750 /var/lib/forgejo
sudo mkdir /etc/forgejo
sudo chown root:git /etc/forgejo && sudo chmod 770 /etc/forgejo
forgejo サービス用ファイルの用意
サービス用のファイルをダウンロードします。Forgejo の DB について SQLite3 を使う場合は、これをそのまま使って大丈夫です。他の DB を使う場合は変更が必要です。
pi@pi5:/opt $ sudo curl -o /etc/systemd/system/forgejo.service \
https://codeberg.org/forgejo/forgejo/raw/branch/forgejo/contrib/systemd/forgejo.service
以上でインストールのための準備は終了です。
forgejo サービスの有効化と開始
インストールのための準備ができたら、サービスを有効化してから、開始します。
sudo systemctl enable forgejo.service
sudo systemctl start forgejo.service
まずはステータスを確認します。
sudo systemctl status forgejo.service
次のような結果になっていて、Active: active (running)
が表示されていれば大丈夫です。
● forgejo.service - Forgejo (Beyond coding. We forge.)
Loaded: loaded (/etc/systemd/system/forgejo.service; enabled; preset: enabled)
Active: active (running) since Sun 2024-02-18 16:21:18 JST; 36min ago
Main PID: 4292 (forgejo)
Tasks: 12 (limit: 9250)
CPU: 3.339s
CGroup: /system.slice/forgejo.service
└─4292 /usr/local/bin/forgejo web --config /etc/forgejo/app.ini
Forgejo の初期設定は http://pi5.local:3000/ へ Web ブラウザでアクセスして行います。
もしきちんと動いていなかった場合は、journalctl
コマンドを使ってログを確認します。
sudo journalctl -n 100 --unit forgejo.service
Forgejo の設定
Forgejo の初期設定から、アカウント登録、リポジトリの作成、HTTP の URL のリポジトリをクローンをするところまで説明します。
初期設定
Forgejo の初期設定をする画面が表示されたら、DB には SQLite3 を使う指定をします。使用するパス、実行ユーザーなどを確認します。
Forgejo 初期設定画面 その1
スクロールして、「アップデートチェッカーを有効にする」にチェックをいれます。
Forgejo 初期設定画面 その2
それから「Forgejo をインストール」をクリックします。しばらくすると、Forgejo のインストールが完了してトップページに遷移します。
アカウント登録とリポジトリ作成
右上の「登録」をクリックしてアカウントを登録する画面とします。ここでは pi ユーザーを登録します。
Forgejo へ pi ユーザーを登録
アカウントを登録すると自動ログインするので、リポジトリを作成します。右上の「+」をクリックして表示されるメニューで「新しいリポジトリ」をクリックします。
Forgejo リポジトリの作成
作成するリポジトリは「proj001」とし、「リポジトリをプライベートにする」にチェックを入れます。
Forgejo リポジトリ proj001 の作成
スクロールして、「リポジトリの初期設定」にチェックを入れたら「リポジトリを作成」をクリックします。
Forgejo 「リポジトリを作成」をクリック
http://pi5.local:3000/pi/proj001 を開いてリポジトリの URL を確認します。
Forgejo リポジトリの URL を確認
リポジトリの HTTP クローン
ターミナルアプリから、リポジトリのクローンを試します。
git clone http://pi5.local:3000/pi/proj001.git
クローン時に認証情報の入力を求められます。Forgejo へ登録した pi ユーザーの認証情報でクローンできます。
SSH の設定
Forgejo のリポジトリについて SSH クローンができるようにします。
SSH キーペアの作成
pi ユーザーについて、Forgejo へ SSH の公開鍵を登録します。そのために Raspberry Pi OS のターミナルアプリ(端末アプリ)を起動し、ssh-keygen
コマンドでキーペアを作成します。
pi@pi5:~ $ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/pi/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/pi/.ssh/id_ed25519
Your public key has been saved in /home/pi/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:UCjW6LQSYHc1Xtl+PGS2OG7rC7g8ApA/uENjf4bWOhI pi@pi5
The key's randomart image is:
+--[ED25519 256]--+
|.o . +.+..o |
|. o * +.o. . + |
| .= o.. . * . |
| o. o . + = |
| +. S . o . |
| E + . o |
|o = = . .. . |
| + = =... .. |
| +.= .o. .o. |
+----[SHA256]-----+
作成されたファイルのうち、~/.ssh/id_ed25519.pub
の内容を Forgejo の pi ユーザーの SSH 公開鍵として登録します。cat
コマンドで内容を確認しておきます。
pi@pi5:~ $ cat .ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBLz6uecLO8HfUCwbmAtROXvwftx+cEKJSOqr9MUDJ7h pi@pi5
SSH キーの登録
Forgejo の http://pi5.local:3000/user/settings/keys を開いて「キーを追加」をクリックして、pi ユーザーの SSH 公開鍵を追加します。
Forgejo SSH キーの登録
pi ユーザーの SSH 公開鍵が追加されると、「SSH キーの管理」の一覧に表示されます。
Forgejo 登録されたキーの一覧表示
http://pi5.local:3000/pi/proj001 を開いて、SSH クローンをするときに使うリポジトリの URL を確認します。URL の欄にある「SSH」をクリックします。
Forgejo 登録されたキーの一覧表示
SSH クローンの動作確認
SSH 公開鍵の登録と URL を確認したら、git clone
コマンドでクローンができることを確認します。すでにクローンした proj001
は削除てから確認します。
git clone git@pi5.local:pi/proj001.git
実際に実行したときの結果は次のようになります。
pi@pi5:~ $ rm -fr proj001/
pi@pi5:~ $ git clone git@pi5.local:pi/proj001.git
Cloning into 'proj001'...
The authenticity of host 'pi5.local (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:Nm4JCdVdVre4QgS2dFET96mVGLHe+OrJ3YsuR633yzM.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'pi5.local' (ED25519) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
HTTPS 対応
続いて HTTPS へ対応します。ここでは簡単に実現できる自己署名のサーバー証明書を使います。
自己署名のサーバー証明書
自己署名のサーバー証明書であれば、forgejo cert
コマンドで簡単に作成することができます。次の例では pi5.local
用に4年間有効なサーバー証明書を作成しています。
forgejo cert -duration=35040h0m0s -host=pi5.local
実行結果は次のようになります。
$ forgejo cert -duration=35040h0m0s -host=pi5.local
2024/02/18 16:12:02 Written cert.pem
2024/02/18 16:12:02 Written key.pem
作成したファイルは /var/lib/forgejo/custom
へ置きます。
sudo mkdir /var/lib/forgejo/custom
sudo mv *.pem /var/lib/forgejo/custom/
sudo chown -R git:git /var/lib/forgejo/custom/
作成したサーバー証明書関連のファイルについて、/etc/forgejo/app.ini
へ CERT_FILE
と KEY_FILE
の設定を追加します。また、HTTPS のための設定として、ROOT_URL
を https のものとし、PROTOCOL
に https を指定します。
[server]
(略)
ROOT_URL = https://pi5.local:3000/
PROTOCOL = https
CERT_FILE = cert.pem
KEY_FILE = key.pem
(略)
設定を反映するために forgejo
サービスを再起動します。
sudo systemctl restart forgejo
これで Forgejo 用の URL が HTTPS 対応となりました。
HTTPS の動作確認
HTTPS の動作確認をするために、今度は https://pi5.local:3000/ へアクセスしましょう。ここでは Chrome を使って確認してみます。警告がでますが、自分で設定したものなので大丈夫です。
Forgejo HTTPS の URL へアクセスしたときの画面
「詳細設定」をクリックすると、「pi5.local へアクセスする(安全ではありません)」のリンクが表示されます。
Forgejo 「pi5.local へアクセスする(安全ではありません)」のリンク
自分で設定して用意した Web システムなので安全です。「pi5.local へアクセスする(安全ではありません)」のリンクをクリックすると HTTPS 対応の Forgejo のトップページになります。
Forgejo 保護されていない通信
サーバー証明書が自己署名なので、Chrome では「保護されていない通信」と赤く表示されますが、HTTPS を使った暗号化通信にはなっています。
SSH クローンの動作確認
Web ブラウザで Forgejo へログインして使えることを確認したら、ターミナルアプリ(端末アプリ)に戻って proj001 のクローンをしなおします。すでにクローンした proj001
は削除してから確認します。
サーバー証明書が自己署名なので、妥当性検証を無効化して git clone
コマンドを実行する必要があります。そのためには GIT_SSL_NO_VERIFY=1
を指定してコマンドを実行します。
GIT_SSL_NO_VERIFY=1 git clone https://pi5.local:3000/pi/proj001
実際の実行結果は次のようになります。
pi@pi5:~ $ rm -fr proj001
pi@pi5:~ $ GIT_SSL_NO_VERIFY=1 git clone https://pi5.local:3000/pi/proj001
Cloning into 'proj001'...
Username for 'https://pi5.local:3000': pi
Password for 'https://pi@pi5.local:3000':
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
以上で、Raspberry Pi 5 で Forgejo が使えるようになりました。
やはり Raspberry Pi OS の方は、メインで使うマシンではないのと、何かあっても microSD カードを作り直せば良いという手軽さがあって楽ですね。また、インストールの説明も Windows 版よりわかりやすいため、設定上の心配事がほとんどなく作業ができました。
この後、forgejo/runner か Woodpecker CI を動かしてみる予定です。Gitea for Windows より先に Raspberry Pi OS の Forgejo で runner を動かしてみた方が楽そうだという印象を持っています。
Raspberry Pi OS
ここでは、今回使用した Raspberry Pi OS の環境について、インストールから初期設定まで説明します。
インストール用 microSD カードの作成
Raspberry Pi OS のインストールから説明します。自分は、Linux を使っているので Raspberry Pi OS インストール用 microSD カードの作成をするためには、rpi-imager
を起動します。
rpi-imager
画面は次のようになります。
rpi-imager 初期画面
Raspberry Pi のデバイスを選択する画面では Raspberry Pi 5 を選択します。
rpi-imager Raspberry Pi のデバイス選択の画面
OS を選択する画面では Raspberry Pi OS (64-bit) を選択します。
rpi-imager OS 選択の画面
ストレージの選択では、書き込み先の USB メモリを選択します。用意した USB メモリと対応するものを指定します。
rpi-imager ストレージ選択の画面
Raspberry Pi デバイス、OS、ストレージを指定したときの画面は次のようになります。
rpi-imager 指定済みの画面
「次へ」をクリックすると、カスタマイズの指定が出来る画面になります。
rpi-imager カスタマイズの画面
「設定を編集する」をクリックすると、カスタマイズ設定の画面になります。ここでは、一般、サービス、オプションについて、それぞれ指定しました。ただ、一部については OS インストール後に反映されなかったので、別途設定が必要でした。
カスタマイズの一般については次のようにしました。
rpi-imager のカスタマイズ設定画面(一般)
カスタマイズのサービスについては次のようにして SSH をパスワード認証でログインできるようにしました。
rpi-imager のカスタマイズ設定画面(サービス)
カスタマイズのオプションについては次のようにして、終わったときにメディアを取り出す項目だけチェックしました。
rpi-imager のカスタマイズ設定画面(オプション)
カスタマイズが終わったら、次の画面で「はい」をクリックします。
rpi-imager カスタマイズ完了の画面
ストレージである USB メモリの内容が初期化されるので、警告が表示されます。「はい」をクリックします。
rpi-imager 警告の画面
書き込みには時間がかかります。終わったら、microSD カードを抜きます。
Raspberry Pi OS インストール
用意した Raspberry Pi OS インストール用 microSD カードを Raspberry Pi 5 の microSD カードスロットへ挿入して、Raspberry Pi 5 の電源を入れます。
すると、次のように Raspberry Pi OS 起動時の画面が表示されます。インストールが実行されるので、何度か再起動がされます。
Raspberry Pi OS 起動時の画面
インストールが完了すると、Raspberry Pi OS が起動して、カスタマイズ時に指定したユーザーで自動ログインとなります。自動ログイン直後の画面は次のようになります。
Raspberry Pi OS 自動ログイン直後の画面
Raspberry Pi OS の情報を確認するには、/boot/issue.txt
と /etc/os-release
を確認します。
Raspberry Pi OS の情報
日本語環境となっていないので、設定を変更します。そのためには、システムメニューのラズパイのアイコンで「Preference」 - 「Raspberry Pi Configuration」をクリックします。
Raspberry Pi Configuration のメニュー
すると、Raspberry Pi Configuration の画面になります。ロケール、キーボード、Wi-Fi 関連の設定などを、この画面からすることができます。
Raspberry Pi Configuration の画面
ローケルが日本になっていなかったので設定しました。
Locale の設定画面
Raspberry Pi Configuration の画面に戻ったら「OK」をクリックすると設定が保存されます。それから Raspberry Pi OS を再起動すると日本語になります。
なお、これだけでは完全な日本語環境にはなっていませんでした。日本語入力やフォント周りについて、追加で作業が必要です。
きちんとした動作確認はしていませんが、とりいそぎ、fonts-noto-cjk と fcitx5-mozc のパッケージをインストールしておきました。
sudo apt-get -y install fonts-noto-cjk fcitx5-mozc
エディタもインストールしておきました。
sudo apt-get -y install code
Discussion