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

- [ ] Повторить пп. 2–5 на прод-окружении.
- [ ] Мониторить первые ~30 мин: `/health/ready`, логи, диск (`df -h`).
