0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

おうちサーバー構築報告:リバースプロクシ with Let's Encrypt で Forgejo 15.0.3

0
Last updated at Posted at 2026-06-28

能書き

おうちサーバー構築報告:予告からのおうちサーバー構築。前々回からForgejo関連作業をしています。

  1. ProxmoxVE(9.1.5)に仮想マシンを作成、PostgreSQL(18.4)をインストール
  2. Forgejoをバイナリインストール
  3. リバースプロクシを設定 ←イマココ
  4. Forgejo Runner をインストールし、Forgejo本体と連携
  5. ForgejoでCI/CDを実験
  6. Mattermost(11.4.2)と連携

前提

目標

  • リバースプロキシを立ててForgejoへアクセスできるようにする
    • Let's Encrypt の証明書を取得してhttpsアクセスできるようにする

参考文献

前回、Forgejo本体をインストールしました。

Forgejoのリバースプロキシについては公式に記述がありました。

今回は、公式を参考にしつつ、私の過去の手順をなぞります。

Let's Encrypt証明書の削除。

事前準備

準備というか。まずはプロクシを司るコンテナのスナップショットを撮り、それからGitLabで用意したプロクシを削除しておきます。

我が家のリバースプロクシサーバーは172.16.1.103です。ここに踏み台172.16.1.100経由で接続します。

コンテナ172.16.1.100:ユーザーansible
ssh root@172.16.1.103

とりあえずコンテナ172.16.1.103を停止。

コンテナ172.16.1.103:ユーザーroot
shutdown -h now

そうしたら、画面のGUI上でスナップショットを撮り、再起動します。それから踏み台経由で再接続しましょう。

コンテナ172.16.1.100:ユーザーansible
ssh root@172.16.1.103

そして Let's Encrypt 証明書を削除。

コンテナ172.16.1.103:ユーザーroot
MY_DOMAIN=example.com
コンテナ172.16.1.103:ユーザーroot
GITLAB_DOMAIN=gitlab.$MY_DOMAIN
コンテナ172.16.1.103:ユーザーroot
certbot delete --cert-name $GITLAB_DOMAIN

次にnginxのリバースプロクシ設定を削除します。Subversionで管理している都合で、rmコマンドではなくてsvn delを使います。

コンテナ172.16.1.103:ユーザーroot
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のマシンが変わったので、それを削除します。

コンテナ172.16.1.103:ユーザーroot
ssh-keygen -R 172.16.1.104

ここまで出来たら/etcをSubversion登録しましょう。

コンテナ172.16.1.103:ユーザーroot
cd /etc
svn st
svn ci -m"deleted the reverse proxy for GitLab"
svn up

DNS

さて、Forgejoのリバースプロクシです。

まず最初にDNSを設定します。Let's Encrypt 証明書を取得する為に外からアクセス可能にする必要があります。その関係で、お金を出して買った独自ドメインを使用して下さい。ここでは仮にexample.comにしておきますが、このまま設定しないで下さい。

コンテナ172.16.1.103:ユーザーroot
MY_DOMAIN=example.com
コンテナ172.16.1.103:ユーザーroot
FORGEJO_DOMAIN=forgejo.$MY_DOMAIN

そして外部のDNSにこれを設定し、家庭内ルーターのポートフォワードなども設定しておきます。今回設定するリバースプロキシサーバー172.16.1.103に向けます。この辺りの手順はそれぞれ異なりますので、各機器のマニュアルなどを参照して下さい。

家庭内DNSにも設定します。我が家の家庭内DNSはUnboundを使用していますが、他のマシンの設定に合わせて修正します。

コンテナ172.16.1.100:ユーザーansible
ssh root@172.16.1.101
コンテナ172.16.1.101(netowrk.local):ユーザーroot
cd /etc/unbound/unbound.conf.d
vi machines.list
コンテナ172.16.1.101(netowrk.local):ユーザーroot
unbound-checkconf
systemctl restart unbound

そして/etcをSubversionでコミットします。

