Discourse muestra la IP del servidor/localhost como la IP del usuario

Hola, he desplegado Discourse en mi propio servidor, todo funciona normalmente excepto la detección de la dirección IP del usuario, incluso he creado un script de PHP (fuera del contenedor de Docker) para obtener todas las cabeceras donde puede estar la IP:

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

Detalles:
El servidor tiene instalado el panel BrainyCP con Apache y Nginx (actualmente el sitio web utiliza Nginx, que actúa como proxy inverso para el contenedor de Docker)
HTTP_CF_CONNECTING_IP devuelve 127.0.0.1 dentro del contenedor de Docker, pero fuera tienen valores normales.
Sin cambiar la cabecera utilizando comandos personalizados, Discourse muestra la IP del servidor.

(Pronto añadiré más detalles ya que mi instancia de Discourse se está reconstruyendo)

No estoy muy seguro de tu configuración, pero noté Cloudflare en tu publicación. ¿Agregaste la plantilla de CloudFlare a tu archivo app.yml?

  - "templates/cloudflare.template.yml"

EDITAR: usé el " " incorrecto.

No, lo he añadido a la lista de plantillas, ahora esperando la reconstrucción.

1 me gusta

Reconstruido, pero todavía muestra la IP del servidor (he comentado los comandos personalizados

## Cualquier comando personalizado para ejecutar después de la compilación
run:
  - exec: echo "Inicio de comandos personalizados"
  ## Si desea establecer la dirección de correo electrónico 'De' para su primer registro, descomente y cambie:
  ## Después de recibir el primer correo electrónico de registro, vuelva a comentar la línea. Solo necesita ejecutarse una vez.
  - 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 "Fin de comandos personalizados"

¿Necesito descomentarlos? (también quiero notar que no funcionaron incluso antes de que agregara la plantilla de cloudflare a app.yml))

Sin comentarios, $sent_http_cf_connection_ip devuelve 127.0.0.1
image

Nginx probablemente está reportando 127.0.0.1 y no Discourse en sí; probablemente necesitarás configurar realip en nginx.

Ya he añadido cloudflare.template.yml que añade directivas realip, pero todavía no funciona.
Incluso he eliminado los comandos personalizados que cambian a encabezado personalizado y ahora Discourse informa la IP del servidor para todos los usuarios en lugar de localhost.

Además, esta es la configuración de Nginx para el dominio zeronet.space generada por el propio panel.

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 está desplegado en los puertos 31080/31443
		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;
}

También quiero señalar la “ruta” de la solicitud:
Usuario -> Cloudflare -> Servidor (Nginx -> Docker -> Discourse)
Y ten en cuenta que la IP del usuario es visible fuera de docker en la cabecera CF-Connecting-IP de Cloudflare.

No sé mucho sobre cómo funciona lo de la IP real de Cloudflare, pero sospecho que tu Discourse nginx necesitará que set_real_ip_from sea la dirección IP que ve como tu proxy nginx. ¿127.0.0.1? ¿Alguna otra dirección interna? ¿La dirección pública? No estoy seguro de cuál vería.

Una vez que sepas cuál es esa dirección, creo que lo que haría sería dejar la plantilla de Cloudflare ahí, y luego añadir un nuevo replace solo para set_real_ip_from.

Además de eso, tu proxy nginx necesitará estar configurado para pasar la cabecera CF-Connecting-IP si aún no está configurado para hacerlo o si no lo hace por defecto. No puedo ayudarte mucho con esta parte.

El mismo camino que yo, mi problema fue que nginx no estaba configurado para tomar la IP de docker como un rango para establecer el realip.

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;

Así que voy de Usuario > Cloudflare > Servidor 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"
## Descomenta estas dos líneas si deseas añadir Lets Encrypt (https)
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"
#  - "templates/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"
4 Me gusta

Esta podría ser la causa de tus problemas. Intenta configurar Discourse en un servidor sin paneles ni proxies inversos instalados e informa si experimentas el mismo problema.

Como primer paso, comienza modificando el bloque de ubicación para Discourse para que coincida con los detalles proporcionados aquí: Run other websites on the same machine as Discourse

1 me gusta

Eso no es una solución a un problema, básicamente comprar un nuevo servidor dedicado de 30 €/mes puede resolver cualquier cosa, lol (este hilo no existirá entonces).

Intentaré publicar los resultados aquí.

¿Necesito agregar encabezados también en la configuración de Nginx de Discourse? (dentro de docker) Porque todavía me muestra la dirección del servidor en lugar de los usuarios.

Basándome en tu ruta, eso no tiene sentido para mí.

Tu nginx va a Discourse a Docker, ¿por qué tu Discourse estaría usando también su propio nginx?

No lo sé, he añadido tus directivas de Nginx a las mías a través del panel (también lo he comprobado desde ssh), pero todavía muestra la IP del servidor.

Este es mi app.yml:

## esta es la plantilla de contenedor Docker de Discourse todo en uno e independiente
##
## Después de realizar cambios en este archivo, DEBE reconstruir
## /var/discourse/launcher rebuild app
##
## ¡TENGA MUCHO CUIDADO AL EDITAR!
## ¡LOS ARCHIVOS YAML SON SÚPER SÚPER SENSIBLES A ERRORES DE ESPACIO EN BLANCO O ALINEACIÓN!
## visite http://www.yamllint.com/ para validar este archivo según sea necesario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/cloudflare.template.yml"
## Descomente estas dos líneas si desea agregar Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## ¿qué puertos TCP/IP debe exponer este contenedor?
## Si desea que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulte https://meta.discourse.org/t/17247 para obtener detalles
expose:
  - "31080:80"   # http
  - "31443:443" # https

params:
  db_default_text_search_config: "pg_catalog.russian"

  ## Establezca db_shared_buffers en un máximo del 25% de la memoria total.
  ## se establecerá automáticamente mediante bootstrap según la RAM detectada, o puede anularlo
  db_shared_buffers: "4096MB"

  ## puede mejorar el rendimiento de la clasificación, pero aumenta el uso de memoria por conexión
  #db_work_mem: "40MB"

  ## ¿Qué revisión de Git debe usar este contenedor? (predeterminado: 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

  ## ¿Cuántas solicitudes web concurrentes se admiten? Depende de la memoria y los núcleos de CPU.
  ## se establecerá automáticamente mediante bootstrap según las CPU detectadas, o puede anularlo
  UNICORN_WORKERS: 8

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  ## Requerido. Discourse no funcionará con un número IP simple.
  DISCOURSE_HOSTNAME: 'zeronet.space'

  ## Descomente si desea que el contenedor se inicie con el mismo
  ## nombre de host (-h opción) que se especifica arriba (predeterminado "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos separados por comas que se convertirán en administradores y desarrolladores
  ## en el registro inicial, por ejemplo, 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'contact@zeronet.space'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  # DIRECCIÓN SMTP, nombre de usuario y contraseña son requeridos
  # ADVERTENCIA, ¡el carácter '#' en la contraseña SMTP puede causar problemas!
  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"

  ## Si agregó la plantilla Lets Encrypt, descomente a continuación para obtener un certificado SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## La dirección CDN http o https para esta instancia de Discourse (configurada para extraer)
  ## consulte https://meta.discourse.org/t/14857 para obtener detalles
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## La clave de licencia de MaxMind para la búsqueda de direcciones IP de geolocalización
  ## consulte https://meta.discourse.org/t/-/137387/23 para obtener detalles
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## El contenedor Docker no tiene estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Los plugins van aquí
## consulte https://meta.discourse.org/t/19157 para obtener detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Cualquier comando personalizado para ejecutar después de la construcción
run:
  - exec: echo "Comienzo de comandos personalizados"
  ## Si desea establecer la dirección de correo electrónico 'De' para su primer registro, descomente y cambie:
  ## Después de recibir el primer correo electrónico de registro, vuelva a comentar la línea. Solo necesita ejecutarse una vez.
  - exec: rails r "SiteSetting.notification_email='noreply@zeronet.space'"
  - exec: echo "Fin de comandos personalizados"

La respuesta estaba enlazada arriba. Necesitas algo como esto.

4 Me gusta

Esto solucionó problemas con la detección de IP (ahora todo funciona normal), pero ahora algunas imágenes no se cargan.

EDITAR: ¡esto fue un problema de caché, ahora todo funciona! ¡Gracias a todos!

2 Me gusta

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