Como migrar arquivos entre servidores com rsync pelo SSH, preservando donos e permissões, com sincronização final rápida; e robocopy no Windows Server.

Para que serve

O rsync copia arquivos entre servidores pelo SSH e, nas execuções seguintes, transfere apenas o que mudou. Isso permite fazer a cópia pesada com o sistema antigo funcionando e, na hora da virada, rodar uma sincronização final de poucos minutos. Este artigo mostra como migrar arquivos entre servidores com rsync: os comandos para trazer sites, arquivos de usuários e dados de aplicações de outro provedor para o seu servidor dedicado (ou para uma VM nele), preservando donos, permissões e links.

Pré-requisitos

  • rsync instalado nos dois lados (apt install rsync; em AlmaLinux/Rocky, dnf install rsync).
  • Acesso SSH do servidor novo ao antigo, de preferência como root, ou um usuário com sudo.
  • Espaço livre no destino maior que o volume de origem (du -sh /var/www no antigo, df -h no novo).
  • Bancos de dados devem ser migrados por dump ou replicação (veja os artigos de MySQL/MariaDB e PostgreSQL). Não copie com rsync o diretório de dados de um banco em funcionamento.

Como migrar arquivos entre servidores com rsync

  1. Crie uma chave SSH temporária no servidor novo e autorize-a no antigo:

    ssh-keygen -t ed25519 -f /root/.ssh/migracao -N ""
    ssh-copy-id -i /root/.ssh/migracao.pub -p 22 root@IP_ANTIGO
    ssh -i /root/.ssh/migracao root@IP_ANTIGO 'hostname'

    Se o antigo não aceita login de root por senha, cole o conteúdo de migracao.pub manualmente em /root/.ssh/authorized_keys pelo painel ou console do provedor antigo.

  2. Abra uma sessão que sobreviva à queda da sua conexão. Cópias grandes levam horas:

    apt install -y tmux
    tmux new -s migracao

    Se a sua conexão cair, entre de novo e rode tmux attach -t migracao.

  3. Simule a cópia com -n (dry-run) para conferir caminhos:

    rsync -aHAXn --numeric-ids -e "ssh -i /root/.ssh/migracao" \
      root@IP_ANTIGO:/var/www/ /var/www/ | head -50
    A barra final faz diferença. origem/var/www/ copia o conteúdo de www para dentro do destino. origem/var/www (sem barra) cria uma pasta www dentro do destino, gerando /var/www/www.
  4. Faça a cópia inicial com o sistema antigo no ar:

    rsync -aHAX --numeric-ids --partial --info=progress2 \
      -e "ssh -i /root/.ssh/migracao" \
      root@IP_ANTIGO:/var/www/ /var/www/
    • -a: modo arquivo (recursivo, preserva permissões, datas, donos, links simbólicos).
    • -H, -A, -X: preservam hard links, ACLs e atributos estendidos.
    • --numeric-ids: mantém UID/GID numéricos, evitando que arquivos mudem de dono quando os nomes de usuários não batem entre os servidores. Crie os mesmos usuários com os mesmos UIDs no destino antes.
    • --partial: se a conexão cair, aproveita o pedaço já transferido de arquivos grandes.
    • --info=progress2: mostra o progresso geral em vez de arquivo a arquivo.

    Não use -z (compressão) para fotos, vídeos e arquivos já compactados: só gasta CPU. Ele ajuda apenas com muito texto em links lentos.

  5. Limite a banda se a origem for produção: --bwlimit=40M limita a cerca de 40 MB/s, deixando folga no link do provedor antigo.

  6. Repita a sincronização nos dias seguintes. Cada execução transfere só as diferenças e fica mais rápida.

  7. Sincronização final na janela de manutenção. Pare os serviços que gravam arquivos no antigo e rode com --delete, que remove no destino o que foi apagado na origem. Rode primeiro em dry-run:

    rsync -aHAXn --numeric-ids --delete --itemize-changes \
      -e "ssh -i /root/.ssh/migracao" root@IP_ANTIGO:/var/www/ /var/www/
    
    rsync -aHAX --numeric-ids --delete --info=progress2 \
      -e "ssh -i /root/.ssh/migracao" root@IP_ANTIGO:/var/www/ /var/www/
  8. Remova o acesso temporário após a migração: apague a chave migracao.pub do authorized_keys do antigo e os arquivos /root/.ssh/migracao* do novo.

Origem sem acesso root

Se você só tem um usuário com sudo no antigo, peça ao rsync remoto para rodar com sudo (o usuário precisa de sudo sem senha para o rsync):

rsync -aHAX --numeric-ids --rsync-path="sudo rsync" \
  -e "ssh -i /root/.ssh/migracao" usuario@IP_ANTIGO:/var/www/ /var/www/

Migrando servidores Windows: robocopy

Entre servidores Windows, o equivalente nativo é o robocopy. Com um compartilhamento do servidor antigo acessível pelo novo (por VPN, nunca SMB aberto na internet; veja também o artigo «Qual VPN usar no servidor dedicado: WireGuard, OpenVPN, IPsec ou Tailscale?»):

robocopy \\SERVIDOR-ANTIGO\Dados D:\Dados /MIR /COPYALL /DCOPY:DAT /R:1 /W:1 /MT:16 /LOG:C:\migracao.log /TEE
  • /MIR espelha a pasta, inclusive apagando no destino o que não existe na origem. Confira o caminho com /L (só lista) antes.
  • /COPYALL copia permissões NTFS, dono e auditoria. Funciona melhor quando os servidores estão no mesmo domínio; com contas locais, as permissões precisarão ser refeitas (veja também o artigo «Como compartilhar pastas e configurar permissões NTFS no Windows Server»).
  • /MT:16 usa 16 cópias em paralelo, útil com muitos arquivos pequenos.

Assim como no rsync, rode uma vez antes e repita na janela de manutenção para copiar só as diferenças.

Como saber se funcionou

  • Uma nova execução em dry-run com --itemize-changes não lista nenhum arquivo (ou só os que mudaram desde a última passada).
  • Compare quantidade e tamanho nos dois lados: find /var/www -type f | wc -l e du -s --apparent-size /var/www.
  • Para conferência rigorosa, rode um dry-run com --checksum (lê todos os arquivos nos dois lados, demora mais).
  • A aplicação funciona no servidor novo, testando pelo arquivo hosts antes de mudar o DNS.

Problemas comuns

"Permission denied" em alguns arquivos

O usuário remoto não consegue ler tudo. Use root ou --rsync-path="sudo rsync".

Arquivos chegam com dono errado

Faltou --numeric-ids ou os usuários não existem no destino com os mesmos UIDs. Crie os usuários e rode de novo: o rsync corrige donos sem retransmitir o conteúdo.

A cópia é interrompida e recomeça do zero

O rsync não recomeça do zero: ele compara e pula o que já está igual. Use --partial para retomar também arquivos grandes pela metade, e rode dentro do tmux.

Nomes com acentos aparecem estranhos

Servidor antigo com codificação diferente de UTF-8. Use --iconv=UTF-8,ISO-8859-1: o primeiro valor é a codificação local (servidor novo) e o segundo, a do servidor remoto (antigo).

Perguntas frequentes

O rsync copia só o que mudou?

Sim. Nas execuções seguintes ele compara origem e destino e transfere apenas as diferenças, por isso a sincronização final costuma levar poucos minutos.

Qual a diferença entre /var/www/ e /var/www no rsync?

Com a barra final, o rsync copia o conteúdo da pasta para o destino. Sem a barra, ele cria a própria pasta dentro do destino, gerando algo como /var/www/www.

Posso usar rsync para copiar um banco de dados?

Não com o banco ligado. Migre bancos por dump ou replicação; copiar o diretório de dados em uso gera uma cópia inconsistente.

Como retomar uma cópia rsync interrompida?

Rode o mesmo comando de novo: o rsync pula o que já está igual. Com --partial ele aproveita também arquivos grandes copiados pela metade.

Qual o equivalente ao rsync no Windows Server?

O robocopy, nativo do Windows. Com /MIR ele espelha a pasta e com /COPYALL preserva permissões NTFS.

Leitura complementar

Precisa de ajuda?

Se a transferência estiver lenta ou falhando, abra um ticket na área do cliente informando o volume de dados e a saída do comando.

Esta resposta lhe foi útil? 0 Usuários acharam útil (0 Votos)

Leia também