Datensicherung mit Fritz!Box, restic und rclone

Inhalt
Eingeheftete Festplatte
Eingeheftete Festplatte | © Wikimedia Commons | Lizenz CC BY 4.0

Oh Schreck, die Daten sind weg! Seien es wichtige Unterlagen, eigene Texte oder die Kinderfotos. In unserem fast vollständig digitalisierten Leben ist Datenverlust der Super-GAU. “Kein Backup, kein Mitleid.”, heißt es dann hämisch von (selbst ernannten) IT-ExpertInnen. Gut, wenn der Totalverlust vermieden werden kann, weil die Daten aus einer Sicherung wieder hergestellt werden können.

Die Fritz!Box stellt einen angeschlossenen USB-Stick per FTP oder SMB als Speicher für Geräte im Heimnetz zur Verfügung. Mit den Programmen restic und rclone können schnell, einfach und sorgenfrei Datensicherungen (Backups) durchgeführt werden. Dieser Post enthält Hintergrundinfos und eine Schrit für Schrit Anleitung.

3, 2, 1, 1, 0 – Die Goldene Backup-Regel

Datenverlust kann viele Ursachen haben. Die Festplatte im Rechner kann kaputt gehen. Die Wohnung kann ausbrennen. Oder Ransomware verschlüsselt alle Daten. Datensicherungsprofis haben die goldene Backup-Regel aufgestellt, um gegen alle diese möglichen Schadensszenarien gewappnet zu sein. Sie besteht aus fünf Forderungen.

  1. Die Daten sollen in 3 Kopien vorliegen. Die täglich benutzten Daten, sind bereits die erste Kopie. Die Zweite und die dritte Kopie liegen in Datensicherungen (Backups) vor.
  2. Die Daten sollen auf mindestens 2 verschiedenen Medien gespeichert sein. So entgeht man dem Datenverlust durch bspw. eine kaputte Festplatte.
  3. Mindestens 1 Kopie soll an einem anderen Ort gespeichert sein. So entgeht man dem Datenverlust durch bspw. einen Wohnungsbrand.
  4. Mindestens 1 Kopie soll geschützt vor Veränderungen gespeichert sein. So entgeht man dem Datenverlust durch bspw. Ransomware. Wenn die Ransomware nämlich neben den Nutzdaten auch die Backups verschlüsselt, hat man gegen die Erpresser verloren.
  5. Es sollen 0 Fehler bei einer Wiederherstellung auftreten. Das ist eigentlich ein No-brainer. Aber das bedeutet, dass die Wierherstellung getestet werden muss. Nur so ist im Schadensfall sicher gestellt, dass alles klappt.

Durch diese fünf Forderungen kommt die Zahlenfolge 3, 2, 1, 1, 0 zustande.

Das Setup

Ich habe eine Fritz!Box 7590 mit USB 2.0. Anschluss. Ich will daran einen 256GB großen USB-Stick anschließen. Er soll den Geräten im Netzwerk als Speicher zur Verfügung stehen. U.a. sollen dort die Datensicherungen (Backups) sämtlicher Geräte landen.

Ich habe mich für restic als Backup-Software entschieden. restic ist ein Kommandozeilentool. Es steht für die großen Betriebssysteme Linux, macOS, Windows zur Verfügung. Es ist sehr einfach zu bedienen. Es legt die Backups verschlüsselt ab. Und es unterstützt Deduplikation .

restic kann Backups auf einer Reihe von Netzwerk-Speicherdiensten speichern. Bei restic werden sie Backend genannt. restic kann SMB und FTP nicht als Backends verwenden. Ein naheliegender Gedanke wäre, den Netzwerkspeicher per SMB zu mounten. restic könnte dann das local-Backend verwenden. In der Doku wird aber genau davor für Linux gewarnt, inklusive Beschreibung eines Workarounds. Ich habe, wie beschrieben, die Umgebungsvariable GODEBUG auf asyncpreemptoff=1 gesetzt. restic konnte dennoch die Backupdaten nicht speichern.

Die Fritz!Box bietet also keinen von restic direkt unterstützten Netzwerkspeicher an. Dieses Problem lässt sich mit dem rclone-Backend lösen. rclone ist ein Kommandozeilentool für effizientes Dateimanagement auf Netzwerkspeichern. Es steht für die großen Betriebssysteme Linux, macOS, Windows zur Verfügung. Es unterstützt eine sehr große Anzahl an Netzwerk-Speicherdiensten, so genannte Provider . Auch mit rclone konnte ich nicht per SMB auf den Netzwerkspeicher zugreifen. Der Zugriff per FTP funktionierte zum Glück.

Jedes zu sichernde Gerät bekommt auf dem Netzwerkspeicher der Fritz!Box ein eigenes Verzeichnis und einen eigenen Useraccount. So können die Schreib-/Leserechte je Gerät vergeben werden. Die Backups kommen sich so nicht ins Gehege.

Das Setup ist also USB-Stick an Fritz!Box. Backups per FTP mit restic und rclone. Jedes Gerät ein eigenes Verzeichnis und einen eigenen Useraccount.

USB-Stick vorbereiten

Schließe den USB-Stick an einen Rechner Deiner Wahl an. Sorge dafür, dass der USB-Stick nur eine Partition enthält. Formatiere diese mit einem der erlaubten Dateisysteme. Vergib dabei einen sprechenden Namen für das Dateisystem. Die Fritz!Box zeigt dies später als Verzeichnis an. In allen Beispielen verwende ich Linux. Ich habe als Dateisystem ext4 und als Namen FritzUSB gewählt.

Der USB-Speicher muss mit dem Dateisystem NTFS, exFAT, FAT/FAT32 oder ext2/ext3/ext4 formatiert sein und darf über maximal vier Partitionen mit jeweils bis zu 4 Terabyte Größe verfügen.

USB-Speicher an FRITZ!Box einrichten aus der Wissensdatenbank auf fritz.com

Netzwerkspeicher an der Fritz!Box einrichten

  1. Schließ den USB-Stick an die Fritz!Box an.
  2. Logg Dich in der Administrationsoberfläche der Fritz!Box auf http(s)://fritz.box ein.
  3. Geh im Menü auf Heimnetz > USB / Speicher.
    • Im Abschnitt USB-Geräte und Speicher an der FRITZ!Box aktiviere die Checkboxen Speicher-(NAS)-Funktion von FRITZ!Box <Modell-Nr.> aktiv und Index automatisch aktualisieren.
    • Im Abschnitt Heimnetzfreigabe aktiviere die Checkbox Zugriff über FTP aktiv. Falls Du die Fritz!Box auch per SMB/CIFS nutzen möchtest, konfiguriere gerne auch das. Für die restic-Backups ist es nicht nötig.
    • Klicke auf den Button Übernehmen
  4. Geh zum Reiter USB-Fernanschluss aktiv.
    • Deaktiviere hier die Checkbox USB-Fernanschluss aktiv
    • Klicke den Button Übernehmen
  5. Klick den Link FRITZ!NAS am oberen Rand des Fensters. Logg Dich mit dem Adminuser-Passwort ein. Du müsstest jetzt durch die Verzeichnisse des USB-Sticks browsen können.
  6. Wechsele in das Verzeichnis des USB-Sticks. Es heißt so, wie das Dateisystem. In meinem Beispiel heißt es FritzUSB. Es ist an einem blauen USB-Symbol erkennbar.
    Das Verzeichnis des USB-Sticks in der Web-Gui des FRITZ!NAS
    Das Verzeichnis des USB-Sticks in der Web-Gui des FRITZ!NAS
  7. Lege mit Hilfe des Buttons Neuer Ordner die gewünschte Verzeichnisstruktur an. Ich habe ein Verzeichnis restic-repos angelegt. Darunter dann für jedes zu sichernde Gerät ein eigenes Unterverzeichnis. Hier im Beispiel geraet-1. Lege zusätzlich ein Verzeichnis an, dessen Name alphabetisch vor allen Geräte-Verzeichnissen steht. Hier im Beispiel heißt es a. Die Fritz!Box hat einen Bug. Bei der Rechtevergabe (siehe nächster Abschnitt) ist das alphabetisch erste Verzeichnis nicht auswählbar. Es werden in der Web-GUI zwei Punkte (..) angezeigt. Diese führen immer auf das nächst höhere Verzeichnis zurück.
    Button 'Neuer Ordner' in der Web-GUI des FRITZ!NAS
    Die neuen Verzeichnisse in der Web-GUI des FRITZ!NAS

