Hallo, ich habe Discourse auf meinem eigenen Server bereitgestellt, alles funktioniert normal, außer der Erkennung der IP-Adresse des Benutzers. Ich habe sogar ein PHP-Skript (außerhalb des Docker-Containers) erstellt, um alle Header abzurufen, in denen sich die IP befinden kann:
Details:
Auf dem Server ist das BrainyCP-Panel mit Apache und Nginx installiert (derzeit verwendet die Website Nginx, das den Docker-Container als Reverse-Proxy verwendet). HTTP_CF_CONNECTING_IP gibt 127.0.0.1 innerhalb des Docker-Containers zurück, aber außerhalb haben sie normale Werte.
Ohne die Header mit benutzerdefinierten Befehlen zu ändern, zeigt Discourse die IP des Servers an.
(Bald werde ich weitere Details hinzufügen, da meine Discourse-Instanz gerade neu kompiliert wird)
Ich bin mir bei Ihrer Einrichtung nicht ganz sicher, habe aber Cloudflare in Ihrem Beitrag bemerkt. Haben Sie die CloudFlare-Vorlage zu Ihrer app.yml-Datei hinzugefügt?
Neu erstellt, aber es wird immer noch die Server-IP angezeigt (ich habe benutzerdefinierte Befehle auskommentiert
## Irgendwelche benutzerdefinierten Befehle, die nach dem Erstellen ausgeführt werden sollen
run:
- exec: echo "Beginn der benutzerdefinierten Befehle"
## Wenn Sie die E-Mail-Adresse 'Von' für Ihre erste Registrierung festlegen möchten, kommentieren Sie die Zeile aus und ändern Sie sie:
## Nachdem Sie die erste Anmelde-E-Mail erhalten haben, kommentieren Sie die Zeile erneut aus. Sie muss nur einmal ausgeführt werden.
- exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
#- replace:
# filename: /etc/nginx/conf.d/discourse.conf
# from: "types {"
# to: |
# set_real_ip_from 85.25.134.45;
# real_ip_header CF-Connection-IP;
# real_ip_recursive on;
# types {
#- replace:
# filename: /etc/nginx/conf.d/discourse.conf
# from: $proxy_add_x_forwarded_for
# to: $send_http_cf_connection_ip;
# global: true
- exec: echo "Ende der benutzerdefinierten Befehle"
Muss ich sie auskommentieren? (Ich möchte auch darauf hinweisen, dass sie nicht funktionierten, noch bevor ich die Cloudflare-Vorlage zu app.yml hinzugefügt habe)
Ich habe bereits cloudflare.template.yml hinzugefügt, das RealIP-Direktiven hinzufügt, aber es funktioniert immer noch nicht.
Ich habe sogar benutzerdefinierte Befehle entfernt, die zu benutzerdefinierten Headern geändert werden, und jetzt meldet Discourse die Server-IP für alle Benutzer anstelle von localhost.
Ich möchte auch den „Pfad“ der Anfrage bemerken: Benutzer -> Cloudflare -> Server (Nginx -> Docker -> Discourse)
Und beachten Sie, dass die IP des Benutzers außerhalb von Docker in den Cloudflare-Headern CF-Connecting-IP sichtbar ist.
Ich weiß nicht viel darüber, wie die Cloudflare-Echt-IP-Sachen funktionieren, aber ich vermute, dass Ihr Discourse Nginx set_real_ip_from auf die IP-Adresse setzen muss, die es als Ihre Proxy-Nginx-Adresse sieht. 127.0.0.1? Eine andere interne Adresse? Die öffentliche Adresse? Ich bin mir nicht sicher, welche es sehen würde.
Sobald Sie wissen, welche Adresse das ist, denke ich, würde ich die Cloudflare-Vorlage dort belassen und dann nur für set_real_ip_from ein neues replace hinzufügen.
Zusätzlich muss Ihr Proxy-Nginx so konfiguriert sein, dass er den CF-Connecting-IP-Header weiterleitet, falls er nicht bereits dazu konfiguriert ist oder dies nicht standardmäßig tut. Mit diesem Teil kann ich Ihnen nicht wirklich helfen.
Gleicher Weg wie ich, mein Problem war, dass Nginx nicht so konfiguriert war, dass es die Docker-IP als Bereich für die Einstellung des Realip verwendet.
Dies könnte die Ursache Ihrer Probleme sein. Versuchen Sie, Discourse auf einem Server ohne installierte Panels oder Reverse Proxies einzurichten und berichten Sie, ob Sie das gleiche Problem haben.
Das ist keine Lösung für ein Problem, im Grunde kann der Kauf eines neuen dedizierten Servers für 30 €/Monat alles lösen, lol (dieser Thread würde dann nicht existieren).
Muss ich auch Header in der Discourse Nginx-Konfiguration hinzufügen? (innerhalb von Docker) Denn es wird mir immer noch die Adresse des Servers anstelle der Benutzer angezeigt.
Ich weiß nicht, ich habe Ihre Nginx-Direktiven über das Panel (auch über SSH überprüft) zu meinen hinzugefügt, aber es wird immer noch die IP des Servers angezeigt.
## Dies ist die All-in-One, eigenständige Discourse Docker Container-Vorlage
##
## Nach Änderungen an dieser Datei MÜSSEN Sie neu erstellen
## /var/discourse/launcher rebuild app
##
## SEIEN SIE *SEHR* VORSICHTIG BEIM BEARBEITEN!
## YAML-DATEIEN SIND SUPER SUPER EMPFINDLICH GEGEN FEHLER BEI LEERZEICHEN ODER AUSRICHTUNG!
## Besuchen Sie http://www.yamllint.com/, um diese Datei bei Bedarf zu validieren
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/cloudflare.template.yml"
## Kommentieren Sie diese beiden Zeilen aus, wenn Sie Lets Encrypt (https) hinzufügen möchten
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## Welche TCP/IP-Ports soll dieser Container verfügbar machen?
## Wenn Sie möchten, dass Discourse einen Port mit einem anderen Webserver wie Apache oder nginx teilt,
## siehe https://meta.discourse.org/t/17247 für Details
expose:
- "31080:80" # http
- "31443:443" # https
params:
db_default_text_search_config: "pg_catalog.russian"
## Setzen Sie db_shared_buffers auf maximal 25% des Gesamtspeichers.
## wird automatisch von bootstrap basierend auf erkanntem RAM gesetzt, oder Sie können überschreiben
db_shared_buffers: "4096MB"
## kann die Sortierleistung verbessern, erhöht aber den Speicherverbrauch pro Verbindung
#db_work_mem: "40MB"
## Welche Git-Revision soll dieser Container verwenden? (Standard: tests-passed)
#version: tests-passed
env:
LC_ALL: ru_RU.UTF-8
LANG: ru_RU.UTF-8
LANGUAGE: ru_RU.UTF-8
DISCOURSE_DEFAULT_LOCALE: ru
## Wie viele gleichzeitige Webanfragen werden unterstützt? Hängt von Speicher und CPU-Kernen ab.
## wird automatisch von bootstrap basierend auf erkannten CPUs gesetzt, oder Sie können überschreiben
UNICORN_WORKERS: 8
## TODO: Der Domainname, auf den diese Discourse-Instanz reagieren wird
## Erforderlich. Discourse funktioniert nicht mit einer reinen IP-Nummer.
DISCOURSE_HOSTNAME: 'zeronet.space'
## Kommentieren Sie aus, wenn der Container mit demselben
## Hostnamen (-h Option) wie oben angegeben gestartet werden soll (Standard "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: Liste von per Komma getrennten E-Mails, die bei der ersten Registrierung zu Administratoren und Entwicklern gemacht werden
## Beispiel 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'contact@zeronet.space'
## TODO: Der SMTP-Mailserver, der zum Überprüfen neuer Konten und zum Senden von Benachrichtigungen verwendet wird
# SMTP-ADRESSE, Benutzername und Passwort sind erforderlich
# ACHTUNG: Das Zeichen '#' im SMTP-Passwort kann Probleme verursachen!
DISCOURSE_SMTP_ADDRESS: smtp.zeronet.space
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: noreply@zeronet.space
DISCOURSE_SMTP_PASSWORD: "xxxxxxx"
DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_NOTIFICATION_EMAIL: "noreply@zeronet.space"
#DISCOURSE_SMTP_DOMAIN: "zeronet.space"
## Wenn Sie die Lets Encrypt-Vorlage hinzugefügt haben, kommentieren Sie unten aus, um ein kostenloses SSL-Zertifikat zu erhalten
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## Die HTTP- oder HTTPS-CDN-Adresse für diese Discourse-Instanz (konfiguriert zum Ziehen)
## siehe https://meta.discourse.org/t/14857 für Details
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## Der Maxmind Geolocation IP-Adressschlüssel für die IP-Adresssuche
## siehe https://meta.discourse.org/t/-/137387/23 für Details
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## Der Docker-Container ist zustandslos; alle Daten werden in /shared gespeichert
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## Plugins gehen hier hin
## siehe https://meta.discourse.org/t/19157 für Details
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## Alle benutzerdefinierten Befehle, die nach dem Erstellen ausgeführt werden sollen
run:
- exec: echo "Beginn der benutzerdefinierten Befehle"
## Wenn Sie die 'Von'-E-Mail-Adresse für Ihre erste Registrierung festlegen möchten, kommentieren Sie sie aus und ändern Sie sie:
## Nachdem Sie die erste Registrierungs-E-Mail erhalten haben, kommentieren Sie die Zeile wieder aus. Sie muss nur einmal ausgeführt werden.
- exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
- exec: echo "Ende der benutzerdefinierten Befehle"