Date: 2026-04-24
From: cativo.dev (186.32.90.71) - 3.4GB RAM
To: polaris2 (167.235.52.161) - 7.6GB RAM
- Verify DNS TTL is set to 300s (5 minutes) 24h before migration
- Announce maintenance window to users
- Verify polaris2 has Docker + 8GB swap configured ✅
- Backup current cativo.dev state
- Traefik - Reverse proxy + Let's Encrypt
- Docker Socket Proxy - Security layer
- Dozzle - Container logs viewer
- Uptime Kuma - Status monitoring
- Prometheus - Metrics collection
- Grafana - Dashboards (with persistent data)
- Ghost Blog - Blog + MySQL database
- Portfolio - Main portfolio app
- Portfolio API - API + MySQL + Redis
- Hello Kitty Landing - Landing page
- Whoami - Test service
- docker-mailserver - SMTP/IMAP
- Roundcube - Webmail
- cliproxyapi - API + Postgres + Docker proxy
traefik/letsencrypt/acme.json (600 permissions)
ghost-blog-prod_db-data # Ghost MySQL
ghost-blog-prod_ghost-content # Ghost content
grafana-data # Grafana dashboards
prometheus-data # Prometheus metrics
mail-data # Mail storage
mail-state # Mail state
mail-logs # Mail logs
portfolio-api-deploy_mysql-data # Portfolio MySQL
portfolio-api-deploy_redis-data # Portfolio Redis
cliproxyapi_postgres-data # Cliproxy Postgres
uptime-kuma-data # Uptime Kuma data
.env # Secrets
docker-compose.yml # Main stack
traefik/ # Traefik config
mail-server/ # Mail config
dozzle/ # Dozzle config
prometheus/ # Prometheus config
-
Set DNS TTL to 300s (24h before)
# Update DNS TTL for cativo.dev to 300 seconds # This allows faster DNS propagation during cutover
-
Run backup script on cativo.dev
./scripts/backup-for-migration.sh
-
Transfer backup to local machine
./scripts/download-backup.sh
-
Verify backup integrity
./scripts/verify-backup.sh
-
Transfer configuration to polaris2
./scripts/setup-polaris2-config.sh
-
Create Docker networks
ssh polaris2 "docker network create web" -
Restore volumes (without starting services)
./scripts/restore-volumes.sh
-
Stop services on cativo.dev
ssh cativo.dev "cd ~/space-server && docker compose down" ssh cativo.dev "cd ~/space-server/mail-server && docker compose down" ssh cativo.dev "cd ~/space-server/dozzle && docker compose down"
-
Final incremental backup (only changed data)
./scripts/incremental-backup.sh
-
Update DNS A records
cativo.dev A 167.235.52.161 *.cativo.dev A 167.235.52.161 mail.cativo.dev A 167.235.52.161 traefik.cativo.dev A 167.235.52.161 grafana.cativo.dev A 167.235.52.161 prometheus.cativo.dev A 167.235.52.161 -
Start services on polaris2
ssh polaris2 "cd ~/space-server && docker compose up -d" ssh polaris2 "cd ~/space-server/mail-server && docker compose up -d" ssh polaris2 "cd ~/space-server/dozzle && docker compose up -d"
-
Check all containers are running
ssh polaris2 "docker ps" -
Verify SSL certificates
curl -I https://cativo.dev curl -I https://mail.cativo.dev curl -I https://traefik.cativo.dev
-
Test mail server
# Send test email # Check IMAP login # Verify SPF/DKIM/DMARC
-
Test Ghost blog
curl -I https://blog.cativo.dev # Login to admin panel -
Verify monitoring
# Check Grafana dashboards # Verify Prometheus targets # Check Uptime Kuma status
- Keep cativo.dev as backup (1 week)
- Monitor logs on polaris2
- Update documentation
- Decommission cativo.dev (after 1 week)
If issues occur within first 30 minutes:
- Revert DNS to old IP (186.32.90.71)
- Start services on cativo.dev
- Investigate issues on polaris2
- Retry migration after fixes
- DNS propagation: 5-15 minutes (with 300s TTL)
- Service startup: 2-3 minutes
- Total user-facing downtime: 10-20 minutes
- Update SSH config to use polaris2 as default
- Update monitoring alerts with new IP
- Update firewall rules if needed
- Document any issues encountered
- Update backup scripts for new server