Ubuntu 22.04 LTS のクリーンインストール後、http/https で接続が受け付けられない

Discourse のインストールは今回が初めてではありませんが、Ubuntu 22.04 LTS を使用した Digital Ocean のドロップレット(1GB NVMe SSD Premium AMD)で 標準的なインストール を 3 回試みたところ、ついに行き詰まってしまいました。

ガイドに従って、過去に何度も行ってきたように LetsEncrypt のためのメールアドレスを入力しました。しかし、ブラウザに Discourse が表示されません(A レコード経由でも、ドロップレットの直接 IP 経由でも)。その後、インストールが HTTP と HTTPS の両方のポートで接続を拒否していることを確認し、それ以来頭を悩ませています。

インストール中に奇妙に感じた点は 1 つだけあります。それは、Digital Ocean のドロップレットにはデフォルトで Docker がインストールされておらず、Discourse コンテナの git クローンが必要であると検出した後にインストールを促されたことです。それ以外は通常通り進め、Docker と Discourse のインストールの両方をテストしました。

良いニュース - Discourse はメール配信性のテストに正常に成功しました。これはインストールが正しく実行されていることを示唆しています。また、Docker も正常に動作しているようです(docker run -it --rm hello-worldを実行後)。github.com への ping も応答が返ってきたため、ファイアウォールや接続の問題ではなさそうです。

問題:接続が拒否される
しかし、curl -v localhost:8080を実行すると以下のような結果になります:

*   Trying 127.0.0.1:8080...
* connect to 127.0.0.1 port 8080 failed: Connection refused
*   Trying ::1:8080...
* connect to ::1 port 8080 failed: Connection refused
* Failed to connect to localhost port 8080 after 1 ms: Connection refused
* Closing connection 0

curl -v localhostを実行すると:

