Usando Prometheus con Cloudflare

¿Alguien ha probado esto detrás de Cloudflare sin abrir las métricas a todo el público?

El problema es que la IP original de Prometheus no está en la ubicación habitual de las cabeceras HTTP cuando está detrás de Cloudflare (o básicamente cualquier proxy).

¿Hay alguna forma de hacerlo accesible solo por http o añadir un subdominio adicional a Discourse para crear un certificado SSL?

Tenerlo accesible por IP o un subdominio adicional que pueda cambiarse al modo transparente en Cloudflare serían dos opciones. La otra probablemente sería modificar el plugin para que compruebe una cabecera http diferente. Creo que debería ser X-Forwarded-For o CF-Connecting-IP. Soy el tipo de persona que puede hacerlo. Esta última sería probablemente la solución más inteligente.

Cualquier ayuda es apreciada.

EDIT: Me acabo de dar cuenta de que Cloudflare utiliza muy bien la IP correcta detrás de Cloudflare. O el plugin está haciendo algo diferente a Cloudflare o… :thinking:

Creo que necesitarías ejecutar Prometheus y, quizás, Graphana en el mismo servidor que Discourse, y servirlos desde un proxy inverso.

1 me gusta

Eso es exactamente lo que no quiero hacer. Preferiría no tener muchas cosas adicionales sucediendo en el servidor de producción, ya que ya está bastante cargado con el tráfico del foro. Además, si necesito hacer un proxy inverso, probablemente no necesitaría ejecutar grafana y prometheus localmente, ya que podría simplemente hacer un proxy inverso a /metrics con IP y sin https, pero todo eso suena hacky. Pensé que podría haber una mejor manera.

1 me gusta

No son muchas cosas. Tiene una sobrecarga bastante baja.

Oh, espera. Pero si tienes las cosas configuradas de modo que la IP remota correcta llegue a Discourse, entonces puedes simplemente configurar la IP remota donde sea que estés ejecutando Prometheus y funcionará. Eso es lo que he hecho con algunos sitios que he monitoreado. Estoy bastante seguro de que por eso se agregó DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEX.

¿Estás usando la plantilla de Cloudflare? (La forma recomendada de hacer las cosas es usar una CDN real y dejar que Discourse decida qué cosas proxy, pero tampoco quieres hacer eso).

1 me gusta

Eso es exactamente lo que no me funciona.

Estoy usando una máquina de prueba que no está proxyficada por Cloudflare. Configuré el exportador de Prometheus allí junto con DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEX configurado en mi servidor de monitoreo y las cosas funcionan bien.

En la máquina de producción, lo mismo no funciona.

Sí, estoy usando la plantilla de Cloudflare

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 agregar Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/cloudflare.template.yml"

y las direcciones IP en la administración de usuarios se ven bien.

Estoy muy contento con cómo funciona Cloudflare hasta ahora y ya ha ayudado mucho con la protección contra DDOS, así que preferiría no cambiar a una solución CDN diferente, al menos no veo una razón.

Con respecto al exportador de Prometheus, no estoy seguro de por qué, pero no parece hacer la verificación de IP de la misma manera que Discourse generalmente lo hace. No soy lo suficientemente hábil en Ruby para validar esta suposición en el código, pero tengo mucha curiosidad al respecto.

Si tu comunidad es de las que atraen ataques DDOS, entonces Cloudflare es una gran solución.

Oh, se ejecuta en su propio puerto, por lo que evita NGINX, que es lo que esa plantilla cambia, por eso es diferente. Así que si quieres que tenga https, necesitarías un nginx externo para hacerlo, creo. O simplemente acceder a él directamente a través de http y confiar en que la restricción a nivel de IP es lo suficientemente buena (y confiar en las redes intermedias).

No estoy seguro de si estamos hablando de lo mismo. Me refería al plugin exportador (del que trata este hilo) y no a prometheus. El exportador no parece manejar la verificación de IP de la misma manera que lo hace el propio discourse, ¿o de lo contrario el problema no debería existir?

1 me gusta

Sí. Leí la fuente demasiado rápido. No sé por qué no obtendría la misma IP que Discourse.

Ya lo tengo funcionando por ahora. Viendo el panel de ejemplo de @sam, me pregunto cómo integraría los datos de redis y postgres. Probablemente con dos exportadores separados. Solo me pregunto cómo tendría la conexión a postgres y redis dentro de Discourse :thinking: