feat(replication): ORCH-101 — расхардкод хоста + секреты нового хоста + smoke (фундамент тиража 10-common) #122
Reference in New Issue
Block a user
Delete Branch "feature/ORCH-101-orch-10-common-smoke"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
ORCH-101 — фундамент тиража 10-common
Платформа разворачивается на новой инфре без правки кода — только env/конфиг. Каждый дефолт = боевому значению (пустой
.env⇒ поведение 1:1; kill-switch-природа, NFR-2).STAGE_TRANSITIONS/QG_CHECKS/check_*/machine-verdict/схема БД — байт-в-байт.Расхардкод (AC-1, AC-2)
Settings:agent_home_dir/agent_git_name/git_email_domain/staging_port(ADR-001 D2/D4).plane_sync.notify_stage_change— ссылки изgitea_public_url(fallbackgitea_url)+gitea_owner.launcher.agent_git_env()— единый Settings-driven env обоих мест запуска.self_deploy/post_deploy— HOME+домен из Settings, имена системных акторов — платформенные литералы.SELF_HOSTING_REPO— нормативная платформенная константа (пин-тест).staging_port == прод-порт→ отказ freshness-пути ДО ssh/build, без тихого fallback.Инфра-файлы (AC-6)
${VAR:-default}по карте D6; группа ORCH-040 (uid/gid/HOME/маунты/useradd) — одни env насквозь;group_add«МИНА 1» сохранён ×3; оба app-сервиса с явнымcommand:.ARG APP_UID/APP_GID/APP_USER/APP_HOME; CMD exec-form 8500 не тронут (D5).REPO="${REPO:-…}"; оба инвокера передаютREPO=явно (D7; exit-контракт 0/1/2 не тронут).Секреты (AC-5)
scripts/gen_secrets.py:token_hex(32), печать по умолчанию,--writeс отказом на существующем.env(exit=2), перезапись только--force..env.example— полнота ключей старта; чек-лист внешних токенов; «боевые секреты не копируются».Smoke + доки (AC-3, AC-4)
docs/operations/REPLICATION.md: карта env, секреты, пошаговый smoke с PASS/FAIL (compose config → /health → /queue+/metrics → onboarding sandbox → задача → артефакты 01–04; расширенно до done), границы 10-common vs Lite vs Bundled.INFRA.md,README.md,CLAUDE.md,docs/architecture/README.md,CHANGELOG.md.Анти-регресс (AC-7)
tests/test_no_host_hardcodes.py: tokenize-сканер запрещённых литералов (82.22.50.71//home/slin/mva154/duckdns) в исполняемом кодеsrc/**+watchdog/**; config-модули — структурное исключение; allowlist пуст; негативная самопроверка.test_host_config_keys/test_infra_parametrization/test_secrets_gen/test_replication_smoke(TC-01…TC-12).test_orch040_compose(судит резолв дефолтов =docker compose configпри пустом env),test_deploy_hook_rollback_sim(REPO через env-override = контракт D7).Полный регресс: 1764 passed. Прод-контейнер в рамках задачи не рестартуется (NFR-1); compose/Dockerfile вступают в силу при следующем штатном деплое (staging 8501 → Confirm Deploy).
ADR:
docs/work-items/ORCH-101/06-adr/ADR-001-host-parametrization-secrets-smoke.md, сквознойadr-0036.Refs: ORCH-101
🤖 Generated with Claude Code
Фундамент тиража 10-common (эпик ORCH-10): платформа разворачивается на новой инфре без правки кода — только env/конфиг. Каждый дефолт = боевому значению (пустой .env => поведение 1:1, kill-switch-природа, NFR-2); STAGE_TRANSITIONS/QG_CHECKS/check_*/machine-verdict/схема БД не тронуты. - config: agent_home_dir / agent_git_name / git_email_domain / staging_port (ADR-001 D2/D4); код-блокеры A1-A4 закрыты: plane_sync ссылки из gitea_public_url+gitea_owner, launcher - единый agent_git_env() (x2 места), self_deploy/post_deploy - HOME+домен из Settings (имена системных акторов - платформенные литералы) - image_freshness: staging_port из конфига + fail-closed guard staging_port == прод-порт -> отказ ДО ssh/build (инвариант ORCH-058 AC-9 стал исполняемым); REPO= передаётся хуку явно обоими инвокерами (D7) - SELF_HOSTING_REPO - нормативная платформенная константа (D3, пин-тест) - compose: полная ${VAR:-default}-интерполяция (реестр B, карта D6); группа ORCH-040 uid/gid/HOME/маунты двигается согласованно (build.args APP_*); group_add "МИНА 1" сохранён x3; оба app-сервиса с явным command: - Dockerfile: ARG APP_UID/APP_GID/APP_USER/APP_HOME (CMD exec-form 8500 сознательно не тронут - D5); deploy-hook: REPO="${REPO:-...}" (D1 реестра) - секреты: stdlib scripts/gen_secrets.py (token_hex(32); печать по умолчанию; --write никогда не перезаписывает существующий .env молча, exit=2; перезапись только --force); .env.example дополнен до полноты ключей старта - доки: новый docs/operations/REPLICATION.md (карта env, чек-лист секретов, smoke-процедура с PASS/FAIL, границы 10-common/Lite/Bundled), INFRA.md, README, CLAUDE.md, CHANGELOG - анти-регресс: tests/test_no_host_hardcodes.py (tokenize-сканер запрещённых литералов, config-модули - структурное исключение, allowlist пуст, негативная самопроверка) + test_host_config_keys / test_infra_parametrization / test_secrets_gen / test_replication_smoke; согласованные структурные правки test_orch040_compose (судит резолв дефолтов) и test_deploy_hook_rollback_sim (REPO через env-override = контракт D7) Полный регресс: 1764 passed. Refs: ORCH-101 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>