Это не моя первая установка 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(>
....
