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
Оба утверждения в разделе Path triggers устарели ровно из-за коммита
2d2336cd в этой же ветке: список больше не содержит ops/docker-prune.sh
(теперь ops/*.sh), а предупреждение «добавлять в paths явно» для
любого нового ops/<name>.sh больше не верно — глоб их подхватывает сам.
Осталась одна деталь, о которой правда надо помнить: одиночная звёздочка
не пересекает /, так что новый ПОДКАТАЛОГ внутри ops/ (как db-bootstrap/,
glitchtip-auth-forwarder/) под глоб не попадает и всё ещё требует своей
строки в paths — иначе тот же класс бага (#2887 / #2203) повторится для
подкаталога.
65 lines
4.5 KiB
Markdown
65 lines
4.5 KiB
Markdown
---
|
||
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.yml` → `deploy.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
|
||
|
||
```bash
|
||
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
|