Relayium

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:

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

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

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:

  1. 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 faltando
  2. Rode 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; done
  3. Desanexe 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

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:

  1. 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.

  2. Compare os totais nos dois servidores.

    # compare os totais nos DOIS servidores
    du -sh /root/workspace
  3. Pare 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

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 à escuta

O 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 9031

A 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; done

Um 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.pid

Matar 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:9031

O 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

Continue lendo