Несогласованная или отсутствующая регистрация и последний IP

У нас установлена Discourse, которая работает уже несколько лет. В данный момент используется последняя версия (2.4.0beta2) с последним образом Docker, на публичном IP-адресе, без прокси или других промежуточных компонентов, с сертификатами LetsEncrypt.

Иногда IP-адрес регистрации пользователя и последний IP-адрес определяются корректно, а иногда — нет. Никакой закономерности не прослеживается. Например, вот пользователь, созданный 7 часов назад, с бессмысленными адресами:

Другой пользователь, созданный 17 часов назад, отображается корректно:

Так происходит постоянно: у одних пользователей всё в порядке, у других — нет. Есть ли какие-либо идеи, что здесь происходит?

Теперь, когда я присмотрелся, меня настораживает то, что эти пользователи могут подключаться через IPv6, поскольку я никогда не видел IPv6-адресов в этих полях. Не поддерживает ли Discourse IPv6? Не понимает ли прокси Docker соответствующую информацию или не передаёт ли её? Или дело в чём-то другом?

Discourse определённо поддерживает, но вам нужно настроить свой сервер и всё, что находится перед ним, чтобы IPv6 работал и так далее.

IPv6 работает отлично, и используется рекомендуемая настройка образов Docker с шаблонами веб-сервиса и базы данных. Никаких дополнительных компонентов перед ними нет. Что именно стоит настроить?

Кстати, наш файл конфигурации контейнеров существует уже несколько лет, хотя в него включены последние шаблоны, а сами образы регулярно пересобираются. Возможно, что-то изменилось за это время?

Похоже, что у других пользователей, использующих стандартную настройку Docker, возникла та же проблема.

https://meta.discourse.org/t/why-are-my-301-redirects-not-working-ipv6-users-also-show-as-localhost/80442/9

Трудно сказать. Я только что проверил последних ~8 новых пользователей, зарегистрировавшихся на talk.commonmark.org — это стандартная установка по умолчанию — и у всех были действительные IPv4-адреса для «Последний IP» и «IP регистрации» (иногда эти адреса различались).

Я знаю, что если учётные записи пользователей создаются через SSO или другие нестандартные пути, это может повлиять на отображаемые IP-адреса. Все ли пользователи, о которых вы говорите, — это обычные регистрации через стандартное окно регистрации нового пользователя в Discourse?

Были ли среди этих адресов IPv6?

Нет, ни один из них не был, но я не знаю, предоставляет ли этот хостинг в колокации вообще IPv6.

Тогда я уверен, что это не будет демонстрировать проблему отображения localhost вместо IPv6-адресов для пользователей, подключившихся через IPv6. Это не означает, что проблемы не существует.

Проблемы не существует на официальном хостинге Discourse, по крайней мере, и он поддерживает IPv6. Я также не вижу проблем при чистой установке у случайного хостинг-провайдера. Не знаю, что ещё вам сказать, кроме того, что вы не ответили на мой довольно важный вопрос.

Ах, да, это обычные регистрации, без SSO или связанных аккаунтов.

Я не сомневаюсь, что это работает в вашей среде хостинга, но вы, кажется, не используете «стандартную» настройку Docker, как большинство пользователей? Я имею в виду, что, конечно, это возможно сделать работающим при правильной настройке прокси и заголовков и т. д., вопрос лишь в том, делает ли это настройка по умолчанию и, если нет, можем ли мы это обеспечить.

Я почти уверен, что вам нужно добавить немного в ваш app.yml, чтобы nginx распознавал ваш IPv6-адрес и передавал адрес клиента. Хотя я сам ещё не разобрался, как это сделать. В темах о настройке обратного прокси-сервера есть примеры для IPv6, которые дают подсказки.

Это у меня в списке дел, которые нужно разобраться, но у меня довольно длинный список. В итоге я отключил IPv6, думаю, из-за этой проблемы, но возможно, из-за какого-то другого незнания особенностей IPv6.

(Джефф, вы можете получить выделенный блок IPv6-адресов, но нужно запросить его, а затем настроить свои хосты для его использования.)

Meta — это стандартная установка Docker с внешним обратным прокси-сервером, которая отлично поддерживает IPv6:

Есть ли в вашем файле discourse.conf раздел, который указывает использовать set_real_ip с вашим IPv6-адресом, что-то вроде этого?

    - replace:
        filename: /etc/nginx/conf.d/discourse.conf
        from: "types {"
        to: |
          set_real_ip_from 192.168.1.0/24;
          set_real_ip_from 172.18.0.0/24;
          set_real_ip_from 172.17.0.0/24;
          set_real_ip_from <НЕКОТОРЫЙ_АДРЕС_IPV6_ЗДЕСЬ?>
          real_ip_recursive on;
          real_ip_header X-Forwarded-For;
          types {

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

Я решил её, настроив Discourse в Docker для прослушивания Unix-сокета и разместив перед ним Caddy на той же машине (вне Docker). Настройка Caddy тривиальна, включает Let’s Encrypt, и теперь всё работает как ожидалось, в том числе для IPv6.

forum.example.com {
  proxy / unix:/var/discourse/shared/web-only/nginx.http.sock {
    transparent
    websocket
  }
}