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:
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)
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))
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.
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.
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.
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).
¿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.
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.
## 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"