Syncthing is een gebruikersvriendelijke applicatie waarmee je continue synchronisatie van bestanden tussen twee of meer computers op veilige manier realiseert. Syncthing draait op alle bekende besturingssystemen. Maak je eigen synchronisatie server op een Raspberry Pi.

Door: Matto Fransen

Wanneer je meerdere systemen hebt, zoals een laptop, een computer en een of meer Android-apparaten, is het handig wanneer die onderling bestanden kunnen uitwisselen. Synchronisatie van mappen gebruik je om de inhoud van folders op twee of meer systemen aan elkaar gelijk te houden. Dit kunnen systemen van jezelf zijn, maar je gebruikt dit ook om met anderen een of meer directory’s te delen.

Diverse commerciële cloudaanbieders bieden synchronisatiediensten aan, waarvan Dropbox het meest bekend is. Wij houden liever zelf alles onder controle en zochten een alternatief, bij voorkeur een oplossing die ook geschikt is voor op een Raspberry Pi.

Syncthing

Syncthing is een open source bestandssynchronisatie applicatie met privacy als uitgangspunt. Het gebruikt end-to-end encryptie en jij bepaalt zelf op welke systemen je data wordt opgeslagen en met wie die wordt gedeeld. Syncthing maakt geen gebruik van een centrale cloudserver. Alle communicatie is versleuteld via TLS op basis van het zogenoemde “perfect forward secrecy” principe.

De gebruiker kiest zelf een of meer te synchroniseren directory’s. Per directory kies je tussen welke apparaten de synchronisatie plaatsvindt. Heb je deze zaken ingesteld, dan verloopt de verdere synchronisatie automatisch.

Platform onafhankelijke synchronisatie

Syncthing is geschreven in Go en beschikbaar onder de open source Mozilla Public License 2.0. Syncthing draait op Android, FreeBSD, Linux, Mac OS X, OpenBSD, Solaris en Windows en is makkelijk te installeren. Een iOS-versie van Syncthing bestaat helaas niet. Op de meeste Linux distributies en op de BSD systemen installeer je Syncthing eenvoudig via de betreffende packagemanager.

Richt in je thuisnetwerk een Syncthing server in, bijvoorbeeld op een Raspberry Pi, en synchroniseer mappen op verschillende apparaten, ook wanneer daarbij sprake is van een mix van besturingssystemen. Hiermee krijg je bijvoorbeeld makkelijk de foto’s van je Android apparaat op je Linux computer, of deel je bestanden tussen je laptop en je PC, enzovoorts.

Device ID

Apparaten zoals je laptop, PC, je Raspberry Pi of bijvoorbeeld je Android tablet, hebben alle een uniek “device ID”. Apparaten kunnen met Syncthing alleen met elkaar informatie uitwisselen indien ze elkaars “device ID” kennen. Dit is de publieke sleutel van een uniek 384 bit ECDSA publiek- en geheim sleutelpaar. Syncthing gebruikt TLS voor gegevensuitwisseling op basis van deze keys. Je hoeft niet geheimzinnig met je “device ID” om te gaan, het is immers een publieke sleutel. Uiteraard houd je wel je geheime sleutel geheim. De uitwisseling tussen twee apparaten start met een TLS handshake. Daarbij controleren de apparaten de geldigheid van elkaars sleutels. Nadat alles in orde bevonden is, begint de gegevensuitwisseling. Al het dataverkeer is versleuteld.

Raspberry Pi

Het installeren van Syncthing op onze onze Raspberry Pi met Raspbian Buster gaat eenvoudig met sudo apt-get install syncthing. Systemd wil graag van ons horen onder welke gebruiker Syncthing moet starten. Om Syncthing straks goed te kunnen beheren, maken we een aparte user aan met adduser syncthing. We laten Syncthing nu starten, Syncthing zet dan voor eens een standaard configuratiebestand op de juiste plek. Met Systemd enabelen en starten we Syncthing. Dit doen we met:

sudo systemctl enable syncthing@syncthing.service
sudo systemctl start syncthing@syncthing.service

De eerste keer dat Syncthing start maakt het een standaard configuratiebestand aan. We worden nu tijdelijk de syncthing-gebruiker en passen deze configuratie aan.

su - syncthing
cd /home/syncthing/.config/syncthing

