Sincronize uma pasta entre 2 computadores, com um observador do sistema de arquivos, para que cada vez que um arquivo seja modificado, ele seja replicado imediatamente

20

Eu tenho:

  • um servidor Linux que eu conecto via SSH na porta IP 203.0.113.0 1234

  • um computador doméstico (atrás de um roteador), IP público 198.51.100.17, que é Debian ou Windows + Cygwin

Qual é a maneira mais fácil de /home/inprogress/ sincronizar uma pasta (em ambas as direções), um pouco como rsync, mas com um observador do sistema de arquivos , para que cada vez que um arquivo seja modificado, ele seja replicado imediatamente do outro lado? (ou seja, não é necessário chamar manualmente um programa de sincronização)

Estou procurando uma solução de linha de comando / sem GUI, pois o servidor está sem cabeça.

Existe uma solução interna Linux / Debian?

Basj
fonte
7
Você está descrevendo syncthing.
Kusalananda
Existe lsync, mas não sei se funciona de maneira útil para sincronização bidirecional.
Ulrich Schwarz
lsync, csync2, inotify + rsync, mas eu preferiria usá-los em uma configuração de rede local.
Rui F Ribeiro
2
Ao nível do sistema de arquivos, isso soa como OCFS2, ou mesmo RAID 1 sobre NBD
roaima
3
A sincronização unidirecional é fácil. A sincronização bidirecional implica na resolução de conflitos (sim, isso acontecerá em algum momento), o que, por sua vez, significa algum tipo de interface do usuário (embora não seja necessária uma GUI).
jcaron

Respostas:

23

Após o comentário de @ Kusalananda, finalmente passei algumas horas testando o Syncthing neste caso de uso e ele funciona muito bem. Ele detecta automaticamente as alterações nos dois lados e a replicação é muito rápida.

Exemplo: imagine que você está trabalhando localmente server.pyem seu software Notepad favorito e pressiona CTRL + S (Salvar). Alguns segundos depois, ele é replicado automaticamente no servidor distante (sem nenhuma caixa de diálogo pop-up).

Uma grande coisa que notei é que você não precisa pensar no IP do computador e servidor doméstico com o Syncthing: cada "dispositivo" (computador, servidor, telefone etc.) tem um DeviceID exclusivo e, se você compartilhar o ID com outro dispositivo, ele descobrirá automaticamente como eles devem se conectar.

Façam:

  • Lado do computador doméstico (Windows ou Linux):

    Use a ferramenta de configuração normal do Syncthing no navegador

  • Lado do VPS:

    Primeiro conecte o VPS com um encaminhamento de porta:

    ssh <user>@<VPS_IP> -L 8385:localhost:8384
    

    A última opção redirecionará a ferramenta de configuração da Web Syncthing do VPS que escuta na porta 8384 para a porta 8385 do computador doméstico.

    Em seguida, execute isso no VPS:

    wget https://github.com/syncthing/syncthing/releases/download/v0.14.52/syncthing-linux-amd64-v0.14.52.tar.gz 
    tar xvfz syncthing-linux-amd64-v0.14.52.tar.gz
    nohup syncthing-linux-amd64-v0.14.52/syncthing &
    

    Em seguida, no navegador do computador doméstico, abra http: // localhost: 8385 : essa será a configuração de Sincronização do VPS!


Outra solução que tentei:


Vantagens adicionais do Syncthing que acabei de notar:

  • você pode reduzir fsWatcherDelaySno config.xmla partir 10de 2segundos para que depois de fazer CTRL + S, 2 segundos mais tarde (+ o tempo para upload, ou seja, menos de 1 segundo para um arquivo de texto pequeno) é no outro computador

  • se você sincronizar dois computadores que estão na mesma rede local (fornecendo apenas o DeviceID, não há necessidade de se preocupar com os endereços IP locais), ele notará automaticamente que não precisa transitar pela Internet, mas pode lidar localmente. Isso é ótimo e permite uma sincronização de transferência de velocidade muito rápida (4 MB / s!) Dos phone <--> computerdois conectados ao mesmo roteador doméstico via Wi-Fi ... ... considerando que ficaria preso a 100 KB / s no ADSL com uma sincronização do Dropbox ! (meu ADSL está limitado a 100 KB / s no upload)

Basj
fonte
@sudodus Um amigo já o recomendou há algumas semanas, e eu tentei para sincronização telefônica por computador <->, mas não imaginava que funcionaria tão bem também para um servidor de desenvolvimento! Edite seu código, pressione Salvar, 1 2 3 está no outro computador!
Basj
11
+1. Eu tive o mesmo problema por um bom tempo, usei o rsync + alguns scripts por anos e finalmente tentei sincronizar, csync, unison e alguns outros dois meses atrás. Funciona muito bem, com vários computadores e mesmo quando alguns deles não têm uma conexão de rede permanente. Pode recomendar 100%.
Guntram Blohm apoia Monica
11
Ótimo que você testou todas essas soluções diferentes @GuntramBlohm! Se você tiver alguns minutos para postar uma resposta para dar seu feedback / comparação entre syncthing, rsync, csync, unison, etc. os prós / contras de cada um, seria super interessante para referência futura!
Basj
16

Parece que o Unison deve fazer o trabalho.

O Unison é uma ferramenta de sincronização de arquivos para OSX, Unix e Windows. Ele permite que duas réplicas de uma coleção de arquivos e diretórios sejam armazenadas em hosts diferentes (ou discos diferentes no mesmo host), modificadas separadamente e atualizadas, propagando as alterações em cada réplica para a outra.

Ele possui uma GUI opcional que pode facilitar a resolução de conflitos, mas tudo também pode ser feito usando uma interface de usuário baseada em texto. Você também pode predefinir como resolver conflitos para uma operação totalmente autônoma.

Há um componente observador de arquivos (fsmonitor) para disparar uma sincronização sempre que necessário. Procure "repetir o relógio" no manual para obter detalhes.

Parece que o Debian tem a versão correta (2.48+) empacotada imediatamente .

TooTea
fonte
Obrigado! O observador de arquivos fsmonitor está incluído imediatamente no Unison ou precisamos instalar esta ferramenta e conectá-la manualmente ao Unison?
Basj
11
@ Basj Está incluído em versões recentes o suficiente e é realmente trivial de configurar. Eu adicionei um link ao manual.
TooTea
Eu usei no passado em um Mac antigo. Funciona apenas com o mínimo de problemas. Porém, não faço ideia se é apropriado para cenários de servidor.
Rui F Ribeiro