Zsynchronizuj folder między 2 komputerami za pomocą obserwatora systemu plików, aby za każdym razem, gdy plik został zmodyfikowany, był on natychmiast replikowany

20

Mam:

  • serwer Linux, który łączę przez SSH na porcie IP 203.0.113.0 1234

  • komputer domowy (za routerem), publiczny adres IP 198.51.100.17, którym jest Debian lub Windows + Cygwin

Jak najłatwiej jest /home/inprogress/ zsynchronizować folder (w obu kierunkach), trochę podobnie rsync, ale z obserwatorem systemu plików , aby za każdym razem, gdy plik był modyfikowany, był natychmiast replikowany po drugiej stronie? (tzn. nie trzeba ręcznie wywoływać programu synchronizacji)

Szukam rozwiązania wiersza polecenia / bez GUI, ponieważ serwer jest bez głowy.

Czy istnieje wbudowane rozwiązanie dla systemu Linux / Debian?

Basj
źródło
7
Ty opisujesz syncthing.
Kusalananda
Jest lsync, ale nie wiem, czy to przydaje się do synchronizacji dwukierunkowej.
Ulrich Schwarz,
lsync, csync2, inotify + rsync, ale wolałbym używać ich w ustawieniach sieci lokalnej.
Rui F Ribeiro
2
Na poziomie systemu plików brzmi to jak OCFS2, a nawet RAID 1 nad NBD
roaima
3
Synchronizacja w jedną stronę jest łatwa. Synchronizacja dwukierunkowa oznacza rozwiązanie konfliktu (tak, w pewnym momencie tak się stanie), co z kolei oznacza pewien rodzaj interfejsu użytkownika (choć nie jest to konieczne GUI).
jcaron

Odpowiedzi:

23

Po komentarzu @ Kusalanandy w końcu spędziłem kilka godzin testując Syncthing dla tego przypadku użycia i działa świetnie. Automatycznie wykrywa zmiany po obu stronach, a replikacja jest bardzo szybka.

Przykład: wyobraź sobie, że pracujesz lokalnie server.pyw swoim ulubionym oprogramowaniu Notatnik, naciskasz CTRL + S (Zapisz). Kilka sekund później jest automatycznie replikowany na odległym serwerze (bez wyskakującego okna dialogowego).

Jedną wielką rzeczą, którą zauważyłem, jest to, że nie musisz myśleć o adresie IP komputera domowego i serwera z Syncthing: każde „urządzenie” (komputer, serwer, telefon itp.) Ma unikalny identyfikator DeviceID i jeśli udostępniasz identyfikator z innym urządzeniem, automatycznie dowie się, jak powinny się ze sobą połączyć.

Do zrobienia:

  • Strona komputera domowego (Windows lub Linux):

    Użyj zwykłego narzędzia konfiguracyjnego do synchronizacji w przeglądarce

  • Strona VPS:

    Najpierw połącz VPS z przekierowaniem portów:

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

    Ta ostatnia opcja przekieruje narzędzie konfiguracji sieci VPS Syncthing nasłuchujące na porcie 8384 do portu 8385 komputera domowego.

    Następnie uruchom to na 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 &
    

    Następnie w przeglądarce komputera domowego otwórz http: // localhost: 8385 : będzie to konfiguracja synchronizacji VPS!


Inne rozwiązanie, które próbowałem:


Dodatkowe zalety Syncthing, które właśnie zauważyłem:

  • można zmniejszyć fsWatcherDelaySw config.xmlod 10do 2sekund tak, że po zrobieniu CTRL + S, 2 sekundy później (+ chwili przesłać, czyli mniej niż 1 sekundę do małego pliku tekstowego) to na innym komputerze

  • jeśli zsynchronizujesz dwa komputery, które są w tej samej sieci lokalnej (po prostu przekazując sobie DeviceID, nie musisz przejmować się lokalnymi adresami IP), automatycznie zauważy, że nie musi przesyłać przez Internet, ale może radzić sobie lokalnie. Jest to świetne i pozwala na bardzo szybką synchronizację transferu (4 MB / s!) phone <--> computerObu podłączonych do tego samego routera domowego przez WiFi ... ... podczas gdy utknąłby przy 100 KB / s na ADSL z synchronizacją Dropbox. ! (mój ADSL jest ograniczony do 100 KB / s podczas przesyłania)

Basj
źródło
@sudodus Znajomy już polecił mi go kilka tygodni temu i próbowałem go do synchronizacji telefonu z komputerem <->, ale nie wyobrażałem sobie, że zadziała to tak dobrze na serwerze programistycznym! Edytuj kod, wciśnij Zapisz, 1 2 3 jest na drugim komputerze!
Basj
1
+1. Miałem ten sam problem od dłuższego czasu, używałem rsync + kilka skryptów przez lata, a w końcu próbowałem synchronizować, csync, unison i kilka innych 2 miesiące temu. Działa świetnie, z dowolną liczbą komputerów, a nawet jeśli niektóre z nich nie mają stałego połączenia sieciowego. Może polecić w 100%.
Guntram Blohm obsługuje Monikę
1
Świetnie, że przetestowałeś wszystkie te różne rozwiązania @GuntramBlohm! Jeśli masz kilka minut, aby opublikować odpowiedź, aby przekazać swoją opinię / porównanie między synchronizacją, rsync, csync, unisonem itp. Zaletami / wadami dla każdego, byłoby bardzo interesujące na przyszłość!
Basj
16

Wygląda na to, że Unison powinien to zrobić.

Unison to narzędzie do synchronizacji plików dla systemów OSX, Unix i Windows. Umożliwia przechowywanie dwóch replik kolekcji plików i katalogów na różnych hostach (lub różnych dyskach na tym samym hoście), modyfikowanie ich osobno, a następnie aktualizowanie poprzez propagowanie zmian w każdej replice do drugiej.

Ma opcjonalny interfejs GUI, który może nieco ułatwić rozwiązywanie konfliktów, ale wszystko można również zrobić za pomocą tekstowego interfejsu użytkownika. Można również wstępnie zdefiniować sposób rozwiązywania konfliktów w przypadku operacji całkowicie nienadzorowanej.

Istnieje moduł obserwatora plików (fsmonitor), który w razie potrzeby wyzwala synchronizację. Wyszukaj „powtórz zegarek” w instrukcji, aby uzyskać szczegółowe informacje.

Wygląda na to, że Debian ma właściwą wersję (2.48+) spakowaną po wyjęciu z pudełka .

TooTea
źródło
Dzięki! Czy obserwator plików fsmonitor jest dołączony do pudełka z Unison, czy też musimy zainstalować to narzędzie i ręcznie połączyć go z Unison?
Basj
1
@Basj Jest zawarty w wystarczającej liczbie ostatnich wersji i jest bardzo prosty w konfiguracji. Dodałem link do instrukcji.
TooTea,
Użyłem go w przeszłości na starym komputerze Mac. Po prostu działa przy minimalnym wysiłku. Nie mam pojęcia, czy jest to odpowiednie dla scenariuszy serwerowych.
Rui F Ribeiro