--- work_item: ORCH-057 stage: architecture author_agent: architect status: proposed created_at: 2026-06-10 model_used: claude-opus-4-8 --- # 07 — Инфра-требования: ORCH-057 — нормализация legacy root-owned файлов при миграции на uid 1000 Work Item: **ORCH-057** · Repo: **orchestrator** · Стадия: architecture > When-applicable. Топология контейнеров **не меняется** (init-контейнер/правка `docker-compose.yml` > отвергнуты — ADR-001 D4). Файл фиксирует новые env-флаги и **обязательную операторскую процедуру** > нормализации legacy root-файлов как шаг миграции uid. ## I-1. Топология / окружения **Без изменений.** Контейнеры `orchestrator` (8500) / `orchestrator-staging` (8501), `user: "1000:1000"`, bind-mount `/home/slin/repos → /repos`, `network_mode: host` — как есть. Init-контейнер / root-entrypoint **сознательно НЕ вводятся** (реинтродуцировали бы root-контекст, убранный ORCH-040, и потребовали бы self-deploy compose с групповым риском — ADR-001 D4, Альтернативы). ## I-2. Переменные окружения / секреты Новые env-флаги (аддитивно в `src/config.py`, дефолты сохраняют поведение до ORCH-057). Добавить в `.env.example` (секретов нет): | Env | Дефолт | Назначение | |-----|--------|------------| | `ORCH_FS_NORMALIZE_ENABLED` | `true` | kill-switch всего слоя ORCH-057 | | `ORCH_FS_NORMALIZE_REPOS` | `` (пусто) | scope CSV; пусто → self-hosting only (enduro не затронут) | | `ORCH_FS_TARGET_UID` | `1000` | целевой uid (фолбэк к `os.getuid()`) | | `ORCH_FS_NORMALIZE_AUTO` | `false` | детект-only; `true` → попытка chown при наличии CAP_CHOWN | | `ORCH_FS_SCAN_ROOTS` | `` (пусто) | CSV-переопределение корней обхода | | `ORCH_FS_SCAN_CACHE_TTL_S` | `300` | TTL детект-кэша | Секреты не вводятся. ## I-3. Деплой / рестарт - **Self-hosting инвариант (NFR-1):** код задачи **не** рестартит/не роняет прод-контейнер `orchestrator`, не трогает `main`/force-push/прод-образ. `chown` из кода возможен лишь при наличии прав (под uid 1000 — no-op). - Изменение **только** `src/**` + docs → штатный деплой self **через staging-гейт (8501)**, затем прод-рестарт **в окно тишины** (`GET /status` без активных задач). Правки `docker-compose.yml`/ entrypoint в задаче **нет** → нет дополнительного инфра-риска сверх обычного self-деплоя. - **Обязательная операторская процедура нормализации (host-prerequisite миграции uid)** — выполняется **под root на хосте mva154 один раз** при миграции uid / на новой среде, ПЕРЕД стартом app. Каноничный текст — в `docs/operations/INFRA.md` (раздел «Миграция uid: обязательная нормализация legacy root-файлов»). Команды покрывают все корни: ``` sudo chown -R 1000:1000 /home/slin/repos/_wt sudo chown -R 1000:1000 /home/slin/repos/orchestrator/.git \ /home/slin/repos/enduro-trails/.git sudo chown -R 1000:1000 /home/slin/repos/orchestrator # incl. data/runs/*.log # Проверка: find /home/slin/repos/_wt ! -uid 1000 -print -quit (пусто = ок) ``` Идемпотентна (повтор на корректной среде — no-op). Помечена обязательным пунктом чеклиста деплоя/миграции self. ## I-4. CI/CD Без изменений в `.gitea/workflows/`. Новые юнит-тесты (`tests/test_fs_normalize.py`, `tests/test_git_worktree_perm_error.py` — см. `04-test-plan.yaml`) гоняются существующим `pytest tests/ -q`. Новых системных зависимостей образа нет.