能書き
おうちサーバー構築報告:予告からのおうちサーバー構築。前々回からForgejo関連作業をしています。
- ProxmoxVE(9.1.5)に仮想マシンを作成、PostgreSQL(18.4)をインストール
- Forgejoをバイナリインストール
- リバースプロクシを設定 ←イマココ
- Forgejo Runner をインストールし、Forgejo本体と連携
- ForgejoでCI/CDを実験
- Mattermost(11.4.2)と連携
前提
- 我が家のサーバーマシンにProxmoxVE(9.1.5)をインストール
- Proxmox VE 上にリバースプロキシ用のコンテナを作成している
- Proxmox VE 上に仮想マシンを作成して、仮想マシンにForgejoをインストールしている
目標
- リバースプロキシを立ててForgejoへアクセスできるようにする
- Let's Encrypt の証明書を取得してhttpsアクセスできるようにする
参考文献
前回、Forgejo本体をインストールしました。
Forgejoのリバースプロキシについては公式に記述がありました。
今回は、公式を参考にしつつ、私の過去の手順をなぞります。
- おうちサーバー構築報告:リバースプロキシ with Let's Encrypt で Mattermost 11.4.2 - Qiita
- おうちサーバー構築報告:リバースプロキシ with Let's Encrypt で GitLab 18.9.0-ce.0 - Qiita
Let's Encrypt証明書の削除。
事前準備
準備というか。まずはプロクシを司るコンテナのスナップショットを撮り、それからGitLabで用意したプロクシを削除しておきます。
我が家のリバースプロクシサーバーは172.16.1.103です。ここに踏み台172.16.1.100経由で接続します。
ssh root@172.16.1.103
とりあえずコンテナ172.16.1.103を停止。
shutdown -h now
そうしたら、画面のGUI上でスナップショットを撮り、再起動します。それから踏み台経由で再接続しましょう。
ssh root@172.16.1.103
そして Let's Encrypt 証明書を削除。
MY_DOMAIN=example.com
GITLAB_DOMAIN=gitlab.$MY_DOMAIN
certbot delete --cert-name $GITLAB_DOMAIN
次にnginxのリバースプロクシ設定を削除します。Subversionで管理している都合で、rmコマンドではなくてsvn delを使います。
svn del /etc/nginx/sites-enabled/gitlab.conf
svn del /etc/nginx/sites-available/gitlab.conf
systemctl reload nginx
それからsshのポートフォワーディング設定……は、後で再利用するので、そのまま放置しておきます。
但し1つだけ。known_hostsに登録された172.16.1.104のマシンが変わったので、それを削除します。
ssh-keygen -R 172.16.1.104
ここまで出来たら/etcをSubversion登録しましょう。
cd /etc
svn st
svn ci -m"deleted the reverse proxy for GitLab"
svn up
DNS
さて、Forgejoのリバースプロクシです。
まず最初にDNSを設定します。Let's Encrypt 証明書を取得する為に外からアクセス可能にする必要があります。その関係で、お金を出して買った独自ドメインを使用して下さい。ここでは仮にexample.comにしておきますが、このまま設定しないで下さい。
MY_DOMAIN=example.com
FORGEJO_DOMAIN=forgejo.$MY_DOMAIN
そして外部のDNSにこれを設定し、家庭内ルーターのポートフォワードなども設定しておきます。今回設定するリバースプロキシサーバー172.16.1.103に向けます。この辺りの手順はそれぞれ異なりますので、各機器のマニュアルなどを参照して下さい。
家庭内DNSにも設定します。我が家の家庭内DNSはUnboundを使用していますが、他のマシンの設定に合わせて修正します。
ssh root@172.16.1.101
cd /etc/unbound/unbound.conf.d
vi machines.list
unbound-checkconf
systemctl restart unbound
そして/etcをSubversionでコミットします。
cd /etc
svn st
svn st | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -rt svn add
svn ci -m"DNS setting for Forgejo proxy"
svn up
exit
Let's Encrypt 証明書
Let's Encrypt で証明書を取得して設定します。その為のnginx設定をします。
FORGEJO_HOST_IPADDR=172.16.1.104
FORGEJO_PORT_HTTP=3000
cd /etc/nginx/sites-available
cat <<___ >forgejo.conf
server {
listen 80;
server_name $FORGEJO_DOMAIN;
server_tokens off;
location ^~ /.well-known/acme-challenge/ {
root /usr/share/nginx/html/ssl-proof;
}
location / {
proxy_pass http://$FORGEJO_HOST_IPADDR:$FORGEJO_PORT_HTTP;
}
}
___
cd ../sites-enabled
ln -s /etc/nginx/sites-available/forgejo.conf
nginxに新しい設定を読み込ませます。
systemctl reload nginx
Let's Encrypt 証明書を取得します。
certbot certonly --register-unsafely-without-email --agree-tos --webroot -w /usr/share/nginx/html/ssl-proof -d $FORGEJO_DOMAIN
certbotの出力を見て成功していたら(Successfully received certificate. の表示があったら)/etc/nginx/sites-available/forgejo.confを書き換えます。参考文献の問題は対応済の内容になっています。
cat <<___ >/etc/nginx/sites-available/forgejo.conf
server {
listen 80;
server_name $FORGEJO_DOMAIN;
location ^~ /.well-known/acme-challenge/ {
root /usr/share/nginx/html/ssl-proof;
}
return 301 https://\$server_name\$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name $FORGEJO_DOMAIN;
merge_slashes off;
ssl_certificate /etc/letsencrypt/live/$FORGEJO_DOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$FORGEJO_DOMAIN/privkey.pem;
ssl_session_timeout 1d;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:50m;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = six months)
add_header Strict-Transport-Security max-age=15768000;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling off;
location / {
proxy_pass http://$FORGEJO_HOST_IPADDR:$FORGEJO_PORT_HTTP;
proxy_set_header Connection \$http_connection;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
client_max_body_size 512M;
}
}
___
設定ファイルをチェック。
nginx -t
問題無ければnginxに新しい設定を読み込ませます。
systemctl reload nginx
普段使いのクライアントマシンからアクセスすると(httpsにリダイレクトされてから)Forgejoのサインイン画面が表示されます。
最後にSubversionへ登録します。証明書だけは登録しないように注意します。その為の設定は既に出来ている筈なので、ここではそれを確認するだけです。
cd /etc
svn st
svn st | grep "^?" | cut -b9- | xargs -rt svn add
svn ci -m"Forgejo"
svn up
/etc/forgejo/app.iniの修正
今度はForgejoサーバーのインストール先コンテナ172.16.1.104にアクセスします。
ssh administrator@172.16.1.104
/etc/forgejo/app.iniを修正します。
sudo vi /etc/forgejo/app.ini
修正内容は下記。この内容は、画面上で表示は可能ですが編集不可のようです。
ドメインは仮にforgejo.example.comとしていますが、上記で設定した、自分だけのドメイン名を設定してください。
それからsshの待ち受けポート番号も変更しておきます。ついでに後述のssh用のSSH_DOMAINも変更。
$ sudo svn diff --diff-cmd diff -x -U0 /etc
Index: /etc/forgejo/app.ini
===================================================================
--- /etc/forgejo/app.ini (revision 12)
+++ /etc/forgejo/app.ini (working copy)
@@ -22,2 +22,2 @@
-SSH_DOMAIN = 172.16.1.104
-DOMAIN = 172.16.1.104
+SSH_DOMAIN = forgejo.moon-night.jp
+DOMAIN = forgejo.moon-night.jp
@@ -25 +25 @@
-ROOT_URL = http://172.16.1.104:3000/
+ROOT_URL = https://forgejo.moon-night.jp/
@@ -28 +28,2 @@
-SSH_PORT = 22
+SSH_PORT = 20022
+START_SSH_SERVER = true
設定を修正したら再起動しましょう。
sudo systemctl restart forgejo
systemctl status forgejo
そしてSubversionコミット。
cd /etc
sudo svn st | grep "^?" | cut -b9- | sudo xargs -rt svn add
sudo svn ci -m"set domain and ssh"
sudo svn up
Forgejoサーバーの仮想マシン作業はここまで。
exit
ssh
sshポートフォワーディングの設定をForgejo用に修正します。
と言っても今回は修正内容はありません。ただ、仮想マシン172.16.1.104が変わったので、公開鍵をコピーし直す必要があります。同時にknown_hostsに172.16.1.104を登録します。
ssh-copy-id administrator@172.16.1.104
そうしたら、念の為、sshポートフォワーディングを再起動します。
systemctl restart portforward
systemctl status portforward
exit
動作確認
ブラウザまたはアプリで$FORGEJO_DOMAINにアクセスしてみます。httpsにリダイレクトされてからログイン画面が表示され、その後は普通に使えるはずです。
そしてその「普通」を一通り確認します。ちょっと大変ですが、下記の流れを確認します。普段使いのWindowsマシンでWSL2(Ubuntu)上の操作とします。
一般ユーザー作成
まずはインストール時に設定した管理者ユーザーでサインインしましょう。
ユーザーメニュー>サイト管理。
左メニュー>アイデンティティとアクセス>ユーザーアカウント。
画面右上の「ユーザーアカウントを作成」ボタンをクリック。そして必要事項を入力します。
- ユーザー名は、今回は「taro」にしました
- メールアドレスも適当に入力
- ユーザーに登録メールを送る: チェックを入れる
「ユーザーアカウントを作成」ボタンをクリック。
するとメールが届きます。メール中にサインイン用のURLが掛かれていますが、そのドメイン名が今回設定したものになっている事を確認します。
そして管理者はサインアウト。メールのドメインをクリックして上記の「taro」としてサインインします。
パスワードの更新を強制されます。
新しいパスワードでサインインしました。同時にパスワード更新のメールが届きます。
「taro」でサインインしたまま、引き続きssh公開鍵を登録します。
ssh公開鍵を登録
ユーザーメニュー>設定。
左メニュー>SSH/GPGキー。
SSHキーの管理の「キーを追加」ボタンをクリック。
普段使いのWindowsマシンでWSL2を起動し、sshの公開鍵を表示します。
cd
cat .ssh/id_ed25519.pub
ここで表示された公開鍵の内容を、先程のキー画面の内容欄に貼り付けます。
そして「キーを追加」ボタンをクリック。
「確認」も出来るようですが……今回は省略してしまいましょう。
ここまで出来たら、「taro」は一旦サインアウトします。
プロジェクト作成
プロジェクトオーナーとは別ユーザーでgit cloneする、というユースケースを実行したい。そこで、褒められた操作ではありませんが、Forgejo管理者「administrator」でプロジェクトを作成します。そして後程「taro」でgit cloneする事にします。
と言う訳でForgejo管理者「administrator」でサインインします。
画面右上の「+」メニュー>新しいリポジトリ。
適当に入力します。
- オーナー: administrator
- リポジトリ名: ExampleProject
- リポジトリをプライベートにする: チェックを外す
- 説明: 必要なら適当に入力してください、今回は空欄とします
- テンプレートを使用する: まだテンプレートが無いので空欄
- リポジトリの初期設定: チェックする
- .gitignore: 今回はどうせプログラム開発しないので何でも良い
- ライセンス: 今回はどうせプログラム開発しないので何でも良い
- 詳細設定
- ラベル: 今回はどうせプログラム開発しないので何でも良い
- オブジェクトのフォーマット: sha1
- デフォルトブランチ: 今回はどうせプログラム開発しないので何でも良い
- テンプレートリポジトリにする: チェックを外す
そうしたら「リポジトリを作成」ボタンをクリック。
これで実験用プロジェクト「ExampleProject」が出来ました。
プロジェクトをgit clone
普段使いのWindowsマシンでWSL2(Ubuntu)を起動します。そしてプロジェクトのgit clone用ディレクトリを作成。
cd
mkdir prj
cd prj
Forgejoプロジェクト画面右上の方の「HTTPS|SSH」について、SSHを選択します。するとssh://git@forgejo.example.com:20022/administrator/ExampleProject.gitが表示されるので、右隣のコピーボタンをクリックしてコピーします。
git clone ssh://git@forgejo.example.com:20022/administrator/ExampleProject.git
プロジェクトをアーカイブ
プロジェクトが終了したと仮定して、アーカイブしてみます。
プロジェクト画面右上の設定タブをクリック。
この設定画面下端に「アーカイブ」ボタンがありますので、これをクリック。
確認画面が表示されるので「アーカイブ」ボタンをクリック。
アーカイブできました。
仕舞い
動作確認が出来たら、事前準備で撮ったスナップショットは削除しても大丈夫でしょう。
以上でForgejoをリバースプロクシ経由でアクセスできるようになりました。





















