flowchart LR A[DO dropletCentOS 7] -->|rsync web files| B[Hetzner AX162-RAlmaLinux 9.7] A -->|replicación MySQL| B A -->|rsync letsencrypt| B C[DNS 300s TTL] -->|fase 6| D[nuevo IP] A -->|proxy_pass| B D -->|tráfico directo| B
flowchart LR A[DO dropletCentOS 7] -->|rsync web files| B[Hetzner AX162-RAlmaLinux 9.7] A -->|replicación MySQL| B A -->|rsync letsencrypt| B C[DNS 300s TTL] -->|fase 6| D[nuevo IP] A -->|proxy_pass| B D -->|tráfico directo| B
flowchart LR A[DO dropletCentOS 7] -->|rsync web files| B[Hetzner AX162-RAlmaLinux 9.7] A -->|replicación MySQL| B A -->|rsync letsencrypt| B C[DNS 300s TTL] -->|fase 6| D[nuevo IP] A -->|proxy_pass| B D -->|tráfico directo| B
rsync -avz --progress \ /etc/letsencrypt/ \ root@new-server:/etc/letsencrypt/
rsync -avz --progress \ /etc/letsencrypt/ \ root@new-server:/etc/letsencrypt/
rsync -avz --progress \ /etc/letsencrypt/ \ root@new-server:/etc/letsencrypt/
# Sync inicial (lenta, una vez)
rsync -avzP --checksum /var/www/html/ \ root@new-server:/var/www/html/ # Sync incremental justo antes del cutover (rápida)
rsync -avzP --delete --checksum /var/www/html/ \ root@new-server:/var/www/html/
# Sync inicial (lenta, una vez)
rsync -avzP --checksum /var/www/html/ \ root@new-server:/var/www/html/ # Sync incremental justo antes del cutover (rápida)
rsync -avzP --delete --checksum /var/www/html/ \ root@new-server:/var/www/html/
# Sync inicial (lenta, una vez)
rsync -avzP --checksum /var/www/html/ \ root@new-server:/var/www/html/ # Sync incremental justo antes del cutover (rápida)
rsync -avzP --delete --checksum /var/www/html/ \ root@new-server:/var/www/html/
# Instalación en Linux (Debian/Ubuntu)
sudo apt install mydumper # macOS
brew install mydumper # Windows: usar WSL2 con Ubuntu # Dump paralelo desde el master
mydumper \ --host=old-server \ --user=repl \ --password=*** \ --outputdir=/backup/dump \ --threads=16 \ --compress \ --triggers --events --routines
# Instalación en Linux (Debian/Ubuntu)
sudo apt install mydumper # macOS
brew install mydumper # Windows: usar WSL2 con Ubuntu # Dump paralelo desde el master
mydumper \ --host=old-server \ --user=repl \ --password=*** \ --outputdir=/backup/dump \ --threads=16 \ --compress \ --triggers --events --routines
# Instalación en Linux (Debian/Ubuntu)
sudo apt install mydumper # macOS
brew install mydumper # Windows: usar WSL2 con Ubuntu # Dump paralelo desde el master
mydumper \ --host=old-server \ --user=repl \ --password=*** \ --outputdir=/backup/dump \ --threads=16 \ --compress \ --triggers --events --routines
CHANGE MASTER TO MASTER_HOST='old-server', MASTER_USER='repl', MASTER_PASSWORD='***', MASTER_LOG_FILE='mysql-bin.000123', MASTER_LOG_POS=456789; START SLAVE; -- Verificar que no hay lag
SHOW SLAVE STATUS\G
CHANGE MASTER TO MASTER_HOST='old-server', MASTER_USER='repl', MASTER_PASSWORD='***', MASTER_LOG_FILE='mysql-bin.000123', MASTER_LOG_POS=456789; START SLAVE; -- Verificar que no hay lag
SHOW SLAVE STATUS\G
CHANGE MASTER TO MASTER_HOST='old-server', MASTER_USER='repl', MASTER_PASSWORD='***', MASTER_LOG_FILE='mysql-bin.000123', MASTER_LOG_POS=456789; START SLAVE; -- Verificar que no hay lag
SHOW SLAVE STATUS\G
# Script con la API de DigitalOcean
curl -X PUT \ -H "Authorization: Bearer $DO_TOKEN" \ -H "Content-Type: application/json" \ -d '{"ttl": 300}' \ "https://api.digitalocean.com/v2/domains/example.com/records/$ID"
# Script con la API de DigitalOcean
curl -X PUT \ -H "Authorization: Bearer $DO_TOKEN" \ -H "Content-Type: application/json" \ -d '{"ttl": 300}' \ "https://api.digitalocean.com/v2/domains/example.com/records/$ID"
# Script con la API de DigitalOcean
curl -X PUT \ -H "Authorization: Bearer $DO_TOKEN" \ -H "Content-Type: application/json" \ -d '{"ttl": 300}' \ "https://api.digitalocean.com/v2/domains/example.com/records/$ID"
server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass https://new-server-ip; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
}
server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass https://new-server-ip; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
}
server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass https://new-server-ip; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
} - Pérdida de escrituras: si se escribe en la base vieja después del dump, esos datos se pierden al apuntar DNS al server nuevo.
- Cachés de DNS: los resolvers de los ISP ignoran TTLs cortos si no los anticipaste; hay clientes que siguen pegándole a la IP vieja durante horas.
- Diferencias sutiles de entorno: una versión distinta de OpenSSL, un php.ini con un límite diferente o un módulo de Nginx compilado con otras flags pueden romper en producción lo que funcionaba en el viejo server. - Reducción de costos en startups LATAM: una startup con infraestructura dolarizada puede ahorrar entre 70% y 85% migrando cargas estables a servidores dedicados en Europa.
- Escape de distribuciones en EOL: muchos servidores que corren CentOS 7 (fin de soporte en 2024) aprovechan la migración para saltar a AlmaLinux 9, Rocky Linux o Debian 12.
- Consolidación de múltiples droplets: un AX162-R con 256 GB de RAM y 48 núcleos puede reemplazar 3 o 4 droplets medianos, simplificando operación y reduciendo factura.
- Cumplimiento de residencia de datos: equipos con clientes europeos muchas veces eligen Hetzner (Nuremberg, Falkenstein, Helsinki) por cumplimiento GDPR.
- Migración entre cloud providers sin que importe el destino: la misma receta sirve para ir de AWS EC2 a OVH, de Linode a DigitalOcean, o entre cualquier par de proveedores. - Price-performance brutal: un AX162-R entrega más CPU, RAM y NVMe que un droplet de $1,432 por $233 al mes.
- Hardware dedicado real: sin vecinos ruidosos robándote IOPS ni CPU steal.
- NVMe en RAID1 incluido: latencias de disco más bajas que casi cualquier SSD de nube pública.
- Red 1 Gbit/s sin cargos por tráfico: ideal para apps con salida de datos alta. - Sin ecosistema gestionado: no hay Managed Databases, App Platform, Spaces o Functions. Todo lo administrás vos.
- Escalado vertical limitado: para crecer pedís otro servidor y lo configurás; no hay autoscaling.
- SLA y soporte más básicos: el modelo es "hardware funciona, lo demás es tuyo". No esperes el mismo nivel de soporte 24/7 que en AWS.
- Setup inicial más pesado: la primera vez te toca instalar todo a mano o con Ansible, no con un click. - Migrating from DigitalOcean to Hetzner — Isa Yeter — caso real documentado que inspiró este artículo.
- mydumper en GitHub — herramienta de dump paralelo para MySQL usada en la migración.
- Hacker News — discusiones recurrentes sobre costos de infraestructura y comparativas entre VPS.
- Hetzner en Wikipedia — contexto histórico y operativo del proveedor alemán.