コンテナ172.16.1.101(netowrk.local):ユーザーroot
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
コンテナ172.16.1.101(netowrk.local):ユーザーroot
exit

Let's Encrypt 証明書

Let's Encrypt で証明書を取得して設定します。その為のnginx設定をします。

コンテナ172.16.1.103:ユーザーroot
FORGEJO_HOST_IPADDR=172.16.1.104
FORGEJO_PORT_HTTP=3000
コンテナ172.16.1.103:ユーザーroot
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に新しい設定を読み込ませます。

コンテナ172.16.1.103:ユーザーroot
systemctl reload nginx

Let's Encrypt 証明書を取得します。

コンテナ172.16.1.103:ユーザーroot
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を書き換えます。参考文献の問題は対応済の内容になっています。

コンテナ172.16.1.103:ユーザーroot
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;
  }
}
___

設定ファイルをチェック。

コンテナ172.16.1.103:ユーザーroot
nginx -t

問題無ければnginxに新しい設定を読み込ませます。

コンテナ172.16.1.103:ユーザーroot
systemctl reload nginx

普段使いのクライアントマシンからアクセスすると(httpsにリダイレクトされてから)Forgejoのサインイン画面が表示されます。

最後にSubversionへ登録します。証明書だけは登録しないように注意します。その為の設定は既に出来ている筈なので、ここではそれを確認するだけです。

コンテナ172.16.1.103:ユーザーroot
cd /etc
svn st
コンテナ172.16.1.103:ユーザーroot
svn st | grep "^?" | cut -b9- | xargs -rt svn add
svn ci -m"Forgejo"
svn up

/etc/forgejo/app.iniの修正

今度はForgejoサーバーのインストール先コンテナ172.16.1.104にアクセスします。

普段使いのWindowsマシン
ssh administrator@172.16.1.104

/etc/forgejo/app.iniを修正します。

仮想マシン172.16.1.104:ユーザーadministrator
sudo vi /etc/forgejo/app.ini

修正内容は下記。この内容は、画面上で表示は可能ですが編集不可のようです。
ドメインは仮にforgejo.example.comとしていますが、上記で設定した、自分だけのドメイン名を設定してください。
それからsshの待ち受けポート番号も変更しておきます。ついでに後述のssh用のSSH_DOMAINも変更。

仮想マシン172.16.1.104:ユーザーadministrator
$ 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

設定を修正したら再起動しましょう。

仮想マシン172.16.1.104:ユーザーadministrator
sudo systemctl restart forgejo
systemctl status forgejo

そしてSubversionコミット。

仮想マシン172.16.1.104:ユーザーadministrator
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サーバーの仮想マシン作業はここまで。

仮想マシン172.16.1.104:ユーザーadministrator
exit

ssh

sshポートフォワーディングの設定をForgejo用に修正します。

と言っても今回は修正内容はありません。ただ、仮想マシン172.16.1.104が変わったので、公開鍵をコピーし直す必要があります。同時にknown_hosts172.16.1.104を登録します。

コンテナ172.16.1.103:ユーザーroot
ssh-copy-id administrator@172.16.1.104

そうしたら、念の為、sshポートフォワーディングを再起動します。

コンテナ172.16.1.103:ユーザーroot
systemctl restart portforward
systemctl status portforward
コンテナ172.16.1.103:ユーザーroot
exit

動作確認

ブラウザまたはアプリで$FORGEJO_DOMAINにアクセスしてみます。httpsにリダイレクトされてからログイン画面が表示され、その後は普通に使えるはずです。

そしてその「普通」を一通り確認します。ちょっと大変ですが、下記の流れを確認します。普段使いのWindowsマシンでWSL2(Ubuntu)上の操作とします。

一般ユーザー作成

まずはインストール時に設定した管理者ユーザーでサインインしましょう。

image.png

ユーザーメニュー>サイト管理。

image.png

左メニュー>アイデンティティとアクセス>ユーザーアカウント。

image.png

