Domain migration: synvirt.mx → synvirt.io (2026-10-15)
Synced read-only from
/home/synvirt/synvirt-platform/docs-internal/runbooks/domain-migration-2026-10-15.md. Edit at the source, not here.
Domain migration: synvirt.mx → synvirt.io (2026-10-15)
Section titled “Domain migration: synvirt.mx → synvirt.io (2026-10-15)”Owner instruction (2026-10-15): the server moves from synvirt.mx to
synvirt.io; the owner handles the .mx → .io redirect in Cloudflare. This
runbook records what was changed, what still needs the owner, and how to roll
back.
Done in the working tree (no commit — commits are not authorised)
Section titled “Done in the working tree (no commit — commits are not authorised)”| Area | Change |
|---|---|
infra/caddy/Caddyfile.dev (the mounted one) |
All vhosts renamed to .io; new legacy_mx snippet: every .mx name keeps its Let’s Encrypt cert and answers 301 https://<same host>.synvirt.io{uri}. Validated with caddy validate. |
infra/caddy/Caddyfile.prod, Dockerfile |
Names/comments to .io. |
infra/compose/compose.yaml |
WP_HOME, WP_SITEURL, SYNVIRT_CDN_URL → .io. Takes effect on container recreate. |
.env, infra/secrets/dev.env, .env.example |
CDN_URL, WP_SITE_URL → .io. WP_ADMIN_EMAIL stays [email protected] (mail is still on the .mx Microsoft 365 tenant). dev.enc.env not re-encrypted. |
apps/web/src |
Docs/CDN/canonical URLs → .io; pnpm build run. |
apps/wordpress/scripts, mu-plugins, themes/synvirt, tests |
Menu URLs, CDN comments, download manifests (SYNVirtOS-Lastest.json, SYNVirt-Media-Creator.json) → https://synvirt.io/downloads/…. |
synnet-devhub |
astro.config.mjs site, module labels, content → .io; rebuilt into dist/ (bind-mounted at /dev). |
README.md, CLAUDE.md, AGENTS.md, Taskfile.yml, infra/scripts/devbox-bootstrap.sh, infra/systemd/synvirt-web.service |
Text → .io. |
Workspace /home/synvirt/AGENTS.md |
Publication note updated. |
Deliberately not changed:
[email protected],[email protected]— mailbox domain, see below.dev.synvirt.mx(10.10.26.1, product host) — LAN-only name, not in Cloudflare.update./updates./licensing./aurora.synvirt.mxin theme copy,apps/wizard-demo/upstreamand release notes — baked into the hypervisor; changes there belong to a product release.status.synvirt.mx— hosted outside this infra.- Dated specs/runbooks under
docs-internal/,release-backups/,release-staging/— history. - Keycloak realm redirect URIs — still
.testonly, nothing referenced.mx.
Needs the owner (auto-mode blocked these as live changes)
Section titled “Needs the owner (auto-mode blocked these as live changes)”Run as root: bash infra/scripts/cutover-synvirt-io.sh. It does, in order:
- Cloudflare DNS for
synvirt.io: apex,www,update,updates,licensing→201.165.127.18proxied;api,auth,cdn,docs,portal→10.10.26.4DNS-only (same shape as.mx). /etc/hostsaliases for the.ionames.wp search-replace(dry-run on 2026-10-15: 23 CDN + 339 apex replacements acrosssvt_posts,svt_postmeta,svt_options,svt_users, WooCommerce download directories).docker compose up -d --force-recreate caddy wordpress,systemctl restart synvirt-web.- curl checks for every
.iohost and the.mx301s.
Then, outside this box:
- Cloudflare redirect rule
*.synvirt.mx → synvirt.io(owner). - Microsoft 365: add
synvirt.iodomain, MX/SPF/autodiscover records, then switchhello@everywhere (WP_ADMIN_EMAIL, menumailto:links,seed-menus.php,apps/web). - LAN split-horizon DNS: add
synvirt.io→10.10.26.4whereversynvirt.mxis overridden today, or LAN clients will hairpin through Cloudflare. - Product repo on 10.10.26.1:
updates./licensing./aurora.synvirt.mxendpoints in a future release. task secrets:encryptto refreshinfra/secrets/dev.enc.env; commit when authorised.
Rollback
Section titled “Rollback”/var/backups/synvirt/domain-migration-20261015/ has the previous
Caddyfile.dev, compose.yaml, .env, dev.env, /etc/hosts; the DB dump
taken just before is /var/backups/synvirt/wpdb_2026-10-15_170151.sql.zst
(bash infra/scripts/backup-wordpress.sh --restore 2026-10-15_170151).
Restore the files, task wp:reload, recreate wordpress.