Содержание:
- Включаем metrics в Caddy
- UFW-правило для доступа из docker-сети
- Добавляем Caddy в
prometheus.yml - Импорт дашборда
В первой части подняли хост и базовую безопасность, во второй - Caddy как реверс-прокси, Prometheus + Grafana c дашбордами по хосту и контейнерам. Снаружи видим, что блог работает, изнутри есть метрики хоста и контейнеров. Но мы не видим сам HTTP-трафик: сколько запросов в секунду, какой процент 5xx и т.д. В конце поста у вас будет настроенный дашборд для HTTP-метрик, который вы можете редактировать под свои нужды.
Финальный чеклист
-
В
/etc/caddy/Caddyfileглобальный блок:admin off+servers { metrics } -
В
/etc/caddy/Caddyfileдобавлен блок:2019 { metrics /metrics } -
caddy validateпроходит -
UFW-правило
from 172.16.0.0/12 to any port 2019 proto tcp -
curl http://localhost:2019/metrics | grep caddy | tailвозвращает строкиcaddy_* -
В
prometheus.ymlдобавлен jobcaddy - Prometheus перечитал конфиг (SIGHUP)
-
Таргет
caddyв Prometheus в состоянииup - Импортирован дашборд Caddy
Главное
- Метрики Caddy отдаёт admin endpoint на
localhost:2019, но по умолчанию они выключены - включаются глобальной директивойservers { metrics }. - На одном порту нельзя одновременно держать admin API и
/metrics. Мы отключим admin API, потому что им не пользуемся. - Не открываем наружу. Порт 2019 пускает только трафик из docker-сетей (
172.16.0.0/12), снаружи UFW его блокирует.
Этап 1. Включаем metrics в Caddy
Дока Caddy по метрикам: https://caddyserver.com/docs/metrics
Включим метрики в /etc/caddy/Caddyfile:
{
email username@example.com
admin off
servers {
metrics
}
}
:2019 {
metrics /metrics
}
...
admin offотключает админкуservers { metrics }включает экспорт Prometheus-метрик:2019- слушает на 2019 порту всех интерфейсов хоста, по/metricsотдаются метрики
Валидируем и перечитываем:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Если в логах будет Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 39}:
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
Проверим, что метрики доступны на хосте:
curl -s http://localhost:2019/metrics | head -20
Должны быть строки вроде caddy_admin_http_requests_total, caddy_http_request_duration_seconds_bucket и т. д.
Этап 2. UFW-правило для доступа из docker-сети
Напоминаю, что Prometheus живёт в контейнере и стучится к Caddy через docker-bridge. По дефолту UFW блокирует трафик от docker-сетей к хосту.
Так же, как это делали для node_exporter в части 2, открываем 2019 для стандартного диапазона 172.16.0.0/12:
sudo ufw allow from 172.16.0.0/12 to any port 2019 proto tcp
sudo ufw reload
Снаружи 2019 по-прежнему недоступен: UFW пускает только source IP из 172.16.0.0/12.
Этап 3. Добавляем Caddy в prometheus.yml
В ~/services/observability/prometheus/prometheus.yml добавляем job:
- job_name: 'caddy'
static_configs:
- targets: ['172.17.0.1:2019']
172.17.0.1 - дефолтный IP моста docker0 (тот же, что использовали для node_exporter в части 2).
Перечитываем конфиг Prometheus без рестарта:
docker compose exec prometheus kill -HUP 1
Проверяем, что таргет ожил:
curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | select(.labels.job == "caddy") | {scrapeUrl, health}'
Будет:
{
"scrapeUrl": "http://172.17.0.1:2019/metrics",
"health": "up"
}
Если health: "down", проверьте UFW: sudo ufw status verbose. Должен отдать:
2019/tcp ALLOW IN 172.16.0.0/12Этап 4. Импорт дашборда
Dashboards -> New -> Import.

Я взял этот: https://grafana.com/grafana/dashboards/24146-caddy-hosts/, ID: 24146
В DS_PROMETHEUS не забываем выбрать prometheus.
После импорта на дашборде увидим статистику по HTTP-запросам, разбивку по HTTP кодам и т.д.
Что дальше
Метрики собираются, дашборд показывает графики. Следующий шаг - настройка алертов, чтобы при превышении порогов мы получали нотификации (в Telegram).