Sincronizar uma pasta grande entre dois servidores (retomável, em segundo plano)
Última atualização: 2026-08-05
Você tem uma pasta grande — dezenas de gigabytes — em um servidor e quer uma cópia exata em outro. Você não pode vigiar um terminal por horas, e uma transferência que morre no meio do caminho não deveria recomeçar do zero. relayium sync foi feito para isso: um espelho incremental unidirecional que pula o que já está lá, retoma um arquivo enviado pela metade de onde parou e verifica de ponta a ponta cada arquivo que envia.
Este guia configura uma transferência sem supervisão e com autorrecuperação: autorize o emissor uma vez, execute o processo à escuta em segundo plano e conduza relayium sync a partir de um laço de repetição dentro do tmux para que ele continue através das quedas de conexão até que a pasta inteira chegue.
Por que relayium sync se encaixa nesta tarefa
sync é um espelho incremental unidirecional sobre o protocolo nativo (instale relayium nas duas pontas). Três propriedades o tornam seguro para executar e reexecutar sem supervisão:
- Pula os arquivos que já estão lá: um arquivo cuja cópia no receptor coincide em tamanho e hora de modificação não é enviado de novo.
- Retoma arquivos parciais: se um arquivo foi transferido pela metade quando a conexão caiu, a próxima execução continua a partir do deslocamento de bytes já em disco em vez de reiniciá-lo.
- Verifica o que envia: cada arquivo transferido — inclusive um retomado — é conferido de ponta a ponta contra o SHA-256 do emissor, e uma divergência é relatada como falha. Os arquivos que ele pula são decididos por tamanho e mtime e não são re-hasheados, então o sync não diz nada sobre o conteúdo que não enviou.
- Por causa disso, o comando é idempotente — executá-lo novamente só faz o trabalho que resta, que é exatamente o que permite a um laço de repetição concluir uma transferência enorme.
Pré-requisitos
O que você precisa
- Este guia usa daemon direto (relayium://), então os dois servidores não precisam de acesso SSH entre si.
- Abra a porta do processo à escuta (9031 por padrão) para o emissor no firewall ou grupo de segurança do receptor.
- Espaço para a pasta inteira no receptor. Compare du -sh /root/workspace no emissor com df -h /root no receptor antes de iniciar uma transferência de várias horas.
Instale relayium nos dois servidores (sync fala o protocolo nativo, então ele precisa estar presente em cada ponta):
# nos DOIS servidores
curl -fsSL https://relayium.com/install.sh | sh
Autorizar o emissor uma vez (no receptor)
O receptor aprova a máquina emissora uma vez; a aprovação é escrita em disco e permanece válida entre reinicializações, então você nunca a repete. Inicie o processo à escuta em um terminal e aponte --dir para o diretório pai — relayium sync /root/workspace reproduz workspace/... no receptor, então --dir /root deposita os arquivos em /root/workspace/.
Na primeira conexão do emissor (próxima seção), serve mostra seu endereço e sua impressão digital e pede que você o aprove; responda y e ele é lembrado para sempre:
# no RECEPTOR (em primeiro plano, para aprovar interativamente)
relayium serve --dir /root --port 9031
# no RECEPTOR, na primeira conexão:
Incoming push from 203.0.113.9:52140
fingerprint: 9f2c41ab…
Accept and remember this peer? [y/N] y
- Para uma configuração totalmente sem supervisão, pule o prompt: execute relayium id no emissor para imprimir sua impressão digital, e então relayium authorize <impressão digital> no receptor.
- --dir é o pai da pasta que você está sincronizando, não a pasta em si — caso contrário os arquivos caem um nível fundo demais (por exemplo /root/workspace/workspace).
Executar o processo à escuta em segundo plano (no receptor)
Uma vez autorizada a impressão digital, pare o serve em primeiro plano (Ctrl-C) e relance-o desacoplado para que sobreviva ao seu logout. Ele carrega a impressão digital salva e aceita o emissor em silêncio — sem prompt desta vez. A mesma linha registra o PID do novo processo em ~/relayium-serve.pid, e é assim que o último passo deste guia para o processo à escuta que ele mesmo lançou, em vez de todo comando relayium da máquina:
# no RECEPTOR
nohup relayium serve --dir /root --port 9031 > ~/relayium-serve.log 2>&1 & echo $! > ~/relayium-serve.pid
- serve trata as conexões uma de cada vez e continua rodando, então está pronto para cada reconexão do laço de repetição abaixo.
- Para uma caixa de entrada sempre ativa, execute-o sob systemd em vez disso (Restart=always, --config-dir /etc/relayium).
Executar o sync em um laço de repetição sob tmux (no emissor)
Transferências longas são interrompidas: uma sessão caída, uma rede instável, uma reinicialização. A solução não é uma ferramenta sofisticada; é um laço que reexecuta sync até ter sucesso, mais um multiplexador de terminal para que sobreviva ao seu logout. Aqui o tmux é mais limpo que o nohup: não há redirecionamento de saída para errar, e você pode reconectar para acompanhar o progresso.
Inicie uma sessão do tmux, depois execute o espelho em um laço until — ele tenta de novo a cada 10 segundos até que sync retorne sucesso, e então sai sozinho:
Abra uma sessão do tmux no emissor, para que o laço sobreviva à sessão ssh de onde você o lançou.
# no EMISSOR tmux new -s xfer # apt install -y tmux se estiver faltandoRode o espelho dentro de um laço until. Ele tenta de novo a cada 10 segundos até o sync retornar sucesso, e então sai sozinho.
until relayium sync /root/workspace relayium://203.0.113.43:9031; do echo "$(date) retrying"; sleep 10; doneDesanexe com Ctrl-b e depois d. O laço continua rodando; reanexe quando quiser acompanhar.
tmux attach -t xfer
Como é uma passada bem-sucedida
Cada passada imprime uma linha por arquivo que realmente enviou, e depois um resumo que contrapõe o que enviou ao que o receptor já tinha. O laço termina na primeira vez que o sync retorna sucesso, e esse resumo é o estado do espelho.
relayium sync /root/workspace relayium://203.0.113.43:9031
workspace/data/part-004.bin (1073741824 bytes)
synced: 1 sent, 812 unchanged- Cada tentativa faz menos: os arquivos já transferidos são pulados, um arquivo enviado pela metade é retomado — então o laço converge e termina.
- O progresso imprime uma linha por arquivo concluído, então um arquivo grande é transferido em silêncio até terminar. O silêncio não é um travamento (veja solução de problemas).
Verificar e finalizar
A transferência está completa quando o laço until termina e você volta a um prompt de shell normal. Confirme que os dois lados coincidem, depois pare o processo à escuta:
Espere o laço until terminar sozinho. Estar de volta a um prompt de shell comum significa que a transferência acabou, não que você a interrompeu.
Compare os totais nos dois servidores.
# compare os totais nos DOIS servidores du -sh /root/workspacePare o processo à escuta no receptor quando os totais baterem. O sinal vai para o PID que você registrou ao lançá-lo, e não para todo comando relayium da máquina por correspondência de texto, e o arquivo de PID só é removido se aquele sinal deu certo. Um arquivo de PID deixado por uma execução anterior pode nomear um PID que o sistema já reutilizou, então, se você não tem certeza de que ele ainda é seu, imprima primeiro a linha de comando desse PID e só o mate se serve aparecer.
# no RECEPTOR, depois de verificado ps -p "$(cat ~/relayium-serve.pid)" -o command= kill "$(cat ~/relayium-serve.pid)" && rm ~/relayium-serve.pid
Como é um espelho concluído
O du -sh informa o mesmo total nos dois servidores, e o laço until devolveu você a um prompt de shell comum em vez de tentar de novo. Totais iguais são uma conferência grosseira de completude, não uma prova de integridade: o sync decidiu por tamanho e mtime quais arquivos não enviar, então o total não diz nada sobre o conteúdo dos arquivos que ele pulou.
# the same total, on BOTH servers
46G /root/workspace- O que o sync enviou está verificado: cada arquivo transferido foi conferido com SHA-256 na chegada, e uma saída limpa significa que nenhuma dessas conferências falhou. O que ele pulou só foi comparado por tamanho e mtime, então totais de du -sh iguais são uma conferência de sanidade sobre a completude, não uma prova de que o conteúdo pulado ainda confere. Se você precisa dessa prova, compare as somas de verificação arquivo por arquivo nos dois servidores.
Solução de problemas
Num espelho de várias horas seis coisas aparecem. Três parecem falhas e não são; as outras três são de verdade, e cada uma tem um comando que diz qual delas você está vendo.
Sintoma, verificação, correção
- Faz muito tempo que nada é impresso e a transferência parece travada.
# no EMISSOR, duas vezes, com alguns segundos de intervalo ss -tinp dst :9031 # ESTAB o processo à escuta foi alcançado; não prova que bytes estejam se movendo # SYN-SENT não alcança o processo à escutaO progresso só é impresso quando um arquivo termina, então um único arquivo grande é transferido em completo silêncio. ESTAB prova apenas alcançabilidade — um socket estabelecido pode ficar ocioso ou travado — e sozinho nunca é prova de avanço. Rode a verificação duas vezes com alguns segundos de intervalo e compare o contador bytes_acked que o -i imprime para aquele socket: subindo, a transferência está andando; parado, é um travamento de verdade.
- O socket fica em SYN-SENT e a transferência nunca começa.
# no RECEPTOR sudo ufw allow from 203.0.113.9 to any port 9031 proto tcp ss -tlnp | grep 9031A porta está bloqueada. Abra 9031/TCP somente para o emissor — substitua 203.0.113.9 pelo endereço do próprio emissor, o IP público ou o privado se os dois servidores compartilham uma rede — restrinja o grupo de segurança da nuvem à mesma origem e então confirme que o serve está mesmo escutando. Essa é a causa mais comum de uma transferência que nunca começa.
- Colar o comando de segundo plano deixa o shell num prompt de continuação >.
tmux new -s xfer until relayium sync /root/workspace relayium://203.0.113.43:9031; do echo "$(date) retrying"; sleep 10; doneUm comando nohup de várias linhas com aspas e um redirecionamento > costuma quebrar no redirecionamento na hora de colar. Use em vez disso o tmux com este laço de uma linha só: não há redirecionamento para errar, e você pode reanexar para acompanhar.
- A limpeza matou algo que você não queria matar.
pgrep -af relayium ps -p "$(cat ~/relayium-serve.pid)" -o command= tmux kill-session -t xfer kill "$(cat ~/relayium-serve.pid)" && rm ~/relayium-serve.pidMatar por padrão de linha de comando envia o sinal a todo processo cuja linha de comando contenha aquele texto — numa máquina com mais de uma transferência rodando, não é o que você queria. E também não para o espelho: o laço until é o dono do sync, então um filho morto é iniciado de novo dez segundos depois. Olhe com pgrep -af e depois encerre o que este guia de fato possui: tmux kill-session -t xfer termina o laço, e um kill no PID que está em ~/relayium-serve.pid para o processo à escuta que você lançou. Se o arquivo de PID está ali desde uma execução anterior, imprima a linha de comando dele antes de sinalizá-lo, porque um PID que o sistema reutilizou pertence a outra coisa completamente.
- Você quer deixar um subdiretório de fora e não existe nenhuma opção de exclusão.
relayium sync /root/workspace/src /root/workspace/data relayium://203.0.113.43:9031O sync aceita -i e -p, --delete, --watch e --config-dir; nada que filtre um caminho no meio da árvore. Nomeie em vez disso os subdiretórios que você quer: cada origem chega sob o --dir do receptor com o próprio nome, então diante de serve --dir /root/workspace este comando reconstrói /root/workspace/src e /root/workspace/data e nunca percorre um venv regenerável.
- Uma origem que você esperava espelhar chega vazia.
relayium sync ./links relayium://203.0.113.43:9031 # warning: no regular files to send (symlinks and special files are skipped)O sync só transfere arquivos regulares, e esse aviso é exatamente a cara de uma árvore feita só de links simbólicos. Aponte o sync para os diretórios a que os links se referem, e crie à parte no receptor os links de que você precisa.
Perguntas frequentes
O que acontece se a transferência for interrompida no meio do caminho?
Nada se perde. Reexecute relayium sync — ele pula os arquivos que já estão no receptor e retoma um arquivo enviado pela metade a partir do deslocamento de bytes já em disco. O laço until deste guia faz isso automaticamente até que a pasta inteira seja espelhada.
Em que isso difere do rsync?
Ambos fazem espelhamento incremental unidirecional, mas relayium sync roda sobre uma conexão TLS fixada sem exigir conta SSH (daemon direto), autentica as duas máquinas pela impressão digital do certificado e verifica com SHA-256 cada arquivo que transfere. Como no comportamento padrão do rsync, um arquivo cujo tamanho e mtime já coincidem no receptor é pulado em vez de ser re-hasheado. É o mesmo motor de transferência dos outros modos do relayium.
O sync apaga no receptor os arquivos que removi da origem?
Só se você pedir. Por padrão sync apenas adiciona e atualiza. Passe --delete para espelhar as exclusões, e o receptor precisa executar serve com --allow-delete para que sejam respeitadas — caso contrário a exclusão é ignorada e reportada de volta.
Posso manter duas pastas sincronizadas continuamente?
Sim. Adicione --watch e sync continua rodando, reespelhando a qualquer mudança sob a origem. Para uma movimentação única de uma pasta grande você não precisa dele — o laço de repetição mais um sync simples bastam.
Preciso abrir uma porta?
Para daemon direto, sim — a porta do processo à escuta (9031 por padrão) precisa ser alcançável a partir do emissor. Se você preferir não abrir uma porta e já tiver SSH entre os servidores, sync também funciona sobre SSH: relayium sync /path user@host:/path (relayium precisa estar instalado no remoto).
Espelhe uma pasta entre dois dos seus próprios servidores — incremental, retomável, sem precisar vigiar.
Obter a CLI