Контейнер Discourse-app запускается, а затем незаметно останавливается

Уважаемое сообщество,

Я попытался установить частный экземпляр Discourse, следуя официальным инструкциям по адресу discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub. Несмотря на то, что скрипты выглядят крайне сложными, мне пришлось вручную изменить файлы container.yml и discourse-setup, чтобы настроить собственные параметры…

Проблема 1: Несмотря на сложность, скрипт установки не позволяет изменить открытые порты! Порты 80/443 нельзя использовать на моем сервере, так как они заняты nginx. Поэтому мне снова пришлось внести изменения в скрипт настройки, чтобы установить порты 3080/3443 в качестве необходимых портов для доступа к Discourse.

Затем мне удалось запустить все контейнеры. Осмотрев стек в Portainer, я обнаружил, что приложение запускается и бесшумно останавливается, а в логах нет достаточной информации о причине. Поскольку Redis и PostgreSQL не публикуют порты, может ли приложение Discourse не работать из-за невозможности подключения к этим компонентам? Что я упустил или сделал неправильно?

_discourse-app_logs.txt (10,4 Ko)

Заранее благодарю за любую помощь!

Причина:

Errno::EADDRNOTAVAIL: Не удалось назначить запрошенный адрес - connect(2) для [::1]:6379

Таким образом, подключение к Redis по IPv6-адресу локальной петли невозможно.

Привет, Ричард, спасибо за быстрый ответ! Я не специалист по IT, просто люблю возиться с инструментами: как исправить эту проблему?

Заранее спасибо за совет!

Похоже, что вы отклонились от стандартной установки, настроив отдельные контейнеры для Redis и Postgres, поэтому, боюсь, у меня нет готового решения для вашего случая. Как вы настроили параметры Redis в Discourse?

Ещё один момент — я вижу redis:4-alpine. Боюсь, вам нужно перейти на более новую версию Redis, так как Discourse требует версию 6.20 или выше. Однако я не думаю, что это является причиной вашей проблемы.

Скрипт настройки работает только для стандартной конфигурации. Если вы настраиваете что-то более сложное, вам придется вручную редактировать YAML-файл. Это гораздо проще, чем изменять сам скрипт.

Discourse не будет работать на нестандартном порту. Вам понадобится обратный прокси-сервер перед ним. См. такие темы, как Запуск других веб-сайтов на той же машине, что и Discourse.

Если вы не планируете использовать предоставленные PostgreSQL и Redis, то вам придется самостоятельно разбираться, почему ваша конфигурация не работает. Причин может быть слишком много, и мы не можем их предположить или вывести. Я рекомендую сначала выполнить стандартную установку на отдельной виртуальной машине, чтобы понять, как всё работает, прежде чем пытаться настроить сложную конфигурацию.

Я не выполнял никакой «нестандартной» установки! Как и указано в документации, я загрузил весь необходимый контент с GitHub, изменил только отображаемые порты и запустил скрипт:

  • Я не вносил никаких изменений в конфигурацию Redis или PostgreSQL.
  • Я не менял версию Redis.
    Эти компоненты программного обеспечения были установлены с помощью оригинального скрипта discourse-setup.

@pfaffman, что вы имеете в виду под «редактированием yml вручную»? О каком именно файле yml идёт речь? В директории «containers» их множество…

Кстати, на этом сервере у меня уже настроен обратный прокси, конфигурация которого, кажется, проста: несколько файлов subdomain.conf, определяющих перенаправление с поддомена:80 на порт XXX. Это то, что требуется?

Я бы рекомендовал стандартную установку на отдельной виртуальной машине, чтобы понять, как всё работает, прежде чем пытаться реализовать очень сложную настройку.

Мне не нужна сложная настройка :blush:, я просто хочу запустить Discourse вместе с другими контейнерами, для чего и предназначен Docker…

Спасибо ещё раз за вашу помощь!

В целом discourse-setup не устанавливает отдельные экземпляры PostgreSQL и Redis, и уж тем более версии 12 и 4.

Пожалуйста, опубликуйте вашу конфигурацию и изменения, которые вы внесли в container.yml и скрипты. Не забудьте удалить любые конфиденциальные настройки.
Также сообщите, на каком коммите репозитория discourse_docker вы находитесь.

Вы отредактировали как файл discourse-setup, так и файл, который будет перезаписан при обновлении discourse-docker. Изменение чего-либо, кроме вашего app.yml, однозначно является нестандартным.

Зачем? И что бы вы ни пытались изменить там, это не тот способ. Вам нужно внести эти изменения в свой app.yml.

Discourse не будет работать на нестандартном порту, поэтому это не стандартная установка.

Стандартная установка включает PostgreSQL и Redis в одном контейнере. Как было отмечено, вы используете неподдерживаемые версии Redis и PostgreSQL. Также можно выполнить установку в двух контейнерах, как описано здесь: Переход от одиночного контейнера к отдельным веб- и дата-контейнерам (вы можете использовать ./discourse-setup --two-container, чтобы discourse-setup создал отдельные дата- и веб-контейнеры, хотя это немного сложнее поддерживать — вам нужно знать, когда обновлять дата-контейнер).

Хорошо, тогда мне нужно:

  • удалить всё программное обеспечение, установленное с помощью изменённых скриптов (надеюсь, это легко обратимо).
  • снова скачать скрипт. Для текущей установки я использовал команду git clone https://github.com/discourse/discourse_docker.git /var/discourse: это нормально?
  • возможно, изменить некоторые настройки только в файле app.yml перед запуском ./discourse-setup.
  • запустить скрипт установки для стандартной установки (я предпочитаю один контейнер).
  • настроить nginx-прокси для маршрутизации discourse.example.com:80/443 к соответствующему контейнеру. Есть ли в документации подсказки по этому разделу?

Пожалуйста, дополните список, если я упустил какой-либо шаг!

Спасибо ещё раз за вашу помощь!

:white_check_mark:

См. Run other websites on the same machine as Discourse

Единственное, что будет установлено, — это Docker.

Выглядит хорошо.

Файл app.yml создаётся командой discourse-setup. Вы не сможете запустить discourse-setup, если он не имеет доступа к портам, но если вы изучите исходный код, то увидите, что можно использовать ./discourse-setup --skip-connection-test и запустить его в любом случае.

Ваш nginx будет отвечать за Let’s Encrypt, поэтому вам нужно закомментировать шаблон Let’s Encrypt. Я подозреваю, что это описано в теме о обратном прокси, на которую есть ссылки выше и ниже.

Смотрите Использование Nginx Proxy Manager для управления несколькими сайтами с Discourse или Запуск других веб-сайтов на той же машине, что и Discourse (который уже был упомянут).

Привет, @pfaffman,

Изучая документацию на тему Запуск других веб-сайтов на том же сервере, что и Discourse, мне нужно получить подтверждение:

  • В сообщении сказано:

Вы не можете использовать ./discourse-setup для настройки Discourse, если другой сервер использует порт 80 или 443. Вам потребуется скопировать и отредактировать файл samples/standalone.yml в вашем любимом текстовом редакторе.

Я понимаю, что мне нужно изменить файл app.yml до запуска discourse-setup, как уже сказано во вступлении:

Вы не можете использовать ./discourse-setup для настройки Discourse, если другой сервер использует порт 80 или 443. Вам потребуется скопировать и отредактировать файл samples/standalone.yml в вашем любимом текстовом редакторе.

Можете ли вы подтвердить следующий процесс:

  • загрузить всё содержимое из GitHub;
  • один раз запустить discourse-setup с опцией --skip-connection-test — это создаст контейнеры и файл app.yml;
  • изменить app.yml, как описано в документации выше;
  • обновить программное обеспечение командой /var/discourse/launcher rebuild app;
  • создать сайт nginx, указывающий на сокет Discourse, и перезапустить nginx;
  • наконец, запустить браузер и перейти на Discourse по адресу https://discourse.mydomain.com, который просто указывает на IP-адрес сервера.

Заранее спасибо за ваши рекомендации!

Обновление:

  • загрузить всё с GitHub: ГОТОВО
  • запустить discourse-setup один раз с опцией --skip-connection-test: всё прошло успешно до самого конца, где скрипт вернул
docker: Error response from daemon: driver failed programming external connectivity on endpoint app (784361985c928eb26b149d829f37882056562d9b1e77ef4ce71fbfe30c5d80b1): Error starting userland proxy: listen tcp4 0.0.0.0:443: bind: address already in use.

Мне это кажется нормальным, так как контейнер пытается использовать те же порты, что и существующий веб-сервер. Однако, поскольку контейнер Discourse не был создан (как показывает вывод docker container ls), я хотел бы получить ваше подтверждение этого перед дальнейшей настройкой nginx…

Заранее спасибо за помощь!

Думаю, вам нужно закомментировать порты.

Вы имеете в виду «до запуска discourse-setup»? В таком случае, какой файл нужно изменить, ведь app.yml не существует до запуска скрипта? Я хочу установить приложение в одном контейнере: стоит ли мне снова запустить тот же скрипт discourse-setup или команду /var/discourse/launcher rebuild app?

Кстати, правильно ли я всё делаю?

Отредактируйте существующий файл с помощью nano или аналогичного редактора и закомментируйте порты. Выполните ./launcher rebuild app.

Скорее всего, в вашем случае также можно использовать --skip-rebuild, тогда команда будет выглядеть так:

./discourse-setup --skip-connection-test --skip-rebuild
nano containers/app.yml
./launcher rebuild app

Извините за беспокойство, но мне нужно быть на 100% уверенным, так как я точно не эксперт :wink::

  • Я запускаю еще раз ./discourse-setup --skip-connection-test --skip-rebuild (предыдущий запуск был без опции --skip-rebuild). Мне не нужно удалять то, что было установлено при предыдущем запуске.
  • Затем я редактирую существующий файл app.yml и закомментировываю порты (они уже закомментированы).
  • После этого я запускаю ./launcher rebuild app.

Спасибо еще раз за ваше время!

Вам больше никогда не нужно запускать discourse-setup (если только вы не измените объем оперативной памяти и не захотите обновить настройки памяти до рекомендуемых значений по умолчанию).

Просто отредактируйте порты и выполните пересборку.

Привет, Джей,

Вот результат пересборки этого утра:

  • ./launcher rebuild app = ОК, есть некоторые предупреждения, но Docker сообщает, что контейнер local_discourse/up запущен и работает.
  • Я настроил сайт nginx согласно инструкциям на Run other websites on the same machine as Discourse и перезапустил nginx = ОК.
  • Я создал запись DNS, чтобы discourse.mydomain.com указывал на IP-адрес сервера = ОК.
  • При открытии браузера по адресу discourse.mydomain.com я попадаю… на экземпляр Nextcloud, работающий на сервере. Похоже, конфигурацию нужно исправить, так как трафик не правильно маршрутизируется в контейнер Discourse…

Я не хочу устанавливать NPM, так как прочитал, что это не надежный инструмент, а конфигурация для Discourse включает жесткое кодирование IP-адресов: стоит ли мне всё равно это сделать?

Заранее спасибо за ваши советы!

Так что, похоже, проблема в вашем обратном прокси-сервере nginx, который стоит перед вашей установкой Discourse.

Подождите…? Что? И зачем вам вообще нужно устанавливать NPM вне контейнера?