CloudflareでPrometheusを使用する

Cloudflare の背後で、メトリクスを一般公開せずに試した人はいますか?

問題は、Cloudflare(または基本的にどのプロキシ)の背後にある場合、Prometheus の元の IP が HTTP ヘッダーの通常の場所になくなることです。

これを HTTP のみでアクセス可能にする方法、または SSL 証明書を作成するために Discourse に追加の(サブ)ドメインを追加する方法はありますか?

IP または Cloudflare で透過モードに切り替えることができる追加のサブドメイン経由でアクセス可能にすることが、2 つの選択肢になります。もう 1 つは、プラグインを変更して別の HTTP ヘッダーを確認することでしょう。X-Forwarded-For または CF-Connecting-IP のいずれかだと思います。私はそれをできるタイプの人間です。後者の方がおそらく最も賢明な解決策でしょう。

どんな助けでも感謝します。

編集:Cloudflare 自体が Cloudflare の背後で正しい IP を非常にうまく使用していることに気づきました。プラグインが Cloudflare 自体とは異なることを行っているか、または… :thinking:

PrometheusとGraphanaをDiscourseと同じサーバーで実行し、リバースプロキシからそれらを提供する必要があると思います。

「いいね!」 1

それがまさに私がしたくないことです。本番サーバーで多くの追加処理が発生するのは避けたいです。フォーラムのトラフィックで既に手一杯なので。また、リバースプロキシが必要な場合、IPと非HTTPSで簡単に /metrics をリバースプロキシできるため、GrafanaとPrometheusをローカルで実行する必要はないかもしれませんが、それはすべてハッキーに聞こえます。もっと良い方法があると思っていました。

「いいね!」 1

それほど多くの処理ではありません。オーバーヘッドはかなり小さいです。

ああ、待ってください。しかし、正しいリモートIPがDiscourseに届くように設定されていれば、Prometheusを実行している場所にリモートIPを設定するだけで機能します。私が監視したいくつかのサイトでそうしました。それがDISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEXが追加された理由だと思います。

Cloudflareテンプレートを使用していますか?(推奨される方法は、実際のCDNを使用し、Discourseにどのコンテンツをプロキシするかを決定させることですが、それもしたくないのでしょう。)

「いいね!」 1

まさにそれが私には機能していません。

Cloudflareでプロキシされていないテストマシンを使用しています。そこでPrometheusエクスポーターをセットアップし、DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEXを監視サーバーに設定したところ、うまく機能しました。

本番マシンでは同じことができません。

はい、Cloudflareテンプレートを使用しています。

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Lets Encrypt (https) を追加したい場合は、これらの2行のコメントを解除してください。
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/cloudflare.template.yml"

そして、ユーザー管理者のIPアドレスは良好に見えます。

これまでのCloudflareの動作には非常に満足しており、すでにDDoS保護に大いに役立っているので、別のCDNソリューションに切り替えたいとは思いません。少なくともその理由は見当たりません。

Prometheusエクスポーターに関しては、なぜかはわかりませんが、Discourseが一般的にIPチェックを行うのと同じ方法ではIPチェックを行っていないようです。Rubyにはそれほど詳しくないので、コードでこの仮説を検証することはできませんが、非常に興味があります。

コミュニティがDDOS攻撃を引き付けるようなものである場合、Cloudflareは優れたソリューションです。

ああ、それは独自のポートで実行されるため、そのテンプレートが変更するNGINXをバイパスします。そのため、違いがあります。したがって、HTTPSを使用したい場合は、外部nginxでそれを行う必要があると思います。または、HTTP経由で直接アクセスし、IPレベルの制限で十分であると信頼する(そして、介在するネットワークを信頼する)だけです。

同じことを話しているかどうかわかりません。私は、Prometheusではなく、エクスポートプラグイン(このスレッドはそれについてです)について話していました。エクスポートプラグインは、Discourse自体が行うのと同じ方法でIPチェックを処理していないようです。そうでなければ、問題は存在しないはずですよね?

「いいね!」 1

ええ。ソースを早とちりしました。Discourseと同じIPを取得できない理由がわかりません。

とりあえず動作するようになりました。@samさんの例のダッシュボードを見て、RedisとPostgreSQLのデータをどのように取り込むことができるか疑問に思っています。おそらく2つの別々のエクスポーターを使うことになるでしょう。Discourse内でPostgreSQLとRedisに接続するにはどうすればよいか、考えています :thinking: