Стадия 6 — лёгкий /ping и починка healthcheck (docker-compose) #6

Closed
opened 2026-07-05 04:03:03 +03:00 by agent_vscode · 0 comments
Collaborator

Цель

Healthcheck не должен зависеть от Telegram RPC и обхода ФС: текущий healthcheck сам провоцирует рестарты контейнера и флаки статики.

Полный план: plans/2026-07-05-stability-fix-plan.md

Контекст (что чиним)

  • Текущий healthcheck (dockercompose.yml:50-56) — curl /rss/vvzvlad_lytdybr?limit=1 с timeout 5с: на холодном кэше генерация легко > 5с (throttle 500мс × N + TG-латентность) → autoheal рестартует контейнер посреди докачек → битые temp-файлы больших видео → флаки статики. Замкнутый круг.
  • /health дергает get_me() и полный os.walk кэша — тяжёлый и зависает вместе с TG-сессией.

Задачи

  • Новый эндпоинт /ping: без токена, без TG RPC, без os.walk. Отдаёт is_connected + возраст последнего успешного watchdog-probe → 200 если жив, 503 если degraded (не connected И последний успешный probe старше interval × failures)
  • В TelegramClient — публичный метод watchdog_last_ok_age() (возраст _wd_last_ok_monotonic, None если probe ещё не было)
  • dockercompose.yml (пример в репо): healthcheck → curl -sf http://127.0.0.1:80/ping, interval 5m, timeout 5s
  • Отметить в отчёте деплоя: прод-компоуз (вне репозитория) обновить руками

Где не наебаться

  • /ping НЕ должен дёргать get_me() — иначе вернули ту же проблему (зависание healthcheck вместе с TG-сессией) через другую дверь. Живость TG — работа вотчдога, /ping только читает его счётчики.
  • Не оставить старый URL /rss/... в прод-healthcheck после выката.
  • Сразу после старта приложения probe ещё не было (age is None) — это НЕ degraded, иначе контейнер зациклится на рестартах при старте (start_period учитывать).

DoD

Во время зависшего TG RPC /ping отвечает мгновенно (503 degraded, но процесс жив); контейнер не рестартится из-за медленной генерации фида.

Зависимости: формально нет; максимум пользы после стадий 1–2. /ping используется в DoD стадии 4.

## Цель Healthcheck не должен зависеть от Telegram RPC и обхода ФС: текущий healthcheck сам провоцирует рестарты контейнера и флаки статики. Полный план: [plans/2026-07-05-stability-fix-plan.md](https://gitea.vvzvlad.xyz/vvzvlad/pyrogram-bridge/src/branch/fix/stability/plans/2026-07-05-stability-fix-plan.md) ## Контекст (что чиним) - Текущий healthcheck (dockercompose.yml:50-56) — `curl /rss/vvzvlad_lytdybr?limit=1` с timeout 5с: на холодном кэше генерация легко > 5с (throttle 500мс × N + TG-латентность) → autoheal рестартует контейнер **посреди докачек** → битые temp-файлы больших видео → флаки статики. Замкнутый круг. - `/health` дергает `get_me()` и полный `os.walk` кэша — тяжёлый и зависает вместе с TG-сессией. ## Задачи - [ ] Новый эндпоинт `/ping`: без токена, без TG RPC, без os.walk. Отдаёт `is_connected` + возраст последнего успешного watchdog-probe → 200 если жив, 503 если degraded (не connected И последний успешный probe старше `interval × failures`) - [ ] В `TelegramClient` — публичный метод `watchdog_last_ok_age()` (возраст `_wd_last_ok_monotonic`, None если probe ещё не было) - [ ] dockercompose.yml (пример в репо): healthcheck → `curl -sf http://127.0.0.1:80/ping`, interval 5m, timeout 5s - [ ] Отметить в отчёте деплоя: прод-компоуз (вне репозитория) обновить руками ## Где не наебаться - `/ping` НЕ должен дёргать `get_me()` — иначе вернули ту же проблему (зависание healthcheck вместе с TG-сессией) через другую дверь. Живость TG — работа вотчдога, `/ping` только читает его счётчики. - Не оставить старый URL `/rss/...` в прод-healthcheck после выката. - Сразу после старта приложения probe ещё не было (`age is None`) — это НЕ degraded, иначе контейнер зациклится на рестартах при старте (start_period учитывать). ## DoD Во время зависшего TG RPC `/ping` отвечает мгновенно (503 degraded, но процесс жив); контейнер не рестартится из-за медленной генерации фида. **Зависимости**: формально нет; максимум пользы после стадий 1–2. `/ping` используется в DoD стадии 4.
Sign in to join this conversation.