*   Trying 127.0.0.1:80...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.81.0
> Accept: */*
>
* Empty reply from server
* Closing connection 0
curl: (52) Empty reply from server

以下は私の app.ymldiscourse-doctor を実行した結果です:

app.yml
 ## 同時 Web リクエストの数は?メモリと CPU コア数に依存します。
  ## bootstrap によって検出された CPU に基づいて自動設定されますが、上書きすることも可能です
  UNICORN_WORKERS: 2

  ## TODO: この Discourse インスタンスが応答するドメイン名
  ## 必須です。Discourse は IP アドレス単独では動作しません。
  DISCOURSE_HOSTNAME: community.example.io

  ## 上記で指定したホスト名と同じ (-h オプション) でコンテナを起動したい場合はコメントアウトを解除してください
  ## (デフォルトは "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 初期登録時に管理者および開発者に設定されるカンマ区切りのメールアドレスリスト
  ## 例: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'example@example.com'

  ## TODO: 新規アカウントの検証や通知送信に使用する SMTP メールサーバー
  # SMTP アドレス、ユーザー名、パスワードは必須です
  # 警告: SMTP パスワードに含まれる '#' 文字は問題を引き起こす可能性があります!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: no-reply@example.io
  DISCOURSE_SMTP_PASSWORD: "XXXXXX"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (オプション、デフォルトは true)
  DISCOURSE_SMTP_DOMAIN: community.example.io
  DISCOURSE_NOTIFICATION_EMAIL: noreply@community.example.io

  ## Lets Encrypt テンプレートを追加した場合、以下のコメントアウトを解除して無料の SSL 証明書を取得してください
  LETSENCRYPT_ACCOUNT_EMAIL: example@example.com

  ## この Discourse インスタンスの http または https CDN アドレス (取得用に設定)
  ## 詳細は https://meta.discourse.org/t/14857 を参照してください
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## IP アドレスの検索に使用する MaxMind のジオロケーション IP キー
  ## 詳細は https://meta.discourse.org/t/-/137387/23 を参照してください
  DISCOURSE_MAXMIND_LICENSE_KEY: XXXXX

## Docker コンテナはステートレスです。すべてのデータは /shared に保存されます
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:

  ## TODO: この Discourse インスタンスが応答するドメイン名
  ## 必須です。Discourse は IP アドレス単独では動作しません。
  DISCOURSE_HOSTNAME: community.example.io

  ## 上記で指定したホスト名と同じ (-h オプション) でコンテナを起動したい場合はコメントアウトを解除してください
  ## (デフォルトは "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 初期登録時に管理者および開発者に設定されるカンマ区切りのメールアドレスリスト
  ## 例: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'example@example.com'

  ## TODO: 新規アカウントの検証や通知送信に使用する SMTP メールサーバー
  # SMTP アドレス、ユーザー名、パスワードは必須です
  # 警告: SMTP パスワードに含まれる '#' 文字は問題を引き起こす可能性があります!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: no-reply@example.io
  DISCOURSE_SMTP_PASSWORD: "XXXXXXXX"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (オプション、デフォルトは true)
  DISCOURSE_SMTP_DOMAIN: community.example.io
  DISCOURSE_NOTIFICATION_EMAIL: noreply@community.example.io

  ## Lets Encrypt テンプレートを追加した場合、以下のコメントアウトを解除して無料の SSL 証明書を取得してください
  LETSENCRYPT_ACCOUNT_EMAIL: example@example.com

  ## この Discourse インスタンスの http または https CDN アドレス (取得用に設定)
  ## 詳細は https://meta.discourse.org/t/14857 を参照してください
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## IP アドレスの検索に使用する MaxMind のジオロケーション IP キー
  ## 詳細は https://meta.discourse.org/t/-/137387/23 を参照してください
  DISCOURSE_MAXMIND_LICENSE_KEY: XXXXXX

## Docker コンテナはステートレスです。すべてのデータは /shared に保存されます
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log
discourse-doctor の結果
Found containers/app.yml

==================== YML SETTINGS ====================
DISCOURSE_HOSTNAME=community.example.io
SMTP_ADDRESS=smtp.mailgun.org
DEVELOPER_EMAILS=example@example.com
SMTP_PASSWORD=XXXXXXXX
SMTP_PORT=587
SMTP_USER_NAME=no-reply@example.io
LETSENCRYPT_ACCOUNT_EMAIL=example@example.com

==================== DOCKER INFO ====================
DOCKER VERSION: Docker version 20.10.21, build baeda1f

DOCKER PROCESSES (docker ps -a)

CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                                                      NAMES
e1d88ff15b5b   local_discourse/app   "/sbin/boot"   18 minutes ago   Up 18 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

e1d88ff15b5b   local_discourse/app   "/sbin/boot"   18 minutes ago   Up 18 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

Discourse container app is running


==================== PLUGINS ====================
          - git clone https://github.com/discourse/docker_manager.git

No non-official plugins detected.

See https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb for the official list.

========================================
Discourse version at community.example.io: NOT FOUND
Discourse version at localhost: NOT FOUND


==================== MEMORY INFORMATION ====================
RAM (MB): 1016

               total        used        free      shared  buff/cache   available
Mem:             969         687          61          21         220         110
Swap:           2047         241        1806

==================== DISK SPACE CHECK ====================
---------- OS Disk Space ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G  8.2G   16G  34% /

==================== DISK INFORMATION ====================
Disk /dev/loop0: 63.22 MiB, 66293760 bytes, 129480 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop1: 102.98 MiB, 107986944 bytes, 210912 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop2: 47.98 MiB, 50315264 bytes, 98272 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/vda: 25 GiB, 26843545600 bytes, 52428800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 728BDF97-580D-4B6F-9462-7E2540D5378B

Device      Start      End  Sectors  Size Type
/dev/vda1  227328 52428766 52201439 24.9G Linux filesystem
/dev/vda14   2048    10239     8192    4M BIOS boot
/dev/vda15  10240   227327   217088  106M EFI System

Partition table entries are not in disk order.


Disk /dev/vdb: 466 KiB, 477184 bytes, 932 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

==================== END DISK INFORMATION ====================

==================== MAIL TEST ====================
For a robust test, get an address from http://www.mail-tester.com/
Or just send a test message to yourself.
Email address for mail test? ('n' to skip) [example@example.com  ]:
Sending mail to example@example.com  . . .
Testing sending to example@example.com  using smtp.mailgun.org:587, username:no-reply@example.io with plain auth.
SMTP server connection successful.
Sending to example@example.com. . .
Mail accepted by SMTP server.
Message-ID: e3455d15-eb48-48bf-9859-a30f1acc765c@community.example.io

If you do not receive the message, check your SPAM folder
or test again using a service like http://www.mail-tester.com/.

If the message is not delivered it is not a problem with Discourse.
Check the SMTP server logs for the above Message ID to see why it
failed to deliver the message.
Replacing: SMTP_PASSWORD
Replacing: LETSENCRYPT_ACCOUNT_EMAIL
Replacing: DEVELOPER_EMAILS
Replacing: DISCOURSE_DB_PASSWORD
Replacing: Sending mail to

==================== DONE! ====================

また、discourse ディレクトリで ./launcher enter app を実行し、さらに top コマンドを実行して nginx、redis、postmaster、ruby がすべて動作しているか確認しました。しかし、リストに nginx は表示されていません

launcher enter app --> top の結果
Tasks:  31 total,   1 running,  30 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.3 us,  2.3 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.3 st
MiB Mem :    969.4 total,     72.4 free,    659.0 used,    238.0 buff/cache
MiB Swap:   2048.0 total,   1667.2 free,    380.8 used.    141.1 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   4528 discour+  25   5  951480 289404   3096 S   0.3  29.2   4:21.14 ruby
      1 root      20   0    6772      0      0 S   0.0   0.0   0:00.02 boot
   4428 root      20   0    2340     24      0 S   0.0   0.0   0:01.14 runsvdir
   4429 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4430 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4431 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4432 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4433 root      20   0    2188    280    256 S   0.0   0.0   1:28.21 runsv
   4434 root      20   0    2188      0      0 S   0.0   0.0   0:00.00 runsv
   4435 root      20   0    2336      0      0 S   0.0   0.0   0:00.05 svlogd
   4436 redis     20   0   58072   2900   1624 S   0.0   0.3   3:17.52 redis-server
   4438 root      20   0    2336      0      0 S   0.0   0.0   0:00.00 svlogd
   4439 discour+  20   0   15256   1128    912 S   0.0   0.1   0:25.85 unicorn_launche
   4441 root      20   0    6620    488    384 S   0.0   0.0   0:00.21 cron
   4442 postgres  20   0  213172   5220   4776 S   0.0   0.5   0:02.75 postmaster
   4445 root      20   0  151068    132      0 S   0.0   0.0   0:00.06 rsyslogd
   4458 postgres  20   0  213392  10404   9896 S   0.0   1.0   0:00.78 postmaster
   4459 postgres  20   0  213172   5004   4604 S   0.0   0.5   0:01.50 postmaster
   4460 postgres  20   0  213172   4956   4588 S   0.0   0.5   0:27.50 postmaster
   4461 postgres  20   0  213840   2264   1652 S   0.0   0.2   0:01.98 postmaster
   4462 postgres  20   0   68200    788      0 S   0.0   0.1   0:05.01 postmaster
   4463 postgres  20   0  213724   1164    700 S   0.0   0.1   0:00.05 postmaster
   4464 discour+  20   0  457692 171868   1364 S   0.0  17.3   0:22.71 ruby
   4503 postgres  20   0  220116  11116  10812 S   0.0   1.1   0:01.51 postmaster
   4538 discour+  20   0  768724 169816   1032 S   0.0  17.1   0:08.27 ruby
   4549 discour+  20   0  768724 169948   1220 S   0.0  17.1   0:08.55 ruby
   4580 postgres  20   0  219408  10580  10460 S   0.0   1.1   0:00.13 postmaster
 134464 postgres  20   0  217332  21388  17444 S   0.0   2.2   0:00.24 postmaster
 137350 root      20   0    7036   3468   2972 S   0.0   0.3   0:00.02 bash
 137382 root      20   0   10108   3756   3080 R   0.0   0.4   0:00.08 top
 137609 discour+  20   0   13760   2004   1732 S   0.0   0.2   0:00.00 sleep

var/discourse/shared/standalone/log/var-log/nginx 内の error.log を確認しました:

2022/12/12 07:55:26 [emerg] 5040#5040: cannot load certificate "/shared/ssl/community.example.io.cer": PEM_read_bio_X509_AUX(>
2022/12/12 07:55:27 [emerg] 5042#5042: cannot load certificate "/shared/ssl/community.example.io.cer": PEM_read_bio_X509_AUX(>
2022/12/12 07:55:28 [emerg] 5044#5044: cannot load certificate "/shared/ssl/community.example.io.cer": PEM_read_bio_X509_AUX(>
2022/12/12 07:55:29 [emerg] 5046#5046: cannot load certificate "/shared/ssl/community.example.io.cer": PEM_read_bio_X509_AUX(>
....

エラーログファイル var/discourse/shared/standalone/log/var-log/nginx に基づいて、app.yml の SSL テンプレートを編集することにしました。

## Let's Encrypt (https) を追加したい場合は、これらの 2 行のコメントを解除してください
##  - "templates/web.ssl.template.yml"
## - "templates/web.letsencrypt.ssl.template.yml"

その後、./launcher stop app./launcher rebuild app を実行したところ、ブラウザに「congratulations, you installed discourse!」と表示され、http 経由で Discourse のビルドが正常に実行されました。

一歩前進しましたが、SSL を機能させることができません。LE 証明書はまだ期限切れではなく、DNS も問題なく、これは非常に標準的なサーバー仕様の新規インストールです。

Let’s Encrypt 経由で SSL を有効にできない理由について、何かアイデアはありますか?

DNSが間違っているか、間違っていたため、何度も試行してレート制限がかかったのだと推測します。簡単な解決策は、1週間待つか、別のサブドメイン名を選択することです。

ホスト名を共有していないため、DNSが機能しているかどうかを知るお手伝いができません。

@pfaffman 、ご返信ありがとうございます。http:// は正常に動作していますが、Let’s Encrypt を有効にすると SSL が機能しません。新規インストールで LE をセットアップしましたが、LE のセットアップチュートリアルを読んでも、DNS の変更については何も言及されていませんでした。

LE/SSL を機能させるために、DNS 側で具体的に何が必要ですか?

DNS セットアップのスクリーンショットを以下に示します。

(DKIM/SPF は検証済みで、Discourse のメールは正常に機能していますので、ご参考までに)

おそらく、Let’s Encrypt に何度もアドレスをリクエストしようとして、何らかの理由で失敗したため、1 週間は再試行できなくなったのだと思います。もしそうなら、1 週間待つか、別の名前を使用してください。

エラーを取得する方法はありますが、携帯電話では思い出せません。

承知いたしました。来週初めの7日間経過後、app.ymlでSSLを再有効化し、再構築して結果を報告します。