← Alle Notizen

Nextcloud und Fileserver automatisch abgleichen mit rclone bisync

Veröffentlicht · zuletzt geändert

NextCloudrcloneBackupLinuxSelf-Hosting

Auch auf: English, español

Wer eine gehostete Nextcloud nutzt und zusätzlich einen Fileserver im lokalen Netz betreibt, kennt das Problem: Laptops synchronisieren schnell mit dem Fileserver, der Abgleich mit der Nextcloud dauert dagegen lange und wird gerne vergessen, wenn man ihn von Hand anstoßen muss. nc-bisync.sh automatisiert genau diesen Schritt mit rclone bisync. Es läuft unbeaufsichtigt per Cron und schlägt nur Alarm, wenn etwas auffällig ist.

Download: nc-bisync.sh

Die Ausgangslage

Der Fileserver ist die Drehscheibe zwischen allen Geräten:

Laptops  ⇄ (Unison, manuell)  ⇄  Fileserver  ⇄ (rclone bisync, automatisch)  ⇄  Nextcloud
                                     │
                                     └─ rsnapshot (täglich, versioniert) → externe Platte

Die Laptops bleiben bei Unison. Im lokalen Netz ist das schnell, und die grafische Oberfläche hilft bei Konflikten. Für die langsame Strecke zur Nextcloud übernimmt rclone bisync. rclone spricht WebDAV direkt an und braucht keinen davfs-Mount. Außerdem bringt es Schutzmechanismen mit, die sonst ein eigenes Wrapper-Skript erfordern würden.

Was das Skript macht

Ein Verzeichnispaar je Freigabe. Jede Freigabe auf dem Fileserver wird mit dem gleichnamigen Ordner in der Nextcloud abgeglichen, unabhängig von den anderen. Paare lassen sich einzeln oder in Gruppen starten, auch mit unterschiedlicher Frequenz. Bei Bedarf wird ein einzelner Unterordner, etwa ein großes Projekt, zum eigenen Paar und im übergeordneten Paar automatisch ausgeschlossen.

Archiv nur auf Anforderung. Ein Unterordner archiv innerhalb eines Paares wird im normalen Lauf nie abgeglichen, sondern nur mit --archiv. Er ist intern ein eigenes Paar mit eigenem Zustand. Das ist stabiler als ein Ordner, der per Filter mal ein- und mal ausgeschlossen wird.

Schutz vor Massenschäden. Gegen größere Schäden sichern drei eingebaute Mechanismen ab:

  • --check-access: In jeder Wurzel liegt eine Datei RCLONE_TEST. Fehlt sie auf einer Seite, weil ein Pfad falsch ist oder ein Laufwerk nicht eingehängt ist, bricht der Lauf ab. Das schützt auch davor, dass ein leerer Bind-Mount als „alles gelöscht“ in die Nextcloud übertragen wird.
  • --max-delete 10: Würden mehr als 10 % der Dateien gelöscht, passiert gar nichts.
  • --backup-dir1: Überschriebene und gelöschte Dateien auf dem Fileserver landen in einem Tagesordner und werden nach 30 Tagen aufgeräumt.

Konflikte. Wurde eine Datei auf beiden Seiten geändert, gewinnt die neuere Version (--conflict-resolve newer). Die ältere bleibt umbenannt erhalten.

Robustheit. Mit --resilient und --recover übersteht bisync abgebrochene Läufe meist ohne manuellen --resync. Eine Sperrdatei verhindert überlappende Läufe.

Benachrichtigung. Bei Fehlern kommt eine Nachricht per Mail oder über ntfy. Das Skript unterscheidet dabei, ob ein Resync nötig ist, die Löschgrenze angeschlagen hat oder die Zugriffsprüfung fehlgeschlagen ist. Jeder Lauf wird mit seiner Dauer in summary.log protokolliert.

Filter. Temporärdateien von Unison, Office, macOS und Windows werden nie synchronisiert.

Setup

Das Skript läuft nicht als root, sondern als der Benutzer, dem die Dateien auf dem Fileserver gehören. Sonst gehörten neu aus der Nextcloud geholte Dateien root und wären für die anderen Benutzer der Freigabe nicht mehr beschreibbar. sudo ist nur für die Installation nötig.

1. rclone installieren

Das Skript braucht rclone 1.66 oder neuer. Die Pakete vieler Distributionen sind älter, deshalb besser das offizielle Installationsskript verwenden:

curl https://rclone.org/install.sh | sudo bash
rclone version

