4.3 KiB
4.3 KiB
Алерты на проблемные контейнеры
Контекст
Случай с wakapi: при старте упали миграции, контейнер встал в restart-loop и несколько дней крутился по кругу — никто не узнал. Из этого две проблемы:
- Контейнеры могут бесконечно перезапускаться при ошибке.
- Нет алертов о таких ситуациях.
Что есть и что использовать
- Netdata — Docker-collector через cgroups + Docker API: состояние,
restart count, healthcheck status. Алерты в
health.d/*.conf, нотификации черезhealth_alarm_notify.conf(Telegram/Discord/email/ntfy). - Dozzle — только для просмотра логов после факта, нормальных алертов нет.
- Caddy — мог бы участвовать в healthcheck снаружи, но это отдельный слой.
План — три слоя
1. Healthchecks в compose (фундамент)
Без них Docker считает контейнер «running», пока процесс жив, — wakapi с
падающими миграциями этому условию удовлетворял. Добавить в каждый
docker-compose.yml.j2:
healthcheck:
test: ["CMD", "wget", "-q", "-O-", "http://localhost:PORT/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 60s # окно на миграции — failed-проверки до истечения не считаются
start_period — ключевая штука для случая wakapi: даём миграциям отработать,
до его истечения healthcheck не убивает контейнер.
2. Алерты через Netdata (главное)
Два разных сигнала:
- Restart loop — алерт на
docker.container_stateили счётчик перезапусков (растёт > N за M минут). Это и есть «контейнер крутится по кругу». - Unhealthy — после healthcheck выше алерт на
docker.container_health_status != healthyдольше M минут.
Канал нотификаций: один, проще всего Telegram-бот. Настройка в
health_alarm_notify.conf.
3. Restart policy — что менять (или не менять)
Скорее оставить unless-stopped. Альтернативы и их минусы:
on-failure:5— Docker сам остановит после 5 попыток. Минус: после ребута сервера сервис не поднимется (толькоalways/unless-stoppedвстают на старте докера). Серьёзный регресс для домашнего сервера.- Внешний sidecar, слушающий
docker eventsи останавливающий контейнер после N рестартов в окне — лишняя сложность ради того, что уже сделает алерт.
Лучше: алерт пришёл → решаем вручную, остановить или чинить.
Опционально (вне netdata)
- Uptime Kuma — внешний HTTP-чек по публичным URL. Ловит случаи, когда контейнер «здоров», но прокся/DNS/Caddy сломаны. Свои нотификации, дашборд. Не дублирует netdata, проверяет с другой стороны.
Шаги при реализации
- Добавить healthcheck + start_period в compose-шаблоны (начать с wakapi, потом по списку).
- Проверить, что netdata собирает Docker-метрики (collector включён).
- Настроить один канал нотификаций (Telegram/ntfy/email — выбрать).
- Написать пару алертов: restart-loop и unhealthy.
Открытые вопросы
- Какой канал нотификаций использовать.
- Добавлять ли Uptime Kuma сразу или потом.