Перейти к содержимому

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_loaded1, когда Caddy запускает хотя бы один HTTP-сервер
servers, routesHTTP-серверы и маршруты в конфигурации
config_last_reload_ok0, когда последняя перезагрузка конфигурации завершилась ошибкой
config_last_reload_timestamp_secondsвремя последней успешной перезагрузки
upstreams, upstreams_unhealthybackend-ы каждого reverse_proxy, и те, что отказывают
upstream_healthy1, когда ни активная, ни пассивная проверка состояния не исключает backendupstream
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 только для чтения»
  1. Административный API Caddy может загрузить новую конфигурацию и остановить Caddy: он должен оставаться недоступным для всего, кроме DumbMonit. Оставьте его там, куда его помещает Caddy, на localhost:2019, и дайте самому Caddy опубликовать его представление только для чтения: только GET, по трём путям, которые читает DumbMonit, за паролем.

  2. Создайте хеш пароля для пользователя dumbmonit.

    caddy hash-password --plaintext 'a-long-password'
  3. Добавьте этот сайт в 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
    }
  4. Необязательно: добавьте metrics в блок глобальных опций в начале Caddyfile, чтобы считать запросы, ошибки и ответы 5xx на сервер. Здоровье upstream и перезагрузки сообщаются и без этого.

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