Caddy¶
Веб-сервер и обратный прокси: upstream-ы, не проходящие проверку состояния, отказавшая перезагрузка конфигурации, ошибки обработчиков и доля ответов 5xx.
DumbMonit читает три вещи из административного API Caddy, все с помощью
GET: /config/apps/http/servers (конфигурация HTTP, которую запускает
Caddy, никогда раздел tls, где хранятся токены DNS-провайдеров),
/reverse_proxy/upstreams (backend-ы и отказы, которые помнит пассивная
проверка состояния) и /metrics (здоровье upstream, перезагрузки, запросы и
ошибки).
Административный API Caddy не предназначен только для чтения: кто бы до него
ни добрался, может загрузить новую конфигурацию или остановить Caddy. Именно
поэтому он слушает на localhost:2019. Настройка ниже оставляет его там и
даёт самому Caddy публиковать его представление только для чтения, защищённое
паролем, которое отвечает на GET по трём путям выше и отклоняет всё
остальное.
Что отслеживается¶
Все метрики с префиксом dumbmonit_caddy_. Суммарные значения — это
счётчики: графики и правила превращают их в скорости.
| Метрика | Что | Метки |
|---|---|---|
config_loaded |
1, когда Caddy запускает хотя бы один HTTP-сервер | |
servers, routes |
HTTP-серверы и маршруты в конфигурации | |
config_last_reload_ok |
0, когда последняя перезагрузка конфигурации завершилась ошибкой | |
config_last_reload_timestamp_seconds |
время последней успешной перезагрузки | |
upstreams, upstreams_unhealthy |
backend-ы каждого reverse_proxy, и те, что отказывают |
|
upstream_healthy |
1, когда ни активная, ни пассивная проверка состояния не исключает backend | upstream |
upstream_fails |
отказавшие запросы, которые сейчас помнит пассивная проверка состояния | upstream |
upstream_requests |
запросы, находящиеся в полёте к backend-у | upstream |
requests_total, requests_5xx_total, request_errors_total |
с опцией metrics: запросы, ответы 5xx и ошибки обработчиков |
|
server_requests_total, server_requests_5xx_total, server_request_errors_total |
то же на сервер (srv0, srv1… или заданные вами имена) |
server |
Для upstream_healthy нужен /metrics: активная проверка состояния видна
только там. Представление только для чтения, которое не пропускает
/metrics, всё равно сообщает о backend-ах и их запомненных отказах. Caddy
не публикует свою версию через административный API.
Применяемые встроенные правила: «Backend Caddy нездоров», «Перезагрузка конфигурации Caddy не удалась», «Обратный прокси отвечает 5xx», плюс «Монитор недоступен».
Страница монитора¶
Панель над графиками читает то, что сохранила проверка; открытие страницы никогда не запрашивает Caddy. Она сообщает, что не так, в одном предложении (нет конфигурации, отказавшая перезагрузка, нездоровые upstream-ы, высокая доля 5xx), затем — серверы, маршруты, upstream-ы, скорость запросов, долю 5xx и ошибки обработчиков за 24 часа, затем — каждый upstream с его запомненными отказами.
Публикация представления административного API Caddy только для чтения¶
-
Административный API Caddy может загрузить новую конфигурацию и остановить Caddy: он должен оставаться недоступным для всего, кроме DumbMonit. Оставьте его там, куда его помещает Caddy, на localhost:2019, и дайте самому Caddy опубликовать его представление только для чтения: только GET, по трём путям, которые читает DumbMonit, за паролем.
-
Создайте хеш пароля для пользователя dumbmonit.
caddy hash-password --plaintext 'a-long-password' -
Добавьте этот сайт в Caddyfile, с этим хешем вместо HASH, затем перезагрузите Caddy. Он отвечает на порту 2020 и отклоняет всё, кроме этих трёх чтений.
:2020 { basic_auth { dumbmonit HASH } @readonly { method GET path /config/apps/http/servers /reverse_proxy/upstreams /metrics } handle @readonly { reverse_proxy localhost:2019 { header_up Host localhost:2019 } } respond 403 } -
Необязательно: добавьте metrics в блок глобальных опций в начале Caddyfile, чтобы считать запросы, ошибки и ответы 5xx на сервер. Здоровье upstream и перезагрузки сообщаются и без этого.
metrics -
Отфильтруйте порт 2020 так, чтобы до него доходил только хост DumbMonit. В DumbMonit введите хост Caddy с этим портом, например «caddy.lan:2020», и пользователя dumbmonit с его паролем.
Warning
Никогда не публикуйте сам административный API в сети без файрвола перед ним: любой, кто достигнет порта 2019, может заменить конфигурацию или остановить Caddy, а опция origins не останавливает клиента, который не отправляет заголовок Origin. Если вы всё же раскрываете его в приватной сети, отфильтруйте порт так, чтобы до него доходил только хост DumbMonit, и выберите No password.
Caddyfile сохраняет смысл без отступов; caddy fmt расставляет их.
header_up Host localhost:2019 нужен, потому что административный API
отвечает только на запросы, адресованные тому адресу, на котором он слушает.
С образом контейнера Caddy запускайте команду хеширования через docker
exec.
Конфигурация, загруженная как JSON, а не из Caddyfile, получает тот же сайт
как дополнительный сервер с обработчиком basic_auth, сопоставителем
method и path и reverse_proxy к localhost:2019.
Учётные данные¶
| Учётные данные | Поля |
|---|---|
| Представление только для чтения | Пользователь и пароль блока basic_auth выше (рекомендуется). |
| Без пароля | Ничего: сам административный API, отфильтрованный так, чтобы до него доходил только DumbMonit. |
Адрес: имя хоста или IP с портом представления только для чтения
(caddy.lan:2020), или полный URL. Опции: протокол (по умолчанию HTTP),
порт (2019, сам административный API), проверка сертификата и таймаут
запроса (10 с).
Пассивная проверка состояния (fail_duration) помнит отказы только в
течение этого времени: backend, который отказал один раз и восстановился,
сообщается как нездоровый до этого момента. Правило ждёт пять минут перед
срабатыванием.