Использование Prometheous с Cloudflare

Пробовал ли кто-нибудь это за Cloudflare, не открывая метрики для всей публики?

Проблема в том, что исходный IP-адрес Prometheus находится не на обычном месте в заголовках HTTP, когда он стоит за Cloudflare (или любым другим прокси).

Есть ли способ сделать это доступным только через HTTP или добавить дополнительный (под)домен к Discourse для создания SSL-сертификата?

Доступность по IP-адресу или дополнительный поддомен, который можно переключить в прозрачный режим в Cloudflare, — это два варианта. Другой вариант, вероятно, — модифицировать плагин так, чтобы он проверял другой заголовок HTTP. Думаю, это должно быть X-Forwarded-For или CF-Connecting-IP. Я как раз тот парень, который может это сделать. Последний вариант, вероятно, будет самым разумным решением.

Любая помощь будет оценена.

РЕДАКТИРОВАНИЕ: Я только что понял, что сам Cloudflare очень хорошо использует правильный IP-адрес за Cloudflare. Либо плагин делает что-то не так, как сам Cloudflare, либо… :thinking:

Думаю, вам нужно будет запустить Prometheus, а возможно и Grafana, на том же сервере, что и Discourse, и обслуживать их через обратный прокси-сервер.

Это именно то, чего я не хочу делать. Я бы предпочел не добавлять лишнего на продакшн-сервер, так как он уже сильно загружен трафиком форума. Кроме того, если мне понадобится настроить обратный прокси, то, вероятно, не придется запускать Grafana и Prometheus локально — я мог бы просто сделать обратный прокси для /metrics по IP и без HTTPS. Но всё это звучит как костыльное решение. Мне казалось, что должен быть более правильный способ.

Это не так много. Накладные расходы довольно низкие.

О, погоди. Но если у тебя настроено так, что правильный удалённый IP-адрес попадает в Discourse, то можно просто указать в качестве удалённого IP адрес, где запущен Prometheus, и всё заработает. Именно так я делал с некоторыми сайтами, которые мониторил. Я почти уверен, что переменная DISCOURSE_PROMETHEUS_TRUSTED_IP_ALLOWLIST_REGEX была добавлена именно для этого.

Ты используешь шаблон Cloudflare? (Рекомендуемый способ — использовать реальный CDN и позволить Discourse решать, что проксировать, но, судя по всему, ты не хочешь этого делать.)

Именно это у меня не работает.

Я использую тестовую машину, которая не проксируется через 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)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/cloudflare.template.yml"

и IP-адреса в разделе администраторов пользователей выглядят корректно.

Я очень доволен тем, как работает Cloudflare на данный момент, и он уже очень помог с защитой от DDoS-атак, поэтому я бы не хотел переходить на какое-то другое CDN-решение — по крайней мере, я пока не вижу для этого причин.

Что касается экспортера Prometheus, я не уверен, почему, но он, похоже, не выполняет проверку IP-адресов так же, как это обычно делает Discourse. Я недостаточно хорошо владею Ruby, чтобы подтвердить это предположение в коде, но мне очень интересно разобраться в этом.

Если ваше сообщество привлекает DDoS-атаки, то Cloudflare — отличное решение.

О, он работает на собственном порту, поэтому обходит NGINX, который как раз и настраивается в этом шаблоне, вот почему всё иначе. Так что, если вы хотите, чтобы он работал по HTTPS, то, думаю, вам понадобится внешний NGINX для этого. Или просто обращайтесь к нему напрямую через HTTP и доверяйте тому, что ограничение на уровне IP достаточно надёжно (и доверяйте промежуточным сетям).

Не уверен, что мы говорим об одном и том же. Я имел в виду плагин экспортера (о котором идёт речь в этой теме), а не Prometheus. Похоже, что экспортер не обрабатывает проверку IP так же, как сам Discourse — иначе проблемы бы не возникло, верно?

Да. Я слишком быстро прочитал исходный код. Не знаю, почему он не получает тот же IP-адрес, что и Discourse.

Пока мне удалось это запустить. Видя пример панели управления от @sam, я задумался, как мне получить данные из Redis и PostgreSQL. Вероятно, с помощью двух отдельных экспортеров. Просто интересно, как мне настроить подключение к PostgreSQL и Redis внутри Discourse :thinking: