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 только для чтения»-
Административный 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 GETpath /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 с его паролем.
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, который отказал один раз и восстановился,
сообщается как нездоровый до этого момента. Правило ждёт пять минут перед
срабатыванием.