🍓

Raspberry Pi 5 で Git システム Forgejo を動かす - Linux 使いになりたい人向け

2024/02/18に公開

はじめに

これは、Linux 使いになりたい人向けに Raspberry Pi 5 で Git リポジトリ管理システム Forgejo を動かす環境を構築する方法を解説するものです。Raspberry Pi 5 を入手できたので、勢いで用意してみました。

/images/20240215_rpi_imager/rpi5-01.png
Raspberry Pi 5 の箱

在庫がなくなりそうな中、手を震わせながら急いでポチりました。CPU が結構な温度になるので、冷却ファンは必須だという印象ですが、まだケースは購入していないので、むきだしで使います。

/images/20240215_rpi_imager/rpi5-02.png
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 を使う指定をします。使用するパス、実行ユーザーなどを確認します。

/images/20240218_rpi_forgejo/forgejo-install-01.png
Forgejo 初期設定画面 その1

スクロールして、「アップデートチェッカーを有効にする」にチェックをいれます。

/images/20240218_rpi_forgejo/forgejo-install-02.png
Forgejo 初期設定画面 その2

それから「Forgejo をインストール」をクリックします。しばらくすると、Forgejo のインストールが完了してトップページに遷移します。

アカウント登録とリポジトリ作成

右上の「登録」をクリックしてアカウントを登録する画面とします。ここでは pi ユーザーを登録します。

/images/20240218_rpi_forgejo/forgejo-regist-01.png
Forgejo へ pi ユーザーを登録

アカウントを登録すると自動ログインするので、リポジトリを作成します。右上の「+」をクリックして表示されるメニューで「新しいリポジトリ」をクリックします。

/images/20240218_rpi_forgejo/forgejo-repo-01.png
Forgejo リポジトリの作成

作成するリポジトリは「proj001」とし、「リポジトリをプライベートにする」にチェックを入れます。

/images/20240218_rpi_forgejo/forgejo-repo-02.png
Forgejo リポジトリ proj001 の作成

スクロールして、「リポジトリの初期設定」にチェックを入れたら「リポジトリを作成」をクリックします。

/images/20240218_rpi_forgejo/forgejo-repo-03.png
Forgejo 「リポジトリを作成」をクリック

http://pi5.local:3000/pi/proj001 を開いてリポジトリの URL を確認します。

/images/20240218_rpi_forgejo/forgejo-repo-04.png
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 公開鍵を追加します。

/images/20240218_rpi_forgejo/forgejo-ssh-01.png
Forgejo SSH キーの登録

pi ユーザーの SSH 公開鍵が追加されると、「SSH キーの管理」の一覧に表示されます。

/images/20240218_rpi_forgejo/forgejo-ssh-02.png
Forgejo 登録されたキーの一覧表示

http://pi5.local:3000/pi/proj001 を開いて、SSH クローンをするときに使うリポジトリの URL を確認します。URL の欄にある「SSH」をクリックします。

/images/20240218_rpi_forgejo/forgejo-ssh-02.png
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.iniCERT_FILEKEY_FILE の設定を追加します。また、HTTPS のための設定として、ROOT_URL を https のものとし、PROTOCOL に https を指定します。

/etc/forgejo/app.ini
[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 を使って確認してみます。警告がでますが、自分で設定したものなので大丈夫です。

/images/20240218_rpi_forgejo/forgejo-https-01.png
Forgejo HTTPS の URL へアクセスしたときの画面

「詳細設定」をクリックすると、「pi5.local へアクセスする(安全ではありません)」のリンクが表示されます。

/images/20240218_rpi_forgejo/forgejo-https-02.png
Forgejo 「pi5.local へアクセスする(安全ではありません)」のリンク

自分で設定して用意した Web システムなので安全です。「pi5.local へアクセスする(安全ではありません)」のリンクをクリックすると HTTPS 対応の Forgejo のトップページになります。

/images/20240218_rpi_forgejo/forgejo-https-03.png
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/runnerWoodpecker 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 

画面は次のようになります。

/images/20240215_rpi_imager/rpi-imager-01.png
rpi-imager 初期画面

Raspberry Pi のデバイスを選択する画面では Raspberry Pi 5 を選択します。

/images/20240215_rpi_imager/rpi-imager-02.png
rpi-imager Raspberry Pi のデバイス選択の画面

OS を選択する画面では Raspberry Pi OS (64-bit) を選択します。

/images/20240215_rpi_imager/rpi-imager-03.png
rpi-imager OS 選択の画面

ストレージの選択では、書き込み先の USB メモリを選択します。用意した USB メモリと対応するものを指定します。

/images/20240215_rpi_imager/rpi-imager-04.png
rpi-imager ストレージ選択の画面

Raspberry Pi デバイス、OS、ストレージを指定したときの画面は次のようになります。

/images/20240215_rpi_imager/rpi-imager-05.png
rpi-imager 指定済みの画面

「次へ」をクリックすると、カスタマイズの指定が出来る画面になります。

/images/20240215_rpi_imager/rpi-imager-06.png
rpi-imager カスタマイズの画面

「設定を編集する」をクリックすると、カスタマイズ設定の画面になります。ここでは、一般、サービス、オプションについて、それぞれ指定しました。ただ、一部については OS インストール後に反映されなかったので、別途設定が必要でした。

カスタマイズの一般については次のようにしました。

/images/20240215_rpi_imager/rpi-imager-setting-01.png
rpi-imager のカスタマイズ設定画面(一般)

カスタマイズのサービスについては次のようにして SSH をパスワード認証でログインできるようにしました。

/images/20240215_rpi_imager/rpi-imager-setting-02.png
rpi-imager のカスタマイズ設定画面(サービス)

カスタマイズのオプションについては次のようにして、終わったときにメディアを取り出す項目だけチェックしました。

/images/20240215_rpi_imager/rpi-imager-setting-03.png
rpi-imager のカスタマイズ設定画面(オプション)

カスタマイズが終わったら、次の画面で「はい」をクリックします。

/images/20240215_rpi_imager/rpi-imager-07.png
rpi-imager カスタマイズ完了の画面

ストレージである USB メモリの内容が初期化されるので、警告が表示されます。「はい」をクリックします。

/images/20240215_rpi_imager/rpi-imager-08.png
rpi-imager 警告の画面

書き込みには時間がかかります。終わったら、microSD カードを抜きます。

Raspberry Pi OS インストール

用意した Raspberry Pi OS インストール用 microSD カードを Raspberry Pi 5 の microSD カードスロットへ挿入して、Raspberry Pi 5 の電源を入れます。

すると、次のように Raspberry Pi OS 起動時の画面が表示されます。インストールが実行されるので、何度か再起動がされます。

/images/20240215_rpi_imager/rpios-01.png
Raspberry Pi OS 起動時の画面

インストールが完了すると、Raspberry Pi OS が起動して、カスタマイズ時に指定したユーザーで自動ログインとなります。自動ログイン直後の画面は次のようになります。

/images/20240215_rpi_imager/rpios-02.png
Raspberry Pi OS 自動ログイン直後の画面

Raspberry Pi OS の情報を確認するには、/boot/issue.txt/etc/os-release を確認します。

/images/20240215_rpi_imager/rpios-03.png
Raspberry Pi OS の情報

日本語環境となっていないので、設定を変更します。そのためには、システムメニューのラズパイのアイコンで「Preference」 - 「Raspberry Pi Configuration」をクリックします。

/images/20240215_rpi_imager/rpios-04.png
Raspberry Pi Configuration のメニュー

すると、Raspberry Pi Configuration の画面になります。ロケール、キーボード、Wi-Fi 関連の設定などを、この画面からすることができます。

/images/20240215_rpi_imager/rpios-05.png
Raspberry Pi Configuration の画面

ローケルが日本になっていなかったので設定しました。

/images/20240215_rpi_imager/rpios-06.png
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