# 07 — Требования к инфраструктуре (ORCH-065) ## Топология **Без изменений.** Новых контейнеров, портов, сетевых сервисов, внешних зависимостей нет. Job-reaper — ещё один фоновый daemon-поток ВНУТРИ существующего процесса оркестратора (как `queue_worker` и `reconciler`), стартует/останавливается в `main.lifespan`. Деплой/рестарт прод-контейнера в рамках задачи НЕ требуется и ЗАПРЕЩЁН (self-hosting safety) — выкатка через штатный `deploy-staging → deploy`. ## Допущение pid-namespace (важно для liveness-детекции) - Агент запускается как `subprocess.Popen(["bash","-c",cmd])` — **дочерний процесс оркестратора в ТОМ ЖЕ pid-namespace** (один контейнер). Значит `os.kill(jobs.pid, 0)` корректно отражает liveness агента, пока жив сам оркестратор. Это инвариант текущей упаковки (один контейнер на инстанс). - Lease пишет `pid = os.getpid()` — pid ПРОЦЕССА ОРКЕСТРАТОРА. После рестарта контейнера старый pid мёртв → детектируется. Риск переиспользования номера pid новым процессом закрыт условием «pid мёртв **ИЛИ** TTL истёк»: TTL добивает lease в любом случае (контракт ORCH-043 сохранён). - **Если в будущем агенты переедут в отдельные контейнеры/namespace** — Tier-1 pid-liveness станет ненадёжной; тогда полагаемся на Tier-2 (exit_code) и Tier-3 (потолок `reaper_max_running_s`). Зафиксировано в 10-tech-risks. ## Поведение при self-restart (ORCH-36 executable self-deploy) Self-restart прод-контейнера во время `deploy` — ровно тот сценарий, что плодит зомби: monitor-поток умирает вместе со старым контейнером. После рестарта: 1. стартовый `requeue_running_jobs()` + стартовый `reclaim_stale_lease` чистят состояние, оставшееся от убитого процесса; 2. периодический reaper добивает то, что возникнет позже без рестарта. Reaper/lease-reclaim сами НИКОГДА не рестартят и не роняют прод-контейнер и не делают git-push в `main` (AC-12). ## Эксплуатационные ручки (env, хост `.env`/`.env.staging`) `ORCH_REAPER_ENABLED`, `ORCH_REAPER_INTERVAL_S`, `ORCH_REAPER_DEAD_TICKS`, `ORCH_REAPER_MAX_RUNNING_S`, `ORCH_LEASE_RECLAIM_ENABLED`; переиспользуются `ORCH_MERGE_LOCK_TIMEOUT_S`, `ORCH_MERGE_GATE_REPOS`. Все флаги документируются в `.env.example` (developer-стадия). Полное отключение (`false`) → строго прежнее поведение. ## Документация эксплуатации `docs/operations/INFRA.md` — добавить (best-effort, developer/PR) короткое упоминание поведения reaper/lease-reclaim при self-restart. Топологическая карта INFRA.md не меняется.