Usando Prometheous com Cloudflare

Alguém já tentou isso por trás do Cloudflare sem expor as métricas publicamente?

O problema é que o IP original do Prometheus não está no local usual nos cabeçalhos HTTP quando está por trás do Cloudflare (ou basicamente qualquer proxy).

Existe alguma maneira de torná-lo acessível apenas via HTTP ou adicionar um subdomínio adicional ao Discourse para criar um certificado SSL?

Tê-lo acessível via IP ou um subdomínio adicional que poderia ser alternado para o modo transparente no Cloudflare seriam duas opções. A outra provavelmente seria modificar o plugin para verificar um cabeçalho HTTP diferente. Acho que deveria ser X-Forwarded-For ou CF-Connecting-IP. Eu sou o tipo de cara que é capaz de fazer isso. Esta última provavelmente seria a solução mais inteligente.

Qualquer ajuda é apreciada.

EDIT: Acabei de perceber que o próprio Cloudflare usa muito bem o IP correto por trás do Cloudflare. Ou o plugin está fazendo algo diferente do próprio Cloudflare ou… :thinking:

Eu acho que você precisaria executar o Prometheus e, talvez, o Grafana no mesmo servidor que o Discourse e servi-los a partir de um proxy reverso.

1 curtida

É exatamente isso que eu não quero fazer. Prefiro não ter muitas coisas adicionais acontecendo no servidor de produção, pois ele já está bastante sobrecarregado com o tráfego do fórum. Além disso, se eu precisar fazer um proxy reverso, provavelmente não precisarei executar o Grafana e o Prometheus localmente, pois eu poderia facilmente apenas fazer um proxy reverso de /metrics externamente em IP e sem HTTPS - mas tudo isso soa como uma gambiarra. Pensei que poderia haver uma maneira melhor.

1 curtida

Não são muitas coisas. É bem leve em termos de sobrecarga.

Ah, espere. Mas se você configurou as coisas de forma que o IP remoto correto chegue ao Discourse, então você pode simplesmente definir o IP remoto para onde quer que esteja executando o Prometheus e funcionará. Foi o que fiz com alguns sites que monitorei. Tenho quase certeza de que é por isso que DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEX foi adicionado.

Você está usando o template do Cloudflare? (A maneira recomendada de fazer as coisas é usar um CDN real e deixar o Discourse decidir quais coisas repassar, mas você também não quer fazer isso.)

1 curtida

É exatamente isso que não está funcionando para mim.

Estou usando uma máquina de teste que não é proxy pelo Cloudflare. Configurei o exportador Prometheus lá junto com o DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEX definido para o meu servidor de monitoramento e as coisas funcionam bem.

Na máquina de produção, o mesmo não acontece.

Sim, estou usando o template do Cloudflare

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomente estas duas linhas se desejar adicionar Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/cloudflare.template.yml"

e os endereços IP nos administradores de usuários estão bons.

Estou muito feliz com o funcionamento do Cloudflare até agora e ele já ajudou muito com a proteção contra DDOS, então prefiro não mudar para alguma solução de CDN diferente - pelo menos não vejo um motivo.

Em relação ao exportador Prometheus, não tenho certeza por quê, mas ele não parece fazer a verificação de IP da mesma forma que o Discourse geralmente faz. Não sou bom o suficiente em Ruby para validar essa suposição no código, mas estou muito curioso sobre isso.

Se sua comunidade é do tipo que atrai ataques DDOS, então o Cloudflare é uma ótima solução.

Ah, ele roda em sua própria porta, então ele contorna o NGINX, que é o que esse template altera, então é por isso que é diferente. Portanto, se você quiser que ele tenha https, precisaria de um nginx externo para fazer isso, eu acho. Ou apenas acessá-lo diretamente via http e confiar que a restrição em nível de IP é boa o suficiente (e confiar nas redes intermediárias).

Não tenho certeza se estamos falando da mesma coisa. Eu estava falando sobre o plugin exportador (este tópico é sobre) e não sobre o prometheus. O exportador não parece lidar com a verificação de IP da mesma forma que o próprio discourse o faz - ou, caso contrário, o problema não deveria existir, certo?

1 curtida

Sim. Eu li o código-fonte rápido demais. Não sei por que ele não obteria o mesmo IP que o Discourse.

Consegui fazer funcionar por enquanto. Vendo o painel de exemplo do @sam, fico imaginando como eu traria os dados do redis e do postgres. Provavelmente com dois exportadores separados. Só fico imaginando como eu teria a conexão com postgres e redis dentro do Discourse :thinking: