docs: чек-лист релиза (P0-9)

Пред/во время/после выкатки: предусловия (.env/issuer/сертификаты/бэкап-таймер),
тесты+миграции перед релизом, бэкап, деплой через CI, smoke после (health/ready,
логин, ключевые потоки, permission 403, rate-limit 429), откат, прод. Ссылается на
secrets.md / backup-restore.md / openiddict-keys.md / stage-setup.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
nns 2026-05-27 02:52:16 +05:00
parent 37e9d28f69
commit 99c1f1b780

56
docs/release-checklist.md Normal file
View file

@ -0,0 +1,56 @@
# Чек-лист релиза food-market
Практический список перед/во время/после выкатки. Деплой автоматизирован
(push в `main` → GitHub Actions: CI → образы → deploy stage; см. [stage-setup.md](stage-setup.md)).
Прод — после подтверждения на stage.
## 0. Предусловия (один раз на окружение)
- [ ] `deploy/.env` заполнен из `deploy/.env.example`, права `600` (см. [secrets.md](secrets.md)).
- [ ] `POSTGRES_PASSWORD` — не дефолтный.
- [ ] `OPENIDDICT_ISSUER` = публичный URL админки (за прокси обязателен).
- [ ] OpenIddict-сертификаты на месте или генерируются self-signed (см. [openiddict-keys.md](openiddict-keys.md)).
- [ ] Таймер бэкапа установлен и активен: `systemctl list-timers food-market-backup.timer` (см. [backup-restore.md](backup-restore.md)).
- [ ] HTTPS на nginx-проксе настроен (вне этого репо).
## 1. Перед релизом (на ветке/в PR)
- [ ] `dotnet build` зелёный (api + зависимости; POS на Linux не собирается — это норма).
- [ ] Юнит-тесты зелёные: `dotnet test tests/food-market.UnitTests`.
- [ ] Интеграционные тесты зелёные: `dotnet test tests/food-market.IntegrationTests` (нужен Docker для Testcontainers).
- [ ] Релевантные e2e-сценарии зелёные (`tests/e2e/run.sh <name>`).
- [ ] Новые EF-миграции просмотрены: идемпотентны, без потери данных, при ручном написании — `[Migration("ID")]` + `[DbContext]` (иначе `Migrate()` не подхватит).
- [ ] Изменения секретов/конфигов отражены в `.env.example` и `secrets.md`.
- [ ] CHANGELOG/release notes обновлены (если ведутся).
## 2. Бэкап перед выкаткой
- [ ] Свежий бэкап БД: `sudo systemctl start food-market-backup.service` → проверить файл в `FM_BACKUP_DIR`.
- [ ] Проверить, что дамп валиден: `pg_restore --list` (см. [backup-restore.md](backup-restore.md)).
## 3. Релиз
- [ ] Смёрджить в `main` (или прогнать `deploy-stage.yml`). CI соберёт образы и задеплоит на stage.
- [ ] Дождаться Telegram-уведомления «Deploy stage OK».
- [ ] Миграции применяются автоматически на старте API (`Migrate()`), отдельный шаг не нужен.
## 4. После выкатки (smoke)
- [ ] `curl -fsS https://<host>/health/ready``200 Healthy` (БД + миграции).
- [ ] `curl https://<host>/health/live``200`.
- [ ] Логин: получить токен на `/connect/token`, `/api/me``200` с ожидаемыми claim'ами и `org_id`.
- [ ] Ключевые потоки: создать товар, провести приёмку, провести розничную продажу — без ошибок.
- [ ] Permission-гейт работает: пользователь без права получает `403` (не `500`/`200`).
- [ ] Антибрутфорс: >5 логинов/мин с одного IP → `429`.
- [ ] Логи без необработанных исключений: `docker logs food-market-api | tail`.
## 5. Откат (если что-то не так)
- [ ] Откатить теги образов: задать прежние `API_TAG`/`WEB_TAG` в `.env`, `docker compose up -d`.
- [ ] Если миграция повредила данные — восстановить БД из бэкапа п.2 (см. [backup-restore.md](backup-restore.md)), затем откатить образ.
- [ ] Сообщить в Telegram-канал статус.
## 6. Прод (после OK на stage)
- [ ] Повторить пп. 25 на прод-окружении.
- [ ] Мониторить первые ~30 мин: `/health/ready`, логи, диск (`df -h`).