Syncthing
2023-08-14
Niewiele jest programów, które nigdy nie sprawiły mi problemu, które odpalam z pełną pewnością, że mnie nie zawiodą i zawsze wykonają robotę dla której zostały stworzone. Mutt, Vim, ssh… i to chyba tyle. Kilka lat temu dodałem do tej listy chwały jeszcze jeden program: Syncthing.
Mam problem z pisaniem o aplikacjach, jestem pewien, że wszyscy, którzy to czytają nie tylko wiedzą to, co i ja, pewnie więcej, nie mają problemów z przeczytaniem dokumentacji, a bez problemu uwierzyłbym, że 90% z was mogłaby taką czy inną aplikację skompilować ze źródeł. Ciężko czasem zebrać się i napisać coś więcej niż jedno zdanie typu „zbadaj Syncthing, mi się podoba”.
Ponieważ jestem w lesie, napisałem już listy, odpisałem na e-maile, a poza laptopem jedyną technologią w której jestem obecnie posiadaniu, jest świeczka, zmarnuję wam i sobie trochę czasu przed świtem.
Syncthing jak pewnie można zgadnąć z nazwy służy do synchronizacji plików. Temat oklepany i w większości rozwiązany, często po łebkach, przez różne płatne serwisy. Ja nie mogę żyć z nimi w zgodzie z własnym sumieniem, tak jak rodzina jest podstawową jednostką społeczną, tak LAN jest dla mnie podstawową jednostką infrastruktury sieciowej. Poligamia Internetu jest moralnie szara, może nawet godna potępienia. Spędziłem dużo czasu żeby wszystko, co robię działało bez problemów bez względu na to, czy jestem podłączony do Internetu. Jak śpiewał poeta, „mój jest ten kawałek podłogi”.
Używając Syncthinga możemy sparować między sobą komputery, zarówno w LAN, jak i te dostępne poza granicami naszej infrastruktury, przy użyciu jednego UUID wygenerowanego podczas pierwszego startu aplikacji na komputerze. Dzielimy się identyfiaktorem z kimś i kiedy obie strony wyrażą zgodę, relacja zostanie ustanowiona i można wybrać zdefiniowane foldery, które zostaną rozdmuchane na wszystkie komputery. Poza tak oczywistą funkcją, jest kilka rzeczy wartych uwagi, których nie znajdziecie nigdzie indziej.
Zawartość udostępnionych folderów może być „wersjonowana” w kilku różnych trybach, instancja może traktować folder jako „tylko do niego piszę” (nie akceptuję zmian z innych instancji), „tylko z niego czytam” (synchronizuję folder, ignoruję lokalne zmiany), możemy ustawić limity oraz współdzielone hasło używane podczas transmisji. Rzeczą dla mnie najważniejszą jest to, że folder może być dzielony asymetrycznie. Jeśli masz w domu kilka komputerów na których chodzi Syncthing, możesz wybrać dowolną architekturę: kto od kogo synchronizuje i na jakich zasadach.
Zamiast opisywać prozą elementów UI, co zawsze wychodzi słabo, albo kręcić wideo (“don’t forget to like & subscribe”) opiszę wam jak praktycznie używam Syncthing każdego dnia.
Nie lubię telefonów
Powiem więcej, gardzę telefonami. Jest powód dla którego mój telefon leży teraz 90km stąd, wyłączony. Nie da się jednak zaprzeczyć, że są użyteczne. Mój gra podcasty i czasem robi zdjęcia. W wyniku działania klienta podcastu czy aplikacji aparatu na telefonie pojawiasię plik, a ten czasem chcę mieć od razu pod ręką, bez sięgania do telefonu lub polegania na zewnętrznej synchronizacji, która wymaga Internetu.
Syncthing na telefonie. Folder Photos
i folder Podcasts
udostępnione są w trybie „tylko do niego piszę”, to znaczy, że to jest jedyne źródło prawdy. Domowy serwer (czyli w mojej nomenklaturze, komputer, który prawie zawsze jest włączony i pradopodobnie ma dostęp do Internetu) synchronizuje oba te foldery na swój dysk w trybie „tylko z niego czytam”. Do tej pory jasne. Robię fotkę, Syncthing wysyła ją na serwer. Pojawia się nowy odcinek podcastu, Syncthing wysyła go na serwer. Teraz laptop. Źródłem danych do synchronizacji jest zarówno telefon jak i serwer. Co to znaczy?
Wyobraźmy sobie, że przez noc ściągnął się nowy odcinek. Telefon dogadał się z serwerem domowym. Ja wstaję, wyłączam telefon (to nie jest pogadanka moralna ani hipotetyczna historia, to wtorek w moim domu) bo na co mi telefon rano. Robię kawę, włączam laptopa. Laptop widzi zmiany na serwerze domowym i je do mnie synchronizuje. Mimo braku głównego źródła wszystko nadal działa jak trzeba. A takie choinki zależności możecie budować tak wysoko jak starczy wam kreatywności.
Raz wystarczy
W pracy często przydzielają mi (choć raczej ja przydzielam sobie, a nikt nie protestuje) prace archelogiczno-detektywistyczne. „Zobacz, co można uratować z SebixCMS, dostaliśmy od klienta jako jedyne źródło dokumentów”. Wtedy okazuje się, że struktura folderów jest oparta na znakach zodiaku i kalendarzu księżycowym, obrazki są w TIFF i BMP, wideo w MOV, a dane tabularyczne w formacie wymyślonym przez programistę, który odszedł z pracy przez to, że nie mógł zdzierżyć pracowania z tak okropnym formatem.
Siadam więc i piszę dziesiątki stron notatek, produkuję mniejsze lub większe skrypty, które grabią po tej stajni Augiasza. Problem z tym, że reszta ludzi pracujących w projekcie będzie miała problem z powtórzeniem moich sztuczek. Skąd ja wziąłem ten cruncher do PNG, pewnie ze źródeł jakiegoś zapomnianego projektu na SourceForge, czy da się zbudować żeby działał pod Windowsem? Nie wiem, nie chcę wiedzieć. Który z setek parametrów potrzebny jest do FFmpeg? Kto wie.
Mój komputer w pracy oraz laptop udostępniają więc innym ludziom (i serwerowi testowemu, ekstremalnie użyteczne. Syncthing nie potrzebuje UI, można więc namówić admina (albo ukraść jego id_rsa
) żeby zainstalował) folder z samymi artefaktami po przetwarzaniu. Oni synchronizują się do serwera (po co mają wiedzieć UUID mojego prywatnego laptopa?), serwer synchronizuje się do komputera biurowego lub laptopa, a one między sobą.