FRITZ!Box-Benutzer einrichten

  1. Logge Dich in der Administrationsoberfläche der Fritz!Box auf http(s)://fritz.box ein.
  2. Gehe im Menü auf System > FRITZ!Box-Benutzer
  3. Klicke den Button Benutzer hinzufügen
  4. Im Abschnitt Benutzer
    • Aktiviere die Checkbox Benutzerkonto aktiv.
    • Bei Benutzername gib den gewünschten Namen ein. Ich habe für jedes Gerät einen eigenen Account. Der heißt genauso wie das Gerät. Und er ist gleich dem Ordnernamen für das jeweilige Gerät. In diesem Beispiel wäre es also geraet-1,
    • Bei Passwort vergib ein sehr starkes Passwort.
  5. Im Abschnitt Berechtigungen aktiviere die Checkbox Zugang zu NAS-Inhalten. Es wird eine Tabelle sichtbar, in der Du Lese- und Schreibrechte vergeben kannst.
  6. In der Tabelle
    • Entferne in der Zeile Alle an der FRITZ!Box verfügbaren Speicher den Haken bei Schreiben.
    • Klicke den Button Verzeichnis hinzufügen. Es öffnet sich ein Dialog Speicher (NAS)-Verzeichnis für Freigabe wählen.
  7. Im Dialog Speicher (NAS)-Verzeichnis für Freigabe wählen aktiviere den Radio-Button Verzeichnis auswählen. Es wird eine Browseransicht sichtbar. In der Browseransicht navigiere zum Verzeichnis FritzUSB/restic-repos/geraet-1. Aktiviere dort den Radio-Button. Klicke den Button OK. In dem folgenden Bild sieht man auch den Bug mit den zwei Punkten (..).
    Ordner 'geraet-1' für Rechteverbabe auswählen
    Ordner 'geraet-1' für die Rechtevergabe auswählen
  8. In der Tabelle erscheint eine neue Zeile FritzUSB/restic-repos/geraet-1. Die Haken bei Lesen und Schreiben sind gesetzt. Klicke den Button Übernehmen.

rclone-Remote einrichten

