Files
admin/.tasks/mssql-minio-migration-to-vds.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

7.9 KiB
Raw Blame History

mssql-minio-migration-to-vds

Goal

Перенести MSSQL контейнер + MinIO с ../entities/windows-recovery-host на ../entities/vds-kzntsv чтобы:

  1. Снять SPOF с windows-recovery-host (домашняя машина) для критических CMS-данных
  2. Achieve target RPO 1ч через подключение к существующему vds-backup-rsync-kreknin pipeline (tx log backups каждые 60 мин в существующий rsync→kreknin)
  3. Унифицировать DB park — MSSQL рядом с pg/maria/mongo/redis в /opt/stacks/databases/
  4. Подготовить 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, volume mssql_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,1433Data Source=mssql.vds.kzntsv.site,1433 (через traefik raw-TCP passthrough)
    • MinIO: endpoint localhost:9000minio.vds.kzntsv.site:9000
  • 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

  1. 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)
  2. MinIO на VDS запущен, content мигрирован (mc mirror от source к target)
  3. CMS connection strings updated в web.config (или эквиваленте), sites функциональны (smoke test 8 hosts: 200 OK + asset loading + admin/assets/getList — это известный hot-path)
  4. Pre-cutover benchmark выполнен — admin assets UI / search / catalog response times измерены до и после миграции, latency degradation <2x (target). Если worse — discussed с user перед commit'ом cutover (возможно retreat или оптимизация query patterns)
  5. 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)
  6. ntfy push verified для расширенного pipeline (включает MSSQL+MinIO size/duration)
  7. cms-stopgap-backup-daily cron на windows-host отключён после первого успешного VDS-pipeline run (atomic swap, не parallel-running, чтобы не оставлять confusing-state двух pipelines)
  8. 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 approachmc mirror overnight (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.