- 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>
7.9 KiB
7.9 KiB
mssql-minio-migration-to-vds
Goal
Перенести MSSQL контейнер + MinIO с ../entities/windows-recovery-host на ../entities/vds-kzntsv чтобы:
- Снять SPOF с windows-recovery-host (домашняя машина) для критических CMS-данных
- Achieve target RPO 1ч через подключение к существующему
vds-backup-rsync-krekninpipeline (tx log backups каждые 60 мин в существующий rsync→kreknin) - Унифицировать DB park — MSSQL рядом с pg/maria/mongo/redis в
/opt/stacks/databases/ - Подготовить ground для будущего IIS migration на managed Windows hosting (windows-hosting-vendor-research → impl-таска позже)
Это Фаза 2 roadmap'а CMS backup'ов. После завершения — списать cms-stopgap-backup-daily pipeline.
Key files / refs
- Source MSSQL: docker container на windows-host, image
mcr.microsoft.com/mssql/server:2019-latest, volumemssql_mssql_data, 5 production DBs (MoreThenCms, Stayer*, stostayer, TireService) — см. ../.wiki/concepts/recovery-architecture-snapshot §"Запущенные docker контейнеры" - Source MinIO: docker container на windows-host, image
minio/minio:RELEASE.2020-07-13T18-09-56Z, volume bind./data - Target MSSQL:
/opt/stacks/databases/mssql/{data,certs,docker-compose.yml}на VDS — паттерн как у existing DBs, см. ../.wiki/entities/vds-kzntsv - Target MinIO:
/opt/stacks/storage/minio/(новый stack на VDS) - CMS connection strings (изменить):
- MSSQL:
Data Source=localhost,1433→Data Source=mssql.vds.kzntsv.site,1433(через traefik raw-TCP passthrough) - MinIO: endpoint
localhost:9000→minio.vds.kzntsv.site:9000
- MSSQL:
- Existing backup pipeline для расширения:
/opt/stacks/backup/scripts/run.shна VDS (см. ../.tasks/vds-backup-rsync-kreknin — 🟢 done) - TLS pattern: self-signed certs через traefik raw-TCP passthrough, см. ../.wiki/concepts/db-tls-self-signed-via-traefik-raw-tcp + ../.wiki/concepts/traefik-tcp-passthrough-vs-starttls
Acceptance
- MSSQL container на VDS запущен, 5 prod DBs восстановлены (cold cutover: stop CMS app pool → backup MSSQL host-side → restore on VDS → repoint connection strings → start CMS app pool)
- MinIO на VDS запущен, content мигрирован (
mc mirrorот source к target) - CMS connection strings updated в web.config (или эквиваленте), sites функциональны (smoke test 8 hosts: 200 OK + asset loading + admin/assets/getList — это известный hot-path)
- Pre-cutover benchmark выполнен — admin assets UI / search / catalog response times измерены до и после миграции, latency degradation <2x (target). Если worse — discussed с user перед commit'ом cutover (возможно retreat или оптимизация query patterns)
- Backup pipeline на VDS расширен: добавлены в
run.sh:mssql_dump_fullежедневно (как pg_dumpall pattern)mssql_tx_log_backupежечасно (новая нога —BACKUP LOGчерезdocker exec mssql sqlcmd ...)minio_mirrorежедневно (mc mirrorлибо rsync data dir)
- ntfy push verified для расширенного pipeline (включает MSSQL+MinIO size/duration)
cms-stopgap-backup-dailycron на windows-host отключён после первого успешного VDS-pipeline run (atomic swap, не parallel-running, чтобы не оставлять confusing-state двух pipelines)- Documented в ../.wiki/concepts/mssql-minio-on-vds (создать) с:
- architecture diagram (IIS → traefik VDS → MSSQL/MinIO containers)
- rollback recipe (если cutover failed — vernut' connection strings + reactivate stop-gap pipeline)
- migration runbook (что делал, в каком порядке)
Decisions log
- 2026-05-21: создана из roadmap-workshop'а (../.wiki/concepts/future-resilient-architecture-goals §Фаза 2). User-confirmed: MSSQL+MinIO мигрируют на VDS (vs alternative — оставить на managed Windows host рядом с IIS). Reasons:
- DB park уже на VDS, unified backup operation
- Linux containers стабильнее и дешевле в обслуживании чем Windows-side MSSQL
- VDS уже работает, не плодим хосты
- Подготавливает ground для IIS-migration (после неё IIS host сможет быть thin — только web layer)
Open questions
- MSSQL Express vs Developer vs Standard на Linux container — TBD по licensing. Production size MoreThenCms — проверить, помещается ли в Express limits (10GB per DB, 1410MB RAM). Если нет — Developer (бесплатно для non-prod, формально не для прод) или Standard (
). Альтернатива — migration MSSQL → PostgreSQL (упомянуто в roadmap как long-term option) — отдельный major project. - MinIO migration approach —
mc mirrorovernight (zero-downtime если кратко) или maintenance window (cleaner)? - Cutover timing — нужен ли downtime window клиентам, или можно zero-downtime через MSSQL log shipping (source → target replay, потом final switch)?
- CMS connection-string change — где живёт config (web.config? отдельный appsettings? hardcoded в DLL?). Если hardcoded — нужен DLL rebuild который требует build env, отложен в ../.wiki/concepts/cms-admin-assets-root-folder-seed §"Долгосрочный TODO"
- Hermes service на windows-host? (упомянут как defer в ../.wiki/entities/vds-kzntsv Open issues) — проверить не зависит ли от MSSQL/MinIO, если да — мигрируется заодно или ломается
Risks
- WAN latency IIS→MSSQL: теперь 10-30ms vs localhost. Большинство CMS-операций batchey, не latency-sensitive. Pre-cutover benchmark обязателен для hot-paths (admin assets UI / search / каталоги) — flag если round-trip-heavy. См. acceptance item 4.
- MSSQL Linux compat: некоторые edge-case T-SQL features differ (CLR, FileStream, full-text search). Smoke test обязателен —
EXEC sp_helpdb+ проверить что нет CLR assemblies / FileStream filegroups в prod DBs. - TLS overhead: rawTCP through traefik adds minor latency vs direct connection. Negligible (<1ms) но проверить.
- Cutover rollback: если CMS не работает после repoint — quick revert connection strings возможен только если MSSQL на windows-host оставлен running parallel ~24-48ч после cutover. План: stop receiving writes на windows-MSSQL (read-only), но container running, для emergency rollback. Через 48ч uptime — stop windows-MSSQL container, через неделю —
docker rm + docker volume rm.
Notes
Эта таска — major (1-2 недели работы realistic). Можно разбить на sub-phases при impl: (a) MSSQL container deploy + restore from backup, (b) connection string change + smoke, (c) MinIO migration, (d) backup pipeline integration. Каждая sub-phase = свой commit с atomic revert recipe.
Atomic revert (full): revert CMS web.config → windows-host MSSQL/MinIO; восстановить cms-stopgap-backup-daily cron; на VDS — docker compose down -v для mssql + minio stacks; удалить новые ноги из run.sh.