rclone organisiert die Konfiguration der von ihm verwendeten Speicherdienste in sog. remotes. Ein Remote wird mittelst des Befehls rclone config angelegt.

  1. Die Backup-Tasks laufen später unter dem user root. Werde daher root mit sudo su -.
  2. Starte die rclone Konfiguration mit rclone config und wähle n, um ein neues remote anzulegen.
    rclone config
    No remotes found, make a new one?
    n) New remote
    s) Set configuration password
    q) Quit config
    n/s/q> n
    
  3. Wähle einen Namen für das neue remote. Ich habe fritz-ftp gewählt.
    Enter name for new remote.
    name> fritz-ftp
    
  4. Tippe die korrekte Nummer für FTP ein. Bei mir war es 16.
    Option Storage.
    Type of storage to configure.
    Choose a number from below, or type in your own value.
    
    [...]
    16 / FTP
       \ (ftp)
    [...]
    Storage> 16
    
  5. Gib den Hostnamen der Fritz!Box ein, also fritz.box.
    Option host.
    FTP host to connect to.
    E.g. "ftp.example.com".
    Enter a value.
    host> fritz.box
    
  6. Gib den Namen des Users ein, den Du im Abschnitt Fritz!Box Benutzer einrichten für den Zugriff auf den Netzwerkspeicher eingerichtet hast. Im Beispiel ist es geraet-1.
    Option user.
    FTP username.
    Enter a string value. Press Enter for the default (nobody).
    user> geraet-1
    
  7. Der Default 21 stimmt bereits. Bestätige einfach mit Enter.
    Option port.
    FTP port number.
    Enter a signed integer. Press Enter for the default (21).
    port> 
    
  8. Wähle y, um das Passwort für den Zugriff auf den Netzwerkspeicher einzugeben.
    Option pass.
    FTP password.
    Choose an alternative below. Press Enter for the default (n).
    y) Yes, type in my own password
    g) Generate random password
    n) No, leave this optional password blank (default)
    y/g/n> y
    Enter the password:
    password:
    Confirm the password:
    password:
    
  9. FTP over TLS wäre wünschenswert, aber weder implicit noch explicit haben bei meinen Tests funktioniert. Ich habe daher beides auf default false gelassen und jeweils mit Enter bestätigt. Das Sicherheitsrisiko ist tragbar, denn die Kommunikation findet über ein WPA2-gesichertes WLAN statt.
    Option tls.
    Use Implicit FTPS (FTP over TLS).
    When using implicit FTP over TLS the client connects using TLS
    right from the start which breaks compatibility with
    non-TLS-aware servers. This is usually served over port 990 rather
    than port 21. Cannot be used in combination with explicit FTP.
    Enter a boolean value (true or false). Press Enter for the default (false).
    tls> 
    
    Option explicit_tls.
    Use Explicit FTPS (FTP over TLS).
    When using explicit FTP over TLS the client explicitly requests
    security from the server in order to upgrade a plain text connection
    to an encrypted one. Cannot be used in combination with implicit FTP.
    Enter a boolean value (true or false). Press Enter for the default (false).
    explicit_tls> 
    
  10. Die advanced config ist uninteressant. Überspringe sie durch Bestätigen mit Enter.
    Edit advanced config?
    y) Yes
    n) No (default)
    y/n>
    
  11. Die Konfiguration ist nun komplett. Bestätige mit Enter, dass sie OK ist.
    Configuration complete.
    Options:
    - type: ftp
    - host: fritz.box
    - pass: *** ENCRYPTED ***
    Keep this "fritz-ftp" remote?
    y) Yes this is OK (default)
    e) Edit this remote
    d) Delete this remote
    y/e/d>
    
  12. Verlasse rclone config mit q.
    Current remotes:
    
    Name                 Type
    ====                 ====
    fritz-ftp            ftp
    
    e) Edit existing remote
    n) New remote
    d) Delete remote
    r) Rename remote
    c) Copy remote
    s) Set configuration password
    q) Quit config
    e/n/d/r/c/s/q> q
    
💡 Hinweis Falls es Unbehagen bereitet, dass die rclone-Konfiguration nicht verschlüsselt ist, so kann mit dem Menüpunkt s) Set configuration password ein Passwort für die Verschlüsselung vergeben werden. Um etwa in Skripten die interaktive Abfrage des Passwortes zu vermeiden, kann es in eine Datei gespeichert und z.B. wie folgt in die dafür vorgesehene Umgebungsvariable geladen werden: RCLONE_CONFIG_PASS=$(cat <path-to-rclone-config-pw>)