Git dla ubogich
Kocham moich przyjaciół, więc kiedy trzeba staram się im ułatwić życie. Piszemy obecnie grę z thungiem. On rysuje, ja koduję. Nikt z nas nie robi muzyki, dzięki bogom. Mógłbym go nauczyć podstaw Gita albo znaleźć jakiegoś biurkowego klienta dla niego, ale i tak praca szła by karkołomnie. Mój podstawowy serwer Gita to sr.ht, gdzie kooperacja w projekcie odbywa się przy pomocy list dyskusyjnych i dystrybucji patchsetów. Jak mówiłem, kocham swoich przyjaciół i nigdy bym im takiej krzywdy nie zrobił.
Mam też obiekcje przed dodawaniem plików binarnych do Gita. Być może jest to traumatyczna reakcja z czasu gdy przyjaciel frontendowiec dodał do projektu katalog „do pobrania” serwisu nad którym pracowaliśmy. W tym na przykład plik instalacyjny Quake3.exe
. A ponieważ była to epoka Subversion spędziłem bardzo przyjemne popołudnie ręcznie wycinając jego bohaterstwo z pliku wyprodukowanego przez svnadmin dump
.
Odpowiedzią oczywiście jest znów Syncthing! On pracuje jak człowiek, kompletnie nieświadomy mechaniki pod spodem, a ja robię commity. Wilk syty, owca cała. Boję się tylko dnia, gdy pomyśli, że fajnie jest posprzątać w projekcie i wywali jakiś bezużyteczny folder, na przykład .git
, w nim same śmieci.
jutup premium
Ustaliliśmy już, że lubię jak wszystko w moim domu działa bez względu na to, czy mogę się dobić do Internetu, czy też nie. Listę “Watch Later” na YouTube traktuję bardzo poważnie, zgodnie z przeznaczeniem. Umieszczam tam filmy, które chcę zobaczyć, a potem je oglądam — jak szaleniec. Normalnie lista “Watch Later” traktowana jest ambicjonalnie, jak modlitwa, trafiają na nie filmy typu „80 kroków by być lepszym człowiekiem”, „Praca z drewnem, od amatora do własnego domu” i „Analiza analizy okropnego filmu niewartego uwagi (7h)” tylko po to by być usunięte po kilku latach.
Skoro traktuję ją poważnie, to znaczy, że chcę ją mieć na moim laptopie. Telefony i tablety mogą pobierać listy odtwarzania, ale a) trzeba za to płacić b) laptopa mam zawsze, telefon jest opcjonalny. Zgadliście, Syncthing.
Na domowym serwerze, w crontabie, siedzi sobie taki oto skrypt.
#!/bin/bash
p=${1:-download}
cd /media/muczoshito/shitube
if [ $p == "clean" ]; then
rm *vtt *jpg *json *webp *mp4 *concat archive.txt .syncthing*
exit
fi
/home/hive/.local/bin/yt-dlp --cookies /media/ssd/Syncthing/Sync/cookies.txt \
--write-info-json \
--write-thumbnail \
--write-subs \
--embed-subs \
--sub-langs all \
--embed-chapters \
--download-archive archive.txt \
--sponsorblock-remove default \
-f "bestvideo[height<=1080][ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" \
https://www.youtube.com/playlist\?list\=WL
find ! -name '.stfolder' ! -name 'archive.txt' -ctime 15 -delete
On sobie siedzi tam, ja teraz w lesie, ale nadal mogę zobaczyć, co chciałem zobaczyć. Możecie też zauważyć, że plik cookies.txt
także pochodzi z folderu Syncthing. Pobranie listy “Watch Later” wymaga autoryzacji, jako że ta jest zawsze prywatna, mam więc cookiejar z odpowiednimi ciastkami sesyjnymi, które mogę pobrać z laptopa.
~ ls /media/dump/Shitube/*.mp4 1983 in Film [Ab5LeWADtEU].mp4 How programmers flex on each other [r6tH55syq0o].mp4 That's No Ordinary iMac G3... [rvkaAqCaduE].mp4
Proszę, oto i wschód słońca. Znowu udało się doczekać końca.
