У нас установлена Discourse, которая работает уже несколько лет. В данный момент используется последняя версия (2.4.0beta2) с последним образом Docker, на публичном IP-адресе, без прокси или других промежуточных компонентов, с сертификатами LetsEncrypt.
Иногда IP-адрес регистрации пользователя и последний IP-адрес определяются корректно, а иногда — нет. Никакой закономерности не прослеживается. Например, вот пользователь, созданный 7 часов назад, с бессмысленными адресами:
Так происходит постоянно: у одних пользователей всё в порядке, у других — нет. Есть ли какие-либо идеи, что здесь происходит?
Теперь, когда я присмотрелся, меня настораживает то, что эти пользователи могут подключаться через IPv6, поскольку я никогда не видел IPv6-адресов в этих полях. Не поддерживает ли Discourse IPv6? Не понимает ли прокси Docker соответствующую информацию или не передаёт ли её? Или дело в чём-то другом?
IPv6 работает отлично, и используется рекомендуемая настройка образов Docker с шаблонами веб-сервиса и базы данных. Никаких дополнительных компонентов перед ними нет. Что именно стоит настроить?
Кстати, наш файл конфигурации контейнеров существует уже несколько лет, хотя в него включены последние шаблоны, а сами образы регулярно пересобираются. Возможно, что-то изменилось за это время?
Трудно сказать. Я только что проверил последних ~8 новых пользователей, зарегистрировавшихся на talk.commonmark.org — это стандартная установка по умолчанию — и у всех были действительные IPv4-адреса для «Последний IP» и «IP регистрации» (иногда эти адреса различались).
Я знаю, что если учётные записи пользователей создаются через SSO или другие нестандартные пути, это может повлиять на отображаемые IP-адреса. Все ли пользователи, о которых вы говорите, — это обычные регистрации через стандартное окно регистрации нового пользователя в Discourse?
Тогда я уверен, что это не будет демонстрировать проблему отображения localhost вместо IPv6-адресов для пользователей, подключившихся через IPv6. Это не означает, что проблемы не существует.
Проблемы не существует на официальном хостинге Discourse, по крайней мере, и он поддерживает IPv6. Я также не вижу проблем при чистой установке у случайного хостинг-провайдера. Не знаю, что ещё вам сказать, кроме того, что вы не ответили на мой довольно важный вопрос.
Я не сомневаюсь, что это работает в вашей среде хостинга, но вы, кажется, не используете «стандартную» настройку Docker, как большинство пользователей? Я имею в виду, что, конечно, это возможно сделать работающим при правильной настройке прокси и заголовков и т. д., вопрос лишь в том, делает ли это настройка по умолчанию и, если нет, можем ли мы это обеспечить.
Я почти уверен, что вам нужно добавить немного в ваш app.yml, чтобы nginx распознавал ваш IPv6-адрес и передавал адрес клиента. Хотя я сам ещё не разобрался, как это сделать. В темах о настройке обратного прокси-сервера есть примеры для IPv6, которые дают подсказки.
Это у меня в списке дел, которые нужно разобраться, но у меня довольно длинный список. В итоге я отключил IPv6, думаю, из-за этой проблемы, но возможно, из-за какого-то другого незнания особенностей IPv6.
(Джефф, вы можете получить выделенный блок IPv6-адресов, но нужно запросить его, а затем настроить свои хосты для его использования.)
Я думаю, что ключевым моментом является внешний обратный прокси — я не считаю, что эту проблему можно решить вообще, или хотя бы легко, только внутри Docker-контейнера.
Я решил её, настроив Discourse в Docker для прослушивания Unix-сокета и разместив перед ним Caddy на той же машине (вне Docker). Настройка Caddy тривиальна, включает Let’s Encrypt, и теперь всё работает как ожидалось, в том числе для IPv6.