Skip to content

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 нуженOwnerEvidenceResult
Перед beta/UAT releaseДаRelease ownerBackup id + release tagNot run
Перед production releaseДаRelease owner + OperationsBackup id/location + approverNot run
Перед применением EF migrationsДаBackend ownerdotnet ef migrations list, backup idNot run
Перед изменением config/envДа, как минимум snapshot config без secret valuesOperationsRedacted config snapshotNot run
Перед изменением Syrve/iiko transport, credentials или worker topologyДаIntegration ownerConfig diff + rollback ownerNot run
Перед approved production posting windowДа, плюс explicit approvalIncident commander / Product ownerApproval link + backup idNot run
Перед bulk import/matching/posting операциямиДа, если операция может изменить данные массовоFeature ownerOperation plan + affected scopeNot run

3. Что входит в backup ​

КомпонентЧто сохранитьКак фиксировать evidenceNotes
PostgreSQL databaseПолный logical backup или provider snapshot Pay DBBackup id, timestamp UTC, storage location, checksum если естьНе хранить пароль в команде или docs
Configuration/envСписок ключей и redacted values (***)Redacted snapshot, commit/tag deployment configSecret values не раскрывать
Uploaded bank filesВнешнее хранилище или volume, если bank files вне DBStorage snapshot id, path/prefix, retentionНе публиковать raw bank files в Plane/docs
Logs / audit evidenceAPI logs, worker logs, audit log export, incident evidenceLog query link, audit export id, screenshotsEvidence нельзя удалять при rollback
Release artifactsBackend/frontend/container tags, migration listGit 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.
  • Нельзя слепо запускать Down migration, если она теряет данные или была написана вручную без проверки.
  • Нельзя отмечать smoke-check как passed без фактического evidence на целевом environment.

5. Pre-release backup checklist ​

Заполняйте таблицу до deploy. Result остается Not run, пока evidence не приложено.

CheckOwnerEvidenceResult
Release tag/image digest определёнRelease ownerGit hash / image digestNot run
Список EF migrations для релиза зафиксированBackend ownerdotnet ef migrations list outputNot run
PostgreSQL backup созданOperationsBackup id/location/timestampNot run
Backup доступен для restore toolingOperationsStorage path / provider snapshot statusNot run
Config/env snapshot сохранён без secret valuesOperationsRedacted config diffNot run
Syrve always-on registration и posting safety review выполненыIntegration ownerRegistration/preflight table + approvalNot run
Uploaded bank files storage проверенOperationsVolume/snapshot evidence или N/A: stored in DBNot run
Audit/log retention подтверждёнOperationsLog retention/evidence linkNot run
Rollback owner и incident commander назначеныRelease ownerDecision table заполненаNot run

6. Release metadata / rollback decision table ​

FieldValue
Release owner
Rollback owner
Incident commander
Environmenttest / 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 остается совместимой.

StepActionOwnerEvidenceResult
1Stop/limit traffic: maintenance window, gateway rule, scale workers down, disable queue consumers if neededOperationsDeployment event / gateway configNot run
2Stop/scale affected workers or queue consumers and restrict traffic according to incident scopeOperations + Integration ownerDeployment/queue evidenceNot run
3Redeploy previous backend tagRelease ownerImage digest + deploy logNot run
4Redeploy previous frontend tagRelease ownerImage digest + deploy logNot run
5Verify API health: /api/health, auth, critical endpointsQA / OperationsCurl output / screenshotNot run
6Verify UI health: login, dashboard, affected pageQA / OperatorScreenshot / UAT noteNot run
7Communicate status to operatorsIncident commanderMessage link / timestampNot 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.

StepActionOwnerEvidenceResult
1Freeze writes или ограничить write-path, если schema/data могут менятьсяIncident commanderWorker/queue/gateway evidenceNot run
2Identify applied migrationBackend ownerdotnet ef migrations list на целевой DBNot run
3Определить target migration для rollbackBackend ownerMigration names + rationaleNot run
4Прочитать Up/Down migration и оценить потерю данныхBackend owner + DBA/OpsReview noteNot run
5Сделать backup перед любым DB rollbackOperationsFresh backup id/locationNot run
6Запустить targeted rollback только approved commandOperations + Backend ownerCommand outputNot run
7Проверить schema/data после rollbackBackend ownerDB checks + app smokeNot run
8Зафиксировать incident notes и follow-up Plane tasksIncident commanderPlane linksNot 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.

