El inicio de sesión falla con "Unknown error"

Hola,

Estoy ejecutando mi propia instancia de Discourse, que instalé siguiendo la guía básica de instalación con Docker. El problema que tengo es que, después de unos días de usar el foro, el inicio de sesión deja de funcionar por completo. Ten en cuenta que soy el único usuario en este foro. Desafortunadamente, no sé qué está causando este error.

Pasos para reproducir #1:

  1. Instala un nuevo servidor de Discourse siguiendo las instrucciones de la guía de instalación con Docker.
  2. Una vez completado el asistente de configuración, verifica que puedas cerrar y volver a iniciar sesión correctamente.
  3. Sigue usando el foro con normalidad. Crea algunas categorías y publicaciones. Quizás cambies el tema predeterminado.
  4. Después de unos días o semanas de uso normal, no podrás volver a iniciar sesión después de cerrar sesión. El inicio de sesión falla con el mensaje “Error desconocido” (mostrado en el formulario de inicio de sesión).

Pasos para reproducir #2:

  1. Instala un nuevo servidor de Discourse siguiendo las instrucciones de la guía de instalación con Docker.
  2. Una vez completado el asistente de configuración, verifica que puedas cerrar y volver a iniciar sesión correctamente.
  3. Restaura una copia de seguridad desde otra instancia de Discourse donde el inicio de sesión estaba fallando.
  4. Mientras se realiza la restauración, aparece un mensaje emergente indicando que has sido desconectado. La restauración se completó con éxito, pero el inicio de sesión falla con el mensaje “Error desconocido” (mostrado en el formulario de inicio de sesión).

He intentado depurar el problema por mi cuenta, pero no he podido encontrar ningún mensaje de error relevante. Esto es lo que he probado hasta ahora:

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

No aparece ningún mensaje de error en estos registros durante un intento fallido de inicio de sesión. ¿Qué más puedo hacer para ayudar a depurar este problema? Gracias de antemano.

¿Miraste /logs en el navegador web cuando iniciaste sesión como administrador?

OK, ya descubrí algo. El inicio de sesión falla tan pronto como habilito la configuración de “forzar HTTPS”. Mi instancia de Discourse está detrás de un servidor proxy con terminación SSL. En cuanto desactivo “forzar HTTPS”, el inicio de sesión vuelve a funcionar. Por lo tanto, esto probablemente no sea un error de Discourse, sino un problema con mi configuración de infraestructura.

También hice lo que sugeriste, pero no hubo ningún mensaje de error en los registros.

Finalmente encontré la solución. El encabezado X-Forwarded-Proto debe establecerse; se utiliza para identificar el protocolo (HTTP o HTTPS) que un cliente usó para conectarse a tu proxy o balanceador de carga.

Dado que uso HAProxy como servidor proxy, tuve que agregar esta línea a mi configuración de HAProxy:

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

Ahora el inicio de sesión funciona correctamente incluso cuando “forzar HTTPS” está habilitado.

También quiero usar el protocolo PROXY en cualquier conexión establecida con mi servidor Discourse. El protocolo PROXY informa al otro extremo (es decir, al servidor Discourse) sobre las direcciones de la conexión entrante, para que pueda conocer la dirección del cliente o la dirección pública a la que accedió. Sin este cambio, Nginx no conocerá la dirección del cliente y todos los registros contendrán la dirección de tu servidor proxy inverso en su lugar. Los siguientes cambios solucionan el problema:

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;  # dirección del servidor proxy
+
+  - 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 {

Y configura HAProxy para imponer el uso del protocolo PROXY en este servidor:

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

Finalmente, ejecuta ./launcher rebuild app y verifica que ahora registre las direcciones de los clientes:

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