Appearance
Backup and Rollback Runbook
Практический runbook для beta/UAT и будущего production MyHoreca Pay. Используйте его вместе с Release Checklist, UAT Checklist и Production Readiness Report.
Правило evidence-first: не отмечайте проверки как
Passed,DoneилиOK, пока действие реально не выполнено на целевом контуре и не приложено evidence: backup id, timestamp, ссылка на лог, скриншот, hash deploy image, вывод команды или incident note.
1. Назначение и область применения
Runbook описывает, как подготовить backup, принять rollback decision, откатить приложение или EF migrations и проверить систему после восстановления.
| Область | Входит |
|---|---|
| Контуры | Test/staging для beta/UAT, будущий production |
| Сервисы | API, Gateway, Frontend, docs portal, workers, PostgreSQL |
| Данные | Pay DB, audit evidence, bank import artifacts, deployment configuration |
| Не входит | Замена полноценного DR-плана провайдера, юридическая compliance-процедура, secret vault implementation |
2. Когда делать backup
Backup обязателен перед любым действием, которое может изменить данные, схему, config или write-path.
| Ситуация | Backup нужен | Owner | Evidence | Result |
|---|---|---|---|---|
| Перед beta/UAT release | Да | Release owner | Backup id + release tag | Not run |
| Перед production release | Да | Release owner + Operations | Backup id/location + approver | Not run |
| Перед применением EF migrations | Да | Backend owner | dotnet ef migrations list, backup id | Not run |
| Перед изменением config/env | Да, как минимум snapshot config без secret values | Operations | Redacted config snapshot | Not run |
| Перед изменением Syrve/iiko transport, credentials или worker topology | Да | Integration owner | Config diff + rollback owner | Not run |
| Перед approved production posting window | Да, плюс explicit approval | Incident commander / Product owner | Approval link + backup id | Not run |
| Перед bulk import/matching/posting операциями | Да, если операция может изменить данные массово | Feature owner | Operation plan + affected scope | Not run |
3. Что входит в backup
| Компонент | Что сохранить | Как фиксировать evidence | Notes |
|---|---|---|---|
| PostgreSQL database | Полный logical backup или provider snapshot Pay DB | Backup id, timestamp UTC, storage location, checksum если есть | Не хранить пароль в команде или docs |
| Configuration/env | Список ключей и redacted values (***) | Redacted snapshot, commit/tag deployment config | Secret values не раскрывать |
| Uploaded bank files | Внешнее хранилище или volume, если bank files вне DB | Storage snapshot id, path/prefix, retention | Не публиковать raw bank files в Plane/docs |
| Logs / audit evidence | API logs, worker logs, audit log export, incident evidence | Log query link, audit export id, screenshots | Evidence нельзя удалять при rollback |
| Release artifacts | Backend/frontend/container tags, migration list | Git hash, image digest, release notes | Нужны для отката приложения |
4. Что нельзя делать
- Нельзя удалять audit evidence, logs, posting evidence или incident attachments ради «чистого» rollback.
- Нельзя переписывать incident history. Допускаются только новые корректирующие notes с timestamp и author.
- Нельзя коммитить secrets, реальные
.env, DB passwords, JWT keys, Syrve credentials или bank files. - Нельзя восстанавливать production DB без явного rollback decision/sign-off.
- Нельзя слепо запускать
Downmigration, если она теряет данные или была написана вручную без проверки. - Нельзя отмечать smoke-check как passed без фактического evidence на целевом environment.
5. Pre-release backup checklist
Заполняйте таблицу до deploy. Result остается Not run, пока evidence не приложено.
| Check | Owner | Evidence | Result |
|---|---|---|---|
| Release tag/image digest определён | Release owner | Git hash / image digest | Not run |
| Список EF migrations для релиза зафиксирован | Backend owner | dotnet ef migrations list output | Not run |
| PostgreSQL backup создан | Operations | Backup id/location/timestamp | Not run |
| Backup доступен для restore tooling | Operations | Storage path / provider snapshot status | Not run |
| Config/env snapshot сохранён без secret values | Operations | Redacted config diff | Not run |
| Syrve always-on registration и posting safety review выполнены | Integration owner | Registration/preflight table + approval | Not run |
| Uploaded bank files storage проверен | Operations | Volume/snapshot evidence или N/A: stored in DB | Not run |
| Audit/log retention подтверждён | Operations | Log retention/evidence link | Not run |
| Rollback owner и incident commander назначены | Release owner | Decision table заполнена | Not run |
6. Release metadata / rollback decision table
| Field | Value |
|---|---|
| Release owner | |
| Rollback owner | |
| Incident commander | |
| Environment | test / staging / production |
| Release tag/image | |
| Previous known-good backend tag | |
| Previous known-good frontend tag | |
| DB backup id/location | |
| Migration list | |
| Decision time (UTC) | |
| Approver | |
| Rollback reason | |
| Evidence bundle link |
7. Rollback приложения
Используйте application rollback, когда проблема в container image, frontend bundle, gateway routing или runtime config, и DB schema/data остается совместимой.
| Step | Action | Owner | Evidence | Result |
|---|---|---|---|---|
| 1 | Stop/limit traffic: maintenance window, gateway rule, scale workers down, disable queue consumers if needed | Operations | Deployment event / gateway config | Not run |
| 2 | Stop/scale affected workers or queue consumers and restrict traffic according to incident scope | Operations + Integration owner | Deployment/queue evidence | Not run |
| 3 | Redeploy previous backend tag | Release owner | Image digest + deploy log | Not run |
| 4 | Redeploy previous frontend tag | Release owner | Image digest + deploy log | Not run |
| 5 | Verify API health: /api/health, auth, critical endpoints | QA / Operations | Curl output / screenshot | Not run |
| 6 | Verify UI health: login, dashboard, affected page | QA / Operator | Screenshot / UAT note | Not run |
| 7 | Communicate status to operators | Incident commander | Message link / timestamp | Not run |
Removed Syrve/iiko capability flags cannot be used as a kill switch. For payment incidents, stop/scale PaymentPostingWorker or queue consumers through deployment orchestration, restrict posting endpoints/traffic when needed, preserve queued work and evidence, and require incident-owner approval before resuming. For read/sync incidents, isolate the affected worker or connection rather than adding removed env gates.
8. Rollback EF migrations
Для production предпочтителен forward-fix, если это безопаснее для данных. DB rollback допускается только после анализа migration и approval.
| Step | Action | Owner | Evidence | Result |
|---|---|---|---|---|
| 1 | Freeze writes или ограничить write-path, если schema/data могут меняться | Incident commander | Worker/queue/gateway evidence | Not run |
| 2 | Identify applied migration | Backend owner | dotnet ef migrations list на целевой DB | Not run |
| 3 | Определить target migration для rollback | Backend owner | Migration names + rationale | Not run |
| 4 | Прочитать Up/Down migration и оценить потерю данных | Backend owner + DBA/Ops | Review note | Not run |
| 5 | Сделать backup перед любым DB rollback | Operations | Fresh backup id/location | Not run |
| 6 | Запустить targeted rollback только approved command | Operations + Backend owner | Command output | Not run |
| 7 | Проверить schema/data после rollback | Backend owner | DB checks + app smoke | Not run |
| 8 | Зафиксировать incident notes и follow-up Plane tasks | Incident commander | Plane links | Not run |
Шаблон команды:
bash
dotnet ef database update <PreviousSafeMigrationName> \
--project backend/src/MyHoreca.Pay.Persistence \
--startup-project backend/src/MyHoreca.Pay.ApiКоманда является шаблоном. Перед запуском укажите правильный startup project, connection string через безопасный secret channel и target environment. Не вставляйте secrets в runbook, Plane или shell history.
9. Если migration irreversible
Irreversible migration — это migration, где Down отсутствует, удаляет данные, меняет типы с потерей точности или зависит от ручных SQL steps.
Что делать:
- Не запускать
Downblindly. - Freeze writes и остановить/изолировать affected workers или queue consumers.
- Оценить forward fix или compensating migration.
- Использовать restored backup только после explicit production rollback decision/sign-off.
- Сохранить все logs, audit evidence, migration output и operator reports.
- Создать follow-up Plane tasks: root cause, data repair, migration hardening, automated test gap.
Decision table:
| Option | Когда выбирать | Approval | Evidence |
|---|---|---|---|
| Forward fix | Данные целы, schema можно расширить/исправить новой migration | Engineering + Operations | Fix migration PR/commit |
| Compensating migration | Нужно восстановить derived/index/config state без full restore | Engineering + DBA/Ops | Migration review |
| Restore backup | Данные повреждены или schema rollback невозможен | Incident commander + Product/Business approver | Backup id + approval |
10. Post-rollback smoke-check
Минимальный smoke-check после rollback. Не отмечайте Passed без evidence.
| Check | Owner | Evidence | Result |
|---|---|---|---|
| Login работает | QA / Operator | Screenshot + GET /api/auth/me status | Not run |
| Dashboard открывается | QA / Operator | Screenshot | Not run |
| Bank imports list открывается | QA / Operator | Screenshot / API status | Not run |
| Upload disabled/enabled согласно настройкам | QA / Operations | UI screenshot + config evidence | Not run |
| Последний import detail открывается | QA / Operator | importId + screenshot | Not run |
| Quality report открывается | QA / Operator | quality report screenshot/API status | Not run |
| Matching page открывается | QA / Operator | Screenshot | Not run |
| Allocations list открывается | QA / Operator | Screenshot | Not run |
| Syrve connection health endpoint отвечает | Integration owner | GET /api/syrve/connections/{id}/health output | Not run |
| Audit log открывается | QA / Operator | Screenshot / API status | Not run |
11. MHPAY-28 import health smoke
MHPAY-28 добавил aggregate monitoring endpoint для bank imports. После rollback или restore проверьте, что он не раскрывает sensitive bank data.
| Check | Owner | Evidence | Result |
|---|---|---|---|
GET /api/bank-statements/import-health-summary?organizationId=&locationId= отвечает | QA / Operations | HTTP status + sanitized response | Not run |
| Response aggregate-only | QA / Security reviewer | No raw descriptions/references/account numbers/file content/raw JSON | Not run |
| Scoping по organization/location не нарушен | QA / Backend owner | Два scoped запроса или tenant test evidence | Not run |
| Raw filenames / bank transaction data не появляются в logs | Operations / Security reviewer | Log query link / redacted excerpt | Not run |
Пример проверки без secret/token в документах:
bash
curl -sS "$API_BASE/api/bank-statements/import-health-summary?organizationId=<org-id>&locationId=<location-id>" \
-H "Authorization: Bearer <redacted-token>"Не сохраняйте bearer token в evidence.
12. Incident notes template
Скопируйте шаблон в Plane comment или incident doc. Не редактируйте старые notes; добавляйте новые записи.
md
## Incident notes
### Timeline
| Time UTC | Actor | Event | Evidence |
|----------|-------|-------|----------|
| | | | |
### Impact
- Environment:
- Users/organizations/locations affected:
- Data affected:
- Customer-visible symptoms:
### Symptoms
- API/UI behavior:
- Logs/metrics:
- First detection source:
### Decisions
| Time UTC | Decision | Owner | Approver | Evidence |
|----------|----------|-------|----------|----------|
| | | | | |
### Commands run
| Time UTC | Command | Environment | Actor | Result / evidence |
|----------|---------|-------------|-------|-------------------|
| | | | | |
### Evidence links
- Backup:
- Logs:
- Screenshots:
- Deploy events:
- DB checks:
### Data affected
- Tables/entities:
- Time window:
- Repair/restore status:
### Follow-up Plane issues
- MHPAY-:13. Command matrix
Команды ниже являются шаблонами. Выполняйте их только в правильном окружении, с согласованными credentials и после approval. Не вставляйте реальные secrets в команду, docs, Plane или screenshots.
| Command template | Working directory | Purpose | Required approval | Evidence |
|---|---|---|---|---|
pg_dump --format=custom --file=<backup-file>.dump --dbname=<redacted-connection-url> | Secure ops shell | PostgreSQL logical backup | Operations | Backup id/location/checksum |
pg_restore --clean --if-exists --dbname=<redacted-target-db> <backup-file>.dump | Secure ops shell | Restore PostgreSQL backup | Incident commander + approver | Restore output + DB checks |
dotnet ef migrations list --project backend/src/MyHoreca.Pay.Persistence --startup-project backend/src/MyHoreca.Pay.Api | repo root / deploy shell | Identify migrations | Backend owner | Command output |
dotnet ef database update <MigrationName> --project backend/src/MyHoreca.Pay.Persistence --startup-project backend/src/MyHoreca.Pay.Api | repo root / deploy shell | Apply/rollback to target migration | Backend owner + Operations | Command output |
docker compose pull && docker compose up -d api gateway frontend | deployment host | Redeploy selected services | Release owner | Deploy log |
kubectl rollout undo deployment/<name> --to-revision=<revision> | cluster ops shell | Rollback container deployment | Operations | Rollout status |
curl -f "$API_BASE/api/health" | ops shell | API health check | QA/Ops | HTTP status/output |
cd docs && npm run build | docs/ | Verify docs portal | Documentation owner | Build output |
14. Связанные документы
- Release Checklist
- UAT Checklist
- Production Readiness Report
- Environment Variables
- Backend API
- Current Implementation State
Sign-off после rollback
| Role | Name | Date/time UTC | Decision | Evidence |
|---|---|---|---|---|
| Incident commander | ||||
| Release owner | ||||
| Rollback owner | ||||
| Operations | ||||
| Product / Business approver |
Rollback считается завершенным только после заполненного smoke-check, сохраненного evidence bundle и созданных follow-up Plane issues.