Hosting Equipo Avantys 5 min

Migrar a VPS: Guía Completa de Migración

Migra tu web de hosting compartido a VPS o de un VPS a otro. Guía paso a paso con WordPress, bases de datos y mínimo downtime.

// Compartir

Migrar a VPS: Guía Completa de Migración
Migración a VPS

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

Proceso de migración a VPS

Escenarios comunes

OrigenDestinoComplejidad
Hosting compartidoVPSMedia
VPS a VPS (mismo proveedor)Baja
VPS a VPS (distinto proveedor)Media
Servidor dedicadoVPSMedia-Alta
Cloud (AWS/GCP)VPSMedia

¿Cuánto tiempo tarda?

Tipo de sitioTiempo estimado
Web estática pequeña30 min - 1 hora
WordPress simple1 - 2 horas
WordPress con mucho contenido2 - 4 horas
Aplicación custom + BD2 - 6 horas
Múltiples sitios4 - 8 horas

Preparación previa

Checklist antes de empezar

Checklist migración VPS
☐ 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

  1. No elimines el servidor origen hasta verificar que todo funciona (mínimo 48-72 horas)

  2. Rollback rápido: Solo cambiar DNS de vuelta a IP antigua

  3. 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:

  1. Planifica con tiempo
  2. Haz backups completos
  3. Usa estrategia de dos fases
  4. Verifica todo antes de cambiar DNS
  5. 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.

Hablar con Avantys
// Boletín

Suscríbete al boletín

Guías nuevas, sin spam. Cancela cuando quieras.