Syncthing: Dateien zwischen Geräten synchronisieren – ohne Cloud
Dateien direkt zwischen deinen Geräten abgleichen, verschlüsselt und ohne fremde Cloud: Syncthing als Peer-to-Peer-Sync hinter Traefik, mit Backup-Tipps.
Inhaltsverzeichnis
Dropbox ohne Dropbox: Mit Syncthing kannst du Dateien direkt zwischen deinen Geräten synchronisieren – verschlüsselt, ohne dass die Dateien je auf einem fremden Server liegen. Auf einem immer erreichbaren VPS wird dein Server zum zuverlässigen Sync-Knoten, der auch dann vermittelt, wenn Laptop und Handy nie gleichzeitig online sind.
Was bauen wir?
Einen dauerhaft laufenden Syncthing-Knoten mit Syncthing v2.1.5 hinter Traefik. Am Ende erreichst du die Weboberfläche verschlüsselt unter deiner Domain, hast sie mit einem Passwort abgesichert und kannst deine Geräte über ihre Geräte-IDs koppeln, sodass ausgewählte Ordner automatisch abgeglichen werden. Anders als Nextcloud ist Syncthing kein zentraler Speicher, sondern ein Peer-to-Peer-Abgleich: Jedes Gerät hält eine vollständige Kopie, der Server ist nur ein besonders zuverlässiger Teilnehmer.
Voraussetzungen
- Ein Server mit laufendem Traefik und Docker Compose
- Eine Subdomain, die auf den Server zeigt – im Folgenden
DEINE_DOMAIN - Die Möglichkeit, Port 22000 (TCP+UDP) zu öffnen – darüber läuft der eigentliche Sync. Auf einem netcup-VPS sind das zwei Ebenen: die UFW-Firewall auf dem Server und, falls dir im SCP eine eingehende Policy zugewiesen ist, zusätzlich die netcup-Firewall. Ohne offenen Port geht es zwar trotzdem – dann aber über fremde Relay-Server, siehe Schritt 7
- Syncthing auf mindestens einem weiteren Gerät (Desktop, oder die Android-App)
VPS 1000 G12.5
4 vCore · 8 GB RAM · 128 GB SSD
ab 14,50 €/Monat
Ein kleiner VPS als Dauer-Sync-Knoten reicht völlig – Syncthing ist genügsam.
💶 1 Monat gratis:
Einmal einlösbar, gilt für VPS 1000 G12.5. Im Warenkorb einlösen →
💶 5,95 € Gutschein für netcup-Neukunden: immer gültig · nicht für Domains und VPS Lite
Schritt für Schritt
Schritt 1: Verzeichnisse anlegen – und die Rechte gleich richtig setzen
Syncthing speichert seine Konfiguration und die synchronisierten Daten in zwei Ordnern. Der Container läuft als normaler Benutzer (UID 1000), deshalb müssen die Ordner diesem gehören – das ist die häufigste Startfalle:
mkdir -p /opt/syncthing/config /opt/syncthing/data
chown -R 1000:1000 /opt/syncthing/config /opt/syncthing/data
cd /opt/syncthingOhne chown startet Syncthing nicht
permission denied“ im Log). Das chown auf UID/GID 1000 vor dem ersten Start verhindert das – mehr zu Rechten in Benutzer & Rechte.Schritt 2: Compose-Datei
Ersetze DEINE_DOMAIN. Wichtig ist der Unterschied zwischen Weboberfläche und Sync-Verkehr:
services:
syncthing:
image: syncthing/syncthing:2.1.5
restart: unless-stopped
hostname: koch-server
environment:
PUID: '1000'
PGID: '1000'
volumes:
- ./config:/var/syncthing/config
- ./data:/var/syncthing/Sync
ports:
- "22000:22000/tcp" # Sync-Protokoll (direkt, nicht über Traefik)
- "22000:22000/udp" # Sync über QUIC
- "21027:21027/udp" # lokale Geräte-Erkennung
networks: [proxy]
labels:
- "traefik.enable=true"
- "traefik.http.routers.syncthing.rule=Host(`DEINE_DOMAIN`)"
- "traefik.http.routers.syncthing.entrypoints=websecure"
- "traefik.http.routers.syncthing.tls.certresolver=le"
- "traefik.http.services.syncthing.loadbalancer.server.port=8384"
networks:
proxy:
external: trueNur die Weboberfläche (Port 8384) läuft über Traefik – dafür sorgen die Labels. Der eigentliche Sync-Verkehr (Port 22000) ist ein eigenes Protokoll, kein HTTP, und wird deshalb direkt über ports: veröffentlicht, nicht über Traefik geleitet. Genau diese Trennung erklärt Docker-Netzwerke verstehen.
Schritt 3: Firewall öffnen und starten
Öffne den Sync-Port in der Firewall (sonst finden sich die Geräte nicht):
ufw allow 22000/tcp
ufw allow 22000/udpNutzt du zusätzlich die netcup-Firewall im SCP, gib denselben Port auch dort frei – sonst blockt die vorgelagerte Firewall den Sync, bevor er den Server überhaupt erreicht. Ob der Port wirklich durchkommt, prüfst du später von einem anderen Rechner aus (nicht vom Server selbst, der erreicht sich immer):
nc -vz DEINE_DOMAIN 22000Connection to DEINE_DOMAIN (203.0.113.10) 22000 port [tcp/*] succeeded!Läuft der Befehl stattdessen in einen Timeout, ist der Port noch in einer der beiden Firewalls zu. Das ist kein Beinbruch – Syncthing weicht dann auf Relay-Server aus (Schritt 7) –, aber der direkte Weg ist schneller und bleibt unter dir.
Dann starten:
docker compose up -dGeduld: Traefik wartet auf den Healthcheck
healthy ist. Bis der erste Check durch ist, existiert für deine Domain also noch gar keine Route – und damit auch noch kein Zertifikat. Im Browser siehst du in dieser Minute deshalb keine 404, sondern zuerst eine Zertifikatswarnung: Traefik antwortet mit seinem eigenen Notzertifikat (curl bricht mit „certificate verify failed" ab, mit curl -k käme eine 404). Das ist normal und verschwindet von selbst.Den Status fragst du direkt am Container ab:
docker inspect -f '{{.State.Health.Status}}' syncthing-syncthing-1healthySteht dort noch starting, warte die 60 Sekunden ab. Sobald healthy erscheint, baut Traefik die Route auf und holt das Let’s-Encrypt-Zertifikat – wenige Sekunden später antwortet die Oberfläche mit gültigem HTTPS:
curl -sI https://DEINE_DOMAIN/ | head -1HTTP/2 200Schritt 4: Die Weboberfläche und der wichtige Sicherheitsschritt
Öffne https://DEINE_DOMAIN/. Die Oberfläche ist standardmäßig auf Englisch; du siehst dein Gerät („This Device“) mit seiner Geräte-ID, Version und Status:

Auf einer frischen Installation warnt Syncthing oben mit rotem Banner, dass noch kein GUI-Passwort gesetzt ist – das ist ernst zu nehmen: Ohne Passwort kann jeder, der die Oberfläche erreicht, auf deine Dateien zugreifen. Setze daher sofort unter Actions → Settings → GUI („Aktionen → Einstellungen") einen Benutzernamen und ein starkes Passwort:

Nach Save lädt Syncthing neu und begrüßt dich ab sofort mit einem Login-Formular – zusätzlich zum HTTPS von Traefik.
Die orange Zeile über dem Feld GUI Listen Address („The GUI address is overridden by startup options") ist kein Fehler: Das offizielle Image setzt die Adresse über die Umgebungsvariable STGUIADDRESS=0.0.0.0:8384 fest, damit die Oberfläche überhaupt aus dem Container heraus erreichbar ist. Das Feld ist dadurch wirkungslos – alle anderen Einstellungen auf dem Reiter greifen normal.
GUI-Passwort in der Oberfläche setzen, nicht per generate als root
syncthing generate als root im Container ausführt, schreibt die config.xml mit falschem Besitzer – danach startet Syncthing nicht mehr (permission denied). Falls das passiert: chown -R 1000:1000 /opt/syncthing/config und neu starten.Schritt 5: Ein zweites Gerät koppeln
Syncthing verbindet Geräte über ihre Geräte-ID – einen langen, eindeutigen Schlüssel. Die Kopplung ist beidseitig: Jedes Gerät muss das andere kennen. Klicke auf Add Remote Device („Entferntes Gerät hinzufügen“):

Die ID des anderen Geräts findest du dort unter Actions → Show ID („Aktionen → Meine ID“) als Text und QR-Code. Trage sie hier ein, vergib einen Namen und speichere. Auf dem anderen Gerät wiederholst du das mit der ID deines Servers. Sobald beide Seiten sich kennen, erscheint das Gerät als „verbunden“ – das dauert rund 20 Sekunden.
Schritt 6: Einen Ordner teilen
Jetzt legst du fest, was abgeglichen wird. Über Add Folder („Ordner hinzufügen“) wählst du einen Pfad (auf dem Server z. B. /var/syncthing/Sync/dokumente, was dem gemounteten ./data-Ordner entspricht) und gibst ihm eine Ordner-ID. Unter dem Reiter Sharing („Teilen“) hakst du die Geräte an, mit denen der Ordner synchronisiert werden soll. Auf dem anderen Gerät bestätigst du die eingehende Freigabe – ab dann hält Syncthing beide Seiten automatisch identisch.
Dateiversionierung als Schutz vor Versehen
.stversions-Ordner aufbewahrt. Wichtig: Das ist ein Schutz vor Versehen, kein Backup (siehe unten).Ein Klick auf den Ordnernamen klappt die Details auf. So sieht ein fertig eingerichteter Knoten aus – Ordner und Gegenstelle beide auf Up to Date:

Die Zeile Folder Path zeigt den Pfad im Container (/var/syncthing/Sync/dokumente). Auf dem Server liegt derselbe Ordner unter /opt/syncthing/data/dokumente – das ist der Bind-Mount aus der Compose-Datei, und genau dort greifen später deine Backups zu.
Schritt 7: Discovery und Relays – wer von deinem Knoten erfährt
Damit sich zwei Geräte finden, ohne dass du IP-Adressen pflegst, nutzt Syncthing ab Werk zwei Dienste des Projekts. Beides ist in einer frischen Installation eingeschaltet:
- Global Discovery meldet deine Geräte-ID samt aktueller IP an öffentliche Discovery-Server. Ein anderes Gerät fragt dort nach deiner ID und bekommt die Adresse.
- Relaying vermittelt den Datenstrom über fremde Relay-Server, wenn keine direkte Verbindung zustande kommt – etwa weil Port 22000 zu ist.
Das ist bequem und bei Heimanschlüssen hinter NAT oft die einzige Chance auf eine Verbindung. Auf einem VPS mit offenem Port 22000 brauchst du den Umweg aber nicht, und er hat einen Preis: Beim Relaying läuft dein Datenverkehr durch Server, die dir nicht gehören. Die Inhalte bleiben dabei Ende-zu-Ende verschlüsselt – ein Relay sieht nur, dass zwei Geräte-IDs miteinander sprechen und wie viel. Wer genau das nicht möchte, schaltet es unter Actions → Settings → Connections ab:
- Enable Relaying aus – erzwingt direkte Verbindungen.
- Global Discovery aus, wenn du bei jedem Gerät stattdessen eine feste Adresse (
tcp://DEINE_DOMAIN:22000) hinterlegst.
Erst den Port prüfen, dann Relaying abschalten
nc -vz-Test aus Schritt 3 bestehen, dann abschalten.Beim ersten Login fragt Syncthing außerdem in einem lila Dialog nach anonymen Nutzungsstatistiken. Antwortest du mit No, ist das Thema erledigt; nachträglich änderst du es unter Actions → Settings → General im Feld „Anonymous Usage Reporting" (Auswahl Disabled). Das ebenfalls voreingestellte Crash Reporting liegt eine Ebene tiefer unter Actions → Advanced → Options (crashReportingEnabled).
Wenn es nicht funktioniert
Der Container startet nicht / Neustart-Schleife mit permission denied. Die Rechte am config- oder data-Ordner stimmen nicht. chown -R 1000:1000 /opt/syncthing/config /opt/syncthing/data und neu starten (siehe Warnung in Schritt 1).
Der Browser meldet ein ungültiges Zertifikat, obwohl der Container läuft. Der Healthcheck ist noch nicht healthy, deshalb kennt Traefik die Domain noch nicht und antwortet mit seinem Notzertifikat (mit curl -k käme eine 404). Bis zu 60 Sekunden nach dem Start abwarten, docker inspect -f '{{.State.Health.Status}}' syncthing-syncthing-1 prüfen und die Seite neu laden. Bleibt es dabei, sieh in docker compose logs nach, warum der Healthcheck fehlschlägt.
Zwei Geräte verbinden sich nicht. Prüfe drei Dinge: Ist Port 22000 (TCP+UDP) in beiden Firewalls offen – UFW auf dem Server und ggf. der netcup-Firewall im SCP? Hast du die ID auf beiden Geräten eingetragen (die Kopplung ist beidseitig)? Und stimmt die ID exakt (Buchstabendreher fallen leicht auf, weil eine Prüfsumme eingebaut ist)? Der Status „Getrennt“ mit korrekt eingetragenen IDs deutet fast immer auf den Firewall-Port.
Ein Ordner bleibt bei „Synchronisiere 0 %" hängen. Meist fehlt auf der Gegenseite die Bestätigung der Freigabe, oder die Ordner-ID stimmt nicht überein – sie muss auf beiden Geräten identisch sein. Prüfe außerdem die Schreibrechte im Zielordner.
Nach dem Setzen des GUI-Passworts kein Zugriff mehr. Passwort vergessen? Du kannst es in der config.xml (<gui>-Block) zurücksetzen, indem du die <user>- und <password>-Zeilen entfernst und Syncthing neu startest – danach ist die Oberfläche wieder ohne Login erreichbar (und du setzt es sofort neu).
Dein Problem ist nicht dabei? Alle Fehlermeldungen durchsuchen →
Wartung & Backups
- Updates. Setze den Image-Tag (
syncthing/syncthing:2.1.5) gelegentlich auf die aktuelle Version unddocker compose up -d. Syncthing hält sich innerhalb einer Hauptversion kompatibel; beim Sprung auf eine neue Hauptversion (wie hier v2) vorher die Release-Notes lesen. Den Rest erledigt dein normaler Update-Prozess. - Backup ist Pflicht – Sync ist kein Backup. Das ist der wichtigste Punkt: Syncthing spiegelt Änderungen, also auch versehentliches Löschen und Verschlüsselung durch Ransomware. Sichere den Sync-Ordner deshalb zusätzlich mit einem echten, versionierten Backup, das der Sync nicht erreichen kann – etwa Restic auf dem Server. Auch der
config-Ordner (Geräte-IDs, Ordnerfreigaben) gehört ins Backup. - Ehrlicher Aufwand. Einmal eingerichtet läuft Syncthing sehr wartungsarm und genügsam – im Leerlauf belegt der Container rund 42 MiB RAM bei 0,1 % CPU. Was wächst, ist der Plattenplatz: Behalte ihn im Blick (
df -h), wenn du große Ordner mit Versionierung abgleichst, und miste alte.stversions-Ordner gelegentlich aus.
Zuletzt aktualisiert: 22.09.2026
Feedback per E-Mail: feedback@serverkueche.de
Das könnte dir auch schmecken


