Anmeldung schlägt mit „Unknown error" fehl

Hallo,

ich betreibe eine eigene Discourse-Instanz, die ich nach der grundlegenden Docker-Installationsanleitung installiert habe. Das Problem, das ich habe, ist, dass nach einigen Tagen der Forennutzung die Anmeldung vollständig aufhört zu funktionieren. Beachten Sie, dass ich der einzige Benutzer auf diesem Forum bin. Leider weiß ich jedoch nicht, was den Fehler verursacht.

Schritte zur Reproduktion #1:

  1. Installieren Sie einen neuen Discourse-Server, indem Sie die Anweisungen aus der Docker-Installationsanleitung befolgen.
  2. Sobald der Einrichtungsassistent abgeschlossen ist, überprüfen Sie, ob Sie sich erfolgreich ab- und wieder anmelden können.
  3. Nutzen Sie das Forum weiterhin normal. Erstellen Sie einfach einige Kategorien und Beiträge. Ändern Sie vielleicht das Standardthema.
  4. Nach einigen Tagen oder Wochen normaler Nutzung können Sie sich nach der Abmeldung nicht mehr anmelden. Die Anmeldung schlägt mit „Unbekannter Fehler“ fehl (wird im Anmeldeformular angezeigt).

Schritte zur Reproduktion #2:

  1. Installieren Sie einen neuen Discourse-Server, indem Sie die Anweisungen aus der Docker-Installationsanleitung befolgen.
  2. Sobald der Einrichtungsassistent abgeschlossen ist, überprüfen Sie, ob Sie sich erfolgreich ab- und wieder anmelden können.
  3. Stellen Sie eine Sicherungskopie von einer anderen Discourse-Instanz wieder her, bei der die Anmeldung fehlschlug.
  4. Während die Wiederherstellung läuft, erhalten Sie eine Popup-Nachricht, dass Sie abgemeldet wurden. Die Wiederherstellung war erfolgreich, aber die Anmeldung schlägt mit „Unbekannter Fehler“ fehl (wird im Anmeldeformular angezeigt).

Ich habe versucht, das Problem selbst zu debuggen, konnte aber keine relevanten Fehlermeldungen finden. Das habe ich bisher versucht:

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

Während eines fehlgeschlagenen Anmeldevorgangs erscheint in diesen Protokollen keine Fehlermeldung. Was kann ich noch tun, um bei der Fehlersuche zu helfen? Vielen Dank im Voraus.

Hast du dich als Admin im Webbrowser eingeloggt und /logs angesehen?

OK, ich habe etwas herausgefunden. Die Anmeldung schlägt fehl, sobald ich die Einstellung „force https

Endlich habe ich die Lösung gefunden. Der Header X-Forwarded-Proto muss gesetzt werden. Er dient dazu, das Protokoll (HTTP oder HTTPS) zu identifizieren, das ein Client zur Verbindung mit Ihrem Proxy oder Load Balancer verwendet hat.

Da ich HAProxy als Proxy-Server verwende, musste ich diese Zeile zu meiner HAProxy-Konfiguration hinzufügen:

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

Jetzt funktioniert die Anmeldung auch dann einwandfrei, wenn „HTTPS erzwingen

Ich möchte auch das PROXY-Protokoll über jede Verbindung verwenden, die zu meinem Discourse-Server hergestellt wird. Das PROXY-Protokoll informiert das andere Ende (d. h. den Discourse-Server) über die Adressen der eingehenden Verbindung, sodass er die Adresse des Clients oder die öffentliche Adresse, auf die zugegriffen wurde, erkennen kann. Ohne diese Änderung weiß Nginx nicht, welche Adresse der Client hat, und alle Logs enthalten stattdessen die Adresse Ihres Reverse-Proxy-Servers. Die folgenden Änderungen bewirken das Gewünschte:

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 des Proxy-Servers
+
+  - 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 {

Und weisen Sie HAProxy an, die Verwendung des PROXY-Protokolls für diesen Server zu erzwingen:

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

Führen Sie abschließend ./launcher rebuild app aus und überprüfen Sie, ob nun die Client-Adressen protokolliert werden:

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