🩺 Docker Health Checks
Health checks позволяют Docker определить, жив ли сервис. Это критично дляdepends_on сcondition: service_healthyи для автоматического восстановления при падениях.
Сервисы с Health Checks
🔄 Как работает Health Check
Как часто проверять (default: 30s)
Макс. время на проверку (default: 30s)
Попыток до unhealthy (default: 3)
Грейс-период при старте (default: 0s)
📋 Конфигурация по сервисам
healthcheck: test: ["CMD-SHELL", "pg_isready -U clowbot -d clowbot"] interval: 10s timeout: 5s retries: 5 start_period: 10s
pg_isready — стандартная утилита PostgreSQL для проверки подключения. Быстрая и надёжная. Бот ждёт healthy перед запуском.
healthcheck: test: ["CMD-SHELL", "ollama list >/dev/null 2>&1"] interval: 20s timeout: 8s retries: 10 start_period: 60s
Почему retries=10 и start_period=60s?
- Ollama грузит модель в память при первом запуске
- Модель phi4-mini занимает ~2GB RAM
- На медленных дисках загрузка может занять 30-60 секунд
- retries=10 × interval=20s = 200s макс. время до unhealthy
healthcheck: test: ["CMD-SHELL", "curl -sf http://localhost:4444/wd/hub/status || exit 1"] interval: 15s timeout: 5s retries: 5 start_period: 30s
Проверяет Selenium Grid status endpoint. Chromium внутри должен быть готов к работе.
{
"value": {
"ready": true,
"message": "Selenium Grid ready."
}
}healthcheck: test: ["CMD", "curl", "-sf", "http://localhost:9000/"] interval: 30s timeout: 10s retries: 5 start_period: 120s
Почему start_period=120s?
- Whisper грузит модель при старте (whisper-base ~150MB)
- На CPU первая загрузка может занять 1-2 минуты
- На GPU — значительно быстрее (~10-20 секунд)
healthcheck: test: ["CMD", "curl", "-sf", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 20s
{
"status": "healthy",
"postgres": "ok",
"telegram_polling": "active",
"version": "1.0.0"
}healthcheck: test: ["CMD-SHELL", "wget -q --spider http://localhost:5678/ || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 30s
n8n не имеет специального health endpoint, поэтому проверяем корневой путь.
🔗 depends_on с condition
Health checks позволяют запускать сервисы в правильном порядке:
services:
bot:
depends_on:
postgres:
condition: service_healthy
ollama:
condition: service_healthy
# bot не запустится пока postgres и ollama не станут healthy
n8n:
depends_on:
postgres:
condition: service_healthy
# n8n ждёт только postgresБот стартует только когда БД готова принимать соединения.
Бот может стартовать до БД → ошибки подключения при старте.
🔄 Restart Policies
Все сервисы используют:
restart: unless-stopped
Перезапускать всегда, кроме явной остановки. Рекомендуется.
Перезапускать всегда, даже после docker stop (при перезагрузке host)
Только при ошибке (exit code != 0)
Не перезапускать (default)
# restart_policy с лимитами restart: name: unless-stopped max_retry_count: 5 # После 5 рестартов остановить попытки
🔍 Проверка health статуса
docker compose psПоказывает статус всех сервисов (healthy / unhealthy / starting)
docker inspect --format={{.State.Health.Status}} postgresТочный статус конкретного контейнера
docker inspect postgres | jq '.[0].State.Health'Полная информация о health check (последние проверки, ошибки)
docker events --filter 'event=health_status'Мониторинг изменений статуса в реальном времени
🔧 Troubleshooting
Сервис unhealthy
- Проверить логи:
docker compose logs postgres - Выполнить health check вручную:
docker exec postgres pg_isready - Проверить ресурсы (CPU/RAM) — возможно таймаут из-за нехватки
- Увеличить retries или timeout если сервис медленный
- Проверить start_period — возможно сервису нужно больше времени
Сервис постоянно restarting
• Проверить docker compose logs --tail=100 service
• Возможно приложение падает сразу после старта
• Проверить конфигурацию (env vars, volumes, ports)
• Проверить зависимости (БД, внешние API)
Health check работает, но сервис не отвечает
• Health check может быть слишком простой (проверяет только процесс)
• Добавить проверку реальной функциональности
• Например: не просто curl /, а curl /health с проверкой зависимостей
✅ Best Practices
Рекомендуется
- Использовать start_period для медленных сервисов
- Проверять реальную функциональность, не только процесс
- Устанавливать разумный timeout (5-10s)
- Логировать ошибки health check в приложении
- Использовать unless-stopped для production
Избегать
- Слишком частые проверки (interval < 5s)
- Слишком короткий timeout (< 3s)
- Слишком много retries без start_period
- Проверки, которые нагружают сервис
- restart: always для development