Пробовал ли кто-нибудь это за Cloudflare, не открывая метрики для всей публики?
Проблема в том, что исходный IP-адрес Prometheus находится не на обычном месте в заголовках HTTP, когда он стоит за Cloudflare (или любым другим прокси).
Есть ли способ сделать это доступным только через HTTP или добавить дополнительный (под)домен к Discourse для создания SSL-сертификата?
Доступность по IP-адресу или дополнительный поддомен, который можно переключить в прозрачный режим в Cloudflare, — это два варианта. Другой вариант, вероятно, — модифицировать плагин так, чтобы он проверял другой заголовок HTTP. Думаю, это должно быть X-Forwarded-For или CF-Connecting-IP. Я как раз тот парень, который может это сделать. Последний вариант, вероятно, будет самым разумным решением.
Любая помощь будет оценена.
РЕДАКТИРОВАНИЕ: Я только что понял, что сам Cloudflare очень хорошо использует правильный IP-адрес за Cloudflare. Либо плагин делает что-то не так, как сам Cloudflare, либо…
Это именно то, чего я не хочу делать. Я бы предпочел не добавлять лишнего на продакшн-сервер, так как он уже сильно загружен трафиком форума. Кроме того, если мне понадобится настроить обратный прокси, то, вероятно, не придется запускать 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 — иначе проблемы бы не возникло, верно?
Пока мне удалось это запустить. Видя пример панели управления от @sam, я задумался, как мне получить данные из Redis и PostgreSQL. Вероятно, с помощью двух отдельных экспортеров. Просто интересно, как мне настроить подключение к PostgreSQL и Redis внутри Discourse