¿Cómo puedo modificar la configuración de Nginx directamente dentro de discourse/docker?

Me gustaría modificar la configuración de Nginx/Docker porque mi instalación de Discourse está detrás de HAProxy. El problema que estoy enfrentando es el siguiente:
Todas las direcciones IP que se conectan a mi instalación de Discourse aparecen como la dirección IP de HAProxy.
Necesito agregar las siguientes líneas al archivo de configuración de Nginx:

set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;

…para transmitir las direcciones IP públicas que se conectan a mi instalación de Discourse a Nginx.
Gracias por su ayuda.

Probablemente no quieras solo esto:

set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;

Esto solo es correcto si ambas de las siguientes condiciones son verdaderas:

  1. HAProxy realmente está enviando el protocolo PROXY al contenedor de Discourse.
  2. Nginx dentro del contenedor de Discourse ve a HAProxy como 127.0.0.1.

En muchas configuraciones de Docker con HAProxy → Discourse, el enfoque más simple y común es usar X-Forwarded-For, no el protocolo PROXY.

Para HAProxy, asegúrate de que envíe el encabezado de IP reenviada:

defaults
    mode http
    option httplog
    option forwardfor

o en el backend:

backend be_discourse
    option forwardfor
    server app 127.0.0.1:8080 check

Luego, en la configuración del contenedor de Discourse, persiste los cambios de IP real de Nginx a través de app.yml. No edites archivos directamente dentro del contenedor en ejecución, porque se perderán al reconstruirlo.

Agrega algo como esto a /var/discourse/containers/app.yml bajo la sección existente run::

run:
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "types {"
      to: |
        set_real_ip_from 127.0.0.1;
        # ajusta esto a la red/puente de Docker real desde la que se conecta HAProxy
        set_real_ip_from 172.17.0.0/16;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
        types {

Luego reconstruye:

cd /var/discourse
./launcher rebuild app

Puede que necesites ajustar set_real_ip_from para que coincida con la IP/rango de origen real que ve Nginx dentro del contenedor de Discourse cuando HAProxy se conecta a él. Con Docker, esto a menudo no es 127.0.0.1; puede ser una dirección de puente de Docker como 172.17.0.1 o un rango de red de Docker definido por el usuario.

Si realmente quieres usar el protocolo PROXY en su lugar, HAProxy debe enviarlo explícitamente:

backend be_discourse
    server app 127.0.0.1:8080 check send-proxy

y Nginx debe escuchar con proxy_protocol, no solo leer real_ip_header proxy_protocol:

run:
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "listen 80;"
      to: "listen 80 proxy_protocol;"

  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "types {"
      to: |
        set_real_ip_from 127.0.0.1;
        set_real_ip_from 172.17.0.0/16;
        real_ip_header proxy_protocol;
        types {

La corrección importante es: real_ip_header proxy_protocol por sí solo es incompleto. Nginx también necesita listen 80 proxy_protocol;, y HAProxy necesita send-proxy. De lo contrario, usa X-Forwarded-For, que es la configuración habitual de HAProxy en modo HTTP. En HAProxy, option forwardfor es la forma estándar de agregar el encabezado de IP del cliente X-Forwarded-For. Con el protocolo PROXY de Nginx, la directiva listen debe incluir proxy_protocol antes de que real_ip_header proxy_protocol pueda funcionar.

Así que la versión corta es:

  • Usa X-Forwarded-For a menos que tengas una razón específica para usar el protocolo PROXY.
  • No mezcles los dos modos.
  • Si HAProxy no está usando send-proxy, entonces real_ip_header proxy_protocol no funcionará.
  • Si usas Discourse Docker, haz el cambio en app.yml, no directamente dentro del contenedor en ejecución.