# Чек-лист релиза 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`).