infra: добавить health check endpoints в Bot и Web #58

Closed
opened 2026-05-12 13:25:48 +03:00 by Toutsu · 1 comment
Owner

Проблема

Ни GmRelay.Bot, ни GmRelay.Web не экспонируют endpoint /health (или аналогичный TCP/HTTP probe). Docker Compose не может определить, что сервис упал, и не перезапустит контейнер автоматически. При падении бота пользователи не получат уведомлений, а Web Dashboard станет недоступен без алертинга.

Критичность

  • Невозможна автоматическая реакция на сбои (restart policy бесполезен без health check).
  • Нет возможности настроить внешний мониторинг (Uptime Kuma, Pingdom и т.д.).

Предлагаемое решение

Web (GmRelay.Web)

  • Добавить middleware /health200 OK + JSON { "status": "healthy", "timestamp": "..." }.
  • Дополнительно проверять доступность PostgreSQL ( readiness probe ): если БД недоступна — 503.

Bot (GmRelay.Bot)

  • Добавить встроенный lightweight HTTP-сервер (например, HttpListener или ASP.NET Core minimal API) на отдельном порту (например, 8081).
  • Endpoint /health возвращает 200, если бот запущен и Webhook/Long-polling активен.

compose.yaml

  • Добавить healthcheck секции для bot и web сервисов с interval, timeout, retries.

Критерии приёмки

  • curl http://localhost:8080/health (Web) возвращает 200 и JSON.
  • curl http://localhost:8081/health (Bot) возвращает 200.
  • docker compose ps показывает статус healthy для обоих сервисов.
  • При отключении PostgreSQL Web возвращает 503 на /health.

Связь

Этап: Подготовка к production

## Проблема Ни `GmRelay.Bot`, ни `GmRelay.Web` не экспонируют endpoint `/health` (или аналогичный TCP/HTTP probe). Docker Compose не может определить, что сервис упал, и не перезапустит контейнер автоматически. При падении бота пользователи не получат уведомлений, а Web Dashboard станет недоступен без алертинга. ## Критичность - Невозможна автоматическая реакция на сбои (restart policy бесполезен без health check). - Нет возможности настроить внешний мониторинг (Uptime Kuma, Pingdom и т.д.). ## Предлагаемое решение ### Web (`GmRelay.Web`) - Добавить middleware `/health` → `200 OK` + JSON `{ "status": "healthy", "timestamp": "..." }`. - Дополнительно проверять доступность PostgreSQL ( readiness probe ): если БД недоступна — `503`. ### Bot (`GmRelay.Bot`) - Добавить встроенный lightweight HTTP-сервер (например, `HttpListener` или ASP.NET Core minimal API) на отдельном порту (например, `8081`). - Endpoint `/health` возвращает `200`, если бот запущен и Webhook/Long-polling активен. ### `compose.yaml` - Добавить `healthcheck` секции для `bot` и `web` сервисов с `interval`, `timeout`, `retries`. ## Критерии приёмки - [ ] `curl http://localhost:8080/health` (Web) возвращает 200 и JSON. - [ ] `curl http://localhost:8081/health` (Bot) возвращает 200. - [ ] `docker compose ps` показывает статус `healthy` для обоих сервисов. - [ ] При отключении PostgreSQL Web возвращает 503 на `/health`. ## Связь Этап: **Подготовка к production**
Toutsu added this to the Подготовка к production milestone 2026-05-12 13:25:48 +03:00
Toutsu added the priority:p0 label 2026-05-12 13:25:48 +03:00
Author
Owner

Реализовано в PR #63 и выпущено в v2.0.0.

Итоговый вариант согласован с PR #79: вместо отдельного 1.16.0 health checks вошли в общий релиз 2.0.0 на merge-коммите 7cecb72.

Проверки:

  • PR #63 after version reconciliation: Gitea Actions run #183 — success
  • deploy main: Gitea Actions run #182 — success
Реализовано в PR #63 и выпущено в [v2.0.0](https://git.codeanddice.ru/Toutsu/GmRelayBot/releases/tag/v2.0.0). Итоговый вариант согласован с PR #79: вместо отдельного `1.16.0` health checks вошли в общий релиз `2.0.0` на merge-коммите `7cecb72`. Проверки: - PR #63 after version reconciliation: Gitea Actions run #183 — success - deploy `main`: Gitea Actions run #182 — success
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Toutsu/GmRelayBot#58