restic-Repository auf dem Netzwerkspeicher initialisieren

  1. Lege ein Verzeichnis /root/.restic an. Entziehe allen außer dem Owner (root) die Rechte darauf. Wechsele dann hinein. Hier werden später alle benötigten Dateien gespeichert sein, auch die Passwortdatei für restic. Es ist darum wichtig, dass nur root Zugriff hat.
    mkdir /root/.restic
    chmod og-rwx /root/.restic
    cd /root/.restic
    
  2. Erzeuge ein pseudozufälliges und genügend langes Passwort für die Absicherung des Repositorys und schreibe es in eine Datei. Sorge mit chmod dafür, dass nur der Owner (root) Zugriff auf die Datei hat. restic wird später das Passwort bei allen Interaktionen mit dem Repository aus dieser Datei laden. Ich habe mit openssl einen 32 Byte/256 Bit langen Wert erzeugt und Base64-codiert in die Datei repo.pw geschrieben.
    # restic-Passwort generieren und in Datei schreiben
    openssl rand -base64 32 > repo.pw
    # nur der Besitzer (root) darf auf die Datei zugreifen
    chmod og-rwx repo.pw
    
  3. Initialisiere das restic-Repository. Die ERROR-Meldungen SetModTime is not supported von rclone können ignoriert werden (siehe hierzu ein Thread im rclone-Forum ). In neueren Versionen von rclone haben die Entwickler die Severity auf Debug heruntergesetzt (siehe hierzu die entsprechende Stelle im Quellcode von rclone )
    restic init -r rclone:fritz-ftp:/FritzUSB/restic-repos/geraet-1 -p repo.pw
    rclone: 2026/01/09 21:05:07 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    rclone: 2026/01/09 21:05:07 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    created restic repository ed0ad21a9c at rclone:fritz-ftp:/FritzUSB/restic-repos/geraet-1
    
    Please note that knowledge of your password is required to access
    the repository. Losing your password means that your data is
    irrecoverably lost.
    
Achtung Verliere wirklich niemals das Repo-Passwort! Ich habe beim Schreiben dieses Posts versehentlich repo.pw überschrieben. Ich musste darum die komplette Datensicherung wiederholen. Ich habe das Passwort beim zweiten Mal dann in meinen Passworttresor gespeichert.

