Como migrar WordPress para VPS

Migrar WordPress para VPS sem downtime exige uma sequência específica: preparar o novo servidor com o stack Docker, copiar os arquivos e exportar o banco da hospedagem de origem, importar tudo na VPS, testar via arquivo hosts e só então trocar o DNS. Fazer nessa ordem garante que o site novo está 100% funcional antes de qualquer visitante ser redirecionado.

Visão geral do processo

A migração tem cinco etapas que devem ser feitas em ordem. Pular etapas aumenta o risco de downtime:

bash
# 1. Preparar a VPS (Docker + stack WordPress pronto)
# 2. Exportar banco da hospedagem atual
# 3. Copiar arquivos WordPress (wp-content)
# 4. Importar e testar na VPS (via hosts local)
# 5. Trocar DNS e remover hospedagem antiga

Exportar o banco da hospedagem atual

Exporte o banco MySQL/MariaDB da hospedagem de origem. A maioria dos painéis (cPanel, Plesk) tem o phpMyAdmin disponível:

bash
# Via phpMyAdmin: Banco → Exportar → Quick → SQL → Go

# Via SSH na hospedagem de origem:
mysqldump -u usuario_db -p nome_do_banco > wordpress-backup.sql

# Compactar para download mais rápido
gzip wordpress-backup.sql

# Copiar para a VPS via SCP
scp wordpress-backup.sql.gz root@IP_DA_VPS:/opt/wordpress/

Copiar os arquivos wp-content

O wp-content contém temas, plugins e uploads, é o único diretório que você precisa copiar (o core do WordPress é baixado fresh pelo Docker):

bash
# Na hospedagem de origem, compactar wp-content
cd /caminho/para/wordpress
tar czf wp-content.tar.gz wp-content/

# Enviar para a VPS
scp wp-content.tar.gz root@IP_DA_VPS:/opt/wordpress/

# Na VPS, extrair para dentro do volume Docker
# Descobrir o mount path do volume
docker volume inspect wordpress_wp_data

# Extrair direto no volume
docker run --rm \
  -v wordpress_wp_data:/dest \
  -v /opt/wordpress:/src \
  alpine sh -c "cd /dest && tar xzf /src/wp-content.tar.gz"

Importar o banco na VPS

Com os containers rodando, importe o banco exportado e ajuste a URL do site:

bash
# Copiar dump para o container do banco
docker cp /opt/wordpress/wordpress-backup.sql wordpress-db-1:/tmp/

# Importar
docker compose exec db bash -c \
  "mysql -u wp -p'${DB_PASSWORD}' wordpress < /tmp/wordpress-backup.sql"

# Atualizar a URL do site para o novo domínio/IP
docker compose exec wordpress wp search-replace \
  'https://antigohospedagem.com.br' 'https://seudominio.com.br' \
  --allow-root --skip-columns=guid

Testar antes de trocar o DNS

Antes de trocar o DNS, teste o novo servidor apontando seu computador local para o IP da VPS via arquivo hosts:

bash
# No seu computador (Linux/Mac): editar /etc/hosts
# Windows: C:\Windows\System32\drivers\etc\hosts
echo "IP_DA_VPS seudominio.com.br www.seudominio.com.br" >> /etc/hosts

# Testar no browser: https://seudominio.com.br
# Verificar: páginas, imagens, login admin, formulários, checkout

# Após validar, remover a linha adicionada ao hosts
# e trocar o DNS no registrador do domínio

Não quer configurar manualmente?

Implante o WordPress em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Use o plugin All-in-One WP Migration: instale na hospedagem atual, exporte (gera um arquivo .wpress), instale o plugin na VPS nova, importe o arquivo. Para sites acima de 512 MB, a versão free tem limite de importação, use a versão paga ou faça manualmente via phpMyAdmin + FTP.

Use FTP/SFTP (FileZilla) para baixar o wp-content. Hospedagens cPanel normalmente têm SFTP na porta 22. Outra opção: comprima wp-content via phpMyAdmin + File Manager do cPanel e baixe o zip pelo browser.

E-mails (MX records) são independentes do servidor web. Se o domínio usa Google Workspace, Zoho ou outro provedor externo, os MX records não mudam, apenas o A record (IP) é trocado. Se a hospedagem atual também faz e-mail, configure primeiro o novo servidor de e-mail antes de trocar o DNS.

No painel do seu registrador ou DNS (Cloudflare, Registro.br), edite o A record do domínio e mude o TTL para 300 (5 minutos) com pelo menos 24h de antecedência. Isso garante propagação em 5 min após a troca. Após a migração, volte o TTL para 3600 (1 hora) ou 86400 (24h).

Plugins que usam caminhos absolutos, chaves de API ou URLs hardcoded precisam de atenção. Plugins de cache devem ser limpos e reconfigurados. Plugins de e-mail (WP Mail SMTP) devem ser testados. O WP-CLI search-replace cuida das URLs no banco, mas variáveis de ambiente e configurações de API precisam de revisão manual.