Inkonsistente / fehlende Registrierung & letzte IP

Wir haben eine Discourse-Installation, die seit mehreren Jahren läuft, derzeit aber auf der neuesten Version (2.4.0beta2) mit dem neuesten Docker-Image betrieben wird. Sie ist direkt über eine öffentliche IP-Adresse erreichbar, ohne Proxy oder andere Komponenten dazwischen, und verwendet LetsEncrypt-Zertifikate.

Manchmal funktionieren die IP-Adresse bei der Registrierung und die letzte IP-Adresse einwandfrei, manchmal nicht. Es gibt dafür keine erkennbare Logik. Hier ist beispielsweise ein Benutzer, der vor 7 Stunden erstellt wurde, mit unsinnigen Adressen:

Ein anderer Benutzer, der vor 17 Stunden erstellt wurde, sieht hingegen völlig in Ordnung aus:

Und so geht es weiter: Bei manchen Benutzern funktioniert es, bei anderen nicht. Habt ihr eine Idee, was hier los ist?

Mir fällt jetzt beim Hinsehen auf, dass es sein könnte, dass diese Benutzer über IPv6 zugreifen, da ich in diesen Feldern noch nie eine IPv6-Adresse gesehen habe. Versteht Discourse IPv6 nicht? Versteht der Docker-Proxy die relevanten Informationen nicht oder leitet sie nicht weiter? Oder liegt etwas anderes vor?

Discourse kann IPv6 definitiv, aber du musst deinen Server und alles, was davor liegt, so konfigurieren, dass IPv6 funktioniert usw.

IPv6 ist sehr funktional, und wir nutzen die empfohlenen Docker-Images mit den Web- und Daten-Template-Konfigurationen. Davor steht nichts anderes. Was sollten wir noch anpassen?

Unser Container-yml ist zwar schon seit einigen Jahren im Einsatz, enthält aber die neuesten Templates, und die Images selbst werden regelmäßig neu erstellt. Könnte sich dies im Laufe der Zeit verändert haben?

Es sieht so aus, als hätten andere, die das Standard-Docker-Setup verwenden, das gleiche Problem.

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

Schwer zu sagen. Ich habe gerade die letzten ca. 8 neuen Benutzer überprüft, die sich bei talk.commonmark.org angemeldet haben. Dabei handelt es sich um eine sehr standardmäßige Installation, und alle hatten gültige IPv4-Adressen für die letzte IP und die Registrierungs-IP (manchmal unterschieden sich diese beiden auch).

Ich weiß, dass Benutzerkonten, die über SSO oder andere ungewöhnliche Wege eingehen, die dort gemeldeten IPs beeinflussen können. Beziehen sich alle diese Benutzer, auf die du dich beziehst, auf reguläre Anmeldungen über das Standard-Dialogfeld für neue Benutzer in Discourse?

Handelte es sich bei einer dieser Adressen um IPv6?

Nein, keines davon, aber ich weiß nicht, ob dieser Colocation-Host überhaupt IPv6 unterstützt.

Dann bin ich mir sicher, dass das Problem, bei dem für Benutzer, die über IPv6 zugreifen, stattdessen localhost anstelle von IPv6-Adressen angezeigt wird, nicht auftritt. Das bedeutet jedoch nicht, dass das Problem nicht existiert.

Das Problem besteht zumindest bei der offiziellen Discourse-Hosting-Lösung nicht, und diese unterstützt IPv6. Auch bei einer Standardinstallation bei einem zufälligen Colocation-Anbieter sehe ich keine Probleme. Ich weiß nicht, was ich dir sonst noch sagen soll, außer dass du meine ziemlich wichtige Frage nicht beantwortet hast.

Ah ja, das sind ganz normale Anmeldungen, ohne Single Sign-On (SSO) oder verknüpfte Konten.

Ich bezweifle nicht, dass es in deiner Hosting-Umgebung funktioniert, aber du verwendest doch nicht das „standardmäßige

Ich bin mir ziemlich sicher, dass du etwas zu deiner app.yml hinzufügen musst, das Nginx anweist, deine IPv6-Adresse zu erkennen und die Client-Adresse durchzureichen. Ich habe selbst noch nicht herausgefunden, wie das geht. Die Themen zum Betreiben eines Reverse Proxys enthalten IPv6-Beispiele, die Hinweise geben.

Das steht auf meiner Liste der Dinge, die ich noch klären muss, aber die Liste ist ziemlich lang. Ich habe IPv6 schließlich deaktiviert, wahrscheinlich wegen dieses Problems, aber vielleicht auch aufgrund meines Mangels an Wissen über IPv6.

(Jeff, du kannst dir einen IPv6-Block zuweisen lassen, musst ihn aber anfordern und dann deine Hosts so konfigurieren, dass sie ihn nutzen.)

Meta ist einfach eine Standard-Docker-Installation mit einem externen Reverse-Proxy und unterstützt IPv6 hervorragend:

Gibt es in deiner discourse.conf einen Abschnitt, der anweist, set_real_ip mit deiner IPv6-Adresse zu setzen, ähnlich wie hier?

    - 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 <EINE_IP_V6_ADRESSE_HIER?>
          real_ip_recursive on;
          real_ip_header X-Forwarded-For;
          types {

Ich denke, der externe Reverse-Proxy ist der Schlüssel – ich glaube nicht, dass dies allein innerhalb des Docker-Containers lösbar ist, oder zumindest nicht ohne weiteres.

Ich habe es jetzt gelöst, indem ich den Discourse-Docker-Container auf einen Unix-Socket lauschen lasse und ihn mit einem Caddy auf derselben Maschine (außerhalb von Docker) vorstelle. Das Caddy-Setup ist trivial, beinhaltet Let’s Encrypt, und jetzt funktioniert es auch für IPv6 wie erwartet.

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