Проблема с Nginx: при остановке и запуске приложения возникает ошибка "502 Bad Gateway"

Когда я выполняю команду ./launcher stop app, а затем ./launcher start app, сайт выдаёт ошибку 502 Bad Gateway. Я не знаю, в чём проблема; я пытался пересобрать проект, но безрезультатно.

Пожалуйста, подскажите, как это исправить.

Не могли бы вы предоставить логи пересборки?

root@amsaal:/var/discourse# ./launcher logs app
Обнаружена архитектура x86_64.
run-parts: выполняется /etc/runit/1.d/00-ensure-links
run-parts: выполняется /etc/runit/1.d/00-fix-var-logs
run-parts: выполняется /etc/runit/1.d/01-cleanup-web-pids
run-parts: выполняется /etc/runit/1.d/anacron
run-parts: выполняется /etc/runit/1.d/cleanup-pids
Очистка устаревших PID-файлов
run-parts: выполняется /etc/runit/1.d/copy-env
run-parts: выполняется /etc/runit/1.d/letsencrypt
[Пн 15 апр 2024 10:12:06 UTC] Домены не изменены.
[Пн 15 апр 2024 10:12:06 UTC] Пропуск, следующее время обновления: 2024-06-12T11:28:31Z
[Пн 15 апр 2024 10:12:06 UTC] Добавьте '--force', чтобы принудительно обновить.
[Пн 15 апр 2024 10:12:07 UTC] Установка ключа в: /shared/ssl/amsaal.net.key
[Пн 15 апр 2024 10:12:07 UTC] Установка полной цепочки в: /shared/ssl/amsaal.net.cer
[Пн 15 апр 2024 10:12:07 UTC] Выполнение команды перезагрузки: sv reload nginx
предупреждение: nginx: не удалось открыть supervise/ok: файл не существует
[Пн 15 апр 2024 10:12:07 UTC] Ошибка перезагрузки для :
[Пн 15 апр 2024 10:12:07 UTC] Домены не изменены.
[Пн 15 апр 2024 10:12:07 UTC] Пропуск, следующее время обновления: 2024-06-12T11:28:38Z
[Пн 15 апр 2024 10:12:07 UTC] Добавьте '--force', чтобы принудительно обновить.
[Пн 15 апр 2024 10:12:08 UTC] Установка ключа в: /shared/ssl/amsaal.net_ecc.key
[Пн 15 апр 2024 10:12:08 UTC] Установка полной цепочки в: /shared/ssl/amsaal.net_ecc.cer
[Пн 15 апр 2024 10:12:08 UTC] Выполнение команды перезагрузки: sv reload nginx
предупреждение: nginx: не удалось открыть supervise/ok: файл не существует
[Пн 15 апр 2024 10:12:08 UTC] Ошибка перезагрузки для :
Запущен runsvdir, PID 537
ok: run: redis: (pid 550) 0s
ok: run: postgres: (pid 551) 0s
nginx: [warn] директива "listen ... http2" устарела, используйте директиву "http2" в /etc/nginx/conf.d/discourse.conf:60
pid супервизора: 545 pid unicorn: 577
root@amsaal:/var/discourse#

Это не то, что я имел в виду. Не могли бы вы выполнить ./launcher rebuild app и затем поделиться результатом? (Также, пожалуйста, поместите вывод в блоки кода, это облегчит чтение темы)

Так пользователю будет немного проще восстановить это, так как стандартный вывод будет записан в файл:

./launcher rebuild app >> rebuild.log

Если вы хотите получать разные файлы при каждой пересборке:

./launcher rebuild app > "rebuild-$(date -Imin).log" 2>&1

После запуска контейнера может пройти минута-две, прежде чем он начнёт обрабатывать запросы. Вы пробовали подождать несколько минут перед переходом на веб-сайт?

