Zum Inhalt springen
Serverküche
Suche

Die Suche wird geladen … (nur in der veröffentlichten Seite verfügbar).

Anwendungen Schwierigkeit: Fortgeschritten

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.

· 10 Min. Lesezeit ·Dauer: ca. 45 Minuten
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)
🍳 Empfehlung Anzeige

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.

Zu netcup →

💶 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

Alle netcup-Gutscheine →

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:

Terminal
mkdir -p /opt/syncthing/config /opt/syncthing/data
chown -R 1000:1000 /opt/syncthing/config /opt/syncthing/data
cd /opt/syncthing

Ohne chown startet Syncthing nicht

Gehören die Ordner root (der Standard bei frisch angelegten Verzeichnissen), kann Syncthing sein Zertifikat und die Konfiguration nicht schreiben und läuft in eine Neustart-Schleife („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:

YAML
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: true

Nur 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):

Terminal
ufw allow 22000/tcp
ufw allow 22000/udp

Nutzt 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):

Terminal
nc -vz DEINE_DOMAIN 22000
Ausgabe
Connection 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:

Terminal
docker compose up -d

Geduld: Traefik wartet auf den Healthcheck

Das Syncthing-Image bringt einen eigenen Healthcheck mit (Intervall 60 Sekunden), und Traefik nimmt einen Container erst auf, wenn dieser 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:

Terminal
docker inspect -f '{{.State.Health.Status}}' syncthing-syncthing-1
Ausgabe
healthy

Steht 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:

Terminal
curl -sI https://DEINE_DOMAIN/ | head -1
Ausgabe
HTTP/2 200

Schritt 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:

Die Syncthing-Weboberfläche mit dem eigenen Gerät koch-server, Version v2.1.5 und der Geräte-ID
Die Weboberfläche: dieses Gerät mit Geräte-ID, darunter Bereiche für Ordner und entfernte Geräte

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:

Der Reiter GUI im Einstellungsdialog von Syncthing mit den leeren Feldern GUI Authentication User und GUI Authentication Password
Actions → Settings → GUI: hier werden Benutzername und Passwort für die Oberfläche gesetzt

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

Setze das Passwort über die Weboberfläche. Wer stattdessen 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“):

Der „Add Device“-Dialog mit Feldern für Geräte-ID, Name und Gruppe
Ein Gerät wird über seine Geräte-ID hinzugefügt – die ID findest du auf dem anderen Gerät unter „Actions → Show ID“

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

Aktiviere pro Ordner unter dessen Einstellungen die Dateiversionierung (z. B. „Einfache Versionierung“, 5 Versionen). Löscht oder überschreibt ein Gerät eine Datei, wird die alte Version auf den anderen Geräten in einem .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 Syncthing-Oberfläche mit dem Ordner Dokumente auf Up to Date, geteilt mit dem Gerät laptop-demo, das ebenfalls als Up to Date gemeldet wird
Das Ziel: Ordner und Gegenstelle stehen auf „Up to Date“, die Versionierung ist aktiv

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

Schaltest du Relaying ab, ohne dass Port 22000 wirklich von außen erreichbar ist, verbinden sich deine Geräte gar nicht mehr – und der Fehler sieht aus wie ein kaputtes Setup. Also erst den 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 und docker 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