STATUS.md cleanup: - 25 🟢 closed task blocks moved to new .tasks/ARCHIVE.md (append-only history; per-task <slug>.md остаются in-place в .tasks/ root). - STATUS.md now 6 KB instead of 78 KB — board показывает только active (🔴/🟡), ready (⚪), blocked (🔵). - Header refreshed с current scope summary. Re-scope: cms-stopgap-backup-daily → windows-host-fallback-backup-daily - Original spec: "временный stop-gap до migration MSSQL/MinIO на VDS" - Reality (2026-05-24): MSSQL+sites уже мигрированы и прикрыты backup'ами (vds-backup-rsync-kreknin 🟢 + ruvds-backup-daily-kreknin 🟢) - New purpose (user-decision): windows-host остаётся warm-standby для DR (failover при потере VDS/RUVDS), backup pipeline нужен чтобы failover не возвращал stale state. - Also: CMS image-rendering хардкодит imgproxy.kzntsv.site через DLL → windows-host MinIO/imgproxy — active dependency даже после primary cutover, не "standby". Backup критично для image-pipeline DR. - Tool: rclone same pattern как ruvds-backup-daily-kreknin 🟢 iis-migration-to-ruvds scope narrow: - tandemmebel.ru + www.tandemmebel.ru EXCLUDED из cutover (user-decision) - Остаются на windows-IIS:8089 неопределённо - Cert на RUVDS уже импортирован, HTTPS binding existing — idle, traffic не пойдёт пока DNS не flipped. Source IIS snolla site нельзя decommission'ить полностью пока tandemmebel на нём же (catch-all). - Scope теперь 24 hostnames для migration (вместо 26). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.0 KiB
windows-host-fallback-backup-daily
Goal
Ежедневный backup ../entities/windows-recovery-host (DESKTOP-NSEF0UK) → ../entities/kreknin-synology чтобы windows-host оставался готовым принять prod трафик если VDS или RUVDS теряем.
Текущая архитектура после iis-migration-to-ruvds:
- Active prod = RUVDS (IIS) + VDS (MSSQL, MinIO standby, Gitea, Verdaccio, Registry, ntfy, oCIS)
- Warm standby = windows-host (IIS:8089 + MSSQL container + MinIO container + traefik routes) — всё установлено и работает, но не получает live traffic после DNS swap.
Если RUVDS или VDS падают — поднимаем DNS обратно на windows-host (94.19.247.14) → traefik routes уже live → IIS:8089 → CMS + MSSQL + MinIO localhost-stack.
Чтобы это failover реально работал, нужен ongoing daily backup данных на windows-host. Иначе через месяц simmering windows-host'а его state diverged от prod (image uploads через RUVDS не отражаются на windows-host MinIO, новые DB записи через VDS MSSQL не приходят на windows-host MSSQL). Failover при этом = откат к stale state.
Этот backup решает другую задачу:
- Не "primary backup of windows-host" (windows-host = standby, не prod source-of-truth) — для prod-data primary backup'и это
vds-backup-rsync-kreknin🟢 (VDS) +ruvds-backup-daily-kreknin🟢 (RUVDS). - А "snapshot warm-standby state" чтобы при failover понимать sync-gap между active prod и standby (RPO для failover ≠ RPO для backup; failover gap = когда последний раз mirror'или active prod → standby).
Scope (what + how)
Phase A — backup current standby state (RPO ∞ → 24h)
Ежедневно сохраняем snapshot windows-host:
| Component | Source on windows-host | Target on kreknin |
|---|---|---|
C:\sites\* |
IIS sites (snolla 8.66 GB + stostayer + stostayer.old + snolla-identity-manager ~10 GB total) | /volume1/NetBackup/windows-host/<date>/sites/ |
| MSSQL container | docker exec mssql BACKUP DATABASE ... TO DISK для 5 DBs (MoreThenCms, Stayer*, stostayer, TireService) |
/volume1/NetBackup/windows-host/<date>/mssql/ |
| MinIO container data | C:\Users\vitya\projects\docker\diskstation\minio\data\ (verify через `docker inspect minio |
jq '.Mounts'`) |
| traefik config + acme.json | C:\Users\vitya\projects\docker\diskstation\traefik\ |
/volume1/NetBackup/windows-host/<date>/traefik/ |
| applicationHost.config | C:\Windows\System32\inetsrv\config\applicationHost.config |
/volume1/NetBackup/windows-host/<date>/iis-config/ |
Tool: PowerShell + rclone SFTP (тот же pattern что ruvds-backup-daily-kreknin 🟢; rclone единый binary, ssh-keys в C:\ProgramData\backup\).
Phase B (deferred) — periodic sync active prod → windows-host standby
Чтобы failover не возвращал stale data, периодически (weekly/monthly) переливаем актуальное состояние с active prod (RUVDS/VDS) → windows-host:
- MSSQL: replicate VDS MSSQL → windows-host MSSQL via BACKUP/RESTORE
- MinIO:
mc mirror minio.kzntsv.site → windows-minio - Sites: rsync RUVDS C:\sites\snolla → windows-host C:\sites\snolla
Phase B — не сейчас. Сначала Phase A; через 1-2 недели понять насколько diverged будет state.
Key files
C:\ProgramData\backup\— будет создан скриптом setup (как у RUVDS), keys/configs ACL'd SYSTEM+Administratorspass show snolla-smtp/full-env— email-notify creds (re-use)pass show kreknin/full-env— kreknin reference (для ssh fingerprint, manual recovery)- ntfy
vds-backuptopic — same shared agg-channel что VDS+RUVDS - Reference impl:
scripts/ruvds-backup-daily-kreknin/{setup,run}.ps1— копировать паттерн, адаптировать paths
Acceptance
- ScheduledTask
WindowsHost-Backup-Dailydaily ~03:00 MSK (раньше VDS 05:00 и RUVDS 04:30 — порядок: windows 03:00 → RUVDS 04:30 → VDS 05:00, чтобы snapshots аккумулировались sequentially на kreknin). - Все 5 components на kreknin
/volume1/NetBackup/windows-host/<date>/. - Retention 7 daily snapshots (как у других).
- Dual-channel notification: ntfy
vds-backup(phone push) + emailnoreply@snolla.com → vitya.kuznetsov@gmail.com. - Smoke recovery test (одноразовый): restore MSSQL
.bakв чистый container на VM,SELECT TOP 1 ... FROM Articlesworks. - README в
scripts/windows-host-fallback-backup-daily/с атомным revert.
Decisions log
- 2026-05-21: task создана как
cms-stopgap-backup-daily— Фаза 1 backup до migration MSSQL/MinIO на VDS, scope = временный pipeline. - 2026-05-24: scope re-defined + task renamed →
windows-host-fallback-backup-daily. Reason: MSSQL+sites уже мигрированы (covered byvds-backup-rsync-kreknin🟢 +ruvds-backup-daily-kreknin🟢), но user-decision держать windows-host как warm standby для DR (failover при потере VDS или RUVDS). Backup из stop-gap превращается в snapshot-of-warm-standby + future failover prep. - 2026-05-24: tool = rclone (же что RUVDS backup, не rsync). Reasoning: тот же proven pattern, нет лишних установок.
- 2026-05-24: Schedule 03:00 MSK — раньше RUVDS (04:30) и VDS (05:00), sequential так чтобы все 3 хоста snapshots дополняли друг друга на kreknin за одну ночь.
Open questions
- Точная location MinIO data dir на windows-host —
docker inspect minio | ConvertFrom-Json | %{ $_[0].Mounts }(PowerShell-version of jq). - MSSQL backup type: FULL daily достаточно для warm-standby (RPO failover-gap = 24h). Differential / tx-log оставить для Phase B.
- Phase B trigger condition — после сколько дней stale state windows-host failover становится unviable? Probably 7-14 days. Decision postpone после первой недели Phase A.
- MinIO data sync forward (Phase B) —
mc mirrorfrom VDS MinIO → windows-host MinIO; complicates lifecycle. Postpone. - Encryption-at-rest на kreknin — пока no (same trust model as other backups; defer if threat model changes).
Completed steps
(none yet)
Notes
- Это не "primary backup" CMS data — primary backup =
ruvds-backup-daily-kreknin🟢 для sites +vds-backup-rsync-kreknin🟢 для MSSQL/MinIO. Этот pipeline = warm-standby snapshot для DR scenario. - Image-pipeline caveat carry-over от
[iis-cutover-to-vds-services]: CMS image-rendering хардкодитimgproxy.kzntsv.siteчерез DLL. Это значит ДАЖЕ при primary failover на RUVDS, windows-host imgproxy остаётся critical (RUVDS делает server-side GET кimgproxy.kzntsv.site). Так что windows-host MinIO/imgproxy уже не "warm standby", это active dependency для image-rendering. Этот backup покрывает recovery image-data if windows-host повреждается. - Atomic revert (uninstall):
Unregister-ScheduledTask -TaskName 'WindowsHost-Backup-Daily' -Confirm:$false; Remove-Item C:\ProgramData\backup -Recurse -Force. На kreknin: keep snapshots as archive (read-only after revert).