Prometheus를 Cloudflare와 함께 사용하는 방법

클라우드플레어(CF) 뒤에서 메트릭스를 전체 공개하지 않고 이 방법을 시도해 본 사람이 있을까요?

문제는 클라우드플레어(또는 기본적으로 모든 프록시) 뒤에서는 Prometheus의 원래 IP가 HTTP 헤더의 일반 위치에 없다는 점입니다.

HTTP로만 접근 가능하게 만들거나, SSL 인증서를 생성하기 위해 Discourse에 추가적인 (서브)도메인을 추가하는 방법이 있을까요?

IP로 접근 가능하게 하거나, 클라우드플레어에서 투명한(Transparent) 모드로 전환할 수 있는 추가 서브도메인을 사용하는 것이 두 가지 옵션이 될 수 있습니다. 다른 옵션은 아마도 플러그인을 수정하여 다른 HTTP 헤더를 확인하도록 하는 것일 것입니다. X-Forwarded-For 또는 CF-Connecting-IP 헤더일 것 같습니다. 저는 그렇게 할 수 있는 종류의 사람입니다. 후자가 아마도 가장 현명한 해결책일 것입니다.

도움 주시면 감사하겠습니다.

수정: 방금 클라우드플레어 자체가 클라우드플레어 뒤에서 올바른 IP를 매우 잘 사용하고 있다는 사실을 깨달았습니다. 플러그인이 클라우드플레어 자체와 다르게 무언가를 하고 있거나… :thinking:

Prometheus와 아마도 Grafana를 Discourse와 동일한 서버에서 실행하고, 리버스 프록시를 통해 제공해야 할 것 같습니다.

제가 원하지 않는 게 바로 그겁니다. 프로덕션 서버에는 이미 포럼 트래픽 때문에 부하가 많이 걸려 있어서, 그 위에 추가로 많은 작업이 이루어지길 원하지 않습니다. 또한 리버스 프록시를 설정해야 한다면, 로컬에서 grafana와 prometheus를 실행할 필요가 없을 것 같습니다. IP와 HTTPS가 아닌 환경으로 /metrics를 리버스 프록시로 노출하기만 하면 되니까요. 하지만 그 모든 것이 해킹처럼 느껴집니다. 더 나은 방법이 있을 줄 알았거든요.

추가 작업이 그렇게 많지는 않습니다. 오버헤드가 꽤 낮습니다.

아, 잠깐. 하지만 올바른 원격 IP가 Discourse로 전달되도록 설정해 두었다면, Prometheus를 실행하는 곳의 IP를 원격 IP로 설정하기만 하면 작동합니다. 제가 모니터링하는 일부 사이트에서 그렇게 했습니다. DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEX가 추가된 이유가 바로 그것이라고 확신합니다.

Cloudflare 템플릿을 사용 중이신가요? (권장되는 방법은 실제 CDN을 사용하고 Discourse가 어떤 항목을 프록시할지 결정하도록 하는 것이지만, 그 또한 원치 않으시는 것 같습니다.)

제 경우엔 정확히 그 부분이 작동하지 않습니다.

저는 Cloudflare 프록시를 거치지 않는 테스트 머신을 사용 중입니다. 해당 머신에 Prometheus 익스포터와 함께 DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEX를 모니터링 서버 IP로 설정했는데, 잘 작동합니다.

하지만 프로덕션 머신에서는 동일한 설정이 작동하지 않습니다.

네, 저는 Cloudflare 템플릿을 사용하고 있습니다.

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Lets Encrypt(https)를 추가하려면 아래 두 줄의 주석을 해제하세요
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/cloudflare.template.yml"

그리고 관리자 페이지에서 사용자의 IP 주소도 정상적으로 보입니다.

지금까지 Cloudflare의 작동 방식에 매우 만족하고 있으며, DDoS 보호에도 큰 도움이 되었기 때문에 다른 CDN 솔루션으로 전환하고 싶지 않습니다. 적어도 그럴 이유가 보이지 않습니다.

Prometheus 익스포터에 대해서는 정확히 왜 그런지 모르겠지만, Discourse가 일반적으로 하는 방식과 동일한 방식으로 IP 체크를 하지 않는 것 같습니다. Ruby 코드를 통해 이 가설을 검증할 만큼 Ruby에 능숙하지는 않지만, 이에 대해 매우 궁금합니다.

DDoS 공격을 자주 받는 커뮤니티라면 Cloudflare가 훌륭한 해결책이 될 수 있습니다.

아, 자체 포트에서 실행되므로 해당 템플릿이 변경하는 NGINX를 우회하기 때문에 그런 것입니다. 따라서 HTTPS를 사용하려면 외부 NGINX를 통해 이를 처리해야 할 것 같습니다. 아니면 단순히 HTTP로 직접 접근하고, IP 수준 제한이 충분히 안전하다고(그리고 중간 네트워크를) 신뢰하는 방법도 있습니다.

같은 것에 대해 이야기하고 있는지 확실하지 않습니다. 저는 이 스레드의 주제인 exporter 플러그인에 대해 이야기하고 있었고, prometheus에 대해서는 아닙니다. exporter가 discourse 자체와 동일한 방식으로 IP 확인을 처리하지 않는 것 같거든요 - 그렇지 않다면 이런 문제가 존재하지 않아야 하지 않나요?

그래. 소스를 너무 빠르게 읽었어. 왜 Discourse와 같은 IP를 가져오지 못하는지 모르겠어.

지금은 일단 작동하게 만들었습니다. @sam 님의 예시 대시보드를 보고, redis와 postgres 데이터를 어떻게 가져와야 할지 궁금해집니다. 아마도 두 개의 별도 익스포터(exporter)를 사용해야 할 것 같습니다. 다만 Discourse 안에서 postgres와 redis에 어떻게 연결하는지 궁금합니다 :thinking: