作業ログ: Forgejoを自宅のミニPCに入れて遊んでみる

Gitea Actionsが気になっていたが、調べてみるとGiteaは営利団体の管理下に置かれた関係でプロジェクトが分裂してForgejoというのが作られたらしい。せっかく個人利用の範囲だし、Forgejoを使ってみる。
Gitea Actions | Gitea Documentation
Comparison with Gitea | Forgejo – Beyond coding. We forge.

ここまでやった。インストールはDocker or Binaryがあり、今回は学習も兼ねてBinaryでやることにした。
- proxmoxを入れたミニPCの上にVMを立てた(ストレージ64GB, メモリ8GB, CPU 4core, Ubuntu 22.04)
- Forgejoのバイナリのインストール、GPG verify
Installation from binary | Forgejo – Beyond coding. We forge.

バイナリを実行可能にする
$ sudo cp forgejo-7.0.4-linux-amd64 /usr/local/bin/forgejo
$ forgejo --version
Forgejo version 7.0.4+gitea-1.21.11 (release name 7.0.4) built with GNU Make 4.4.1, go1.22.4 : bindata, timetzdata, sqlite, sqlite_unlock_notify
$ sudo chmod 755 /usr/local/bin/forgejo
git, git-lfsのインストール
$ sudo apt install git git-lfs
forgejoは git
ユーザを使って実行するらしい。なのでgitユーザを作る
sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
Installation from binary | Forgejo – Beyond coding. We forge.

Forgejo向けディレクトリ作成
$ sudo mkdir /var/lib/forgejo
$ sudo chown git:git /var/lib/forgejo && sudo chmod 750 /var/lib/forgejo
この辺からsudoめんどいので sudo -s
する。sudo su -
してたら「今時は sudo -s
ですよ」と言われたので改めて調べてみた。
sudo su とかしてる人はだいたいおっさん
ふむふむ、 sudo -s
か sudo -i
で代替できそう
# mkdir /etc/forgejo
# chown root:git /etc/forgejo && chmod 770 /etc/forgejo

DB setup
sqliteがデフォルト。今回はpostgresqlを学習のために使ってみる。
# apt install postgresql postgresql-contrib
# vim /etc/postgresql/16/main/postgresql.conf
## 以下コメントアウトして有効化
password_encryption = scram-sha-256 # scram-sha-256 or md5
## 再起動
# service postgresql restart

CREATE DATABASE
を打ったらエラーが出た。
# su -c "psql" - postgres
psql (16.3 (Ubuntu 16.3-0ubuntu0.24.04.1))
Type "help" for help.
postgres=# CREATE ROLE forgejo WITH LOGIN PASSWORD '(This is password)';
CREATE ROLE
# CREATE DATABASE forgejodb WITH OWNER forgejo TEMPLATE template0 ENCODING UTF8 LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
ERROR: invalid LC_COLLATE locale name: "en_US.UTF-8"
HINT: If the locale name is specific to ICU, use ICU_LOCALE.
どうやらロケールの問題らしい。
# locale -a
C
C.utf8
POSIX
確かに en_US.UTF-8
はない。
検索してみる
# apt-cache search language-pack | grep ja
以下を入れる
language-pack-en - translation updates for language English
language-pack-ja - translation updates for language Japanese
# apt install language-pack-ja language-pack-en
locale-genする
# locale-gen ja_JP.UTF-8
Generating locales (this might take a while)...
ja_JP.UTF-8... done
Generation complete.
# locale-gen en_US.UTF-8
Generating locales (this might take a while)...
en_US.UTF-8... done
Generation complete.
# locale -a
C
C.utf8
POSIX
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IL
en_IL.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
ja_JP.utf8
これでOK.
このままpostgresqlに入ってもダメで、再起動が必要。
# service postgresql restart
# su -c "psql" - postgres
psql (16.3 (Ubuntu 16.3-0ubuntu0.24.04.1))
Type "help" for help.
postgres=# CREATE DATABASE forgejodb WITH OWNER forgejo TEMPLATE template0 ENCODING UTF8 LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
CREATE DATABASE

関係ないけど、ロケールを変更するとORDER BYが遅くなるらしい
PostgreSQLにおけるロケールの影響調査 #performance - Qiita

接続確認まで
# vim /etc/postgresql/16/main/pg_hba.conf
# 以下を追記
local forgejodb forgejo scram-sha-256
host forgejodb forgejo 127.0.0.1/32 scram-sha-256 # IPv4 local connections
host forgejodb forgejo ::1/128 scram-sha-256 # IPv6 local connections
USER はよく分からないがforgejoのままで。
と思ったら最初にUser作ってたわ。
接続確認して、最初に作ったUserのパスワードを入れる。
# psql -U forgejo -d forgejodb -h localhost
Password for user forgejo:
psql (16.3 (Ubuntu 16.3-0ubuntu0.24.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
forgejodb=>
\q
いけてそう。TLSは今回は使わないのでskipする

に戻る。
systemd化する
# wget -O /etc/systemd/system/forgejo.service https://codeberg.org/forgejo/forgejo/raw/branch/forgejo/contrib/systemd/forgejo.service
# vim /etc/systemd/system/forgejo.service
# 以下をコメントアウト
Wants=postgresql.service
After=postgresql.service
# systemctl enable forgejo.service
# systemctl start forgejo.service
ここで以下にアクセス(/etc/hosts
でgit.localがVMのIPを向くように設定してる)
http://git.local:3000/
アクセスすると以下の画面

色々埋めてgo
データベース設定が無効です: pq: database "forgejo" does not exist
とでた。作業ログを眺めるとforgejodb をCREATEしてるので、forgejodbにしたらいけた

設定したらなんか落ちた。
# systemctl status forgejo.service | cat -
2024/06/22 11:58:03 cmd/web.go:353:listen() [E] Failed to start server: listen tcp 0.0.0.0:80: bind: permission denied
80番ポートがダメっぽい。
この辺参考にする
# setcap cap_net_bind_service+ep /usr/local/bin/forgejo
# systemctl restart forgejo.service
# systemctl status forgejo.service | cat -
良さそう。 http://git.local
にアクセスできた。

デフォルトでは管理者ユーザなので、管理者以外で使いたいからサインアップする。
forgejoでアカウント作成までできた!

Forgejo Actionsも試してみた
なぜかリモートから actions/checkout
等を持ってくるのが途中で止まってしまい動かなかったので、ローカルにactionsユーザを作りcloneしてきた。
結果全てがローカルで完結するようになり、ネットワーク処理が入らないのでキャッシュ効いている時はcheckout, setup-go使っててもpushしたら即ジョブが回り4sで終了する感じになった。
(マシンの強さもあると思う)
CIが高速という点で、雑に一人で開発する時になるべくローカルネットワークに寄せるのは面白いかもしれないと感じた。