Я установил Discourse на двух разных виртуальных машинах.
Использую официальную инструкцию по установке.
Одна работает под управлением Debian 12 в экземпляре VMWare Fusion на Mac Pro, другая — Ubuntu 24 в виртуальной машине под управлением TrueNAS.
Обе развернуты на выделенных серверах в моей локальной сети с мостовым подключением и имеют уникальные доступные IP-адреса.
Сервер TN размещает множество других приложений в контейнерах Docker, и все они работают и доступны как из локальной сети, так и из интернета; Mac Pro нативно размещает вики-сайт.
На обеих машинах функция bootstrap завершается успешно, но рабочий сайт не появляется — в браузере отображается только «сервер не отвечает».
Согласно выводу команды docker ps, контейнер «app» запущен и работает, прослушивая порты 80 и 443; утилита ufw сообщает, что эти порты разрешены.
Некоторое время на сайте под Debian отображалась стандартная страница приветствия nginx, но теперь она тоже не отвечает.
Я не разработчик и не веб-специалист, поэтому не уверен, как проводить диагностику. Я обращался за помощью к Grok, но пока ничего не сработало.
У меня есть общедоступный статический IP-адрес и доменное имя, указывающее на этот адрес.
Обычно я использую wildcard A-запись для указания любого хоста на этот IP, но в процессе устранения неполадок я наткнулся на сообщение о том, что Discourse может некорректно работать с проксируемыми адресами в Cloudflare DNS, поэтому я создал отдельную A-запись и отключил прокси для неё.
Правильно ли я использую термин «функция инициализации» (bootstrap function)?
Просто хочу убедиться, что мы говорим об одном и том же.
./discourse-setup — это и есть процесс инициализации, верно?
Так что, если я говорю, что он прошёл инициализацию и контейнер запущен, значит, тест соединения, который выполняется в самом начале настройки, успешно пройден.
Ну, в некотором роде. Он создаёт файл app.yml, а затем выполняет команду ./launcher bootstrap app.
Если вы запускали его много раз, пока DNS не работал корректно, вы, вероятно, достигли лимитов запросов для Let’s Encrypt. Простые решения: подождать неделю или использовать другое доменное имя.
И на этой машине ничего другого не запущено?
И когда вы запускали discourse-setup, он не жаловался на невозможность подключения к самому себе?
Я запускал это только один раз на каждой виртуальной машине, и для каждой использовал отдельное имя хоста.
Совсем новые виртуальные машины, на которых ничего другого не запущено. На физическом оборудовании запущены другие службы, но у них отдельные внутренние IP-адреса, отличные от адресов хостов.
Вот ошибки, которые я обнаружил в выводе установки; ни одна из них не выглядит критической:
690:M 30 Apr 2025 22:05:22.859 # Warning: Could not create server TCP listening socket *:6379: bind: Address already in use
690:M 30 Apr 2025 22:05:22.859 # Failed listening on port 6379 (TCP), aborting.
109:M 30 Apr 2025 21:59:42.411 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition...
2025-04-30 21:59:41.125 UTC [60] postgres@postgres ERROR: database "discourse" already exists
2025-04-30 21:59:41.274 UTC [63] postgres@discourse ERROR: role "discourse" already exists
WARN: Unresolved or ambiguous specs during Gem::Specification.reset:
stringio (>= 0)
Available/installed versions of this gem:
- 3.1.7
- 3.1.5
- 3.1.1
WARN: Clearing out unresolved specs. Try 'gem cleanup <gem>'
Please report a bug if this causes problems.
The setting 'staticAddonTrees' will default to true in the next version of Embroider and can't be turned off. To prepare for this you should set 'staticAddonTrees: true' in your Embroider config.
The setting 'staticAddonTestSupportTrees' will default to true in the next version of Embroider and can't be turned off. To prepare for this you should set 'staticAddonTestSupportTrees: true' in your Embroider config.
Node.js heap_size_limit is less than 2048MB. Setting --max-old-space-size=2048 and CHEAP_SOURCE_MAPS=1
-e DISCOURSE_SMTP_DOMAIN=discourse.example.com
[BABEL] Note: The code generator has deoptimised the styling of /var/www/discourse/app/assets/javascripts/discourse/ember/ember-template-compiler.js as it exceeds the max of 500KB.
[BABEL] Note: The code generator has deoptimised the styling of /var/www/discourse/app/assets/javascripts/discourse/ember/ember.js as it exceeds the max of 500KB.
Я не учитывал тот факт, что порт 80 уже занят, а у меня есть только один внешний IP-адрес. Поэтому, несмотря на то, что проверка домена успешно проходила в процессе настройки, мне пришлось изменить порты на стороне хоста, чтобы всё заработало.
Внутри я использую NPM.
Шаги для настройки:
Измените порт на стороне хоста на 7080 для HTTP.
Так как я буду направлять трафик через свой менеджер прокси, я упростил задачу и отключил скрипты LE.
Обновил приложение.
В обратном прокси настроил перенаправление с ‘внешний IP:80’ на ‘внутренний IP:7080’, затем контейнер изменил порты… и всё заработало как по волшебству.