Erste Datensicherung durchführen

  1. Erzeuge im Verzeichnis /root/.restic eine Datei exclude.patterns. Diese enthält pro Zeile ein Pattern für Dateinamen und Pfade, die nicht gesichert werden sollen. Die Datei sieht z.B. wie folgt aus:
    # Common cache, logs and temporary files
    .cache/
    /cache/
    *.tmp
    *.bak
    *.swp
    *.log
    *~
    
    # Specific application caches/dependencies
    /node_modules/
    /vendor/
    __pycache__/
    
    # System files that shouldn't be backed up
    lost+found/
    .DS_Store
    Thumbs.db
    
    # User profile files (usually not needed in backups)
    .bash_history
    .bash_logout
    .bashrc
    .config/
    .docker/
    .local/
    .profile
    .ssh/
    .sudo_as_admin_successful
    .wget-hsts
    # Database files (backup separately)
    *.db-shm
    *.db-wal
    
    # Browser caches
    .mozilla/firefox/*/Cache/
    .google-chrome/Default/Cache/
    Library/Caches/
    
    # Development files
    .git/objects/
    .svn/
    .hg/
    *.pyc
    *.pyo
    *.class
    
    # VM and container images
    *.vmdk
    *.vdi
    *.qcow2
    *.img
    *.iso
    
    👍 Credits Ich habe die Datei aus einer Vorlage von RedKB erstellt.
  2. Wechsele in den Runlevel 3. Der Wechsel in den Runlevel 3, schließt alle grafischen Oberflächen inkl. des Fenstermanagers. Dies vermeidet offene Filehandles, welche die Sicherung der entsprechenden Dateien behindern könnten.
    init 3
    
  3. Starte das initiale Backup. Lasse dabei cache-Dateien und alle Patterns aus dem Exclude-File aus. Ich habe nur /home/ gesichert. Mir hat das die vergangenen Jahre immer gereicht, um Rechner ggf. neu aufzusetzen. Auch hier können die ERROR-Meldungen SetModTime is not supported von rclone ignoriert werden.
    restic backup --exclude-caches --exclude-file /root/.restic/exclude.patterns -p /root/.restic/repo.pw -r rclone:fritz-ftp:/FritzUSB/restic-repos/geraet-1/ /home/
    repository ed0ad21a9c opened (version 2, compression level auto)
    created new cache in /root/.cache/restic
    no parent snapshot found, will read all files
    [...]
    snapshot 021949ed76 saved
    

Datensicherung überprüfen

Damit kein Datenverlust auftritt und im Schadensfall die Daten aus einer Datensicherung wiederhergestellt werden können, muss eine Datensicherung folgende Anforderungen erfüllen

  • Die Datensicherung muss vollständig sein.
  • Die Datensicherung muss fehlerfrei sein.
  • Die Datensicherung muss wiederhergestellt werden können.

restic unterstützt eine Überprüfung der o.a. Anforderungen mit entsprechenden Kommandos.

  1. restic check prüft das Repository auf Fehler und meldet diese ggf. Damit kann sichergestellt werden, dass alle Dateien, die gesichert werden sollten auch in der Datensicherung gelandet sind. Auch hier können die ERROR-Meldungen SetModTime is not supported von rclone ignoriert werden.
    restic check -p /root/.restic/repo.pw -r rclone:fritz-ftp:/FritzUSB/restic-repos/geraet-1/
    using temporary cache in /tmp/restic-check-cache-4009179987
    repository ed0ad21a9c opened (version 2, compression level auto)
    created new cache in /tmp/restic-check-cache-4009179987
    create exclusive lock for repository
    rclone: 2026/01/10 00:02:00 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    load indexes
    [0:03] 100.00%  7 / 7 index files loaded
    check all packs
    check snapshots, trees and blobs
    [0:00] 100.00%  2 / 2 snapshots
    no errors were found
    
  2. restic check [...] --read-data, der Parameter sorgt dafür, dass restic alle Daten in der Sicherung auf Fehlerfreiheit prüft. Dies dauert daher entsprechend lange. Auch hier können die ERROR-Meldungen SetModTime is not supported von rclone ignoriert werden.
    restic check -p /root/.restic/repo.pw -r rclone:fritz-ftp:/FritzUSB/restic-repos/geraet-1/ --read-data
    using temporary cache in /tmp/restic-check-cache-569960798
    repository ed0ad21a9c opened (version 2, compression level auto)
    created new cache in /tmp/restic-check-cache-569960798
    create exclusive lock for repository
    rclone: 2026/01/10 00:06:55 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    load indexes
    [0:02] 100.00%  7 / 7 index files loaded
    check all packs
    check snapshots, trees and blobs
    [0:00] 100.00%  2 / 2 snapshots
    read all data
    rclone: 2026/01/10 00:11:56 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    rclone: 2026/01/10 00:16:56 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    rclone: 2026/01/10 00:21:56 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    rclone: 2026/01/10 00:26:57 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    rclone: 2026/01/10 00:31:56 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    rclone: 2026/01/10 00:36:56 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    rclone: 2026/01/10 00:41:55 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    [37:56] 100.00%  3043 / 3043 packs
    no errors were found
    
  3. Mit restic mount können Datensicherungen in gewünschent Ständen in den Verzeichnisbaum gemountet werden. So kann entweder maschinell unterstützt oder händisch geprüft werden, ob gewisse Dateien im Backup gelandet sind. Auch hier können die ERROR-Meldungen SetModTime is not supported von rclone ignoriert werden.
    restic mount -p /root/.restic/repo.pw -r rclone:fritz-ftp:/FritzUSB/restic-repos/geraet-1 /mnt/backups/
    repository ed0ad21a9c opened (version 2, compression level auto)
    rclone: 2026/01/10 00:47:49 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-1: SetModTime is not supported
    [0:00] 100.00%  7 / 7 index files loaded
    Now serving the repository at /mnt/backups/
    Use another terminal or tool to browse the contents of this folder.
    When finished, quit with Ctrl-c here or umount the mountpoint.
    

Wiederherstellung testen

Ich habe für den Test habe ein Zielverzeichnis /restore-test für die Wiederherstellung angelegt. Ich habe einen USB-Stick dorthin gemountet. Mit restic restore habe ich die Datensicherung in diesen Ordner wiederhergestellt. Die Wiederherstellung dauerte ähnlich lange wie die Sicherung. Nach gut 30 Minuten hat restic Erfolg gemeldet. Ich bin dann durch die Dateien gebrowst und habe einige händisch mit den Originalen verglichen. Auch hier können die ERROR-Meldungen SetModTime is not supported von rclone ignoriert werden.

restic restore latest -p /root/.restic/repo.pw -r rclone:fritz-ftp:/FritzUSB/restic-repos/geraet-01/ --target /restore-test/
repository ed0ad21a9c opened (version 2, compression level auto)
rclone: 2026/01/10 20:06:00 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-01: SetModTime is not supported
[0:00] 100.00%  7 / 7 index files loaded
restoring <Snapshot ed0ad21a9c of [/home] at 2026-01-10 23:52:26.779556634 +0100 CET by root@geraet-01> to /restore-test/
rclone: 2026/01/10 20:11:00 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-01: SetModTime is not supported
rclone: 2026/01/10 20:16:02 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-01: SetModTime is not supported
rclone: 2026/01/10 20:21:00 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-01: SetModTime is not supported
rclone: 2026/01/10 20:26:00 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-01: SetModTime is not supported
rclone: 2026/01/10 20:31:00 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-01: SetModTime is not supported
rclone: 2026/01/10 20:36:00 ERROR : ftp://fritz.box:21/FritzUSB/restic-repos/geraet-01: SetModTime is not supported
Summary: Restored 41091 files/dirs (61.251 GiB) in 32:49

Alles automatisieren

Die Datensicherung soll automatisch jeweils vor Herunterfahren des Endgerätes statt finden. So werden alle Daten, die in der vorhergehenden Sitzung erstellt, bearbeitet oder gelöscht wurden, sehr zeitnah einer Datensicherung zugeführt. Im Schadensfall steht ein ziemlich aktueller Datenbestand für die Wiederherstellung zur Verfügung. Die Datensicherung soll aber auch gegen irrtümliches Löschen oder fehlerhafte Änderungen an einzelnen Daten schützen. Darum reicht es nicht, nur den jeweils aktuellsten Stand aufzubewahren. Es werden auch ein paar ältere Stände aufbewahrt. Aus diesen können einzelne Dateien dann gezielt wiederhergestellt werden. Es sollen hierfür sieben tägliche Stände, vier wöchentliche Stände und drei monatliche Stände aufbewahrt werden.

  1. Ein Shellscript erledigt alle nötigen Schritte. Erzeuge eine Datei backup.sh im Verzeichnis /root/.restic. Mache sie ausführbar mit chmod u+x backup.sh. Der Inhalt ist wie folgt:
    #!/bin/bash
    
    # This script will first perform a restic-backup.
    # After completion of backup it will perform a
    # forget and prune of the chosen repository.
    #
    # All parameters are read from environment variables.
    # Those are sourced from an .env file. The locacion
    # of that .env file is the only and mandatory parameter
    # of this script.
    #
    # The .env file must contain the following variables
    # RESTIC_REPOSITORY
    # RESTIC_PASSWORD_FILE
    # BACKUP_SOURCES
    # EXCLUDE_FILE
    # KEEP_DAILY
    # KEEP_WEEKLY
    # KEEP_MONTHLY
    
    set -a
    source $1
    set +a
    
    backup_cmd=(restic backup --exclude-file "$EXCLUDE_FILE" ${BACKUP_SOURCES[@]})
    echo "[INFO] Running restic backup command: ${backup_cmd[@]}"
    "${backup_cmd[@]}"
    backup_result=$?
    if [[ $backup_result -ne 0 ]]; then
        echo "[ERROR] Failed to run restic backup command with result ${backup_result}."
        exit $backup_result
    fi
    
    cleanup_cmd=(restic forget --keep-daily "$KEEP_DAILY" --keep-weekly "$KEEP_WEEKLY" --keep-monthly "$KEEP_MONTHLY" --prune)
    echo "[INFO] Running restic cleanup command: ${cleanup_cmd[@]}"
    "${cleanup_cmd[@]}"
    cleanup_result=$?
    if [[ $cleanup_result -ne 0 ]]; then
        echo "[ERROR] Failed to run restic cleanup command with result ${cleanup_result}."
        exit $cleanup_result
    fi
    
  2. Das Shellscript sourcst alle nötigen Variablen aus einer Environment-Datei. Erzeuge eine Datei home2fritz.env im Verzeichnis /root/.restic. Der Inhalt ist wie folgt:
    RESTIC_REPOSITORY=rclone:fritz-ftp:/FritzUSB/restic-repos/geraet-1/
    RESTIC_PASSWORD_FILE=/root/.restic/repo.pw
    BACKUP_SOURCES=(/home)
    EXCLUDE_FILE=/root/.restic/exclude.patterns
    KEEP_DAILY=7
    KEEP_WEEKLY=4
    KEEP_MONTHLY=3
    
  3. Für den automatischen Aufruf bei Shutdown sorgt eine SystemD-Unit. Erzeuge eine Datei restic-backup.service im Verzeichnis /etc/systemd/system. Der Inhalt ist wie folgt:
    [Unit]
    Description=Restic backup before system shutdown
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    Type=oneshot
    KillMode=process
    User=root
    Group=root
    RemainAfterExit=true
    ExecStart=/bin/true
    ExecStop=/root/.restic/backup.sh /root/.restic/home2fritz.env
    
    # Hardening (safe defaults)
    Nice=19
    IOSchedulingClass=best-effort
    IOSchedulingPriority=7
    PrivateTmp=true
    NoNewPrivileges=true
    
    [Install]
    WantedBy=multi-user.target
    
  4. Lade die SystemD-Konfiguration neu. Aktiviere den Backup-Service. Starte ihn.
    systemctl daemon-reload
    systemctl enable restic-backup.service
    systemctl start restic-backup.service
    

Ab jetzt werden Deine Daten voll automatisch regelmäßig gesichert. Herzlichen Glückwunsch!

Fazit

Es hat Zeit gekostet, die funktionierende Konfiguration zu finden. Die Sackgassen restic/rclone mit SMB und rclone mit FTP over TLS waren ärgerlich. Auch der Bug in der Web-GUI der Fritz!Box für die Rechtevergabe hat gestört. Das finale Setup aus USB-Speicher an der Fritz!Box, restic als Datensicherungslösung und rclone als Wrapper für FTP ist aber stabil. Damit sind schnelle, einfache und sorgenfreie Datensicherungen möglich.

Mit je einem User und Ordner pro zu sicherndem Gerät sind die Daten gut getrennt. Rechte, vor allem zum Schreiben können gezielt vergeben werden. Die verschiedenen Sicherungen kommen sich so nicht ins Gehege.

Es werden zwei verschiedene Medien für die Sicherung verwendet. Der Ausfall eines Speichermediums ist damit kein Problem mehr (siehe 2. Forderung). Das Starten der Backups unter dem jeweiligen root-User und Sichern auf einen Netzwerkspeicher bietet einen gewissen Schutz vor Veränderung. Die Ransomware kommt nicht mehr direkt an die Backups heran (siehe 4. Forderung). Damit sind drei der fünf Forderungen der Golden Backup Regel erfüllt.

Für Schutz vor Wohnungsbränden müsste eine dritte Kopie noch an einem anderen Ort gespeichert werden. Man könnte sich hier mit Freunden zusammentun, die auch über USB-Speicher an ihren Internetroutern verfügen. Ein VPN-Tunnel zwischen den Routern ist schnell gegraben und man stellt sich gegenseitig Speicherplatz zur Verfügung. Es bieten sich aber auch Webhoster mit Internetspeichern an. Sie verüfgen i.d.R. über APIs (bspw. restic-native REST-API oder S3-Storage), die echte Unveränderbarkeit der Daten sicher stellen. Die Backups der eigenen Daten können dort ohne Sorge um die Vertraulichkeit gespeichert werden, denn restic verschlüsselt die Daten bei der Datensicherung. Die Goldene Backup Regel ist dann komplett befolgt. Potenzieller Datenverlust ist kein Angstauslöser mehr.

Kommentare

Kommentare bitte unter meinem Mastodon-Post auf hhsocial.de (Mastodon-Account nötig).