Соединение не принимается по http/https после чистой установки на Ubuntu 22.04 LTS

Это не моя первая установка Discourse, но мне удалось зайти в тупик после трёх попыток выполнить стандартную установку на Droplet Digital Ocean (1 ГБ NVMe SSD Premium AMD) под управлением Ubuntu 22.04 LTS. Я прошёл по руководству и указал адрес электронной почты для LetsEncrypt, как делал это много раз раньше. После того как установка Discourse не отобразилась в браузере (ни через A-запись, ни через прямой IP-адрес Droplet), я подтвердил, что установка отклоняет подключения как на портах HTTP, так и HTTPS, и с тех пор бьюсь головой об стену.

Единственная странность, которую я заметил во время установки, заключалась в том, что Docker не был установлен по умолчанию на Droplet Digital Ocean, и система предложила установить его после обнаружения того, что клонирование репозитория контейнера Discourse требует его наличия.除此之外, я продолжил как обычно и протестировал как Docker, так и установку Discourse.

Хорошие новости — Discourse успешно выполняет тест на доставляемость почты, что подразумевает, что установка существует и работает, а Docker, похоже, функционирует нормально (после запуска команды “docker run -it --rm hello-world”). Я также пропинговал github.com и получил ответы, так что проблема, похоже, не в брандмауэре или подключении.

Проблема: отклонение подключений
Однако выполнение команды “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.yml и результаты выполнения команды discourse-doctor:

app.yml
 ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и ядер CPU.
  ## Устанавливается автоматически при загрузке на основе обнаруженных 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

  ## Адрес CDN http или https для этого экземпляра Discourse (настроен на получение)
  ## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## Ключ лицензии 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

  ## Адрес CDN http или https для этого экземпляра Discourse (настроен на получение)
  ## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## Ключ лицензии 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
Найден containers/app.yml

==================== НАСТРОЙКИ YML ====================
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

==================== ИНФОРМАЦИЯ O Docker ====================
ВЕРСИЯ DOCKER: Docker version 20.10.21, сборка baeda1f

ПРОЦЕССЫ DOCKER (docker ps -a)

CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                                                      NAMES
e1d88ff15b5b   local_discourse/app   "/sbin/boot"   18 минут назад   Up 18 минут   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 минут назад   Up 18 минут   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

Контейнер Discourse app запущен


==================== ПЛАГИНЫ ====================
          - git clone https://github.com/discourse/docker_manager.git

Необнаружено неофициальных плагинов.

См. официальный список по адресу https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb.

========================================
Версия Discourse на community.example.io: НЕ НАЙДЕНА
Версия Discourse на localhost: НЕ НАЙДЕНА


==================== ИНФОРМАЦИЯ О ПАМЯТИ ====================
RAM (МБ): 1016

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

==================== ПРОВЕРКА МЕСТА НА ДИСКЕ ====================
---------- Место на диске ОС ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G  8.2G   16G  34% /

==================== ИНФОРМАЦИЯ О ДИСКАХ ====================
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

Записи таблицы разделов не упорядочены по дискам.


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

==================== КОНЕЦ ИНФОРМАЦИИ О ДИСКАХ ====================

==================== ПРОВЕРКА ПОЧТЫ ====================
Для надежного теста получите адрес на http://www.mail-tester.com/
Или просто отправьте тестовое сообщение себе.
Адрес электронной почты для проверки почты? ('n' для пропуска) [example@example.com  ]:
Отправка письма на example@example.com  . . .
Тестирование отправки на example@example.com через smtp.mailgun.org:587, пользователь:no-reply@example.io с простым аутентификацией.
Соединение с SMTP-сервером успешно.
Отправка на example@example.com. . .
Почта принята SMTP-сервером.
Message-ID: e3455d15-eb48-48bf-9859-a30f1acc765c@community.example.io

Если вы не получили сообщение, проверьте папку СПАМ
или протестируйте снова, используя сервис вроде http://www.mail-tester.com/.

Если сообщение не доставлено, это не проблема Discourse.
Проверьте логи SMTP-сервера для указанного выше Message-ID, чтобы узнать, почему
не удалось доставить сообщение.
Замена: SMTP_PASSWORD
Замена: LETSENCRYPT_ACCOUNT_EMAIL
Замена: DEVELOPER_EMAILS
Замена: DISCOURSE_DB_PASSWORD
Замена: Отправка письма на

==================== ГОТОВО! ====================

Я также выполнил команду ./launcher enter app в каталоге discourse и команду 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

Посмотрел на error.log внутри var/discourse/shared/standalone/log/var-log/nginx:

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(>
....

Хорошо, судя по файлу error.log внутри var/discourse/shared/standalone/log/var-log/nginx, я решил закомментировать шаблоны SSL в app.yml:

## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
##  - "templates/web.ssl.template.yml"
## - "templates/web.letsencrypt.ssl.template.yml"

Затем я выполнил ./launcher stop app и ./launcher rebuild app, после чего сборка Discourse успешно запустилась по HTTP, и в браузере появилось сообщение «Congratulations, you installed Discourse!».

Шаг вперёд, но мне не удаётся настроить SSL. Мои сертификаты LE ещё не истекли, DNS выглядит корректно, и это чистая установка с очень стандартными характеристиками сервера.

Есть ли у кого-нибудь идеи, почему установка не позволяет включить SSL через Let’sEncrypt?

Полагаю, проблема в неправильной (или ранее неправильной) настройке DNS, и из-за множества попыток вы попали под ограничение скорости запросов. Простые решения: подождать неделю или выбрать другое имя поддомена.

Поскольку вы не указали имя хоста, мы не можем проверить, работает ли DNS.

Спасибо за ответ, @pfaffman. http:// работает нормально, но SSL не работает при включении Let’s Encrypt. Хотя я настраивал LE с помощью чистой установки, я прочитал руководство по настройке LE и не увидел там упоминания о модификациях DNS.

Что именно нужно сделать на стороне DNS, чтобы LE/SSL заработали?

Вот скриншот моей настройки DNS:

(Для справки: DKIM/SPF прошли проверку, и почта Discourse работает хорошо).

Опять же, я предполагаю, что вы многократно пытались запросить адрес у Let’s Encrypt, но по какой-то причине это не удавалось, и теперь вы не можете повторить попытку в течение недели. Если я прав, то просто подождите неделю или используйте другое имя.

Существует способ получить сообщение об ошибке от них, но я не могу вспомнить, как это найти на телефоне.

Понял. После истечения семидневного срока на следующей неделе я снова включу SSL в app.yml, пересоберу проект и отчитаюсь.