syncli é uma ferramenta de linha de comando, escrita em Go, para sincronizar
um diretório entre máquinas na mesma rede local.
Cada máquina roda o syncli apontando para um diretório e um nome de grupo.
Os nós do mesmo grupo se descobrem automaticamente via mDNS (zeroconf, sem
servidor central), e as alterações feitas em um diretório são propagadas para os
demais nós do grupo.
Oferecer uma forma simples de manter um diretório sincronizado entre computadores de uma rede local, sem depender de serviço na nuvem nem de configuração de servidor. É um projeto de estudo/experimentação, não um produto pronto para produção.
- Descoberta: os nós se anunciam e se encontram por mDNS no serviço
_syncli._tcp(compatível com Avahi/Bonjour). Apenas nós do mesmo grupo se conectam entre si. - Observação de arquivos: cada nó observa seu diretório recursivamente e detecta mudanças (com debounce).
- Transferência: as mudanças são enviadas via TCP aos peers do grupo. Para arquivos grandes, apenas os blocos alterados são transferidos (delta de 64 KB); arquivos pequenos são enviados por inteiro. Ao entrar em um grupo que já existe, o nó pede um snapshot completo a um peer para começar com uma cópia íntegra dos arquivos.
- Funciona apenas em rede local.
- A comunicação não é criptografada. Use somente em redes confiáveis.
- A resolução de conflitos é last-write-wins (a última escrita vence).
- Go 1.24+ (para compilar)
- Uma rede local com mDNS/multicast habilitado
Compilar a partir do código:
git clone https://github.com/ccallazans/syncli.git
cd syncli
go build -o syncli ./cmd/syncliOu instalar diretamente com o Go:
go install github.com/ccallazans/syncli/cmd/syncli@latestO projeto inclui um Dockerfile:
docker build -t syncli .
docker run --rm --network host syncli --group fotos --dir /dataO mDNS depende de multicast na rede, por isso normalmente é necessário
--network host.
syncli --group <nome> --dir <caminho> [opções] # inicia a sincronização
syncli peers [--timeout <duração>] # lista os peers na rede
syncli help # mostra a ajuda
| Opção | Descrição | Padrão |
|---|---|---|
--group <nome> |
Nome do grupo de sincronização (obrigatório) | — |
--dir <caminho> |
Diretório local a sincronizar (obrigatório) | — |
--port <porta> |
Porta TCP de escuta | 9001 |
--peer <host:porta> |
Conecta manualmente a um peer (pode repetir) | — |
--auto-join |
Entra no grupo sem pedir confirmação | false |
--verbose |
Logs de depuração | false |
| Opção | Descrição | Padrão |
|---|---|---|
--timeout <duração> |
Tempo de varredura da rede | 5s |
| Variável | Descrição |
|---|---|
SYNCLI_NODE_ID |
Define um ID fixo para o nó (por padrão é hostname-pid) |
SYNCLI_EXP_LOG |
Caminho de um arquivo JSONL para registro de eventos |
Compartilhar um diretório (o primeiro nó cria o grupo):
syncli --group fotos --dir ~/FotosEntrar em um grupo já existente (faz a varredura e pede confirmação):
syncli --group fotos --dir ~/fotos-localO mesmo, mas sem o prompt de confirmação (útil em scripts/Docker):
syncli --group fotos --dir ~/fotos-local --auto-joinRodar dois grupos na mesma máquina (use portas diferentes):
syncli --group fotos --dir ~/Fotos --port 9001
syncli --group documentos --dir ~/Documentos --port 9002Listar os peers e seus grupos na rede:
syncli peers
syncli peers --timeout 10sAdicionar um peer manualmente quando o mDNS não estiver disponível:
syncli --group fotos --dir ~/Fotos --peer 192.168.1.10:9001Para encerrar um nó em execução, use Ctrl+C.
Distribuído sob os termos do arquivo LICENSE.