Я запускаю собственный экземпляр Discourse, который установил, следуя базовому руководству по установке через Docker. Проблема, с которой я столкнулся, заключается в том, что после нескольких дней использования форума вход в систему полностью перестает работать. Обратите внимание, что я единственный пользователь этого форума. К сожалению, я не знаю, что вызывает эту ошибку.
Шаги для воспроизведения #1:
Установите новый сервер Discourse, следуя инструкциям из руководства по установке через Docker.
После завершения мастера настройки убедитесь, что вы можете успешно выйти из системы и снова войти.
Продолжайте использовать форум как обычно. Просто создайте несколько категорий и тем. Возможно, измените тему по умолчанию.
Через несколько дней или недель обычного использования вы не сможете войти в систему после выхода. Вход завершается ошибкой «Неизвестная ошибка» (отображается в форме входа).
Шаги для воспроизведения #2:
Установите новый сервер Discourse, следуя инструкциям из руководства по установке через Docker.
После завершения мастера настройки убедитесь, что вы можете успешно выйти из системы и снова войти.
Восстановите резервную копию из другого экземпляра Discourse, где вход в систему не работал.
Во время процесса восстановления появляется всплывающее сообщение о том, что вы вышли из системы. Восстановление прошло успешно, но вход завершается ошибкой «Неизвестная ошибка» (отображается в форме входа).
Я пытался самостоятельно отладить проблему, но не смог найти никаких соответствующих сообщений об ошибках. Вот что я уже пробовал:
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
При неудачной попытке входа в систему в этих логах не появляется никаких сообщений об ошибках. Что еще я могу сделать, чтобы помочь отладить эту проблему? Заранее спасибо.
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 не будет знать адрес клиента, и все логи будут содержать адрес вашего сервера-прокси. Следующие изменения решают эту проблему: