# 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//` (создать), 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\\` - rsync `D:\backup\mssql\` → `kreknin:/volume1/NetBackup/windows-cms//mssql/` - rsync `C:\sites\` → `kreknin:/volume1/NetBackup/windows-cms//sites/` - rsync MinIO data dir → `kreknin:/volume1/NetBackup/windows-cms//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).