---
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).
