インストール後、ポート443/80が閉じた状態で表示される

こんにちは。
Ubuntu 22.04.4 サーバー上の Proxmox VE(仮想環境)で、初めて Discourse のインストールを完了しました。
インストールはエラーなく正常に完了しましたが、完了後にフォーラムサイトを開こうとすると、サービスにアクセスできないというエラーが表示されます。

ネットワークから確認すると、ポートは閉じられています。

PS C:\Users\mwojt> nmap 192.168.131.211

PORT    STATE  SERVICE
22/tcp  open   ssh
80/tcp  closed http
443/tcp closed https

しかし、Ubuntu マシン内で localhost に対して同じスキャンを実行すると、開いていると表示されます。

root@ubuntu-discourse:~# nmap localhost

PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

ただし、同じ Ubuntu VM から IP アドレスに対してチェックを実行すると、次のようになります。

root@ubuntu-discourse:~# nmap 192.168.131.211

PORT    STATE    SERVICE
22/tcp  open     ssh
80/tcp  filtered http
443/tcp filtered https

したがって、ポートはフィルタリングされているように見えます。
ポートはファイアウォールで開かれています。

root@ubuntu-discourse:~# ufw status
Status: active

To                         Action      From
--                         ------      ----
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
22                         ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
22 (v6)                    ALLOW       Anywhere (v6)

Docker のポートフォワーディングも正しく設定されているようです。

root@ubuntu-discourse:~# docker port 6922c7802903
80/tcp -> 0.0.0.0:80
80/tcp -> [::]:80
443/tcp -> 0.0.0.0:443
443/tcp -> [::]:443

何が間違っていますか?問題はどこにありますか?

Discourseのインストールにまた90分も費やしてしまいました。今回は仮想環境を排除するために別の物理マシンにインストールしましたが、GitHubの指示を注意深く守ったにもかかわらず、全く同じ問題が発生しました。

これはもう不可能なのでしょうか??

問題はそちら側にある可能性はありますか? 正しく動作している私のDiscourseインスタンスでも、あなたと非常に似た結果が見られます。

Browserlingのようなプロキシを使用して、インスタンスに到達できますか?

編集:お待ちください、あなたの住所192.168.131.211はローカルアドレスであり、外部から到達できるとは期待できません。

編集: netstat -rn を試したときに、Discourseホストで何が見えますか?

Here is my netstat:

root@ubuntu-forum:/var/discourse# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.131.1   0.0.0.0         UG        0 0          0 enp1s0
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
192.168.130.0   0.0.0.0         255.255.254.0   U         0 0          0 enp1s0
192.168.131.1   0.0.0.0         255.255.255.255 UH        0 0          0 enp1s0
192.168.131.152 0.0.0.0         255.255.255.255 UH        0 0          0 enp1s0

Aside from the Discourse on Ubuntu I installed Talkyard on Debian (Talkyard is a forum engine a bit similar to Discourse), also on Docker, and it is working like a charm. So I think I will try installing Discourse on Debian too.

Netstat -rn on my Debian looks like this:

root@debian-12:~# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.131.1   0.0.0.0         UG        0 0          0 ens18
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
172.26.0.0      0.0.0.0         255.255.255.128 U         0 0          0 br-886bebfa13ae
192.168.130.0   0.0.0.0         255.255.254.0   U         0 0          0 ens18

Not sure if this is helpful.

これが私のnetstatです:

root@ubuntu-forum:/var/discourse# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.131.1   0.0.0.0         UG        0 0          0 enp1s0
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
192.168.130.0   0.0.0.0         255.255.254.0   U         0 0          0 enp1s0
192.168.131.1   0.0.0.0         255.255.255.255 UH        0 0          0 enp1s0
192.168.131.152 0.0.0.0         255.255.255.255 UH        0 0          0 enp1s0

Ubuntu上のDiscourseの他に、DebianにもTalkyard(Discourseに少し似たフォーラムエンジン)をDocker上でインストールしましたが、それは問題なく動作しています。そのため、DebianにもDiscourseをインストールしてみようと思います。

DebianでのNetstat -rnは以下のようになります:

root@debian-12:~# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.131.1   0.0.0.0         UG        0 0          0 ens18
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
172.26.0.0      0.0.0.0         255.255.255.128 U         0 0          0 br-886bebfa13ae
192.168.130.0   0.0.0.0         255.255.254.0   U         0 0          0 ens18

これが役立つかどうかはわかりません。

Discourseはドメイン経由でアクセスした場合にのみ機能するというのが本当だと思いますので、ブラウザとドメインを使用してサイトにアクセスできるような設定になっていますか?もし完全にローカルのLAN内であれば、hostsファイルでそれが可能かもしれませんが、確信はありません。サーバーとクライアント(そしておそらくDockerも)が名前解決できる必要があると思います。

