Tenemos una instalación de Discourse, mantenida durante varios años y actualmente en la última versión (2.4.0beta2) usando la imagen Docker más reciente, con una dirección IP pública, sin proxy ni ningún otro elemento delante, y certificados de LetsEncrypt.
A veces, la IP de registro del usuario y la última IP funcionan perfectamente; otras veces, no. No veo ningún patrón ni razón aparente. Por ejemplo, aquí hay un usuario creado hace 7h, con direcciones sin sentido:
Y así sucesivamente: en algunos usuarios funciona bien, en otros no. ¿Alguna idea sobre qué está ocurriendo?
Ahora que lo miro, me llama la atención que podría deberse a que estos usuarios están accediendo mediante IPv6, ya que nunca he visto una dirección IPv6 en estos campos. ¿Discourse no soporta IPv6? ¿El proxy de Docker no entiende o no transmite la información relevante? ¿O es algo más?
IPv6 es muy funcional y se está utilizando la configuración recomendada de imágenes de Docker con las plantillas de web + datos. No hay nada más delante. ¿Qué deberíamos ajustar?
Tenga en cuenta que nuestro archivo yml de contenedores lleva varios años, aunque incluye las plantillas más recientes y las imágenes en sí se reconstruyen con frecuencia. ¿Podría ser algo que haya cambiado con el tiempo?
Es difícil de decir. Acabo de auditar a los últimos ~8 usuarios nuevos que se registraron en talk.commonmark.org, que es una instalación estándar muy básica, y todos tenían direcciones IPv4 válidas para la última IP y la IP de registro (a veces ambas diferían, también).
Sé que si las cuentas de usuario llegan a través de SSO u otras vías inusuales, eso puede afectar las IPs que se muestran allí. ¿Son todos estos usuarios a los que te refieres registros regulares a través del diálogo estándar de nuevo usuario en Discourse?
Entonces, estoy seguro de que no presentará el problema de mostrar localhost en lugar de direcciones IPv6 para los usuarios que acceden a través de IPv6. Eso no significa que el problema no exista.
El problema no existe en el alojamiento oficial de Discourse, al menos, y ese sí es compatible con IPv6. Tampoco veo problemas en una instalación estándar en un host de colocalización aleatorio. No sé qué más decirte, aparte de que no has respondido a mi pregunta bastante importante.
No dudo de que funcione en tu alojamiento, pero no usas la configuración “estándar” de Docker que utiliza la mayoría de los usuarios, ¿verdad? Quiero decir, estoy seguro de que es posible que funcione si un proxy configura las cabeceras correctas, etc.; la cuestión es si la configuración predeterminada lo hace y, si no, si podemos hacer que lo haga.
Estoy bastante seguro de que necesitas agregar algo a tu app.yml que le indique a nginx que reconozca tu dirección IPv6 y retransmita la dirección del cliente. Aunque aún no he logrado averiguar cómo hacerlo. Los temas sobre la ejecución de un proxy inverso incluyen ejemplos de IPv6 que ofrecen pistas.
Esto está en mi lista de cosas por resolver, pero tengo una lista bastante larga. Terminé desactivando IPv6, creo que debido a este problema, aunque quizás por alguna otra falta de conocimiento sobre IPv6.
(Jeff, puedes obtener un bloque IPv6 enrutado, pero debes solicitarlo y luego configurar tus hosts para que lo utilicen.)
Creo que el proxy inverso externo es la clave; no creo que esto sea solucionable en absoluto, o al menos no fácilmente, solo desde dentro del contenedor Docker.
Lo he resuelto ahora configurando que el contenedor Docker de Discourse escuche en un socket Unix y lo frontee con Caddy en la misma máquina (fuera de Docker). La configuración de Caddy es trivial, incluye Let’s Encrypt, y ahora funciona como se espera también para IPv6.