gendesign/.claude/rules/deploy.md
bot-backend e909dbcada
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m0s
CI / backend-tests (pull_request) Successful in 17m6s
docs(rules): deploy.md отражает ops/*.sh глоб вместо точечного docker-prune.sh (#2203)
Оба утверждения в разделе Path triggers устарели ровно из-за коммита
2d2336cd в этой же ветке: список больше не содержит ops/docker-prune.sh
(теперь ops/*.sh), а предупреждение «добавлять в paths явно» для
любого нового ops/<name>.sh больше не верно — глоб их подхватывает сам.

Осталась одна деталь, о которой правда надо помнить: одиночная звёздочка
не пересекает /, так что новый ПОДКАТАЛОГ внутри ops/ (как db-bootstrap/,
glitchtip-auth-forwarder/) под глоб не попадает и всё ещё требует своей
строки в paths — иначе тот же класс бага (#2887 / #2203) повторится для
подкаталога.
2026-08-20 22:25:34 +03:00

4.5 KiB
Raw Blame History

paths
docker-compose*.yml
Caddyfile
.github/workflows/**
.forgejo/workflows/**
scripts/setup-*.sh

Deploy conventions

Post-deploy verification (MANDATORY)

После КАЖДОГО успешного merge+deploy на main — немедленно spawn qa-tester subagent с playwright smoke по тому, что merged.

Why: Без auto-smoke user сам ловит prod TypeErrors / 4xx / overlay bugs которые qa-tester catched бы за 2 мин. Плохой UX + потерянное время на P0 hotfixes уже после того как user увидел проблему. User rule (2026-05-18): «проверяй через плэйврайт сразу после деплоя».

How to apply:

  • После mcp__forgejo__get_pull_request merged: true И подтверждения deploy success (HTTP 200 на routes / GHA run finished / user сказал «deploy прошёл») — Agent subagent_type=qa-tester.
  • Prompt: routes изменённые в PR + expected behaviour из PR body + console errors check + critical API calls (4xx/5xx detection) + regression baseline (/, /health, /landing/stats).
  • Background OK — wait notification, не блокировать остальной flow.
  • НЕ дожидаться user feedback «не работает» — qa-tester ловит сам.

Reference incident: PR #346 (2026-05-18) deploy → user сам нашёл prod 500 на by-bbox, потом 400 на analyze, потом TypeError на poi-score, потом UI overlap. Каждое ловилось бы playwright smoke по /site-finder/analysis/{cad}.

Path triggers (Forgejo Actions, .forgejo/workflows/)

  • backend/**, frontend/**, Caddyfile, caddy/**, docker-compose.prod.yml, data/sql/**, ops/glitchtip-auth-forwarder/**, ops/db-bootstrap/**, ops/*.sh, .forgejo/workflows/deploy.ymldeploy.yml (main Site Finder stack)
  • ops/*.sh (#2203) — любой скрипт непосредственно в ops/ уезжает на VM автоматически, дополнять paths: вручную для нового ops/<name>.sh не нужно. ⚠️ Одиночная звёздочка не пересекает /новый подкаталог внутри ops/ (по образцу ops/db-bootstrap/, ops/glitchtip-auth-forwarder/) под этот глоб не попадает и требует своей отдельной строки в paths:, иначе не доедет до /opt/gendesign и будет молча исполняться в старой версии
  • trade-in изменения → deploy-tradein.yml (отдельный stack; paths-filter base = last deployed SHA → накопленный diff, fail-safe build-all)
  • docker-compose.obsidian.yml, scripts/setup-couchdb.sh, docs/obsidian-livesync.md.forgejo/workflows/deploy-obsidian.yml
  • docs/** alone → НЕ триггерит деплой

После изменения .env на VPS

docker compose up -d --force-recreate --no-deps <service>

docker compose restart НЕ перечитывает env_file.

Caddyfile

Bind-mounted → нужен явный caddy reload после изменения. deploy.yml делает автоматически после compose up -d.

Sentry release tracking

SENTRY_RELEASE=$IMAGE_TAG пишется в backend/.env.runtime на VPS через sedне полная перезапись файла (там user-managed COUCHDB_PASSWORD и пр.).

VPS git state

deploy.yml делает git reset --hard origin/main → любые ручные правки в /opt/gendesign стираются. .env-файлы выживают (в .gitignore).

DB migrations через deploy

data/sql/NN_*.sql применяются до compose up -d. Если SQL падает → deploy останавливается (exit 1), containers не обновляются.

Diagnose: GHA log "Apply DB migrations". См. .claude/rules/sql.md для migration order.

Запреты

  • Менять env_file секреты в docker-compose*.yml — секреты через VPS .env файлы
  • Полностью перезаписывать .env.runtime — только sed для конкретных переменных
  • git pull на VPS вручную — deploy.yml уже делает git reset --hard
  • Hardcode tags / SHA в compose files — ${IMAGE_TAG} через env