Échec de la connexion avec « Unknown error »

Bonjour,

Je fais fonctionner ma propre instance Discourse, que j’ai installée en suivant le guide d’installation Docker. Le problème que je rencontre est que, après quelques jours d’utilisation du forum, la connexion cesse de fonctionner complètement. Notez que je suis le seul utilisateur de ce forum. Malheureusement, je ne sais pas ce qui cause ce bug.

Étapes pour reproduire le problème #1 :

  1. Installez un nouveau serveur Discourse en suivant les instructions du guide d’installation Docker.
  2. Une fois l’assistant de configuration terminé, vérifiez que vous pouvez vous déconnecter et vous reconnecter avec succès.
  3. Continuez à utiliser le forum normalement. Créez simplement quelques catégories et publications. Vous pouvez également modifier le thème par défaut.
  4. Après quelques jours ou semaines d’utilisation normale, vous ne pourrez plus vous reconnecter après vous être déconnecté. La connexion échoue avec le message « Erreur inconnue » (affiché dans le formulaire de connexion).

Étapes pour reproduire le problème #2 :

  1. Installez un nouveau serveur Discourse en suivant les instructions du guide d’installation Docker.
  2. Une fois l’assistant de configuration terminé, vérifiez que vous pouvez vous déconnecter et vous reconnecter avec succès.
  3. Restaurez une sauvegarde provenant d’une autre instance Discourse où la connexion échouait.
  4. Pendant la restauration, un message pop-up vous indique que vous avez été déconnecté. La restauration a réussi, mais la connexion échoue avec le message « Erreur inconnue » (affiché dans le formulaire de connexion).

J’ai essayé de déboguer le problème moi-même, mais je n’ai trouvé aucun message d’erreur pertinent. Voici ce que j’ai essayé jusqu’à présent :

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

Aucun message d’erreur n’apparaît dans ces journaux lors d’une tentative de connexion échouée. Que puis-je faire d’autre pour aider à déboguer ce problème ? Merci d’avance.

Avez-vous consulté /logs dans le navigateur web lorsque vous étiez connecté en tant qu’administrateur ?

OK, j’ai trouvé quelque chose. La connexion échoue dès que j’active le paramètre « forcer HTTPS ». Mon instance Discourse se trouve derrière un serveur proxy avec terminaison SSL. Dès que je désactive « forcer HTTPS », la connexion fonctionne à nouveau. Il s’agit donc probablement d’un problème lié à ma configuration d’infrastructure plutôt que d’un bug de Discourse.

J’ai également suivi vos conseils, mais aucun message d’erreur n’apparaît dans les journaux.

Enfin, j’ai trouvé la solution. L’en-tête X-Forwarded-Proto doit être défini ; il sert à identifier le protocole (HTTP ou HTTPS) utilisé par le client pour se connecter à votre proxy ou équilibreur de charge.

Puisque j’utilise HAProxy comme serveur proxy, j’ai dû ajouter cette ligne à ma configuration HAProxy :

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

Désormais, la connexion fonctionne correctement même lorsque l’option « forcer HTTPS » est activée.

Je souhaite également utiliser le protocole PROXY sur n’importe quelle connexion établie vers mon serveur Discourse. Le protocole PROXY informe l’autre extrémité (c’est-à-dire le serveur Discourse) des adresses de la connexion entrante, afin qu’il puisse connaître l’adresse du client ou l’adresse publique à laquelle il a accédé. Sans cette modification, Nginx ne connaîtra pas l’adresse du client et tous les journaux contiendront l’adresse de votre serveur proxy inverse. Les modifications suivantes permettent de résoudre le problème :

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;  # adresse du serveur 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 {

Et indiquez à HAProxy d’imposer l’utilisation du protocole PROXY pour ce serveur :

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

Enfin, exécutez ./launcher rebuild app et vérifiez que les adresses des clients sont désormais consignées :

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