Что делать:

  • Не запускать Down blindly.
  • 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Когда выбиратьApprovalEvidence
Forward fixДанные целы, schema можно расширить/исправить новой migrationEngineering + OperationsFix migration PR/commit
Compensating migrationНужно восстановить derived/index/config state без full restoreEngineering + DBA/OpsMigration review
Restore backupДанные повреждены или schema rollback невозможенIncident commander + Product/Business approverBackup id + approval

10. Post-rollback smoke-check ​

Минимальный smoke-check после rollback. Не отмечайте Passed без evidence.

CheckOwnerEvidenceResult
Login работаетQA / OperatorScreenshot + GET /api/auth/me statusNot run
Dashboard открываетсяQA / OperatorScreenshotNot run
Bank imports list открываетсяQA / OperatorScreenshot / API statusNot run
Upload disabled/enabled согласно настройкамQA / OperationsUI screenshot + config evidenceNot run
Последний import detail открываетсяQA / OperatorimportId + screenshotNot run
Quality report открываетсяQA / Operatorquality report screenshot/API statusNot run
Matching page открываетсяQA / OperatorScreenshotNot run
Allocations list открываетсяQA / OperatorScreenshotNot run
Syrve connection health endpoint отвечаетIntegration ownerGET /api/syrve/connections/{id}/health outputNot run
Audit log открываетсяQA / OperatorScreenshot / API statusNot run

11. MHPAY-28 import health smoke ​

MHPAY-28 добавил aggregate monitoring endpoint для bank imports. После rollback или restore проверьте, что он не раскрывает sensitive bank data.

CheckOwnerEvidenceResult
GET /api/bank-statements/import-health-summary?organizationId=&locationId= отвечаетQA / OperationsHTTP status + sanitized responseNot run
Response aggregate-onlyQA / Security reviewerNo raw descriptions/references/account numbers/file content/raw JSONNot run
Scoping по organization/location не нарушенQA / Backend ownerДва scoped запроса или tenant test evidenceNot run
Raw filenames / bank transaction data не появляются в logsOperations / Security reviewerLog query link / redacted excerptNot 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 templateWorking directoryPurposeRequired approvalEvidence
pg_dump --format=custom --file=<backup-file>.dump --dbname=<redacted-connection-url>Secure ops shellPostgreSQL logical backupOperationsBackup id/location/checksum
pg_restore --clean --if-exists --dbname=<redacted-target-db> <backup-file>.dumpSecure ops shellRestore PostgreSQL backupIncident commander + approverRestore output + DB checks
dotnet ef migrations list --project backend/src/MyHoreca.Pay.Persistence --startup-project backend/src/MyHoreca.Pay.Apirepo root / deploy shellIdentify migrationsBackend ownerCommand output
dotnet ef database update <MigrationName> --project backend/src/MyHoreca.Pay.Persistence --startup-project backend/src/MyHoreca.Pay.Apirepo root / deploy shellApply/rollback to target migrationBackend owner + OperationsCommand output
docker compose pull && docker compose up -d api gateway frontenddeployment hostRedeploy selected servicesRelease ownerDeploy log
kubectl rollout undo deployment/<name> --to-revision=<revision>cluster ops shellRollback container deploymentOperationsRollout status
curl -f "$API_BASE/api/health"ops shellAPI health checkQA/OpsHTTP status/output
cd docs && npm run builddocs/Verify docs portalDocumentation ownerBuild output

14. Связанные документы ​

Sign-off после rollback ​

RoleNameDate/time UTCDecisionEvidence
Incident commander
Release owner
Rollback owner
Operations
Product / Business approver

Rollback считается завершенным только после заполненного smoke-check, сохраненного evidence bundle и созданных follow-up Plane issues.