2. Nextcloud-Remote einrichten

Lege in der Nextcloud unter Einstellungen → Sicherheit ein App-Passwort an. Richte dann als der Benutzer, unter dem das Skript später läuft, den Remote ein (ohne sudo):

rclone config
# n) New remote
# name> nc
# Storage> webdav
# url> https://cloud.example.com/remote.php/dav/files/BENUTZERNAME/
# vendor> nextcloud
# user> BENUTZERNAME
# pass> (App-Passwort)

Zum Test:

rclone lsd nc:

3. Skript installieren und anpassen

sudo install -m 755 nc-bisync.sh /usr/local/bin/nc-bisync.sh
sudo install -d -o BENUTZER /var/lib/nc-bisync /var/log/nc-bisync
sudo install -d -o BENUTZER -m 700 /mnt/USB-Crucial/.bisync-backup

Der Modus 755 macht das Skript für alle Benutzer ausführbar, verändern kann es aber nur root. Die zweite Zeile legt das Status- und das Log-Verzeichnis an und übergibt sie dem Benutzer, unter dem das Skript läuft. Die dritte legt das Backup-Verzeichnis (BACKUP_ROOT) an; Modus 700, weil dort überschriebene Dateien aus allen Freigaben landen und nur der Benutzer des Skripts sie sehen soll.

Im Konfigurationsblock am Anfang trägst du die Paare ein, je Zeile Name, lokaler Pfad und Pfad in der Nextcloud:

PAIRS=(
    "administration|/mnt/shares/administration|nc:Administration"
    "bibliothek|/mnt/shares/bibliothek|nc:Bibliothek"
    "dokumente|/mnt/shares/dokumente|nc:Dokumente"
    "fotos|/mnt/shares/fotos|nc:Fotos"
    "projekte|/mnt/shares/projekte|nc:Projekte"
    "unternehmen|/mnt/shares/unternehmen|nc:Unternehmen"
)

Weitere Einstellungen:

Variable Bedeutung Beispiel
ARCHIVE_SUBDIR Unterordner, der nur mit --archiv läuft archiv
BACKUP_ROOT Ablage für überschriebene Dateien /mnt/USB-Crucial/.bisync-backup
MAX_DELETE Löschgrenze in Prozent 10
NOTIFY_MAIL Empfänger für Fehlermeldungen (optional) admin@example.com
NTFY_URL ntfy-Topic für Push-Nachrichten (optional) https://ntfy.sh/mein-topic

Achte darauf, dass BACKUP_ROOT außerhalb aller Paare liegt. Mit nc-bisync.sh --list prüfst du, welche Paare konfiguriert sind und welche einen Archiv-Unterordner haben.

4. Gruppenrechte auf dem Fileserver

Das Skript legt neue Dateien mit umask 002 an, damit sie für die Gruppe beschreibbar bleiben. Damit sie auch die richtige Gruppe bekommen und nicht die primäre Gruppe des Benutzers, sollten die synchronisierten Verzeichnisse das setgid-Bit haben. Das setgid-Bit an einem Verzeichnis bewirkt, dass darin neu angelegte Dateien und Unterordner automatisch dessen Gruppe erben, statt die primäre Gruppe ihres Erstellers zu bekommen.

Für die Paare aus dem Beispiel oben setzt du es so auf allen vorhandenen Verzeichnissen:

for d in administration bibliothek dokumente fotos projekte unternehmen; do
    sudo find "/mnt/shares/$d" -type d -exec chmod g+s {} +
done

Ob es gesetzt ist, erkennst du an einem s in den Gruppenrechten:

$ ls -ld /mnt/shares/dokumente
drwxrws--- 10 stefan familie 4,0K 21. Jul 13:19 /mnt/shares/dokumente

5. Unison auf den Laptops anpassen

bisync erkennt Änderungen über Änderungszeit und Größe. Damit ein Unison-Lauf von einem Laptop nicht jede Datei scheinbar verändert, gehört in jedes Unison-Profil:

times = true

6. Erstabgleich

Teste zuerst mit --dry-run, dann führe den Erstabgleich aus:

nc-bisync.sh --init --dry-run
nc-bisync.sh --init

--init legt die RCLONE_TEST-Dateien in jedem Paar und jedem vorhandenen Archiv-Unterordner an und gleicht alles mit --resync ab. Bei Unterschieden gewinnt die neuere Datei. Bei vielen Daten bietet es sich an, die Paare einzeln einzurichten, zum Beispiel nc-bisync.sh --init fotos.

