Home ITHome ServerSyncthing einrichten: Linux-Desktop und Homeserver ohne Cloud synchronisieren

Syncthing einrichten: Linux-Desktop und Homeserver ohne Cloud synchronisieren

by Dimitri Roschkowski
0 Kommentare

Mein Ziel war schlicht: Das Home-Verzeichnis meines Linux-Desktops soll sich automatisch mit meinem Unraid-Homeserver abgleichen, in beide Richtungen, und später auch mit zwei Notebooks (macOS und Linux). Schnell soll es sein, im Dauerbetrieb kaum CPU kosten, mit kleinen und großen Dateien zurechtkommen – und ohne Cloud auskommen. KI-Modelle, VM-Images, Caches, node_modules und Python-Umgebungen sollen draußen bleiben, SSH- und GnuPG-Schlüssel dagegen mit.

Geworden ist es Syncthing. In diesem Ratgeber zeige ich, wie ich Syncthing auf dem Desktop und als Docker-Container auf dem Homeserver eingerichtet habe: welche Ordner, welche Ignore-Liste, welche Ports, wie Tailscale und die lokale Gerätesuche zusammenspielen und warum der Homeserver als „Verteilergerät“ neue Rechner von selbst bekannt macht. Am Ende liefen neun Ordner mit rund 197 GB und 264.000 Dateien sauber im Abgleich.

Schema: Desktop, Homeserver mit Unraid und zwei Notebooks synchronisieren direkt per Syncthing, im LAN direkt und unterwegs über Tailscale
Mein Aufbau: Der Homeserver ist immer an, verteilt neue Geräte und hält 30 Tage Versionen vor.

Syncthing im Homelab, die Serie:

  1. Syncthing einrichten (dieser Artikel)
  2. Syncthing auf Unraid beschleunigen (erscheint in Kürze)
  3. Syncthing vs. Resilio Sync (erscheint in Kürze)

Das Wichtigste in Kürze

  • Syncthing gleicht Ordner direkt zwischen deinen Geräten ab – ohne Server, ohne Cloud, Open Source, verschlüsselt per TLS.
  • Nie das ganze Home synchronisieren: Gezielte Ordner wählen, der Rest bleibt lokal. Bei mir sind es neun Ordner mit rund 197 GB.
  • Die .stignore muss vor dem ersten Scan liegen, sonst wird erst gehasht und übertragen und dann ignoriert – mit Leichen auf der Gegenseite.
  • Ports: 8384/TCP für die Weboberfläche, 22000/TCP und UDP für den Abgleich, 21027/UDP für die lokale Gerätesuche.
  • Relays und globale Gerätesuche aus, wenn alle Geräte im selben Tailnet sind – die lokale Suche sorgt zu Hause trotzdem für die direkte LAN-Verbindung.
  • Homeserver als Verteilergerät (Introducer): Neue Rechner müssen nur dort angemeldet werden.
  • Syncthing ist kein Backup: Löschen wird überall nachgezogen. Versionierung auf einem Knoten ist das Minimum.

Was ist Syncthing?

Syncthing ist ein Open-Source-Programm (Lizenz MPL 2.0), das Ordner zwischen Geräten synchron hält. Es gibt keinen zentralen Server: Jedes Gerät hat eine eigene Geräte-ID, die aus seinem Zertifikat abgeleitet ist, und spricht direkt mit den Geräten, mit denen du es verbunden hast. Die Verbindungen sind per TLS verschlüsselt, übertragen werden nur geänderte Blöcke einer Datei. Änderungen erkennt Syncthing über die Dateisystem-Benachrichtigungen des Betriebssystems sofort, ein vollständiger Scan läuft zusätzlich nur in größeren Abständen.

Mit Version 2.0 (August 2025) hat Syncthing seine interne Datenbank von LevelDB auf SQLite umgestellt, aktuell ist Version 2.1.7 vom 21. Oktober 2026. Auf meinem Desktop läuft 2.1.3 aus den Manjaro-Paketquellen, auf dem Homeserver 2.1.6 im Container.