Open het bestand “config.xml” in je editor en zoek naar het blokje dat start met ‘gui enabled=“true”’. Wijzig hier “127.0.0.1:8384” het IP-adres voor localhost (127.0.0.1) in het ip-adres van je Raspberry Pi, bijvoorbeeld “192.168.0.123:8384”.

Met “exit” word je weer je eigen user, herstart Syncthing met sudo systemctl restart syncthing@syncthing.service

Admin GUI
Open in de browser het IP-adres met de port die je zojuist hebt opgegeven, in ons voorbeeld http://192.168.0.123:8384.

Syncthing vraagt om toestemming een anoniem gebruiksrapport naar data.syncthing.net te sturen, dit is niet verplicht. Vervolgens komen we in het management dashboard, dit waarschuwt dat nog geen wachtwoord op op dit dashboard zit. Dit doen we natuurlijk als eerste, klik op settings en ga naar de “GUI” tab. Hier kunnen we ook kiezen of we https willen gebruiken voor de GUI zelf. Voorlopig doen we dat nog even niet, om te voorkomen dat we veel tijd kwijt zijn met oplossen van self-signed certificaatproblemen.

Wanneer je liever een dashboard in het Nederlands hebt, dan kies je in de menubalk voor “Dutch” in plaats van “English”.

Nadat Syncthing op de Raspberry Pi draait, gaan we één voor één de andere systemen die we willen synchroniseren voorzien van Syncthing en configureren. We doen dit met een Linux systeem en een Android tablet.

Installeer Syncthing via de packagemanager op je Linux of BSD laptop of computer. Je hebt nu twee opties, je kunt Syncthing automatisch laten starten bij het booten, of je start het met de hand. Wil je Syncthing automatisch op de achtergrond laten draaien, volg dan de hierboven beschreven methode voor de Raspberry Pi, met een aparte gebruiker en het enabelen en starten van de Syncthing-dienst via Systemd. Op je lokale systeem hoef je het config.xml bestand niet aan te passen, omdat je met je browser op localhost draait.

Nadat syncthing is gestart doe je de rest van het beheer met je webbrowser. Ga hiervoor naar de admin GUI via de URL http://localhost:8384/, zie onderstaande afbeelding. Wil je Syncthing liever met de hand starten, geef dan “syncthing” op de commandline in. Syncthing start onder jouw gebruiker en opent automatisch de admin GUI in je webbrowser.

De Syncthing web-GUI.

Synchronisatie opzetten

Nu Syncthing op twee machines draait gaan we de synchronisatie instellen. Open in je browser twee browser-tabbladen, een tab met de admin GUI van de Raspberry Pi en een tab met de lokale admin GUI. De admin GUI bestaat, naast de menukeuzes in de bovenbalk, uit drie gedeelten, “dit apparaat”, “externe apparaten” en “Mappen”. Via de menubalk “Acties” kies je voor “ID weergeven”. Je krijgt dan een lange string te zien, met daaronder de QR-code van die string. Kopieer die string. Ga naar het andere tabblad, en open daar “Extern apparaat toevoegen”. Plak het ID in het betreffende vakje en ga naar de tab “Sharing” en selecteer welke mappen je wilt synchroniseren. Ga naar het tabje “Geavanceerd” en vul bij adressen het adres “tcp://<ip-adres>:8384” in, waarbij je <ip-adres> vervangt door het adres van het betreffende systeem. In de andere browsertab zie je dat andere apparaat wil connecten, klik hierop. Het apparaat ID is reeds ingevuld, vul ook de andere tabbladen in.

Introductie-apparaat

Bij het bewerken van de gegevens van het externe apparaat zie je de optie “introductie-apparaat”. Klik deze aan, wanneer je wilt dat tijdens het synchroniseren op je lokale machines automatisch de benodigde mappen worden aangemaakt. Let er op dat maar één van de twee apparaten introductie-apparaat kan zijn om race-condities te voorkomen.

Wanneer je de Raspberry Pi als centrale server inzet, en alle andere apparaten via de Raspberry Pi laat synchroniseren, dan selecteer je deze optie alleen op het systeem waar je alle mappen, die op de Raspberry Pi gesynchroniseerd worden, wilt ontvangen. Bij de andere apparaten kies je handmatig de mappen die je gesynchroniseerd wilt hebben.