Обнаружена архитектура x86_64.
Проверка актуальности лаунчера
Лаунчер актуален
Остановка старого контейнера
app
2.0.20231218-0429: Извлечение образа из discourse/base
Дайджест: sha256:468f70b9bb4c6d0c6c2bbb3efc1a5e12d145eae57bdb6946b7fe5558beb52dc1
Статус: Образ discourse/base:2.0.20231218-0429 уже актуален
docker.io/discourse/base:2.0.20231218-0429
/usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
97:C 15 Apr 2024 18:52:04.329 # oO0OoO0OoO0Oo Redis запускается oO0OoO0OoO0Oo
97:C 15 Apr 2024 18:52:04.329 # Версия Redis=7.0.7, биты=64, коммит=00000000, изменен=0, pid=97, только что запущен
97:C 15 Apr 2024 18:52:04.330 # Конфигурация загружена
97:M 15 Apr 2024 18:52:04.331 * Монохронные часы: POSIX clock_gettime
97:M 15 Apr 2024 18:52:04.336 * Режим работы=standalone, порт=6379.
97:M 15 Apr 2024 18:52:04.336 # Сервер инициализирован
97:M 15 Apr 2024 18:52:04.337 * Загрузка RDB, созданного в версии 7.0.7
97:M 15 Apr 2024 18:52:04.337 * Возраст RDB: 31 секунда
97:M 15 Apr 2024 18:52:04.337 * Использование памяти RDB при создании: 23.25 Мб
97:M 15 Apr 2024 18:52:04.451 * Загрузка RDB завершена, загружено ключей: 1351, истекших ключей: 5.
97:M 15 Apr 2024 18:52:04.461 * База данных загружена с диска за 0.124 секунды
97:M 15 Apr 2024 18:52:04.461 * Готов к принятию подключений
3507:C 15 Apr 2024 18:58:01.238 # oO0OoO0OoO0Oo Redis запускается oO0OoO0OoO0Oo
3507:C 15 Apr 2024 18:58:01.238 # Версия Redis=7.0.7, биты=64, коммит=00000000, изменен=0, pid=3507, только что запущен
3507:C 15 Apr 2024 18:58:01.238 # Конфигурация загружена
3507:M 15 Apr 2024 18:58:01.239 * Монохронные часы: POSIX clock_gettime
3507:M 15 Apr 2024 18:58:01.240 # Предупреждение: Не удалось создать TCP-сокет для прослушивания сервера *:6379: bind: Адрес уже используется
3507:M 15 Apr 2024 18:58:01.240 # Не удалось начать прослушивание порта 6379 (TCP), прерывание.
97:M 15 Apr 2024 18:58:27.220 * 100 изменений за 300 секунд. Сохранение...
97:M 15 Apr 2024 18:58:27.223 * Фоновое сохранение запущено процессом с pid 3555
3555:C 15 Apr 2024 18:58:30.967 * База данных сохранена на диск
3555:C 15 Apr 2024 18:58:30.969 * Fork CoW для RDB: текущее значение 1 МБ, пиковое 1 МБ, среднее 1 МБ
97:M 15 Apr 2024 18:58:31.058 * Фоновое сохранение завершено успешно
97:M 15 Apr 2024 19:03:32.047 * 100 изменений за 300 секунд. Сохранение...
97:M 15 Apr 2024 19:03:32.063 * Фоновое сохранение запущено процессом с pid 3634
3634:C 15 Apr 2024 19:03:37.774 * База данных сохранена на диск
3634:C 15 Apr 2024 19:03:37.777 * Fork CoW для RDB: текущее значение 1 МБ, пиковое 1 МБ, среднее 1 МБ
97:M 15 Apr 2024 19:03:37.828 * Фоновое сохранение завершено успешно
97:signal-handler (1713208309) Получен сигнал SIGTERM, планирование завершения работы...
97:M 15 Apr 2024 19:11:49.130 # Пользователь запросил завершение работы...
97:M 15 Apr 2024 19:11:49.131 * Сохранение финального снапшота RDB перед выходом.
97:M 15 Apr 2024 19:11:52.592 * База данных сохранена на диск
97:M 15 Apr 2024 19:11:52.593 # Redis теперь готов к выходу, пока...
sha256:066d1fc0bf450b6f9043e13960cafef6b7751d92f0d89cc4e0865208293ce2e2
58661874f252e2e9dac3955608dbbe90e60f020a4d307d2818e7f991d39f8010
Удаление старого контейнера
app

ea032a7acab7743f4ef8de3b9a536da0dbbf36b8c9dd5b2a9add0cfb01286e5d