Mein Aufbau

Rolle System Syncthing Netz
Desktop Manjaro (KDE), Ryzen 9 5950X, Home auf BTRFS-NVMe, Projekte auf eigener BTRFS-NVMe systemd-Benutzerdienst 2,5 GBit/s, LAN und Tailscale
Homeserver Unraid 7.3.2, Core i7-9700T, Pool aus vier 10-TB-Festplatten (BTRFS-RAID), NVMe-Cache Docker-Container linuxserver/syncthing 10 GBit/s, LAN und Tailscale
Notebooks macOS und Linux werden gerade angebunden zu Hause oder unterwegs per Tailscale

Schritt 1: Syncthing auf dem Linux-Desktop

Syncthing steckt in den Paketquellen praktisch aller Distributionen. Auf Arch und Manjaro installierst du es mit sudo pacman -S syncthing, auf Debian und Ubuntu mit sudo apt install syncthing – wer dort eine aktuellere Version will, bindet die offizielle Paketquelle von Syncthing ein. Gestartet wird es als Benutzerdienst, damit es mit deinem Benutzerkonto läuft und auf dein Home-Verzeichnis zugreifen darf:

systemctl --user enable --now syncthing

Die Weboberfläche erreichst du danach unter http://127.0.0.1:8384. Bei neueren Installationen liegt die Konfiguration unter ~/.local/state/syncthing, ältere nutzen noch ~/.config/syncthing. Lass die Oberfläche auf dem Desktop auf 127.0.0.1 gebunden, dann ist sie von außen gar nicht erreichbar.

Syncthing-Oberfläche, Bereich Dieses Gerät mit Downloadrate, Uploadrate, lokalem Status, Zuhörern, Gerätesuche und Version 2.1.3
Der Desktop in der Syncthing-Oberfläche: 264.000 Dateien lokal, Version 2.1.3. Geräte-Kennung unkenntlich gemacht.

Schritt 2: Syncthing als Docker-Container auf dem Homeserver

Auf dem Homeserver läuft Syncthing im Container lscr.io/linuxserver/syncthing. Auf Unraid gibt es dafür eine fertige Vorlage in den Community Apps, auf jedem anderen Docker-Host reicht eine kleine Compose-Datei. PUID=99 und PGID=100 entsprechen auf Unraid dem Benutzer „nobody“ und der Gruppe „users“:

services:
  syncthing:
    image: lscr.io/linuxserver/syncthing:latest
    container_name: syncthing
    environment:
      - PUID=99
      - PGID=100
    volumes:
      - /mnt/cache/appdata/syncthing:/config      # Konfiguration und Index auf der NVMe
      - /mnt/btrfs_data/Sysbackup/syncthing/data1:/data1   # Daten direkt auf dem Pool
    ports:
      - 8384:8384        # Weboberfläche
      - 22000:22000/tcp  # Abgleich (TCP)
      - 22000:22000/udp  # Abgleich (QUIC)
      - 21027:21027/udp  # lokale Gerätesuche
    restart: unless-stopped

Wichtig für Unraid: Die Pfade zeigen direkt auf den Pool (/mnt/btrfs_data/…) und den Cache (/mnt/cache/…), nicht auf /mnt/user/…. Mit dem /mnt/user-Pfad lief der Erstabgleich bei mir mit 1,7 MB/s – warum, und wie es 110-mal schneller wurde, steht im zweiten Teil: Syncthing auf Unraid langsam?. Wie Unraid selbst eingerichtet wird, zeige ich in Unraid einrichten, Docker allgemein in Docker installieren.

Diese Ports braucht Syncthing:

Port Protokoll Wofür
8384 TCP Weboberfläche und REST-API
22000 TCP Datenabgleich zwischen den Geräten
22000 UDP Datenabgleich über QUIC
21027 UDP lokale Gerätesuche im LAN

