Индекс журналаDockup / заметка с места
Note / self-host-healthchecks

Как разместить Healthchecks самостоятельно в 2026 году: cron-пинги, оповещения и резервное копирование базы данных

Разместите Healthchecks самостоятельно с правильными портами, постоянным хранилищем, HTTPS, секретами, резервными копиями и проверками обновлений. Узнайте, как исправить ситуацию, когда cron-задачи отправляют ping на внутренний URL.

Самостоятельное размещение Healthchecks становится по-настоящему интересным при первом redeploy, а не после первого docker run. Если cron-задачи отправляют ping на внутренний URL или workers для email-уведомлений не запущены, Docker всё равно может сообщать, что процесс полностью работоспособен. Описанное ниже развёртывание строится вокруг наблюдаемого поведения: отправьте из тестовой задачи start-, success- и failure-пинги, затем пропустите запланированный ping и получите оповещение о невыполненной задаче.

Назначение Healthchecks однозначно: dead-man monitoring для cron-задач и фоновых процессов. Из этого следует, что должно оставаться публичным, что нужно держать приватным и какие данные должна восстанавливать резервная копия.

Резервируйте состояние, которое Healthchecks не может воссоздать

Стандартному контейнеру Healthchecks не требуется mount для данных приложения. Однако состав данных для восстановления вполне определён: база данных приложения и конфигурация уведомлений. Не создавайте пустой volume лишь для того, чтобы развёртывание выглядело stateful; вместо этого сохраните точную ссылку на image и проверенную конфигурацию.

Соберите Healthchecks на чистом хосте и выполните acceptance-тест. Восстановление считается успешным, если возвращаются checks, schedules, integrations и ping keys, а намеренно пропущенный ping вызывает ожидаемое оповещение. Любая подключённая база данных или сервис для совместной работы должен резервироваться по собственному плану, согласованному с приложением, а заменяемый web-контейнер пересоздаётся из кода. В руководстве по развёртыванию от Git-репозитория до production описана эта воспроизводимая граница.

Храните checksum или digest заведомо рабочего image и повторяйте тесты после обновлений. Для stateless-сервиса успешная пересборка — это тест восстановления; для внешнего состояния runbook Healthchecks должен содержать ссылку на отдельного владельца и процедуру восстановления.

Соберите заменяемый контейнер Healthchecks

Используйте команду, в которой явно указаны все важные параметры. В этом базовом варианте Healthchecks привязывается к loopback хоста, добавляются известные mount для данных и задаётся первая обязательная настройка. Для production-оповещений добавьте проверенные параметры подключения к Postgres и рабочую доставку email; для приватных сервисов используйте приватные имена.

docker run -d \
  --name healthchecks \
  --restart unless-stopped \
  -p 127.0.0.1:8000:8000 \
  -e SECRET_KEY=replace-with-a-long-random-value \
  -e SITE_ROOT=https://app.example.com \
  -e ALLOWED_HOSTS=app.example.com \
  -e DB=postgres \
  -e DB_HOST=postgres.internal \
  -e DB_NAME=healthchecks \
  -e DB_USER=healthchecks \
  -e DB_PASSWORD=replace-with-a-strong-database-password \
  healthchecks/healthchecks:latest

Замените плавающие tags на протестированную версию или digest. После запуска проверьте docker logs --tail 200 healthchecks и убедитесь, что процесс слушает порт 8000. Затем выполните acceptance-действие Healthchecks; ответ root-page не доказывает, что весь сценарий работает: отправьте из тестовой задачи start-, success- и failure-пинги, затем пропустите запланированный ping и получите оповещение о невыполненной задаче.

От чего зависит Healthchecks

Обозначьте вокруг Healthchecks три границы: входящий трафик к порту 8000, постоянное состояние и вспомогательные требования. Контейнер можно заменить, но для двух остальных компонентов нужны явные владельцы. Сетевой контракт Healthchecks включает Postgres и рабочую доставку email для production-оповещений. Приватные endpoints должны использовать внутренний DNS; разрешайте только необходимые исходящие вызовы и выдайте Healthchecks service credential с ограниченными правами.

Диаграмма считается полной, когда чистый клиент может отправить из тестовой задачи start-, success- и failure-пинги, затем пропустить запланированный ping и получить оповещение о невыполненной задаче. Собирайте данные о времени и ресурсах для количества checks, grace periods, notification fan-out, доставки email и записей в базе данных. Если транзакция завершается ошибкой, первая граница, которая ведёт себя не так, как описано, подскажет, нужно ли исследовать маршрутизацию, локальные ресурсы или вспомогательный сервис.

Настройте маршрутизацию Healthchecks, не создавая ложного впечатления о HTTPS

Выберите итоговый hostname Healthchecks до того, как пользователи сохранят callbacks или настройки клиентов, затем задайте в SITE_ROOT и ALLOWED_HOSTS внешний HTTPS-адрес. На платформе TLS должен завершаться один раз, после чего запросы направляются на приватный порт 8000.

Выполните acceptance-транзакцию извне. Если клиент не достигает Healthchecks, воспользуйтесь чек-листом проверки SSL для проверки DNS и сертификата. Если запрос доходит до Healthchecks, но cron-задачи отправляют ping на внутренний URL или workers для email-уведомлений не запущены, прекратите менять proxy redirects и исследуйте границу, специфичную для приложения.

Какие данные собрать до запуска Healthchecks

