Discourse zeigt Server-IP/localhost als IP des Benutzers an

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:

REMOTE_ADDR: 212.58.xxx.xxx
SERVER_PORT: 80
SERVER_ADDR: 85.25.xxx.xxx
SERVER_SOFTWARE: Apache:
HTTP_CF_CONNECTING_IP: 212.58.xxx.xxx
HTTP_CDN_LOOP: cloudflare
HTTP_X_REAL_IP: 162.158.xxx.xxx

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?

  - "templates/cloudflare.template.yml"

EDIT: falsche " " verwendet

Nein, ich habe es zur Vorlagenliste hinzugefügt und warte nun auf den Neuerstellungsprozess.

1 „Gefällt mir“

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)

Unkommentiert gibt $sent_http_cf_connection_ip 127.0.0.1 zurück
image

Nginx meldet wahrscheinlich 127.0.0.1, nicht Discourse selbst. Sie müssen wahrscheinlich realip in nginx einrichten.

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.

Außerdem ist dies die Nginx-Konfiguration für die Domain zeronet.space, die vom Panel selbst generiert wurde

server {
	listen 85.25.xxx.xx:443 ssl http2;
	server_name  zeronet.space www.zeronet.space;
	root  /home/ay0ks/workspace/sites/zeronet.space;
	
	# ssl on;
	ssl_certificate  /etc/certs/ay0ks/zeronet.space_1655753906.crt;
	ssl_certificate_key /etc/certs/ay0ks/zeronet.space_1655753906.key;
	#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	#ssl_ciphers  "HIGH:!RC4:!aNULL:!MD5:!kEDH";
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
	ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:!COMPLEMENTOFDEFAULT;
	ssl_prefer_server_ciphers on;
	
	add_header Strict-Transport-Security 'max-age=604800';
	
	access_log /etc/nginx/vhost_logs/zeronet.space_access;
	error_log /etc/nginx/vhost_logs/zeronet.space_error;
	
	location ~ /.well-known {
		allow all;
	}
	
	location ~ /\\.ht {
		deny all;
		access_log off;
		log_not_found off;
	}

	location / {
		root /home/ay0ks/workspace/sites/zeronet.space;
		proxy_pass http://85.25.xxx.xx:31080; # Discourse ist auf den Ports 31080/31443 bereitgestellt
		proxy_redirect     off;
		proxy_force_ranges on;
		proxy_set_header   Host $host;
		proxy_set_header   X-Real-IP $remote_addr;
		proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header   X-Forwarded-Proto $scheme;
		proxy_set_header   HTTPS $scheme;
		
		proxy_cache off;
		proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
		#access_log /etc/nginx/vhost_logs//home/ay0ks/workspace/sites/zeronet.space;
		
		proxy_cache_valid 3s;
		proxy_cache_min_uses 2;
		# proxy_cache_lock on;
		# proxy_cache_use_stale error timeout;
		# proxy_cache_use_stale updating http_502 http_504;
		limit_conn lone 100;
		# limit_req zone=ltwo burst=10;
		
		client_body_buffer_size    128k;
		client_max_body_size       1024m;
		proxy_connect_timeout      180;
		proxy_send_timeout         180;
		proxy_read_timeout         180;
		send_timeout               180;
		
		proxy_buffer_size          4k;
		proxy_buffers              8 32k;
		proxy_busy_buffers_size    68k;
		proxy_temp_file_write_size 10m;
	}

	# error_page  404              /404.html;
	# error_page   500 502 503 504  /50x.html;
}

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.

set_real_ip_from 172.18.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from 172.18.0.0/16;

Also gehe ich Benutzer > Cloudflare > Server Nginx (SWAG Docker) > Discourse

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Real-IP $remote_addr;
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"
#  - "templates/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"
4 „Gefällt mir“

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.

Als ersten Schritt beginnen Sie damit, den location-Block für Discourse entsprechend den hier angegebenen Details anzupassen: Run other websites on the same machine as Discourse

1 „Gefällt mir“

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).

Werde versuchen und Ergebnisse hier posten

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.

Basierend auf Ihrem Pfad ergibt das für mich keinen Sinn.

Ihr Nginx leitet zu Discourse zu Docker, warum sollte Ihr Discourse auch seinen eigenen Nginx verwenden?

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 meine app.yml:

## 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"

Die Antwort wurde oben verlinkt. Sie benötigen so etwas.

4 „Gefällt mir“

Dies hat Probleme mit der IP-Erkennung behoben (jetzt funktioniert alles normal), aber jetzt werden einige Bilder nicht geladen

EDIT: Das war ein Cache-Problem, jetzt funktioniert alles! Vielen Dank an alle!

2 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.