画面右上の「ユーザーアカウントを作成」ボタンをクリック。そして必要事項を入力します。

  • ユーザー名は、今回は「taro」にしました
  • メールアドレスも適当に入力
  • ユーザーに登録メールを送る: チェックを入れる

image.png

「ユーザーアカウントを作成」ボタンをクリック。

image.png

するとメールが届きます。メール中にサインイン用のURLが掛かれていますが、そのドメイン名が今回設定したものになっている事を確認します。

そして管理者はサインアウト。メールのドメインをクリックして上記の「taro」としてサインインします。

image.png

パスワードの更新を強制されます。

image.png

新しいパスワードでサインインしました。同時にパスワード更新のメールが届きます。

image.png

「taro」でサインインしたまま、引き続きssh公開鍵を登録します。

ssh公開鍵を登録

ユーザーメニュー>設定。

image.png

左メニュー>SSH/GPGキー。

image.png

SSHキーの管理の「キーを追加」ボタンをクリック。

image.png

普段使いのWindowsマシンでWSL2を起動し、sshの公開鍵を表示します。

普段使いのWindowsマシン:WSL2
cd
cat .ssh/id_ed25519.pub

ここで表示された公開鍵の内容を、先程のキー画面の内容欄に貼り付けます。

image.png

そして「キーを追加」ボタンをクリック。

image.png

「確認」も出来るようですが……今回は省略してしまいましょう。

ここまで出来たら、「taro」は一旦サインアウトします。

プロジェクト作成

プロジェクトオーナーとは別ユーザーでgit cloneする、というユースケースを実行したい。そこで、褒められた操作ではありませんが、Forgejo管理者「administrator」でプロジェクトを作成します。そして後程「taro」でgit cloneする事にします。

と言う訳でForgejo管理者「administrator」でサインインします。

image.png

画面右上の「+」メニュー>新しいリポジトリ。

image.png

適当に入力します。

  • オーナー: administrator
  • リポジトリ名: ExampleProject
  • リポジトリをプライベートにする: チェックを外す
  • 説明: 必要なら適当に入力してください、今回は空欄とします
  • テンプレートを使用する: まだテンプレートが無いので空欄

image.png

  • リポジトリの初期設定: チェックする
  • .gitignore: 今回はどうせプログラム開発しないので何でも良い
  • ライセンス: 今回はどうせプログラム開発しないので何でも良い
  • 詳細設定
    • ラベル: 今回はどうせプログラム開発しないので何でも良い
    • オブジェクトのフォーマット: sha1
    • デフォルトブランチ: 今回はどうせプログラム開発しないので何でも良い
    • テンプレートリポジトリにする: チェックを外す

image.png

そうしたら「リポジトリを作成」ボタンをクリック。

image.png

これで実験用プロジェクト「ExampleProject」が出来ました。

プロジェクトをgit clone

普段使いのWindowsマシンでWSL2(Ubuntu)を起動します。そしてプロジェクトのgit clone用ディレクトリを作成。

普段使いのWindowsマシン:WSL2:Ubuntu
cd
mkdir prj
cd prj

Forgejoプロジェクト画面右上の方の「HTTPS|SSH」について、SSHを選択します。するとssh://git@forgejo.example.com:20022/administrator/ExampleProject.gitが表示されるので、右隣のコピーボタンをクリックしてコピーします。

普段使いのWindowsマシン:WSL2:Ubuntu
git clone ssh://git@forgejo.example.com:20022/administrator/ExampleProject.git

プロジェクトをアーカイブ

プロジェクトが終了したと仮定して、アーカイブしてみます。

プロジェクト画面右上の設定タブをクリック。

image.png

この設定画面下端に「アーカイブ」ボタンがありますので、これをクリック。

image.png

確認画面が表示されるので「アーカイブ」ボタンをクリック。

image.png

アーカイブできました。

image.png

仕舞い

動作確認が出来たら、事前準備で撮ったスナップショットは削除しても大丈夫でしょう。

以上でForgejoをリバースプロクシ経由でアクセスできるようになりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?