---
work_item: ORCH-009
stage: architecture
author_agent: architect
status: proposed
created_at: 2026-06-10
model_used: claude-opus-4-8
---

# 07 — Инфра-требования: ORCH-009 — Turnkey-онбординг проектов

Work Item: **ORCH-009** · Repo: **orchestrator** · Стадия: architecture

> Топология оркестратора **не меняется** (NFR-1/NFR-2: `src/**` и compose не трогаются).
> Файл фиксирует **предусловия исполнения способности** (токены/доступы/контуры) и инфра-границы
> операторского скрипта. Детали решений — `06-adr/ADR-001-turnkey-onboarding-kit-and-cli.md`.

## I-1. Топология / окружения

- **Прод (`orchestrator`, 8500):** не затрагивается. Скрипт не создаёт/не останавливает/не
  рестартит контейнеры; в общую БД не пишет (читает только файлы чекаута и внешние API).
- **Staging (`orchestrator-staging`, 8501, БД `./data/staging`):** контур smoke-прогона (ADR D8).
  Регистрация sandbox-проекта — в `.env.staging`; рестарт staging — штатный, свободный
  (прод-инвариант на него не распространяется).
- **Новые внешние сущности** (создаются скриптом в `apply`): Plane-проект, Gitea-репо +
  per-repo webhook. Аддитивно: существующие проекты/репо не модифицируются (BR-9).
- **Запуск скрипта:** хост mva154, из корня чекаута репо orchestrator. Среда исполнения —
  venv с `requirements.txt` (httpx уже в зависимостях; новых pip-зависимостей нет) **или**
  `docker compose exec orchestrator python scripts/onboard_project.py …` (read-only к рантайму,
  без рестартов). Канонический способ фиксирует runbook `docs/operations/ONBOARDING.md`.

## I-2. Переменные окружения / секреты

**Новых env-переменных не вводится.** Используются существующие (предусловия запуска):

| Переменная | Роль в онбординге |
|---|---|
| `ORCH_PLANE_API_TOKEN` (+ `ORCH_PLANE_API_URL`, `ORCH_PLANE_WORKSPACE_SLUG`) | создание/чтение Plane-проекта, статусов, лейблов; токен с правом создания проектов в workspace |
| `ORCH_GITEA_TOKEN` (+ Gitea base URL) | создание репо (под `{{GITEA_OWNER}}`), per-repo webhook; токен с правом create-repo + hooks |
| `ORCH_GITEA_WEBHOOK_SECRET` | **переиспользуется** для webhook нового репо (приёмник валидирует один глобальный секрет, ADR D6); отсутствует → скрипт генерит и печатает оператору для `.env` |
| `ORCH_PROJECTS_JSON` | источник существующих записей для merged-вывода (ADR D7); **применение новой строки — операторский шаг** |

- Секреты — только в `.env`/`.env.staging` на хосте, в гит не попадают (правило #8 CLAUDE.md);
  в логах/отчётах скрипта секреты маскируются (NFR-3).
- Kit несёт собственный `.env.example` нового проекта (дескрипторы без значений) — канон секретов
  транслируется в онбордируемые репо.

## I-3. Деплой / рестарт

- **Скрипт НИКОГДА не рестартит/не останавливает прод-контейнер** (NFR-2, self-hosting инвариант).
- Регистрация проекта в реестре (Ф-3): правка `.env` (строка `ORCH_PROJECTS_JSON` из отчёта
  скрипта) + **управляемый операторский рестарт** оркестратора — групповое окно для ВСЕХ проектов
  общего инстанса; runbook помечает шаг self-hosting-предупреждением и командой проверки
  (`GET /queue`, резолв статусов нового проекта).
- TTL-self-heal статусов Plane (ORCH-068, 300с) рестарта не требует: статусы/лейблы, созданные
  после регистрации, подхватываются без вмешательства.
- Деплой самой задачи ORCH-009 — штатный конвейер: изменение docs/scripts/tests-only, образ
  пересобирается стандартно, staging-гейт (8501) обязателен как обычно.

## I-4. CI/CD

- `.gitea/workflows/` — **без изменений**: новые тесты (`tests/test_onboarding_kit.py`,
  `test_onboarding_script.py`, `test_onboarding_invariants.py`) подхватываются существующим
  pytest-шагом; все детерминированы, без сети (NFR-5).
- Инфра-предусловий в образе нет: скрипт — операторский CLI вне рантайма, в образ ничего
  дополнительно не запекается.
