[P1] Observability: off-box uptime-probe + fail health-check на dead backend + mem-лимиты + log-rotation #2214

Open
opened 2026-07-02 19:18:56 +00:00 by lekss361 · 1 comment
Owner

Эпик: #2200

Находки (Ops, High + Medium, verified):

  • Health-check деплоя декоративен: deploy-tradein.yml:427-431 цикл кончается sleep 1 (exit 0) — после 30 фейлов скрипт продолжает и пишет success-маркер. Мёртвый бэкенд помечается задеплоенным.
  • Uptime-kuma определён (docker-compose.uptime.yml), но не запущен (0 контейнеров); gendesign-couchdb «unhealthy» 6 недель — никто не смотрит. Единственный монитор (GlitchTip) на той же коробке → полная авария тиха by construction.
  • Нет mem-лимитов на backend/scraper/postgres/frontend (коробка в свопе 2927/4095М) → OOM-killer может убить сосед-postgres.
  • Нет docker log-rotation (нет daemon.json, logopts пустые) → unbounded рост логов на общем диске.

Acceptance:

  • Health-check реально валит деплой при dead backend (проверка кода после цикла).
  • Внешний (off-box) uptime-probe на публичные эндпоинты Меры + алерт.
  • mem_limit на tradein backend/scraper/postgres/frontend.
  • logging: (json-file max-size/max-file) или daemon.json log-rotation.

Scope: .forgejo/workflows/deploy-tradein.yml, docker-compose.prod.yml, ops/. часть needs-human (внешний хост для probe).

Эпик: #2200 **Находки (Ops, High + Medium, verified):** - Health-check деплоя декоративен: `deploy-tradein.yml:427-431` цикл кончается `sleep 1` (exit 0) — после 30 фейлов скрипт продолжает и пишет success-маркер. Мёртвый бэкенд помечается задеплоенным. - Uptime-kuma определён (`docker-compose.uptime.yml`), но не запущен (0 контейнеров); gendesign-couchdb «unhealthy» 6 недель — никто не смотрит. Единственный монитор (GlitchTip) на той же коробке → полная авария тиха by construction. - Нет mem-лимитов на backend/scraper/postgres/frontend (коробка в свопе 2927/4095М) → OOM-killer может убить сосед-postgres. - Нет docker log-rotation (нет daemon.json, logopts пустые) → unbounded рост логов на общем диске. **Acceptance:** - [ ] Health-check реально валит деплой при dead backend (проверка кода после цикла). - [ ] Внешний (off-box) uptime-probe на публичные эндпоинты Меры + алерт. - [ ] mem_limit на tradein backend/scraper/postgres/frontend. - [ ] `logging:` (json-file max-size/max-file) или daemon.json log-rotation. Scope: `.forgejo/workflows/deploy-tradein.yml`, `docker-compose.prod.yml`, `ops/`. _часть needs-human (внешний хост для probe)._
lekss361 added the
observability
priority/p1
scope/devops
tradein
labels 2026-07-02 19:20:25 +00:00
Author
Owner

Bot-часть выполнена и верифицирована на проде (2026-07-03 06:06 UTC), PR #2231 задеплоен.

Проверка docker inspect на проде — mem-лимиты применены ко всем tradein-контейнерам:

Контейнер Memory Memswap
tradein-postgres 3g (healthcheck pg_isready добавлен, статус healthy) = mem
tradein-backend 768m = mem
tradein-browser 2560m 3g
tradein-frontend 384m = mem
tradein-scraper 640m = mem (запрет свапа)

Нюанс: scraper получил лимит только с деплоем #2253 (06:03 UTC) — деплой #2231 (21:32) его намеренно не пересоздавал: deploy-workflow не трогает scraper на не-scraper изменениях (#1182, чтобы не убивать бегущий sweep). Перед пересозданием проверено: активных scrape_runs не было.

Health-check, log-rotation, fail-on-dead-backend — в составе #2231 (смержен, задеплоен, backend health 200).

Остаётся (needs-human): off-box uptime-probe — внешний мониторинг с машины вне Beget VPS (UptimeRobot/healthchecks.io или cron с другого хоста). Бот с VPS это не провижионит. Issue оставляю open до настройки.

**Bot-часть выполнена и верифицирована на проде (2026-07-03 06:06 UTC), PR #2231 задеплоен.** Проверка `docker inspect` на проде — mem-лимиты применены ко всем tradein-контейнерам: | Контейнер | Memory | Memswap | |---|---|---| | tradein-postgres | 3g (healthcheck `pg_isready` добавлен, статус healthy) | = mem | | tradein-backend | 768m | = mem | | tradein-browser | 2560m | 3g | | tradein-frontend | 384m | = mem | | tradein-scraper | 640m | = mem (запрет свапа) | Нюанс: scraper получил лимит только с деплоем #2253 (06:03 UTC) — деплой #2231 (21:32) его намеренно не пересоздавал: deploy-workflow не трогает scraper на не-scraper изменениях (#1182, чтобы не убивать бегущий sweep). Перед пересозданием проверено: активных scrape_runs не было. Health-check, log-rotation, fail-on-dead-backend — в составе #2231 (смержен, задеплоен, backend health 200). **Остаётся (needs-human): off-box uptime-probe** — внешний мониторинг с машины вне Beget VPS (UptimeRobot/healthchecks.io или cron с другого хоста). Бот с VPS это не провижионит. Issue оставляю open до настройки.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2214
No description provided.