Schritt 3: Geräte verbinden und den Homeserver zum Verteilergerät machen

Jedes Gerät zeigt unter Aktionen → Kennung anzeigen seine Geräte-ID, auch als QR-Code. Auf dem anderen Gerät trägst du sie unter Gerät hinzufügen ein, die Gegenseite fragt dann einmal nach, ob sie die Verbindung annehmen soll. Statt „dynamic“ habe ich als Adresse die feste Tailscale-Adresse des Homeservers eingetragen (tcp://100.x.y.z:22000). Wie Tailscale funktioniert, steht in Tailscale einrichten.

Auf dem Desktop ist der Homeserver zusätzlich als Verteilergerät (englisch Introducer) markiert. Damit übernimmt der Desktop automatisch alle Geräte, die der Homeserver kennt, samt ihren Ordnerfreigaben. Ein neues Notebook muss ich also nur am Homeserver anmelden, nicht an jedem Rechner einzeln.

Syncthing-Geräteansicht des Homeservers: Verbindungstyp TCP LAN, Komprimierung nur Metadaten, Verteilergerät Ja, Version 2.1.6
Der Homeserver aus Sicht des Desktops: direkte Verbindung im LAN, Verteilergerät „Ja“, 160 GiB hochgeladen. Adresse und Kennung unkenntlich gemacht.

Schritt 4: Ordner auswählen – nie das ganze Home

Der wichtigste Grundsatz: Synchronisiere gezielte Ordner, nicht dein komplettes Home-Verzeichnis. Wie schnell das schiefgeht, zeigte ein früherer Versuch aus dem April: Er hatte das gesamte /home als einen Ordner eingetragen. Beim ersten Start begann Syncthing sofort, das ganze Home zu scannen, und belegte nach 17 Sekunden 1,2 GB Arbeitsspeicher. Auf dem Homeserver lag von damals noch eine unvollständige Kopie mit Browser-Profilen und Programmdaten. Allein das Löschen der vielen kleinen Dateien dauerte über 20 Minuten. Deshalb: alte Konfigurationen prüfen, bevor man den Dienst startet.

Diese neun Ordner sind es geworden, alle im Modus „Senden & Empfangen“:

Ordner Inhalt Größe nach Ausschlüssen Dateien
Projekte Quellcode, Git-Repos, Werkzeuge 169 GB 250.000
Obsidian-Vault Notizen 16,5 GB 8.700
Schreibtisch Kurse, Videos, Ablage 7,5 GB 245
Dokumente Briefe, Scans, Projektdoku 3,2 GB 4.500
Bilder Screenshots 0,1 GB 236
Skripte kleine Skripte klein 9
.ssh, .gnupg, Schlüssel drei Schlüsselordner klein 58

Nicht dabei sind unter anderem Downloads (174 GB), Musik, temporäre Ordner und KI-Modelle. Kleiner Stolperstein bei der Bestandsaufnahme: du -sh ~ meldete 13 TB, weil BTRFS-Snapshots unter dem Projektordner mitgezählt wurden. Mit du -x oder einem Ausschluss für den Snapshot-Ordner stimmt die Zahl wieder.

Syncthing-Ordnerliste mit neun Ordnern, alle im Status Aktuell
Neun Ordner, alle „Aktuell“. Ordnernamen teils verallgemeinert.
Details des Syncthing-Ordners Projekte: 250.438 Dateien, rund 158 GiB, Neue Scans jede Stunde, Dateisystemüberwachung aktiviert
Der größte Ordner: rund 250.000 Dateien und 158 GiB (169 GB). Vollscan stündlich, Änderungen erkennt die Dateisystemüberwachung sofort.

Schritt 5: Die .stignore vor dem ersten Scan anlegen

Was nicht synchronisiert werden soll, steht in einer Datei .stignore im jeweiligen Ordner – oder du trägst es beim Anlegen des Ordners im Reiter „Ignoriermuster“ ein. Entscheidend ist der Zeitpunkt: Die Liste muss vor dem ersten Scan stehen. Sonst hasht und überträgt Syncthing erst alles und ignoriert es danach. Bei mir sind Python-Umgebungen und node_modules unter Dokumente und Projekte erst beim Zuschauen aufgefallen – die nachträglich ignorierten Dateien blieben auf der Gegenseite liegen und mussten von Hand weg.

So sieht meine Liste für die Code-Ordner aus:

// Abhängigkeiten / Build-Artefakte
(?d)node_modules
(?d).pnpm-store
(?d)vendor
(?d).venv
(?d)venv*
(?d)*-venv
(?d)__pycache__
(?d).pytest_cache
(?d).mypy_cache
(?d).ruff_cache
(?d).cache
(?d).next
(?d).nuxt
(?d).turbo
(?d)dist
(?d)build
(?d)target
(?d).gradle
(?d)test-results
(?d)playwright-report
// Modelle und VMs
*.gguf
*.safetensors
*.bin
*.vmdk
*.vmem
*.vmss
*.nvram
*.qcow2
*.iso
*.vdi
*.img
// Müll
(?d).DS_Store
(?d)Thumbs.db
(?d)*.tmp
(?d)*.swp
(?d)*.log
// nur im Projektordner: VMs und Snapshots
(?d)vmware
(?d)VM
(?d).snapshots
(?d).sync

Das Präfix (?d) erlaubt Syncthing, die ignorierten Einträge zu löschen, wenn sie sonst das Entfernen eines Ordners blockieren würden. Zeilen mit // sind Kommentare. Im Projektordner fliegen zusätzlich 213 GB VMware-Maschinen, 30 GB weitere VMs und die BTRFS-Snapshots raus. Reine Datenordner wie der Obsidian-Vault bekommen nur die Müll-Muster.

Für die Schlüsselordner gelten eigene Regeln: Unter .gnupg dürfen Sockets und Sperrdateien nie synchronisiert werden (S.gpg-agent*, S.scdaemon, *.lock, random_seed, *~), unter .ssh bleiben known_hosts.old, known_hosts.bak* und *.swp draußen. Wie man SSH-Schlüssel überhaupt erzeugt, steht in SSH-Key erstellen.

Syncthing-Dialog Ordner bearbeiten, Reiter Ignoriermuster mit der Liste für den Projektordner
Die Ignoriermuster lassen sich direkt in der Oberfläche bearbeiten, gespeichert werden sie in der .stignore des Ordners.

Ob die Liste greift, prüfst du, bevor die Gegenseite Daten bekommt: Im Ordner zeigt Syncthing unter „Lokaler Status“ den Hinweis „Durch Ignoriermuster reduziert“, und im Log beziehungsweise über die REST-API siehst du, was tatsächlich übertragen wird.

Schritt 6: Verbindungen – lokal direkt, unterwegs über Tailscale

Weil alle meine Geräte im selben Tailscale-Netz hängen, brauche ich die öffentlichen Hilfsdienste von Syncthing nicht. In den Einstellungen unter „Verbindungen“ sind deshalb die globale Gerätesuche und die Weiterleitung (Relays) aus, die lokale Gerätesuche bleibt an. Auch die anonyme Nutzungsstatistik habe ich abgelehnt.

Syncthing-Einstellungen, Reiter Verbindungen: Lokale Gerätesuche aktiviert, globale Gerätesuche und Weiterleitung deaktiviert
Lokale Gerätesuche an, globale Gerätesuche und Relays aus.

Das Ergebnis: Zu Hause verbindet sich Syncthing direkt über die LAN-Adresse des Homeservers und markiert die Verbindung als „TCP LAN“ – nicht über Tailscale, obwohl dort die Tailscale-Adresse eingetragen ist. Unterwegs läuft der Abgleich über Tailscale. Der komplette Erstabgleich von 171,7 GB lief über genau eine direkte LAN-Verbindung.

Schritt 7: Versionierung nur auf dem Homeserver

Syncthing überträgt jede Änderung, auch ein versehentliches Löschen. Deshalb versioniert der Homeserver alle Ordner stufenweise für 30 Tage: In der ersten Stunde bleibt alle 30 Sekunden eine Version, am ersten Tag stündlich eine, danach täglich eine. Aufgeräumt wird jede Stunde, die Versionen landen im Unterordner .stversions. Desktop und Notebooks versionieren nicht – das spart dort Platz, und eine Kopie mit Vergangenheit reicht.

Syncthing-Dialog Ordner bearbeiten, Reiter Dateiversionierung: Stufenweise Dateiversionierung, Höchstalter 30 Tage, Bereinigungsintervall 3600 Sekunden
Auf dem Homeserver: stufenweise Versionierung mit 30 Tagen Höchstalter.
Ordner Projekte in der Syncthing-Oberfläche des Homeservers mit Ordnerpfad /data1/Projekte und Dateiversionierung Stufenweise 30 Tage
Derselbe Ordner auf dem Homeserver: Pfad im Container /data1/Projekte, Versionierung „Stufenweise, 30 Tage“.

Schritt 8: Weitere Rechner sauber einbinden

Damit nie ein Rechner in das Home-Verzeichnis eines anderen schreibt, gilt bei mir eine einfache Regel: Jeder Rechner besitzt eigene Ordner. Andere Rechner empfangen sie unter ~/Sync/<Rechnername>/<Ordner>, der Homeserver unter /data1/<Rechnername>/<Ordner>. Die Ordner-IDs bekommen den Rechnernamen als Präfix. So kollidieren auch zwei Rechner nicht, die beide einen Ordner „Projekte“ haben.

Ordnerliste auf dem Homeserver mit den Ordnern des Desktops und den Ordnern eines Notebooks mit Präfix notebook
Auf dem Homeserver: oben und unten die Ordner des Desktops, dazwischen die Ordner eines Notebooks mit eigenem Präfix. Rechnernamen verallgemeinert.

Die Weboberfläche absichern

Auf dem Desktop lauscht die Oberfläche nur auf 127.0.0.1:8384. Auf dem Homeserver muss sie im Netz erreichbar sein, also gehört ein Benutzer mit Passwort dazu, und am besten ist sie nur im LAN oder über Tailscale erreichbar. Das Passwort setzt du am einfachsten in der Oberfläche unter Einstellungen → GUI.

Wer die config.xml von Hand bearbeitet, sollte wissen: Ein Klartext-Passwort in der Datei hat Syncthing 2.1.6 bei mir beim Start nicht gehasht, auch per REST-API eingetragener Klartext blieb Klartext – der Login schlug fehl. Den nötigen bcrypt-Hash erzeugt Syncthing selbst:

syncthing generate --home=/tmp/stgen --gui-user=NAME --gui-password=PASSWORT
grep -oP '(?<=<password>)[^<]+' /tmp/stgen/config.xml

Den Hash trägst du dann statt des Klartexts ein. Den temporären Ordner danach löschen.

Status prüfen über die REST-API

Für Skripte und schnelle Kontrollen hat Syncthing eine REST-API. Den API-Schlüssel findest du in der config.xml oder in der Oberfläche unter Einstellungen → GUI:

# Verbindungen und übertragene Datenmengen
curl -H "X-API-Key: $KEY" http://127.0.0.1:8384/rest/system/connections

# Zustand eines Ordners (Dateien, Größe, ausstehend)
curl -H "X-API-Key: $KEY" "http://127.0.0.1:8384/rest/db/status?folder=projekte"

Syncthing ist kein Backup

Das kann man nicht oft genug sagen: Syncthing hält Ordner gleich. Löschst du eine Datei auf dem Desktop, ist sie Sekunden später auch auf dem Homeserver weg. Die Versionierung auf einem Knoten ist das Minimum, ein echtes Backup mit eigener Historie bleibt trotzdem nötig – bei mir übernehmen das restic und der Proxmox Backup Server.

Typische Fehler beim Einrichten

Fehler Folge Besser
Ganzes Home als ein Ordner Scan über alles, Browser-Profile und Caches landen auf dem Server Gezielte Ordner, Rest bleibt lokal
.stignore erst nach dem Scan Daten werden übertragen und bleiben auf der Gegenseite liegen Ignore-Liste vor dem ersten Scan anlegen
Alte Konfiguration nicht geprüft Ein vergessener Ordner startet sofort config.xml vor dem ersten Start ansehen
Unraid-Container auf /mnt/user Erstabgleich mit 1,7 MB/s Direkter Pool-Pfad, siehe Teil 2
Klartext-Passwort in der config.xml Login schlägt fehl Passwort in der GUI setzen oder Hash erzeugen
Syncthing als Backup betrachtet Löschen wird überall nachgezogen Versionierung plus echtes Backup

Fazit

Syncthing erledigt genau, was ich wollte: Desktop und Homeserver gleichen sich ohne Cloud ab, zu Hause direkt über das LAN, unterwegs über Tailscale. Nach dem Erstabgleich standen alle neun Ordner auf „Aktuell“, der Projektordner mit rund 250.000 Dateien und 169 GB vollständig, insgesamt 171,7 GB übertragen, null Dateien ausstehend. Die meiste Arbeit steckt nicht im Programm, sondern in der Vorbereitung: die richtigen Ordner wählen, die Ignore-Liste vor dem ersten Scan anlegen und auf Unraid den richtigen Pfad nutzen.

Weiter geht es mit Teil 2: Syncthing auf Unraid 110-mal schneller und Teil 3: Syncthing vs. Resilio Sync. Wer statt Ordnerabgleich eine Cloud mit Weboberfläche sucht, findet in Nextcloud installieren die Alternative mit Server.

FAQ

Welche Ports braucht Syncthing?

22000/TCP und 22000/UDP für den Datenabgleich, 21027/UDP für die lokale Gerätesuche und 8384/TCP für die Weboberfläche. Die Weboberfläche sollte nicht aus dem Internet erreichbar sein.

Gibt es Syncthing für Android?

Die offizielle Android-App wurde im Dezember 2024 eingestellt. Weiter gepflegt wird der Fork „Syncthing-Fork“, erhältlich über F-Droid und GitHub.

Gibt es Syncthing für das iPhone?

Ja, über Apps anderer Entwickler. „Synctrain“ ist seit Januar 2025 kostenlos und quelloffen im App Store, „Möbius Sync“ ist kostenpflichtig.

Ist Syncthing ein Backup?

Nein. Syncthing überträgt auch Löschungen und Fehler. Aktiviere die Versionierung mindestens auf einem Gerät und sichere zusätzlich mit einem echten Backup-Programm.

Kann ich einen Obsidian-Vault mit Syncthing synchronisieren?

Ja, der Vault ist nur ein Ordner. Meiner hat 16,5 GB und 8.700 Dateien. Bearbeitest du dieselbe Notiz gleichzeitig auf zwei Geräten, legt Syncthing eine Konfliktdatei mit „sync-conflict“ im Namen an, statt eine Version zu verlieren.

Funktioniert Syncthing ohne Internet?

Ja. Mit lokaler Gerätesuche finden sich die Geräte im LAN auch ohne Internet. Globale Gerätesuche und Relays werden nur gebraucht, wenn Geräte über das Internet ohne VPN zueinanderfinden sollen.

Wo liegt die Konfiguration von Syncthing unter Linux?

Bei neueren Installationen unter ~/.local/state/syncthing, bei älteren unter ~/.config/syncthing. Im Docker-Container von linuxserver liegt sie im Volume /config.

Quellen

You may also like

Hinterlasse einen Kommentar