--- work_item: ORCH-103 stage: architecture author_agent: architect status: proposed created_at: 2026-06-11 model_used: claude-opus-4-8 --- # 07 — Инфра-требования: ORCH-103 — Bundled-тираж: весь стек одним комплектом + bootstrap Work Item: **ORCH-103** · Repo: **orchestrator** · Стадия: architecture > Вся инфраструктура этой задачи — **ЦЕЛЕВОЙ хост заказчика** (и одноразовый тестовый хост/VM > приёмки). Инфраструктура НАШЕГО прод-контура (mva154) не затрагивается ни одним пунктом: > артефакты bundle в нашем контуре инертны (NFR-2, паттерн ORCH-009). ## I-1. Топология / окружения **Наш контур: N/A** (корневой `docker-compose.yml`, прод 8500, staging 8501 — байт-в-байт). **Целевой хост bundle (нормативно, ADR-001 D1/D3/D4):** - Один Linux x86_64 хост, docker + docker compose v2, sudo у оператора. Compose-проект **`orchestrator-bundle`** (`deploy/bundled/docker-compose.yml`), одна именованная bridge-сеть. - Состав: `orchestrator` (build из корневого `Dockerfile`), `orchestrator-watchdog` (build из `watchdog/Dockerfile`), `gitea` (пиннованный `gitea/gitea`), Plane CE-стек — зеркало upstream selfhost-référence (≈13–14 сервисов: web/space/admin/api/worker/beat-worker/ migrator/live + postgres/redis/mq/minio/proxy; точные теги пиннит developer по проверенному стенду). Staging-контур орка отсутствует. - **Карта портов (дефолты; конфигурируемы в `deploy/bundled/.env.example`):** `${BUNDLE_ORCH_PORT:-8500}` — API орка (smoke/health), `${BUNDLE_PLANE_PORT:-8080}` — Plane proxy (UI), `${BUNDLE_GITEA_HTTP_PORT:-3000}` — Gitea web. Postgres/redis/mq/minio/ssh-Gitea — **наружу не публикуются**. Машинный трафик (webhooks в обе стороны, API, git, /metrics) — внутрисетевой сервис-DNS. - **Хранилище:** состояние Plane/Gitea — именованные тома `orchestrator-bundle_*`; данные орка — bind `deploy/bundled/data`; репозитории агентов — bind `deploy/bundled/repos` (владелец — uid оператора = `ORCH_RUN_UID`, инвариант ORCH-040). - **Ресурсы (предусловие, гипотеза BRD §6 — финальные цифры по замеру на приёмке, AC-4):** ориентир ≥ 4 vCPU / 8 GB RAM / 40 GB диска; preflight bootstrap проверяет и отказывает до любых мутаций (BR-7). ## I-2. Переменные окружения / секреты - **Новый канон:** `deploy/bundled/.env.example` (bundle-инфра: `BUNDLE_PUBLIC_HOST`, карта портов, реюз `ORCH_RUN_UID/GID`/`ORCH_DOCKER_GID`/`ORCH_AGENT_HOME_DIR`/`ORCH_HOST_CLAUDE_*`, плейсхолдеры внутренних кред Plane/Gitea по upstream-именам). Live-файлы только на целевом хосте, права 600: `deploy/bundled/.env`, корневые `.env`/`.env.watchdog` (каноны Lite 1:1). - **Корневой `.env.example` НЕ меняется** (bundle не вводит новых ключей `Settings`); в `.gitignore` добавляется `deploy/bundled/repos/` (остальные live-файлы уже покрыты неякорными `.env`/`data/`/`.env.watchdog`). - **Секреты (FR-3):** webhook-секреты — `gen_secrets.py`; внутренние креды стека (postgres/ redis/mq/minio/SECRET_KEY Plane, админ Gitea) — stdlib `secrets` в bootstrap; внешние предусловия заказчика — Claude CLI/Anthropic-доступ (обязателен для конвейера), Telegram-токены (опциональны). В репо и логах bootstrap секретов нет (NFR-3, тест-эвристика). ## I-3. Деплой / рестарт - **Наш прод: рестарт НЕ требуется и НЕ выполняется.** Задача — docs+scripts+compose+tests; мерж в `main` ничего не активирует в нашем контуре (никто не исполняет bundle-артефакты; kill-switch не нужен — паттерн ORCH-009). Self-hosting инвариант соблюдён по построению. - На целевом хосте пересоздание контейнеров орка/watchdog после сборки env — штатный шаг bootstrap (D5 шаг 8); к нашему проду отношения не имеет. ## I-4. CI/CD - `.gitea/workflows/**` — **без изменений**; три новых структурных тест-модуля подхватываются существующим `pytest tests/ -q` (без docker/сети/LLM — CI-безопасны, TC-12). ## I-5. Разовое предусловие приёмки (человек) Чистый тестовый Linux-хост/VM (ресурсы I-1) для ручной приёмки AC-1/AC-2/AC-3/AC-8 по `BUNDLED_SETUP.md` + замер фактических минимумов RAM/диск/CPU для §2 дока (AC-4: цифры «не с потолка»). На нашем боевом хосте bundle не запускается ни в каком виде (BRD §2.2).