In het tabblad “Geavanceerd” van de betreffende map kies je of je alleen wilt verzenden, alleen wilt ontvangen, of beide. De synchronisatie verloopt op de achtergrond. Van tijd tot tijd controleert Syncthing of er wijzigingen zijn. Indien nodig start het dan synchronisatie acties. Is een systeem onbereikbaar, bijvoorbeeld omdat je laptop uit staat, dan wordt zorgt Syncthing later voor de synchronisatie. Houd er rekening mee dat verwijderen van een bestand ook een wijziging is die gesynchroniseerd wordt, het bestand verdwijnt ook uit de betreffende mappen op de andere systemen. Wanneer je gekozen hebt om Syncthing niet via systemd maar via de commandline op te starten, dan start het na een reboot niet automatisch. De configuratie is wel bewaard, dus wanneer je met dezelfde gebruiker vanaf de commandline Syncthing opstart, dan werkt alles weer. Dit gebruik je bijvoorbeeld om je laptop alleen in je thuisnetwerk te laten synchroniseren.

De Synthing Android GUI.

Android

Syncthing is erg makkelijk om foto’s en andere bestanden van je Android tablet of smartphone te synchroniseren. Wij installeerden via F-Droid de Syncthing applicatie. Via de Google Playstore kan natuurlijk ook. Nadat je de applicatie geïnstalleerd hebt, stel je deze op een gelijke manier in. Onder het hamburger-menu vind je de menukeuze Web-GUI waarmee je op een vergelijkbare webpagina komt als we eerder gezien hebben (zie bovenstaande afbeelding).

Wij hebben Syncthing ingesteld om de directory’s “Camera” en de “Screenshots” te synchroniseren met de Raspberry Pi. Onze laptop synchroniseert hiermee, zodat een nieuwe foto op het Android apparaat deze na een tijdje vanzelf op de laptop verschijnt. Wij kiezen op onze Android apparaten voor “alleen verzenden”. Je kunt alle apparaten onderling laten synchroniseren, zonder inzet van een centrale synchronisatieserver. Het voordeel van een centrale synchronisatieserver is dat het makkelijker is om overzicht te hebben wat met wie gedeeld wordt, bovendien heb je dan op je centrale server ook een kopie van de bestanden.

Versioning van bestanden

Syncthing kent verschillende manieren van versioning. De standaard instelling is “geen versioning”. Een andere instelling lijkt op dat van de prullenbak, wanneer een nieuwe versie voor een bestaand bestand wordt gesynchroniseerd, dan wordt de vorige versie in het archief bewaard, in de directory “.stversions”. Hierbij stel je het aantal dagen in, dat een bestand in het archief blijft. Syncthing verwijdert het archiefbestand na afloop van deze periode.

Een andere optie is “Simple File Versioning”, waarbij je met “Keep Versions” opgeeft hoeveel versies je wilt bewaren. Wanneer je “Keep Versions” op vier zet, dan bewaart Syncthing de laatste vier versies in de “.stversions” directory. “Staggered File Versioning” is de combinatie van het aantal versies dat bewaard wordt en de duur daarvan. Je kunt ook voor “External File Versioning” kiezen, hierbij geef je een script op. Syncthing runt het script vlak voor het overschrijven van een bestand door een nieuwe versie. Voor al deze methodes geldt dat Syncthing uitsluitend iets met versies doet wanneer deze op een ander apparaat zijn gewijzigd en met dit apparaat gesynchroniseerd worden.

SSH-tunnel

Wanneer twee machines niet in hetzelfde netwerk zitten, maar wel onderling SSH-verkeer mogelijk is, dan kun je een SSH-tunnel opzetten. Op deze manier hoef je niet je Syncthing-server direct bloot te stellen. Je maakt de SSH-tunnel door vanaf een van de twee machines als volgt een verbinding op te zetten.

ssh -L 1999:127.0.0.1:8384 gebruiker@192.168.2.102

Vervang “gebruiker@192.168.1.102” met de juiste gebruikersnaam en IP-adres. Je kunt nu de Admin GUI van het remote systeem openen in je browser via “http:/localhost:1999”.

Syncthing is een mooi Dropbox alternatief. Het is een handige methode om makkelijk automatisch foto’s en screenshots van je Android apparaat naar je laptop over te zetten en bestanden tussen Linux-, BSD- en Windows-systemen onderling te synchroniseren, of met anderen te delen. Je installeert het eenvoudig met je packagemanager. Probeer het zelf!

Instellingen van een map.