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/wwwno antigo,df -hno 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
-
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.pubmanualmente em/root/.ssh/authorized_keyspelo painel ou console do provedor antigo. -
Abra uma sessão que sobreviva à queda da sua conexão. Cópias grandes levam horas:
apt install -y tmux tmux new -s migracaoSe a sua conexão cair, entre de novo e rode
tmux attach -t migracao. -
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 -50A 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 pastawwwdentro do destino, gerando/var/www/www. -
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. -
Limite a banda se a origem for produção:
--bwlimit=40Mlimita a cerca de 40 MB/s, deixando folga no link do provedor antigo. -
Repita a sincronização nos dias seguintes. Cada execução transfere só as diferenças e fica mais rápida.
-
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/ -
Remova o acesso temporário após a migração: apague a chave
migracao.pubdoauthorized_keysdo 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
/MIRespelha a pasta, inclusive apagando no destino o que não existe na origem. Confira o caminho com/L(só lista) antes./COPYALLcopia 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:16usa 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-changesnã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 -ledu -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.
