Ошибка входа: «Неизвестная ошибка»

Здравствуйте,

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

Шаги для воспроизведения #1:

  1. Установите новый сервер Discourse, следуя инструкциям из руководства по установке через Docker.
  2. После завершения мастера настройки убедитесь, что вы можете успешно выйти из системы и снова войти.
  3. Продолжайте использовать форум как обычно. Просто создайте несколько категорий и тем. Возможно, измените тему по умолчанию.
  4. Через несколько дней или недель обычного использования вы не сможете войти в систему после выхода. Вход завершается ошибкой «Неизвестная ошибка» (отображается в форме входа).

Шаги для воспроизведения #2:

  1. Установите новый сервер Discourse, следуя инструкциям из руководства по установке через Docker.
  2. После завершения мастера настройки убедитесь, что вы можете успешно выйти из системы и снова войти.
  3. Восстановите резервную копию из другого экземпляра Discourse, где вход в систему не работал.
  4. Во время процесса восстановления появляется всплывающее сообщение о том, что вы вышли из системы. Восстановление прошло успешно, но вход завершается ошибкой «Неизвестная ошибка» (отображается в форме входа).

Я пытался самостоятельно отладить проблему, но не смог найти никаких соответствующих сообщений об ошибках. Вот что я уже пробовал:

cd /var/discourse
./launcher enter app
tail -F log/production_errors.log
tail -F log/production.log
tail -F log/unicorn.stderr.log
tail -F log/unicorn.stdout.log

При неудачной попытке входа в систему в этих логах не появляется никаких сообщений об ошибках. Что еще я могу сделать, чтобы помочь отладить эту проблему? Заранее спасибо.

Вы смотрели в /logs в веб-браузере, когда вошли в систему как администратор?

OK, я кое-что выяснил. Вход не удаётся сразу после включения настройки «принудительный HTTPS». Мой экземпляр Discourse находится за прокси-сервером с завершением SSL. Как только я отключаю «принудительный HTTPS», вход снова работает. Так что, скорее всего, это не ошибка в Discourse, а проблема с моей инфраструктурой.

Я также сделал то, что вы предложили, но в логах сообщения об ошибке не было.

Наконец-то решение найдено. Необходимо установить заголовок X-Forwarded-Proto, который используется для определения протокола (HTTP или HTTPS), по которому клиент подключился к вашему прокси-серверу или балансировщику нагрузки.

Поскольку я использую HAProxy в качестве прокси-сервера, мне пришлось добавить эту строку в конфигурацию HAProxy:

http-request set-header X-Forwarded-Proto https if { ssl_fc }

Теперь вход в систему работает корректно, даже если включена опция «принудительный HTTPS».

Я также хочу использовать протокол PROXY для любого соединения, устанавливаемого с моим сервером Discourse. Протокол PROXY информирует другую сторону (т.е. сервер Discourse) о адресах входящего соединения, чтобы он мог узнать адрес клиента или публичный адрес, к которому обращались. Без этого изменения Nginx не будет знать адрес клиента, и все логи будут содержать адрес вашего сервера-прокси. Следующие изменения решают эту проблему:

root@talk3:/var/discourse# git diff
diff --git a/templates/web.template.yml b/templates/web.template.yml
index a60e6ef..55cb5f2 100644
--- a/templates/web.template.yml
+++ b/templates/web.template.yml
@@ -116,6 +116,19 @@ run:
       to: daemon off;

   - replace:
+      filename: /etc/nginx/nginx.conf
+      from: /# server_tokens off;/
+      to: |
+        server_tokens off;
+        real_ip_header proxy_protocol;
+        set_real_ip_from 192.168.1.19;  # адрес прокси-сервера
+
+  - replace:
+      filename: "/etc/nginx/conf.d/discourse.conf"
+      from: /listen 80;$/
+      to: "listen 80 proxy_protocol;"
+
+  - replace:
       filename: "/etc/nginx/conf.d/discourse.conf"
       from: /upstream[^\}]+\}/m
       to: "upstream discourse {

И настройте HAProxy на принудительное использование протокола PROXY для этого сервера:

-    server server-1 192.168.1.27:80 check
+    server server-1 192.168.1.27:80 check send-proxy

Наконец, выполните ./launcher rebuild app и проверьте, что теперь логируют адреса клиентов:

tail -F /var/discourse/shared/standalone/log/var-log/nginx/access.log