feat(scripts): interactive Lite-installer setup_lite.py (ORCH-104)
Единый операторский CLI scripts/setup_lite.py — исполняемый инструмент Lite-тиража поверх документа-канона docs/deployment/LITE_SETUP.md (ORCH-102). Автоматизирует маршрут §2–§12: скан предусловий хоста с офером доустановки → discovery docker-инсталляций Plane/Gitea → интерактивный сбор обязательных ключей с немедленной верификацией → автодетект хост-параметров и когерентность портов → сборка .env/.env.watchdog от канонов → webhook Plane → guard-ы Gitea → подъём ровно orchestrator+orchestrator-watchdog → регистрация проекта строго кирпичом onboard_project.py → итоговый отчёт PASS/FAIL/MANUAL. Scripts+docs+tests (паттерн ORCH-009/103): рантайм src/**, корневой docker-compose.yml, Dockerfile, .env.example/.env.watchdog.example, STAGE_TRANSITIONS/QG_CHECKS/check_*/machine-verdict/схема БД — байт-в-байт. kill-switch не нужен (активация — только явный запуск CLI человеком на целевом хосте; в нашем контуре артефакт инертен). - D1/D2: stdlib-only, один файл; режимы plan/apply/verify (closed choices), дефолт apply (бизнес-цель «одна команда»); безопасность структурно — фаза 0 ≡ plan, ранний guard чужого .env, per-action consent, non-TTY без --yes → exit 2 ДО мутаций. Exit 0/2/1; resume = повторный запуск (check→ensure по реальности, без state-файла). - D3: 10 нормативных шагов, инвариант APPLY_STEPS == build_plan(). - D4–D11: решающая логика — чистые функции (вердикты предусловий, classifier discovery строго по image-префиксам, port_overrides когерентной тройкой, staging==prod fail-closed, рендер env с маркером managed-файла, C-1 ORCH-100 машинно, §6.4 branch protection без удаления, webhook Plane Path A/Б, build_onboard_args). - NFR-1/3: src.* не импортируется; секреты скрыты и не печатаются; delete-операций нет; никаких операций с main; рестарт — только собственного контура. - D12: LITE_SETUP.md §1.1 + footer-норматив; tests/test_setup_lite_script.py (47 unit/structural); аддитивный TC-27 в test_lite_setup_doc.py; витрина docs/overview + docs/architecture/README дополнены; CHANGELOG + CLAUDE.md (паспорт) обновлены. Refs: ORCH-104 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
Work item: ORCH-011
|
||||
Work item: ORCH-104
|
||||
Repo: orchestrator
|
||||
Branch: feature/ORCH-011-
|
||||
Branch: feature/ORCH-104-lite
|
||||
Stage: development
|
||||
@@ -3,6 +3,12 @@
|
||||
Формат: [Keep a Changelog](https://keepachangelog.com/). Записи — на смысловой PR/задачу.
|
||||
|
||||
## [Unreleased]
|
||||
- **Lite-тираж: интерактивный installer `scripts/setup_lite.py`** (ORCH-104, `feat`): у Lite-тиража (ORCH-102 — документ `docs/deployment/LITE_SETUP.md`) появился исполняемый инструмент — один операторский CLI, автоматизирующий маршрут LITE_SETUP §2–§12 для внешнего заказчика: скан предусловий хоста с офером доустановки → discovery docker-инсталляций Plane/Gitea → интерактивный сбор обязательных ключей с немедленной верификацией → автодетект хост-параметров и когерентность портов → сборка `.env`/`.env.watchdog` от канонов → webhook Plane → guard-ы Gitea → подъём ровно `orchestrator`+`orchestrator-watchdog` → регистрация проекта строго кирпичом `onboard_project.py` → итоговый отчёт PASS/FAIL/MANUAL. **Scripts+docs+tests** (паттерн ORCH-009/103): рантайм `src/**`, корневой `docker-compose.yml`, `Dockerfile`, `.env.example`/`.env.watchdog.example`, `STAGE_TRANSITIONS`/`QG_CHECKS`/`check_*`/machine-verdict/схема БД — байт-в-байт; kill-switch не нужен (активация — только явный запуск CLI человеком на целевом хосте, в нашем контуре артефакт инертен). ADR: `docs/work-items/ORCH-104/06-adr/ADR-001-setup-lite-interactive-installer.md`, сквозной `adr-0040-lite-interactive-installer.md`.
|
||||
- **Режимы и дефолт (D1/D2):** python stdlib-only, один файл; закрытый набор режимов семейной лексики `plan`/`apply`/`verify` (`choices`), но **дефолт без аргументов — `apply`** (бизнес-цель «одна команда»). Безопасность дефолта — структурно, не режимом: фаза 0 ≡ `plan` (read-only скан + discovery + автодетект), ранний guard чужого `.env`, per-action consent на каждую мутацию, non-TTY без `--yes` → `exit 2` ДО любой мутации. Exit-контракт `EXIT_OK=0`/`EXIT_MANUAL=2`/`EXIT_ERROR=1`; resume = повторный запуск (check→ensure по реальности, без state-файла).
|
||||
- **Step-движок (D3):** 10 нормативных шагов `scan→prereqs→discovery→collect→render-env→plane-webhook→gitea-guards→up→onboard→report`; каждый шаг ссылается на свой § LITE_SETUP; инвариант `[n for n,_,_ in APPLY_STEPS] == [n for n,_ in build_plan()]` (нет «теневых» шагов).
|
||||
- **Решающая логика — чистые функции (D4–D11):** вердикты предусловий `prereq_verdicts` (не-Linux/не-x86_64 → WARN «вне контура Lite», ни один пункт не пропускается молча), офер установки per-package consent'ом по закрытому набору менеджеров (`apt-get`/`dnf`/`yum`/`zypper`; неопределимый → MANUAL), classifier discovery строго по image-префиксам (`makeplane/*`, `gitea/gitea*`), `port_overrides` (когерентная тройка `ORCH_DEPLOY_PROD_TARGET_PORT`⇄`WATCHDOG_METRICS_URL`⇄`ORCH_POST_DEPLOY_BASE_URL` одной функцией), `staging_port == prod` → fail-closed (ORCH-058/101), рендер `.env` от канона `.env.example` с маркером managed-файла (`# managed by scripts/setup_lite.py (ORCH-104)` → основа resume и guard'а чужого конфига), `WATCHDOG_TG_*` только в `.env.watchdog` (ловушка файла-носителя §4.3), webhook-секреты строго кирпичом `gen_secrets.py`, C-1 ORCH-100 машинно (токен watchdog-бота == токену орка → отказ), §6.4 branch protection на `main` → FAIL с лечением без удаления (no-delete), webhook Plane CE Path A (UI) / Path Б (SQL под пятью предусловиями), `build_onboard_args` детерминированная сборка аргументов кирпича `onboard_project.py` (собственного канона статусов/лейблов скрипт не несёт).
|
||||
- **Секрет-гигиена (NFR-3):** значения секретов вводятся скрыто (`getpass`-класс) и НИКОГДА не печатаются (только имена ключей); существующий немаркированный `.env`/`.env.watchdog` не перетирается без `--force`; delete-операций нет вообще; никаких операций с `main`/force-push; рестарт — только собственного свежеподнятого контура.
|
||||
- **Документация и анти-дрейф (D12):** `LITE_SETUP.md` получил подраздел `### 1.1. Быстрый путь: setup_lite.py` (пиннинг «13 разделов в порядке» цел байт-в-байт) + footer-норматив «меняешь шаги тиража → обнови док **и** `scripts/setup_lite.py` в том же PR»; новый `tests/test_setup_lite_script.py` (ast-скан stdlib-only/нет `src.*`, зеркала `FORBIDDEN_DELETE_NEEDLES`/`FORBIDDEN_STATUS_NEEDLES`, unit чистых функций, секрет-гигиена, import без side-effects); аддитивный тест в `tests/test_lite_setup_doc.py` (TC-27, существующий кортеж `SECTIONS` не правится); витрина `docs/overview/README.md` (маршрут «Развернуть у себя») и `docs/architecture/README.md` (блок Type A) дополнены.
|
||||
- **Витрина системы `docs/overview/`: бизнес + тех, маршруты трёх аудиторий, презентация** (ORCH-011, `docs`): единая точка входа в документацию платформы — новый docs-раздел `docs/overview/` (плоский каталог, 10 файлов, ADR-001 D1): индекс `README.md` (маршруты «Я заказчик / Я менеджер / Я разработчик» + норматив сопровождения «изменил функциональность → обнови витрину в том же PR»), бизнес-часть `business.md` (проблема → решение → что умеет фактически → ценность → 6 сценариев; без жаргона, цифры только с атрибуцией), 7 тех-блоков `tech-*.md` (архитектура со схемой потока, конвейер/гейты, агенты, модель объектов, интеграции, качество/безопасность, наблюдаемость; link-first — за деталями ссылки в golden sources, разрешённый дубль только машинно-сверяемый). **Docs+tests+dev-скрипт** (паттерн ORCH-102/103): `src/**`/`docker-compose.yml`/`Dockerfile`/`requirements*`/`STAGE_TRANSITIONS`/`QG_CHECKS`/machine-verdict/схема БД — ноль изменений. ADR: `docs/work-items/ORCH-011/06-adr/ADR-001-system-overview-canon.md`, сквозной `adr-0039-system-overview-docs-canon.md`.
|
||||
- **Презентация (D4/D5):** слайдо-источник `docs/overview/presentation.md` (16 слайдов в машинно-парсимой структуре «## Слайд N: …» + процедура сборки «команда + Проверка:») + dev-скрипт `scripts/build_presentation.py` (python-pptx, тёмный дизайн, редактируемый текст с точной кириллицей; чистый stdlib-парсер `parse_slides` + ленивый импорт pptx). Запуск только вне рантайма; `python-pptx` НЕ в прод-образе (машинный гард); собранный `.pptx` в git не коммитится — `build/` в `.gitignore`.
|
||||
- **Анти-дрейф (D6):** новый структурный `tests/test_system_docs.py` (без сети/LLM/subprocess, паттерн `test_lite_setup_doc.py`) — 10 файлов витрины; маршруты/норматив; derive-сверки с кодом: стадии импортом `src.stages.STAGE_TRANSITIONS` (вкл. `deploy-staging`/`cancelled`, порядок цепочки), exit-гейты и под-гейты именами реестра `QG_CHECKS` в нормативном порядке security → merge → coverage → image-freshness (+ маркер «не стадии»), 6 агентов glob'ом промптов, таблица эффортов class-default'ами config (ORCH-41/81); валидность относительных ссылок + обязательные golden-source ссылки; полнотекстовый FORBIDDEN-скан (импорт из `test_no_host_hardcodes.py`) + секрет-эвристика + запрет вне-репозиторных путей; слайды каноническим парсером; `pptx` отсутствует в `requirements*`/`Dockerfile`; указатели README/CLAUDE/CHANGELOG.
|
||||
|
||||
47
CLAUDE.md
47
CLAUDE.md
@@ -380,6 +380,53 @@ API → `manual-step` (fail-safe); **runbook** `docs/operations/ONBOARDING.md` (
|
||||
в том же PR. Детали — `docs/work-items/ORCH-103/06-adr/ADR-001-bundled-stack-compose-and-bootstrap.md`,
|
||||
сквозной `docs/architecture/adr/adr-0038-bundled-replication-canon.md`.
|
||||
|
||||
## Lite-installer: интерактивный `scripts/setup_lite.py` (ORCH-104)
|
||||
У Lite-тиража (ORCH-102 — документ-канон `docs/deployment/LITE_SETUP.md`) появился **исполняемый
|
||||
инструмент**: один операторский CLI `scripts/setup_lite.py` (python stdlib-only, мнемоническая пара
|
||||
`LITE_SETUP.md` ⇄ `setup_lite.py`), автоматизирующий маршрут LITE_SETUP §2–§12 для внешнего
|
||||
заказчика. **Scripts+docs+tests** (паттерн ORCH-009/103): рантайм `src/**`, корневой
|
||||
`docker-compose.yml`, `Dockerfile`, `.env.example`/`.env.watchdog.example`,
|
||||
`STAGE_TRANSITIONS`/`QG_CHECKS`/`check_*`/machine-verdict/схема БД — **байт-в-байт**; kill-switch не
|
||||
нужен (активация — только явный запуск CLI человеком на целевом хосте, в нашем контуре артефакт
|
||||
инертен; на mva154 не запускается).
|
||||
- **Режимы (D1/D2):** закрытый набор семейной лексики `plan`/`apply`/`verify` (`choices`), но
|
||||
**дефолт без аргументов — `apply`** (бизнес-цель «одна команда» — суть задачи; осознанное
|
||||
отступление от plan-default семейства ORCH-009/103). Безопасность дефолта — **структурно, не
|
||||
режимом**: фаза 0 ≡ `plan` (read-only скан предусловий + discovery + автодетект; ноль мутаций),
|
||||
ранний guard чужого `.env`, per-action consent на каждую мутацию (печать точной команды → согласие
|
||||
→ исполнение; отказ → честный MANUAL с эквивалентной командой), non-TTY без `--yes` → `exit 2` ДО
|
||||
любой мутации. Exit-контракт `EXIT_OK=0`/`EXIT_MANUAL=2`/`EXIT_ERROR=1`; resume = повторный запуск
|
||||
(check→ensure по реальности, **без state-файла**).
|
||||
- **Step-движок (D3):** 10 нормативных шагов `scan→prereqs→discovery→collect→render-env→
|
||||
plane-webhook→gitea-guards→up→onboard→report`, каждый ссылается на свой § LITE_SETUP; инвариант
|
||||
`[n for n,_,_ in APPLY_STEPS] == [n for n,_ in build_plan()]` (нет «теневых» шагов).
|
||||
- **Решающая логика — чистые функции (D4–D11):** `prereq_verdicts` (не-Linux/не-x86_64 → WARN «вне
|
||||
контура Lite», ни один пункт не молча), офер установки per-package consent'ом по закрытому набору
|
||||
менеджеров `apt-get`/`dnf`/`yum`/`zypper` (неопределимый → MANUAL), `discover_installations`
|
||||
**строго по image-префиксам** (`makeplane/*`, `gitea/gitea*`; имена контейнеров/проектов как признак
|
||||
НЕ используются — анти-ложноположительность; 0/1/≥2 → ручной ввод/префилл/выбор, «ввести вручную»
|
||||
всегда), немедленная верификация каждого ключа (Plane `/api/v1/workspaces/<slug>/projects/`, Gitea
|
||||
`/api/v1/user`, Telegram `getMe`; лимит 3 попытки → MANUAL), `port_overrides` (когерентная тройка
|
||||
`ORCH_DEPLOY_PROD_TARGET_PORT`⇄`WATCHDOG_METRICS_URL`⇄`ORCH_POST_DEPLOY_BASE_URL` одной функцией),
|
||||
`staging_port == prod` → fail-closed (ORCH-058/101), рендер `.env` от канона `.env.example` с
|
||||
**маркером managed-файла** `# managed by scripts/setup_lite.py (ORCH-104)` (основа resume и guard'а
|
||||
чужого конфига: немаркированный `.env`/`.env.watchdog` → отказ `exit 2` без `--force`),
|
||||
`WATCHDOG_TG_*` только в `.env.watchdog` (ловушка файла-носителя §4.3), webhook-секреты **строго
|
||||
кирпичом** `gen_secrets.py` (свежий выпуск), **C-1 ORCH-100 машинно** (токен watchdog-бота == токену
|
||||
орка → отказ шага), **§6.4** branch protection на `main` → FAIL с лечением **без удаления**
|
||||
(no-delete), webhook Plane CE Path A (UI рекомендация) / Path Б (SQL под пятью предусловиями D8),
|
||||
`build_onboard_args` детерминированная сборка аргументов кирпича `onboard_project.py` (собственного
|
||||
канона статусов/лейблов скрипт НЕ несёт — 22 статуса остаются за `plane_sync._PLANE_NAME_TO_KEY`).
|
||||
- **Гигиена (NFR-1/3):** stdlib-only (ast-скан), `src.*` не импортируется, канон-знания — только
|
||||
субпроцессами кирпичей; значения секретов скрыты (`getpass`) и НИКОГДА не печатаются; delete-операций
|
||||
нет вообще; никаких операций с `main`/force-push; рестарт — только собственного свежеподнятого
|
||||
контура (никогда чужие/боевые контейнеры). **Норматив сопровождения (D12):** меняешь шаги тиража →
|
||||
обнови `LITE_SETUP.md` **и** `scripts/setup_lite.py` в том же PR (footer LITE_SETUP). Анти-дрейф —
|
||||
`tests/test_setup_lite_script.py` (зеркала `FORBIDDEN_DELETE_NEEDLES`/`FORBIDDEN_STATUS_NEEDLES`,
|
||||
unit чистых функций, секрет-гигиена) + аддитивный TC-27 в `tests/test_lite_setup_doc.py`. Детали —
|
||||
`docs/work-items/ORCH-104/06-adr/ADR-001-setup-lite-interactive-installer.md`, сквозной
|
||||
`docs/architecture/adr/adr-0040-lite-interactive-installer.md`.
|
||||
|
||||
## Конвенции
|
||||
- Conventional Commits (`feat:`, `fix:`, `docs:`, `refactor:`, `test:`)
|
||||
- Ветки: `feature/ORCH-NNN-slug`, `fix/ORCH-NNN-slug`
|
||||
|
||||
@@ -36,7 +36,8 @@
|
||||
1. [business.md](business.md) — проблема, решение, ценность.
|
||||
2. [business.md → Сценарии использования](business.md#сценарии-использования) — как это выглядит в работе.
|
||||
3. [presentation.md](presentation.md) — слайдовая версия рассказа (собирается в PowerPoint).
|
||||
4. Развернуть у себя: [LITE_SETUP](../deployment/LITE_SETUP.md) (своя инфраструктура) или
|
||||
4. Развернуть у себя: [LITE_SETUP](../deployment/LITE_SETUP.md) (своя инфраструктура;
|
||||
быстрый путь — интерактивный installer `scripts/setup_lite.py`, ORCH-104) или
|
||||
[BUNDLED_SETUP](../deployment/BUNDLED_SETUP.md) (весь стек одним комплектом).
|
||||
|
||||
### Я менеджер проекта
|
||||
|
||||
1379
scripts/setup_lite.py
Normal file
1379
scripts/setup_lite.py
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user