# Dev Report: ORCH-3 (S-3) + M-5 — безопасный rollback деплоя + чистка хардкода инфры Дата: 2026-06-03 Статус: DONE (PR #20 открыт, НЕ смержен; прод-хук НЕ применён) ## Задача - S-3: убрать опасный `git checkout $LAST_TAG` из deployer.md (загаживает shared-репо, прод не откатывает), перенести rollback В ХУК enduro-deploy-hook.sh. - M-5: вынести хардкод инфры (architect.md:16, tester.md:27,38,39) в env с дефолтами. - Репо: enduro-trails (НЕ orchestrator). Сервер slin@82.22.50.71. Хук /home/slin/bin/enduro-deploy-hook.sh. ## Верификация по живому коду (до правок) - Хук сейчас: `set -e` → cd REPO → `git pull origin main` → `docker compose up -d app` → опц. gps-collector. rollback'а НЕТ. - app собирается из Dockerfile (build context), образ `enduro-trails-app:latest`. Running image id = sha256:dda30e27... - compose: `docker compose images app` даёт `enduro-trails-app:latest`. `docker inspect --format '{{.Image}}'` даёт sha256 running. - => механизм отката: ДО rebuild сохранить id текущего (старого) образа в .deploy-prev-image; на --rollback ретегнуть его в enduro-trails-app:latest и `docker compose up -d --no-build app`. ## Блок А — DONE (хук-кандидат, НЕ применён на прод) - Бэкап прод-хука: `/home/slin/bin/enduro-deploy-hook.sh.bak-1780468526`. - Новый хук staged как кандидат: `/home/slin/bin/enduro-deploy-hook.sh.new` (НЕ перезаписан живой — применение = шаг Стрим/Слава). - `bash -n` кандидата: OK. md5: 2b60c65b33bf962b91a6aa6436076181. - Логика: - Normal deploy: ДО `docker compose up -d app` снимаем id текущего running образа и пишем в `$REPO/.deploy-prev-image`. Best-effort (`|| true`), set -e не ломается. - `--rollback`: читает .deploy-prev-image; если пусто/образа нет локально → лог «rollback skipped» + exit 1. Иначе `docker tag enduro-trails-app:latest` + `docker compose up -d --no-build app` + exit 0. git/pull НЕ трогает. - happy-path (pull + restart + опц. gps-collector) сохранён без изменений. - DRY-RUN на проде (read-only + throwaway-тег, НЕ :latest): capture=sha256:dda30e27..., tag OK, throwaway удалён, running app не тронут. - ⚠️ Хук вне git-репо (только /home/slin/bin/), в PR не попадает — приложен как .new кандидат + задокументирован здесь. ## Сделано - [x] A — rollback в хук (backup + кандидат + bash -n + dry-run) — DONE - [x] Б — deployer.md блок 6 (rollback = ssh ... --rollback) + tools docker→Bash (git, curl) — DONE - [x] В — M-5 architect.md (${DEPLOY_SSH_HOST:-mva154}) + tester.md (${REPO_DIR}, ${UI_TEST_RUNNER}) — DONE - [x] git push + remote verify (ORCH-7) + PR #20 — DONE ## Результат - Ветка `feature/ORCH-3-deploy-rollback` запушена. Remote-проверка (ORCH-7): `origin/main..origin/feature/...` = c6b8826 (S-3), 39b15be (M-5). РЕАЛЬНО на remote. - PR #20 → main репо enduro-trails: https://git.mva154.duckdns.org/admin/enduro-trails/pulls/20 . НЕ смержен (мерж = Стрим). - Коммиты (Conventional): `fix(deploy): move rollback into deploy hook (S-3)`, `refactor(agents): parametrize infra hardcode (M-5)`. - Хук-кандидат + бэкап лежат на хосте в /home/slin/bin/ — применение = осознанный шаг Стрим/Слава. ## Проверка по таблице ТЗ 1. backup `.bak-1780468526` ✔ 2. happy-path цел + bash -n OK ✔ 3. --rollback читает prev-image/skipped+exit1, логирует ✔ (dry-run верифицирован) 4. deployer.md: нет git checkout, rollback=хук ✔ 5. M-5 env с дефолтами, смысл цел ✔ 6. PR #20, remote содержит коммиты ✔ ## Изменённые файлы - (хук на хосте) /home/slin/bin/enduro-deploy-hook.sh - .openclaw/agents/deployer.md - .openclaw/agents/architect.md - .openclaw/agents/tester.md ## Проблемы и решения - Хук НЕ трекается в git-репо (живёт только /home/slin/bin/) → в PR не попадает. Решение: staged как `.new` кандидат + бэкап на хосте, полностью задокументирован тут и в теле PR. - На хосте нет scp → файлы заливал через base64 over SSH (с md5-проверкой целостности). - Remote origin = http://localhost:3000 (Gitea на хосте) → git/PR-операции делал на самом хосте в /tmp/orch3-work (свежий clone, НЕ shared prod working-copy, чтобы не трогать прод). - Способ отката выбран: retag prev-image → enduro-trails-app:latest + `docker compose up -d --no-build app`. Причина: app собирается из Dockerfile, образ всегда тегается enduro-trails-app:latest; ретег предыдущего id + рестарт без rebuild — надёжно возвращает контейнер на старый образ, ничего не пересобирая. ## Применение на проде (для Стрим/Слава, НЕ выполнено мной) ``` cp /home/slin/bin/enduro-deploy-hook.sh.new /home/slin/bin/enduro-deploy-hook.sh # swap # откат при необходимости: cp /home/slin/bin/enduro-deploy-hook.sh.bak-1780468526 /home/slin/bin/enduro-deploy-hook.sh ``` Примечание: .deploy-prev-image появится только ПОСЛЕ первого деплоя новым хуком; до этого `--rollback` честно вернёт «skipped». ## Очистка - Временный clone /tmp/orch3-work оставлен (содержит запушенную ветку). Хук-кандидат и бэкап оставлены на хосте как deliverable.