Да, после завершения процесса пересборки, через 30 секунд сайт перестал работать с ошибкой 502 Gateway Error. Затем я выполнил команду /launch restart app, затем launch start app, и всё заработало.

Возможно, происходит что-то ещё.

Это… похоже на неполный лог. Он действительно заканчивается здесь или просто происходит долгая пауза? Если второе, то, возможно, вам понадобится больше оперативной памяти или места для подкачки.

Попробуйте подождать 60 секунд.

Это может быть либо пауза, либо процесс пересборки занимает очень много времени — почти 30 минут. Я думаю, что проблема в оперативной памяти: всего 2 ГБ, что может замедлять работу, но в данный момент у меня нет проблем с нехваткой памяти. Система просто работает медленно; обычно пересборка не должна занимать более 1–2 минут в зависимости от конфигурации.

Ниже указаны характеристики моего VPS:

CPU: AMD EPYC 7551P, 32-ядерный процессор, 2000 МГц
RAM: 2 ГБ
SSD: 60 ГБ

Ошибка 502 не возникла бы, если бы контейнер не был запущен. Если бы вы подождали немного дольше, сайт начал бы работать.

Дело не в том, что остановка и запуск что-то исправили, а в том, что во время перезапуска вы просто подождали достаточно долго.

Ошибку 502 в течение определённого времени во время запуска контейнера ожидать нормально. У вас нет проблем.

Честно говоря, это не так уж и необычно: пересборки не бывают быстрыми, особенно когда…

…у вас мало памяти.

В целом, для работы Discourse в настоящее время рекомендуется иметь как минимум 4 ГБ общей памяти (оперативной и подкачки).

При обновлении Discourse через административный интерфейс я получаю предупреждение о несовместимости:

warning Resolution field "unset-value@2.0.1" is incompatible with requested version "unset-value@^1.0.0"
[3/5] Fetching packages...
warning Pattern ["wrap-ansi-cjs@npm:wrap-ansi@^7.0.0"] is trying to unpack in the same destination "/home/discourse/.cache/yarn/v6/npm-wrap-ansi-cjs-7.0.0-67e145cff510a6a6984bdf1152911d69d2eb9e43-integrity/node_modules/wrap-ansi-cjs" as pattern ["wrap-ansi@^7.0.0"]. This could result in non-deterministic behavior, skipping.
[4/5] Linking dependencies...
warning "@discourse/lint-configs > eslint-plugin-ember > ember-eslint-parser@0.3.8" has unmet peer dependency "@typescript-eslint/parser@^6.15.0".
warning " > @glint/environment-ember-loose@1.4.0" has unmet peer dependency "@glimmer/component@^1.1.2".
warning " > discourse-markdown-it@1.0.0" has unmet peer dependency "xss@*".
warning "workspace-aggregator-e69f39ff-3f17-47f3-9e20-638bb7914a45 > discourse > @uppy/aws-s3@3.0.6" has incorrect peer dependency "@uppy/core@^3.1.2".
warning "workspace-aggregator-e69f39ff-3f17-47f3-9e20-638bb7914a45 > discourse > @uppy/aws-s3-multipart@3.1.3" has incorrect peer dependency "@uppy/core@^3.1.2".
warning "workspace-aggregator-e69f39ff-3f17-47f3-9e20-638bb7914a45 > discourse > @uppy/xhr-upload@3.1.1" has incorrect peer dependency "@uppy/core@^3.1.2".
warning "workspace-aggregator-e69f39ff-3f17-47f3-9e20-638bb7914a45 > discourse-plugins > ember-this-fallback@0.4.0" has unmet peer dependency "ember-source@^3.28.11 || ^4.0.0".
warning "workspace-aggregator-e69f39ff-3f17-47f3-9e20-638bb7914a45 > admin > ember-source > router_js@8.0.3" has unmet peer dependency "rsvp@^4.8.5".
warning "workspace-aggregator-e69f39ff-3f17-47f3-9e20-638bb7914a45 > discourse > @uppy/aws-s3 > @uppy/xhr-upload@3.3.0" has incorrect peer dependency "@uppy/core@^3.2.1".

Их можно игнорировать, это не помешает Discourse выполнить пересборку.