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

4.3 KiB
Raw Blame History

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).