diff --git a/docs/release-checklist.md b/docs/release-checklist.md new file mode 100644 index 0000000..a3dfb5b --- /dev/null +++ b/docs/release-checklist.md @@ -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 `). +- [ ] Новые 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:///health/ready` → `200 Healthy` (БД + миграции). +- [ ] `curl https:///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) + +- [ ] Повторить пп. 2–5 на прод-окружении. +- [ ] Мониторить первые ~30 мин: `/health/ready`, логи, диск (`df -h`).