ローカルDNSサーバーで、ネットワーク名をそのホストに解決させているため、外部からアクセスするのと同様に機能します。

DigitalOceanのVMにDiscourseを正常にインストールしました。これをローカル構成の参照として使用します。すぐに気づいたことの1つは、VMのhostsファイルです。次のエントリがあります。

これがすべてであることを願っています。わかり次第お知らせします。

いいえ、失敗しました…3日間苦労して完全に打ちのめされ、疲れました… :slightly_frowning_face:
プロバイダーにホストされていないローカルマシンにDiscourseをインストールすることは不可能なのではないかと考え始めています :frowning:

インストール中に録画したこのビデオを確認して、何が間違っているか教えてください。

試してみる価値があるかもしれません
サーバーで
lsof -i
を実行してください。

Discourse は実行されているようですが、ネットワークの状況により到達不能になっている可能性が高いと思われます。

わかりました、根本原因を突き止めました… Dockerログを確認したところ、Let’s Encrypt証明書の取得に失敗したため、nginxサーバーがまったく起動しないことが判明しました(添付のログを参照してください)
docker_logs_not_working.txt (10.0 KB)

これで、その修正方法を特定する必要があります。実際、SSLは必要ありません。独自のSSL証明書を持つリバースプロキシを使用しているためです。そのため、ポート80でDiscourseと簡単に通信できます。Discourseサーバーがそれを好むかどうかはわかりません。

検索すれば、閉鎖環境、つまりイントラネットを持つローカルセットアップが失敗する最も一般的な理由が見つかるでしょう。Discourse には SSL が必要です。

私のDNSはCloudflareでホストされているため、APIキーを提供することでLetsEncrypt証明書を簡単に取得できます。ACMEをDiscourseで設定して、証明書のプロビジョニングをスムーズに行うことはできますか?マニュアルでは見つけられませんでしたが、検索がうまくいっていないのかもしれません。

長い格闘の末、ついに修正することができました。

実施すべきことは以下の通りです:
SSHセッションから以下のコマンドを実行して、コンテナIDまたは名前を見つけます。

docker ps

以下のコマンドを使用して、dockerコンテナのシェルにアクセスします。

docker exec -it [container_id or name] bash

Cloudflare APIキーとメールアドレスを環境変数としてエクスポートします。これは、「acme.sh」スクリプトがDNSチャレンジを作成および削除するために必要なDNSレコードを作成および削除できるように、Cloudflare APIで認証できるようにするためです。私は、Cloudflareアカウントから実際のメールアドレスとグローバルAPIキーを使用しました。

export CF_Key="your_cloudflare_global_api_key"
export CF_Email="your_cloudflare_email_address"

以下のディレクトリに変更します。

cd /shared/letsencrypt

acme.sh--issueコマンドで実行し、DNSチャレンジの処理にdns_cf(DNS Cloudflare)モードを使用したいことを指定します。証明書を取得したいドメインでyourdomain.comを置き換えます。

./acme.sh --issue --dns dns_cf -d yourdomain.com -d *.yourdomain.com

証明書の作成が成功した後、スクリプトはコピーされたディレクトリを表示します。私の場合は以下のようでした。

Your cert is in: /root/.acme.sh/sprawy.info.pl_ecc/sprawy.info.pl.cer
Your cert key is in: /root/.acme.sh/sprawy.info.pl_ecc/sprawy.info.pl.key
The intermediate CA cert is in: /root/.acme.sh/sprawy.info.pl_ecc/ca.cer
And the full chain certs is there: /root/.acme.sh/sprawy.info.pl_ecc/fullchain.cer

discourse.confファイルを編集して、証明書へのパスを更新します。

nano /etc/nginx/conf.d/discourse.conf

既存のssl_certificateおよびssl_certificate_key行を以下に置き換える必要があります。

ssl_certificate /root/.acme.sh/sprawy.info.pl_ecc/sprawy.info.pl.cer;
ssl_certificate_key /root/.acme.sh/sprawy.info.pl_ecc/sprawy.info.pl.key;

これにより、新しい証明書の場所にポイントされるようになります。

設定をテストするためにこれを実行します。

nginx -t

エラーがない場合は、Webサーバーをリロードします。

nginx -s reload

そして、うまくいきました!

「いいね!」 2

素晴らしいニュースですね。解決おめでとうございます。LetsEncryptの場合、証明書リクエストに連続して失敗するとロックアウトされる(7日間だったかと思います)ことを覚えておくと良いでしょう。そのため、これらのリクエストは慎重に行うことが重要です。

「いいね!」 2