- 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>
42 lines
4.3 KiB
Markdown
42 lines
4.3 KiB
Markdown
# 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).
|