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…
É 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.
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.)
É 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?
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