Llega el momento: tu hosting compartido se queda pequeño, o necesitas cambiar de proveedor de VPS. La migración puede parecer intimidante, pero con un plan claro es un proceso controlable.
Esta guía te lleva paso a paso para migrar sin perder datos ni tener downtime excesivo.
Tipos de migración
Escenarios comunes
| Origen | Destino | Complejidad |
|---|---|---|
| Hosting compartido | VPS | Media |
| VPS a VPS (mismo proveedor) | Baja | |
| VPS a VPS (distinto proveedor) | Media | |
| Servidor dedicado | VPS | Media-Alta |
| Cloud (AWS/GCP) | VPS | Media |
¿Cuánto tiempo tarda?
| Tipo de sitio | Tiempo estimado |
|---|---|
| Web estática pequeña | 30 min - 1 hora |
| WordPress simple | 1 - 2 horas |
| WordPress con mucho contenido | 2 - 4 horas |
| Aplicación custom + BD | 2 - 6 horas |
| Múltiples sitios | 4 - 8 horas |
Preparación previa
Checklist antes de empezar
☐ Backup completo del origen
☐ VPS destino configurado y funcionando
☐ Acceso SSH a ambos servidores
☐ Credenciales de bases de datos
☐ Lista de dominios y subdominios
☐ Certificados SSL (o plan para regenerar)
☐ Documentación de configuraciones especiales
☐ Horario de baja actividad elegido
☐ Plan de rollback si algo falla
Información a recopilar
# En el servidor origen
# Versiones de software
php -v
mysql --version
nginx -v
apache2 -v
# Sitios configurados
ls /var/www/
ls /etc/nginx/sites-enabled/
ls /etc/apache2/sites-enabled/
# Bases de datos
mysql -e "SHOW DATABASES;"
# Cron jobs
crontab -l
cat /etc/crontab
# Espacio usado
du -sh /var/www/*
Configurar el VPS destino
Stack básico
# Actualizar sistema
sudo apt update && sudo apt upgrade -y
# Instalar web server
sudo apt install nginx -y
# Instalar PHP (ajusta versión)
sudo apt install php8.2-fpm php8.2-mysql php8.2-curl \
php8.2-gd php8.2-mbstring php8.2-xml php8.2-zip -y
# Instalar MySQL/MariaDB
sudo apt install mariadb-server -y
sudo mysql_secure_installation
# Instalar herramientas
sudo apt install rsync wget curl unzip -y
Verificar que funciona
# Nginx
sudo systemctl status nginx
curl localhost
# PHP
php -v
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
curl localhost/info.php | head -20
# MySQL
sudo mysql -e "SELECT VERSION();"
Migración de archivos
Método 1: rsync (recomendado)
# Desde el servidor DESTINO
# Sincronizar archivos del origen
rsync -avz --progress \
-e "ssh -p 22" \
usuario@origen:/var/www/sitio/ \
/var/www/sitio/
# Opciones:
# -a = archive (preserva permisos, fechas)
# -v = verbose
# -z = compresión durante transferencia
# --progress = mostrar progreso
Con exclusiones
rsync -avz --progress \
--exclude='cache/*' \
--exclude='*.log' \
--exclude='node_modules/' \
-e "ssh -p 22" \
usuario@origen:/var/www/sitio/ \
/var/www/sitio/
Método 2: tar + scp
# En servidor ORIGEN: crear archivo
cd /var/www
tar -czvf sitio-backup.tar.gz sitio/
# Transferir al destino
scp sitio-backup.tar.gz usuario@destino:/var/www/
# En servidor DESTINO: extraer
cd /var/www
tar -xzvf sitio-backup.tar.gz
rm sitio-backup.tar.gz
Método 3: SFTP/FTP (para hosting sin SSH)
Si el origen es hosting compartido sin SSH:
# Instalar lftp en destino
sudo apt install lftp -y
# Descargar desde FTP
lftp -u usuario,contraseña ftp.hosting.com << EOF
mirror -c /public_html /var/www/sitio
bye
EOF
Ajustar permisos
# Después de copiar
sudo chown -R www-data:www-data /var/www/sitio
sudo find /var/www/sitio -type d -exec chmod 755 {} \;
sudo find /var/www/sitio -type f -exec chmod 644 {} \;
# Carpetas de escritura (uploads, cache)
sudo chmod -R 775 /var/www/sitio/wp-content/uploads
Migración de base de datos
Exportar en origen
# MySQL/MariaDB - Base de datos específica
mysqldump -u usuario -p nombre_bd > backup.sql
# Con todas las opciones recomendadas
mysqldump -u usuario -p \
--single-transaction \
--routines \
--triggers \
--add-drop-table \
nombre_bd > backup.sql
# Comprimir (para BD grandes)
mysqldump -u usuario -p nombre_bd | gzip > backup.sql.gz
Transferir
# Desde destino
scp usuario@origen:/ruta/backup.sql.gz /tmp/
# O desde origen
scp backup.sql.gz usuario@destino:/tmp/
Importar en destino
# Crear base de datos y usuario
sudo mysql << EOF
CREATE DATABASE nombre_bd CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'usuario'@'localhost' IDENTIFIED BY 'contraseña_segura';
GRANT ALL PRIVILEGES ON nombre_bd.* TO 'usuario'@'localhost';
FLUSH PRIVILEGES;
EOF
# Importar datos
gunzip backup.sql.gz
mysql -u usuario -p nombre_bd < backup.sql
# O directamente comprimido
gunzip -c backup.sql.gz | mysql -u usuario -p nombre_bd
Verificar importación
mysql -u usuario -p nombre_bd -e "SHOW TABLES;"
mysql -u usuario -p nombre_bd -e "SELECT COUNT(*) FROM tabla_principal;"
Migrar WordPress completo
Paso 1: Backup en origen
# Archivos
cd /var/www
tar -czvf wordpress-files.tar.gz sitio/
# Base de datos
mysqldump -u wp_user -p wp_database > wordpress-db.sql
Paso 2: Transferir
# Desde destino
scp usuario@origen:/var/www/wordpress-files.tar.gz /var/www/
scp usuario@origen:/ruta/wordpress-db.sql /tmp/
Paso 3: Restaurar archivos
cd /var/www
tar -xzvf wordpress-files.tar.gz
chown -R www-data:www-data sitio/
Paso 4: Crear BD e importar
sudo mysql << EOF
CREATE DATABASE wp_database;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'nueva_contraseña';
GRANT ALL ON wp_database.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EOF
mysql -u wp_user -p wp_database < /tmp/wordpress-db.sql
Paso 5: Actualizar wp-config.php
nano /var/www/sitio/wp-config.php
define('DB_NAME', 'wp_database');
define('DB_USER', 'wp_user');
define('DB_PASSWORD', 'nueva_contraseña');
define('DB_HOST', 'localhost');
Paso 6: Actualizar URLs (si cambia dominio)
# Con WP-CLI
wp search-replace 'https://viejo.com' 'https://nuevo.com' --all-tables
# O con SQL directo
mysql -u wp_user -p wp_database << EOF
UPDATE wp_options SET option_value = 'https://nuevo.com' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'https://nuevo.com' WHERE option_name = 'home';
EOF
Paso 7: Configurar virtual host
# /etc/nginx/sites-available/sitio.com
server {
listen 80;
server_name sitio.com www.sitio.com;
root /var/www/sitio;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
sudo ln -s /etc/nginx/sites-available/sitio.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Migración con mínimo downtime
Estrategia de dos fases
Fase 1: Sincronización inicial (sin downtime)
# Sincronizar todo mientras el sitio sigue funcionando
rsync -avz usuario@origen:/var/www/sitio/ /var/www/sitio/
# Exportar BD (puede estar desactualizada)
# En origen:
mysqldump -u user -p database > backup.sql
Fase 2: Sincronización final + cambio DNS
# 1. Poner sitio en mantenimiento (origen)
# wp maintenance-mode activate
# 2. Sincronizar cambios recientes (muy rápido)
rsync -avz --delete usuario@origen:/var/www/sitio/ /var/www/sitio/
# 3. Exportar BD actualizada
mysqldump -u user -p database > backup-final.sql
# 4. Importar en destino
mysql -u user -p database < backup-final.sql
# 5. Cambiar DNS
# 6. Verificar que funciona
# 7. Quitar mantenimiento
Tiempo de downtime real
Con esta estrategia: 5-15 minutos (solo fase 2).
Cambiar DNS
Reducir TTL antes de migrar
48 horas antes:
sitio.com A 300 IP_VIEJA
El TTL de 300 segundos (5 min) hace que el cambio propague rápido.
Cambiar a nueva IP
sitio.com A 300 IP_NUEVA
www CNAME sitio.com
Verificar propagación
# Desde tu máquina
dig sitio.com +short
# Desde diferentes ubicaciones
# https://www.whatsmydns.net/
Restaurar TTL después
Una vez confirmado que funciona:
sitio.com A 3600 IP_NUEVA
SSL en el nuevo servidor
Con Certbot (Let’s Encrypt)
# Instalar Certbot
sudo apt install certbot python3-certbot-nginx -y
# Obtener certificado (DNS ya debe apuntar al nuevo servidor)
sudo certbot --nginx -d sitio.com -d www.sitio.com
# Verificar renovación
sudo certbot renew --dry-run
Migrar certificado existente
Si tienes certificado de pago:
# Copiar desde origen
scp usuario@origen:/etc/letsencrypt/live/sitio.com/* /etc/ssl/sitio.com/
# Configurar en Nginx
ssl_certificate /etc/ssl/sitio.com/fullchain.pem;
ssl_certificate_key /etc/ssl/sitio.com/privkey.pem;
Verificación post-migración
Checklist de verificación
# 1. Web carga correctamente
curl -I https://sitio.com
# 2. HTTPS funciona
curl -I https://sitio.com 2>&1 | grep "HTTP/2 200"
# 3. Base de datos conecta
mysql -u user -p database -e "SELECT 1;"
# 4. Formularios funcionan (probar manualmente)
# 5. Uploads funcionan
ls -la /var/www/sitio/wp-content/uploads/
# 6. Cron jobs configurados
crontab -l
# 7. Emails salen (si aplica)
echo "Test" | mail -s "Test" [email protected]
Monitorizar primeros días
# Ver errores en logs
tail -f /var/log/nginx/error.log
tail -f /var/log/php8.2-fpm.log
# Ver accesos
tail -f /var/log/nginx/access.log
Rollback si algo falla
Plan de contingencia
-
No elimines el servidor origen hasta verificar que todo funciona (mínimo 48-72 horas)
-
Rollback rápido: Solo cambiar DNS de vuelta a IP antigua
-
Rollback con datos:
# Exportar cambios del nuevo servidor
mysqldump -u user -p database > cambios-nuevos.sql
# Importar en servidor antiguo
mysql -u user -p database < cambios-nuevos.sql
Herramientas útiles
Para WordPress
- All-in-One WP Migration: Plugin simple para migración
- Duplicator: Crea paquete instalable
- WP-CLI: Línea de comandos para WordPress
Para servidores
- rsync: Sincronización de archivos
- mysqldump: Backup de bases de datos
- scp/sftp: Transferencia de archivos
Para verificación
- whatsmydns.net: Propagación DNS
- ssllabs.com: Verificar SSL
- gtmetrix.com: Rendimiento
Preguntas frecuentes
¿Cuánto downtime tendré durante la migración?
Con la estrategia de dos fases, solo 5-15 minutos. Sin planificación, puede ser varias horas mientras los DNS propagan.
¿Pierdo el posicionamiento SEO al migrar?
No, si mantienes las mismas URLs y el sitio funciona correctamente. Google puede tardar unos días en reflejar el cambio de IP pero no afecta rankings.
¿Puedo migrar sin acceso SSH al origen?
Sí, usando FTP/SFTP para archivos y phpMyAdmin para exportar la base de datos. Es más lento pero funciona.
¿Qué hago si el nuevo servidor tiene versión de PHP diferente?
Prueba el sitio en el nuevo servidor antes de cambiar DNS. Si hay errores de compatibilidad, ajusta el código o instala la misma versión de PHP.
¿Debo mantener el servidor antiguo después de migrar?
Sí, al menos 48-72 horas. Esto te permite hacer rollback fácil si algo falla. Después puedes cancelarlo.
Nuestra recomendación
Para migración exitosa:
- Planifica con tiempo
- Haz backups completos
- Usa estrategia de dos fases
- Verifica todo antes de cambiar DNS
- Mantén servidor antiguo como backup
¿Primera migración a VPS? La administración gestionada de Avantys incluye migración asistida sin downtime.
Conclusión
Migrar a un VPS o entre VPS es un proceso controlable si sigues un plan. La clave es la preparación: backups, pruebas y un plan de rollback.
Con la estrategia de dos fases, puedes migrar con menos de 15 minutos de downtime.
¿Listo para migrar a un VPS potente? Explora los VPS de Avantys con asistencia en migración incluida.
¿Quieres que lo hagamos por ti?
En Avantys gestionamos tu web, hosting y crecimiento digital de punta a punta. Tú a lo importante.