Files
admin/.tasks/cms-stopgap-backup-daily.md
vitya fd8bb13e75 resilience(roadmap): workshop pass 1 — close design-task; file top-3 impl-tasks
- close [resilience-roadmap-design] 🟢 — roadmap expanded via interactive workshop
  with user (per-service RTO/RPO matrix for 10 services, CMS backup 2-phase plan,
  IIS migration track, 4 secondary topics documented as recommendations)
- file 3 impl-tasks  ready (spawned by roadmap-design):
  - cms-stopgap-backup-daily — Phase 1, plug RPO=∞ via daily rsync to kreknin
  - mssql-minio-migration-to-vds — Phase 2 enabler, achieves RPO 1h target
  - windows-hosting-vendor-research — design-task for IIS migration off home host
- unblock [admin-infra-project-review] 🔵 (last blocker cleared)
- expand .wiki/concepts/future-resilient-architecture-goals.md with §Workshop pass 1
  (canonical) above original §Pre-workshop placeholder (historical)

Key user-decisions zafiksirovany in workshop:
- CMS RTO 4h / RPO 1h (not 1h/15min — overkill for one-person infra)
- MSSQL+MinIO migrate to VDS (not Windows-side managed hosting)
- MSSQL Always-On AG rejected — log shipping every 60min sufficient
- IIS long-term dies with snolla-on-node; transitional via managed Windows host
- Cloud off-site = Yandex Object Storage when needed (kreknin already off-site)
- Monitoring = Uptime Kuma on VDS, high-priority among not-filed

Acceptance per spec (user confirmed plan + concrete impl-tasks top-3 + doc committed) — met.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 16:25:04 +03:00

42 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# cms-stopgap-backup-daily
## Goal
Plug текущую дыру **RPO=∞** для CMS прод. CMS sites + MSSQL + MinIO на [[windows-recovery-host]] не имеют бэкапов нового состояния с 2026-05-19 (последний Hyper Backup был 2026-05-09 на мёртвой синке). Если windows-host сгорит сейчас — теряем всё.
Stop-gap: ежедневный rsync на [[kreknin-synology]] (RPO факт = 24ч) до пока MSSQL/MinIO не переедут на VDS через [[mssql-minio-migration-to-vds]], где backup'ы будут через существующий `vds-backup-rsync-kreknin` pipeline (RPO 1ч target).
**Это временное решение** — pipeline списывается после Фазы 2. Поэтому **не строить ничего изощрённого**: cron + rsync + ssh-pipe, паттерн уже работает на VDS.
## Key files
- `C:\sites\*` — IIS site directories (snolla, stostayer, stostayer.old)
- MSSQL container на windows-host, port 1433 — backup через `docker exec mssql /opt/mssql-tools/bin/sqlcmd ... BACKUP DATABASE ... TO DISK = '/var/opt/mssql/backup/...'`, потом скопировать `.bak` файлы из volume `mssql_mssql_data` на host
- MinIO data dir — `C:\Users\vitya\projects\docker\diskstation\minio\data\` (verify on impl)
- Target: `kreknin.site:/volume1/NetBackup/windows-cms/<DATE>/` (создать), retention 7 daily snapshots
- SSH key: `~/.ssh/id_ed25519_kreknin` (vitya@195.19.90.188), пароль см. [[../entities/kreknin-synology]]
- Notify: ntfy `vds-ops` topic (`https://ntfy.vds.kzntsv.site/vds-ops`, auth vitya/Pryakhin9, см. [[../entities/vds-kzntsv]])
## Acceptance
1. Daily ~03:00 MSK cron (Windows Task Scheduler) на windows-host выполняет:
- MSSQL FULL backup всех 5 prod DBs (MoreThenCms, Stayer*, stostayer, TireService) → `D:\backup\mssql\<DATE>\`
- rsync `D:\backup\mssql\``kreknin:/volume1/NetBackup/windows-cms/<DATE>/mssql/`
- rsync `C:\sites\``kreknin:/volume1/NetBackup/windows-cms/<DATE>/sites/`
- rsync MinIO data dir → `kreknin:/volume1/NetBackup/windows-cms/<DATE>/minio/`
2. ntfy push на `vds-ops` topic с status (success/failure + total size + duration)
3. Retention: 7 daily snapshots на kreknin (старше — auto-delete через script или kreknin-side cron)
4. **Smoke recovery test:** на отдельной машине / VM загрузить MSSQL backup в чистый MSSQL container, проверить что хотя бы одна DB readable (`SELECT TOP 1 ... FROM Articles` или эквивалент)
5. Documented in `.wiki/concepts/cms-stopgap-backup-pipeline.md` (создать) с atomic revert recipe
## Decisions log
- 2026-05-21: создана как **Фаза 1** из roadmap-workshop'а (см. [[../.wiki/concepts/future-resilient-architecture-goals]] §"CMS backup pipeline — 2-фазный план"). User-decision: не строить proper RPO 1ч pipeline на windows-host т.к. MSSQL/MinIO мигрируют на VDS в обозримом (2-4 недели). Этот pipeline = bridge, не target-state.
## Open questions
- [ ] Точное location MinIO data dir на windows-host — узнать на ходу через `docker inspect minio | jq '.Mounts'`
- [ ] Windows Task Scheduler vs WSL cron для расписания — TBD на impl (Task Scheduler нативнее, WSL даёт привычные bash-скрипты)
- [ ] Encryption бэкапов at-rest перед отправкой на kreknin — defer (kreknin наш host под нашим контролем)
- [ ] MSSQL backup — full ежедневно или differential? Full ~~достаточно для RPO 24ч stop-gap; tx-log backups оставляем на Фазу 2 для RPO 1ч
## Notes
Паттерн `vds-backup-rsync-kreknin` ([[../.tasks/vds-backup-rsync-kreknin]]) — reference implementation на VDS-стороне. Адаптировать на Windows: PowerShell вместо bash, rsync.exe (через Git Bash или Cygwin), SSH-ключ Windows path.
Atomic revert: `Unregister-ScheduledTask -TaskName "cms-stopgap-backup" -Confirm:$false; Remove-Item D:\backup\mssql\* -Recurse`. На kreknin: backup snapshots оставить как archive (read-only после revert).