Создайте небольшой disposable fixture для Healthchecks и сохраняйте его для каждого релиза. Fixture должен проверять реальный workflow: отправить из тестовой задачи start-, success- и failure-пинги, затем пропустить запланированный ping и получить оповещение о невыполненной задаче. Запишите digest image, внешний hostname, адрес dependency и ожидаемый результат, чтобы другой оператор мог повторить тест без интерпретации этого руководства.

Запустите fixture три раза. Сначала используйте свежее развёртывание. Затем замените контейнер, не изменяя постоянное состояние. В третий раз восстановите резервную копию в пустом окружении. Третий запуск успешен только тогда, когда возвращаются checks, schedules, integrations и ping keys, а намеренно пропущенный ping вызывает ожидаемое оповещение. Во время каждого запуска собирайте latency и данные об использовании ресурсов для количества checks, grace periods, notification fan-out, доставки email и записей в базе данных; это станет базовым уровнем для оповещений вместо произвольного процента CPU.

Наконец, намеренно проверьте негативный сценарий: временно запретите test identity доступ к Postgres и рабочей доставке email для production-оповещений. Убедитесь, что Healthchecks явно сообщает об ошибке и не повреждает состояние, восстановите правильные условия и повторите успешную транзакцию. Запись о релизе с этими четырьмя результатами — более надёжное доказательство, чем скриншоты dashboard или однократный ответ curl.

Проверки отказоустойчивости Healthchecks

Наблюдайте за работой Healthchecks: количеством checks, grace periods, notification fan-out, доставкой email и записями в базе данных. Устанавливайте лимиты с запасом под эту нагрузку и не используйте liveness probe, конкурирующую с ней за ресурсы. Операторская проверка также должна по расписанию отправлять из тестовой задачи start-, success- и failure-пинги, затем пропускать запланированный ping и получать оповещение о невыполненной задаче.

При обновлениях помните, что application migrations и конфигурацию workers нужно обновлять вместе, чтобы web-страница не скрывала сломанную доставку оповещений. Разверните candidate-версию на восстановленной копии и повторите известный тест. Если cron-задачи отправляют ping на внутренний URL или workers для email-уведомлений не запущены, используйте runtime logs и фактический сетевой запрос, чтобы определить, какое предположение изменилось.

Выберите границу доверия Healthchecks

Закройте bootstrap window сразу после появления первого доверенного администратора. Конкретная ловушка Healthchecks — использовать сгенерированный secret, который меняется при каждом перезапуске; более безопасный вариант — стабильный SECRET_KEY, ограничение членства в проектах и отношение к ping URL как к credentials.

Сгенерируйте SECRET_KEY один раз, не храните его в Git и сохраните вместе с recovery manifest, поскольку его изменение может сделать недействительным зашифрованное или подписанное состояние приложения. Credentials для dependencies должны передаваться по приватной сети, а роли внутри Healthchecks должны разрешать минимальный набор полезных действий. Не записывайте конфиденциальные request bodies и responses провайдеров в обычные логи.

Для развёртывания в Dockup всё равно нужен acceptance-тест Healthchecks

Dockup может взять на себя заменяемые компоненты платформы: направить трафик на порт 8000, выпустить domain и certificate, передать secrets, подключить persistent storage и соединить Healthchecks с managed-сервисами или сервисами, подключёнными через приватную сеть. Это можно сделать на инфраструктуре Dockup или на подключённом вами сервере.

Acceptance-проверка Healthchecks остаётся явной. После one-click deployment задайте в SITE_ROOT и ALLOWED_HOSTS внешний HTTPS-адрес, подключите и проверьте Postgres и рабочую доставку email для production-оповещений, затем выполните следующий сценарий: отправьте из тестовой задачи start-, success- и failure-пинги, пропустите запланированный ping и получите оповещение о невыполненной задаче. Такое разделение намеренно: Dockup устраняет повторяющуюся настройку инфраструктуры, но не делает вид, что роли приложения, credentials провайдеров или политика восстановления выбираются автоматически.

Часто задаваемые вопросы

Что требуется Healthchecks для production-развёртывания?

Направьте контейнер Healthchecks через один HTTPS-origin на порт 8000. Сетевые требования для вспомогательных компонентов — Postgres и рабочая доставка email для production-оповещений. Не объявляйте Healthchecks готовым, пока не сможете отправить из тестовой задачи start-, success- и failure-пинги, затем пропустить запланированный ping и получить оповещение о невыполненной задаче.

Какие данные Healthchecks нужно включать в резервную копию?

Стандартному image Healthchecks не требуется mount для данных приложения. Сохраните конфигурацию развёртывания и отдельно создавайте резервные копии подключённого состояния; восстановление считается успешным, когда возвращаются checks, schedules, integrations и ping keys, а намеренно пропущенный ping вызывает ожидаемое оповещение.

Требуется ли Healthchecks HTTPS за reverse proxy?

Используйте HTTPS для публичного origin Healthchecks, а порт 8000 оставьте во внутреннем маршруте. Правильно задайте настройку Healthchecks: укажите в SITE_ROOT и ALLOWED_HOSTS внешний HTTPS-адрес. Для Healthchecks HTTPS защищает credentials и содержимое пользователей при передаче и обеспечивает согласованное поведение клиентов, зависящее от origin.

Как тестировать обновление Healthchecks?

Восстановите текущее состояние Healthchecks в изолированном развёртывании, примените candidate-версию и повторите acceptance-транзакцию. Уделите этому особое внимание: application migrations и конфигурацию workers нужно обновлять вместе, чтобы web-страница не скрывала сломанную доставку оповещений. Храните предыдущий image Healthchecks, пока не будут понятны границы миграции данных и rollback.