Forward-fix после incident May 14 (см. vault events/Incident_Prod_Down_May14_2026). PR #117 был полностью reverted PR #119 (Caddy depends_on frontend: service_healthy + failing wget --spider / → Caddy не стартовал → vsё прод down ~25 мин). Этот PR делает то же что планировал #117, но корректно: ### Frontend healthcheck — TCP probe через node (НЕ HTTP) ```yaml test: ["CMD", "node", "-e", "require('net').createConnection({port:3000,host:'127.0.0.1'}) .once('connect',function(){process.exit(0)}) .once('error',function(){process.exit(1)})"] start_period: 60s retries: 6 interval: 15s ``` - НЕ зависит от HTTP status (200/404/308 — все OK если порт слушает) - `node` гарантированно в alpine image (запускает server.js) - `127.0.0.1` — никакой DNS ambiguity (busybox alpine localhost IPv6 vs IPv4) - 60s + 6×15s = 150s window — с запасом на Next.js standalone cold start ### Caddy depends_on — backend healthy, frontend started (НЕ healthy) ```yaml caddy: depends_on: backend: { condition: service_healthy } # backend имеет /health endpoint frontend: { condition: service_started } # safety net — НЕ блокирует Caddy ``` Lesson from incident: frontend health flaky (Next.js cold start variable). Strict service_healthy для frontend → одна misconfig = full outage обоих доменов (gendsgn.ru + obsidian.gendsgn.ru через тот же Caddy на shared network). ### backend/worker/beat redis: service_started → service_healthy Redis уже имеет `redis-cli ping` healthcheck. Tightening безопасно — был artifact pre-healthcheck Redis. ### Pin rosreestr2coord>=5.0.0 (lock уже 5.3.3) v5 убрала delay параметр; код адаптирован (rate limit на worker уровне). Защита от silent downgrade при `uv lock --upgrade`. ### Что НЕ повторено из #117 - Caddy depends_on frontend: service_healthy — заменено на service_started - wget --spider / — заменено на node TCP probe ### Vault обновлён - `events/Incident_Prod_Down_May14_2026.md` — постмортем + timeline + lessons - Update Changelog в `domains/infra/infra-MOC.md` (если есть) Closes incident. Re-applies #117 goals safely. |
||
|---|---|---|
| .. | ||
| alembic | ||
| app | ||
| db/init | ||
| output | ||
| tests | ||
| .dockerignore | ||
| .env.example | ||
| .env.runtime.example | ||
| alembic.ini | ||
| debug.log | ||
| Dockerfile | ||
| pyproject.toml | ||
| uv.lock | ||