Im Probelauf ändert das Skript nichts: Es legt auch keine RCLONE_TEST-Dateien an und überspringt deshalb die Zugriffsprüfung.

7. Zeitplan

Trage die Cronjobs mit crontab -e in die Crontab des Benutzers ein, unter dem das Skript läuft. Weil jedes Paar eine eigene Sperre hat, können häufig geänderte Freigaben öfter laufen als selten geänderte:

# häufig geändert: alle 2 Stunden
0 */2 * * *  /usr/local/bin/nc-bisync.sh dokumente fotos projekte unternehmen administration
# selten geändert: nachts
30 2 * * *   /usr/local/bin/nc-bisync.sh bibliothek

Bei vielen Dateien bremst nicht die Übertragung, sondern das Auflisten über WebDAV, und das passiert bei jedem Lauf vollständig. Starte deshalb mit zwei Stunden und lies nach ein paar Tagen die Laufzeiten ab:

tail /var/log/nc-bisync/summary.log

Als Faustregel sollte das Intervall etwa dreimal so lang sein wie ein Lauf. Allzu häufig solltest du nicht abgleichen, denn manche Anbieter drosseln viele WebDAV-Anfragen.

Verwendung im Alltag

Befehl Wann
nc-bisync.sh alle Paare abgleichen, ohne Archiv
nc-bisync.sh fotos dokumente nur die genannten Paare abgleichen
nc-bisync.sh --archiv projekte nachdem in projekte Dateien archiviert wurden
nc-bisync.sh --dry-run fotos vorher anzeigen, was passieren würde
nc-bisync.sh --archiv --force projekte wenn beim Archivieren die Löschgrenze angeschlagen hat
nc-bisync.sh --list konfigurierte Paare anzeigen

rclone-Optionen mit Wert gibst du immer in der Form --option=wert an, sonst hält das Skript den Wert für den Namen eines Paares.

Dateien archivieren

Verschiebe die Dateien innerhalb der Freigabe in den Unterordner archiv und starte dann den Abgleich für diese Freigabe:

nc-bisync.sh --archiv projekte

Das Skript gleicht zuerst das Archiv ab und erst danach den Rest der Freigabe. So liegen die Dateien schon im Archiv der Nextcloud, bevor sie dort aus dem Rest der Freigabe verschwinden. Schlägt der Archiv-Lauf fehl, wird der Rest der Freigabe gar nicht angefasst.

Verschiebst du sehr viele Dateien auf einmal, kann die Löschgrenze greifen. Prüfe dann kurz das Log und starte mit --force.

Ein Archiv richtest du nachträglich ein, indem du lokal den Ordner archiv anlegst und einmal nc-bisync.sh --init NAME ausführst.

Einzelne Unterordner als eigenes Paar

Wird eine Freigabe zu groß für häufige Läufe, kann ein Unterordner ein eigenes Paar bekommen:

"tango|/mnt/shares/projekte/Tango|nc:Projekte/Tango"

Das Skript schließt Tango dann im Paar projekte automatisch aus. Weil sich dadurch dessen Filter ändert, ist einmal nc-bisync.sh --init projekte tango nötig. Der Unterordner muss in der Nextcloud an der entsprechenden Stelle liegen, sonst bricht das Skript mit einer Meldung ab.

Wenn eine Benachrichtigung kommt

  • Resync nötig: Lies die Ursache im genannten Log nach. Danach behebt meist nc-bisync.sh --init NAME den Zustand, vorher am besten mit --dry-run.
  • Zu viele Löschungen: Prüfe, ob die Löschungen gewollt sind. Wenn ja, starte mit --force.
  • Zugriffsprüfung fehlgeschlagen: Eine RCLONE_TEST-Datei fehlt. Prüfe, ob der Pfad stimmt, die Nextcloud erreichbar ist und das Laufwerk gemountet ist.

Grenzen

rclone bisync ist kein Backup. Der Abgleich überträgt auch versehentliche Änderungen, nur Massenlöschungen werden abgefangen. Verschlüsselt etwa Ransomware Dateien auf einem Laptop, landen sie über Unison und bisync auch in der Nextcloud, denn dabei wird überschrieben, nicht gelöscht. Den eigentlichen Schutz bilden deshalb die versionierten rsnapshot-Sicherungen und die Dateiversionen der Nextcloud. Die Aufbewahrungszeit sollte länger sein als die Zeit, bis man einen Schaden bemerkt.