Restic done right!
Backups sind ein essenzieller Bestandteil jeder IT-Infrastruktur, weshalb sie in den unterschiedlichsten Lösungsansätzen vertreten sind. Von einfachen Copy-Jobs, rclone oder rsync bis hin zu umfangreichen Enterprise-Lösungen wie dem EMC NetWorker ist nahezu alles möglich, je nach benötigtem Funktionsumfang und verfügbarem Budget.
Doch nicht immer muss es die „große, fully managed”-Lösung sein. Oft reichen leichtgewichtige Tools vollkommen aus, um eine zuverlässige Datensicherung zu gewährleisten.
Dieser Blogartikel stellt die Backup-Lösung restic vor, die sich in den letzten Jahren zunehmend etabliert hat – sowohl im Homelab-Bereich als auch für kleinere Enterprise-Szenarien.
Grundlagen zu restic
Restic ist in der Programmiersprache Go geschrieben, vollständig Open Source und wurde als sichere wie effiziente Backup-Lösung entwickelt. Es unterstützt moderne Sicherheitsmechanismen wie Verschlüsselung, Deduplizierung und eine performante Datenorganisation.
Dafür arbeitet restic intern mit einem Chunk-basierten Ansatz: Dateien werden in Blöcke („Chunks") zwischen ca. 512 kB und 8 MB Größe zerlegt – abhängig vom Dateninhalt. Das sorgt für effiziente Deduplizierung und schnelle inkrementelle Backups.
restic im Stand-alone-Einsatz
Am unkompliziertesten nutzt man restic als „Stand-alone”-Backup-Tool. Dabei wird lediglich der restic-Client benötigt, um Backups anzulegen oder wiederherzustellen. Dreh- und Angelpunkt ist dabei das sog. Repository, also das Zielverzeichnis, in dem die Backups gespeichert werden.
Init – Repository erstellen
Ein neues Repository wird mit folgendem Befehl initialisiert:
restic -r <repo> init
<repo> kann dabei ein Dateipfad oder eine Remote-Adresse sein. restic fragt anschließend nach einem Passwort, mit dem das Repository verschlüsselt wird. In einem entsprechenden Beispiel sieht das ganze dann so aus:
restic -r ./restic-repo init enter password for new repository: enter password again: created restic repository 390713f5a2 at ./restic-repo Please note that knowledge of your password is required to access the repository. Losing your password means that your data is irrecoverably lost.
Ein großer Vorteil von restic ist, dass das Repository lediglich aus Ordnern und Dateien besteht, welche sich mit normalen Dateisystemmitteln kopieren und sichern lassen. Dadurch können auch restic-Repos selbst zuverlässig gesichert werden.
Backup – Daten sichern
Ein Backup wird über folgenden Befehl ausgeführt:
restic -r <repo> backup <pfad>
Damit das funktioniert, muss das <repo> zuvor bereits initialisiert worden sein. Der angegebene <pfad> wird als Snapshot gesichert. Bei weiteren Backups speichert restic nur die geänderten Blöcke, was den Speicherbedarf gering hält.
restic -r restic-repo backup important_data enter password for repository: repository 390713f5 opened (version 2, compression level auto) created new cache in /home/steffen/.cache/restic no parent snapshot found, will read all files [0:00] 0 index files loaded Files: 1 new, 0 changed, 0 unmodified Dirs: 1 new, 0 changed, 0 unmodified Added to the repository: 1008 B (883 B stored) processed 1 files, 25 B in 0:04 snapshot ee91903c saved
Review – Snapshots anzeigen
Mit:
restic -r <repo> snapshots
können alle Snapshots, die in einem Repository bereits erstellt wurden, angezeigt werden. Ein „ls” listet im Anschluss auch die Dateien des Snapshots auf.
$ restic -r restic-repo snapshots enter password for repository: repository 390713f5 opened (version 2, compression level auto) ID Time Host Tags Paths Size -------------------------------------------------------------------------------------------------------------------- ee91903c 2026-03-13 13:21:44 devserver /home/steffen/restic-test-server-instanz/important_data 25 B -------------------------------------------------------------------------------------------------------------------- 1 snapshots $ restic -r restic-repo ls ee91903c enter password for repository: repository 390713f5 opened (version 2, compression level auto) [...] /important_data /important_data/important_file
Recover – Daten wiederherstellen
Restic erlaubt sowohl die Wiederherstellung des letzten Snapshots als auch eines gezielten Snapshots:
$ restic -r restic-repo restore ee91903c --target restore_path enter password for repository: repository 390713f5 opened (version 2, compression level auto) [...] Summary: Restored 2 files/dirs (25 B) in 0:00 $ ls important_data restic-repo restore_path $ ls restore_path important_data
oder eine einzelne Datei aus einem Snapshot:
$ touch important_data/scnd_important_file $ restic -r restic-repo backup important_data enter password for repository: [...] Files: 1 new, 0 changed, 1 unmodified Dirs: 0 new, 1 changed, 0 unmodified Added to the repository: 1.456 KiB (961 B stored) processed 2 files, 48 B in 0:03 snapshot 4b90f041 saved $ restic -r restic-repo snapshots enter password for repository: repository 390713f5 opened (version 2, compression level auto) ID Time Host Tags Paths Size -------------------------------------------------------------------------------------------------------------------- ee91903c 2026-03-13 13:21:44 devserver /home/steffen/restic-test-server-instanz/important_data 25 B 4b90f041 2026-03-13 13:31:50 devserver /home/steffen/restic-test-server-instanz/important_data 48 B -------------------------------------------------------------------------------------------------------------------- 2 snapshots $ restic -r restic-repo ls 4b90f041 enter password for repository: repository 390713f5 opened (version 2, compression level auto) [...] /important_data /important_data/important_file /important_data/scnd_important_file $ restic -r restic-repo restore 4b90f041 --target restore_path2 --include /important_data/scnd_important_file enter password for repository: [...] Summary: Restored 2 / 1 files/dirs (23 B / 23 B) in 0:00 $ ls -la restore_path2/important_data total 4 drwxr-xr-x. 2 steffen steffen 33 Mar 13 13:31 . drwx------. 3 steffen steffen 28 Mar 13 13:32 .. -rw-r--r--. 1 steffen steffen 23 Mar 13 13:31 scnd_important_file
Für eine komfortable Suche im Backup bietet restic zudem: restic mount
$ mkdir mounted_restic_repo $ restic -r restic-repo mount mounted_restic_repo enter password for repository: [...] Now serving the repository at mounted_restic_repo Use another terminal or tool to browse the contents of this folder. When finished, quit with Ctrl-c here or umount the mountpoint. $ ls mounted_restic_repo/snapshots/2026-03-13T13:31:50Z/important_data/ important_file scnd_important_file
Damit wird das Repository als Dateisystem eingebunden und ist einfach durchsuchbar.
Forget – Snapshots aufräumen
Snapshots können mit folgendem Befehl verworfen werden: restic -r <repo>
forget <snapshot-id> restic -r restic-repo forget ee91903c enter password for repository: repository 390713f5 opened (version 2, compression level auto) [0:00] 100.00% 1 / 1 files deleted $ restic -r restic-repo prune enter password for repository: [...] rebuilding index [0:00] 100.00% 2 / 2 indexes processed [0:00] 100.00% 2 / 2 old indexes deleted removing 1 old packs [0:00] 100.00% 1 / 1 files deleted done
Mit der Option --prune werden die Daten auch physisch gelöscht. Hier lassen sich flexible Retention‑Policies definieren, um alte Backups automatisiert zu entfernen. Bspw „--keep-last 5” oder „--keep-daily 5”, das funktioniert auch mit weekly, yearly, monthly oder sogar hourly.
Da die manuelle Eingabe des Passworts in vielen automatisierten Szenarien nicht sinnvoll ist, können dafür Passwort-Files oder Umgebungsvariablen eingesetzt werden.
$ export RESTIC_PASSWORD=secretPassword $ restic -r restic-repo snapshots repository 390713f5 opened (version 2, compression level auto) ID Time Host Tags Paths Size -------------------------------------------------------------------------------------------------------------------- 4b90f041 2026-03-13 13:31:50 devserver /home/steffen/restic-test-server-instanz/important_data 48 B -------------------------------------------------------------------------------------------------------------------- 1 snapshots
Besonders elegant ist die Verwendung des „Password Commands”, bei dem das Passwort als Ausgabe eines ausgeführten Befehls erwartet wird – damit könnten auch externe Secret-Management-Lösungen angebunden werden.
Verifikation der Integrität mit restic check
Um sicherzustellen, dass die Backups integer und frei von Schreibfehlern sind, ist es dringend angeraten, regelmäßig das Kommando restic check auf das Repository anzuwenden.
$ restic -r restic-repo check [...] check all packs check snapshots, trees and blobs [0:00] 100.00% 1 / 1 snapshots no errors were found
Sollten dabei Fehler auffallen, können diese proaktiv angegangen und behoben werden und sorgen nicht für einen Ausfall des Backups, wenn es „brennt”.
Konfigurationsdateien mit resticprofile
Egal, ob die Backups automatisiert oder per CLI manuell angelegt werden sollen, aufgrund der Komplexität und Menge der Parameter tut man gut daran, ein entsprechendes Skript zu entwickeln, welches das Backup für einen durchführt. Das könnte wie folgt aussehen:
$ cat /home/steffen/.restic-backup export RESTIC_REPOSITORY=/home/steffen/restic-test-server-instanz/restic-repo export RESTIC_PASSWORD="secretPassword" $ cat restic-backup.sh #!/bin/bash source /home/steffen/.restic-backup restic backup /home/steffen/restic-test-server-instanz/important_data/ restic forget --keep-weekly 2 --keep-daily 5 --keep-monthly 12 --prune
Die Entwicklung eines eigenen Skripts führt allerdings zwangsläufig zu dem Problem, dass diese Skripte zum Anlegen des Backups sowohl potenziell komplex als auch fehleranfällig und wartungsintensiv sind und ggf. aufgrund von zu starkem Customizing auch schlecht wiederverwendet werden können. Außerdem müssen zusätzliche Cronjobs oder Systemd-Timer angelegt werden, damit das Backup automatisiert ausgeführt wird.
Um das zu vereinfachen, bietet es sich an, als Ergänzung zur restic ebenfalls resticprofile einzusetzen. Anstatt alle Parameter per CLI händisch an den restic-Befehl anzuhängen, nutzt diese Anwendung eine Konfigurationsdatei, wahlweise im .toml-, .yaml-, .json- oder .hcl-Format, um die Parameter einzulesen und anzuwenden. Eine entsprechende profile.yaml sieht bspw. so aus:
$ cat profiles.yaml
version: 1
global:
initialize: true
default:
repository: "/home/steffen/restic-test-server-instanz/restic-repo"
password-file: "/home/steffen/.restic-pw"
backup:
verbose: true
exclude-caches: true
source:
- „/home/steffen/restic-test-server-instanz/important_data/"
schedule: '03:00'
schedule-lock-wait: 10m
tag:
- "automatic"
- "daily"
retention:
before-backup: false
after-backup: true
keep-daily: 5
keep-weekly: 2
keep-monthly: 12
prune: true
tag: true
host: true
Um damit ein Backup anzustoßen, genügt nun ‚resticprofile backup' und die Parameter der Datei werden (bei korrektem Dateinamen und Pfad, bspw. ~/profiles.yaml) automatisch angewendet. Damit das funktioniert, muss die profiles-Datei an einem definierten Pfad liegen, der von resticprofile gelesen wird. Die vollständige Liste der möglichen Pfade findet sich hier. Dort findet sich auch eine umfangreiche Doku mit Beispielen, in denen viele Parameter beschrieben sind.
Die gewohnten CLI-Parameter von restic funktionieren in den meisten Fällen weiter (bspw. ls, snapshots, mount), wobei ohne Parameter automatisch ein Snapshot durchgeführt wird.
$ resticprofile backup [...] Files: 2 new, 0 changed, 0 unmodified Dirs: 4 new, 0 changed, 0 unmodified Data Blobs: 0 new Tree Blobs: 3 new Added to the repository: 1.409 KiB (1.127 KiB stored) processed 2 files, 48 B in 0:00 snapshot 8517243b saved 2026/03/18 10:58:18 profile 'default': finished 'backup' 2026/03/18 10:58:18 profile 'default': cleaning up repository using retention information repository 390713f5 opened (version 2, compression level auto) Applying Policy: keep 5 daily, 2 weekly, 12 monthly snapshots $ resticprofile [...] ID Time Host Tags Paths Size ------------------------------------------------------------------------------------------------------------------------- 4b90f041 2026-03-13 13:31:50 devserver /home/steffen/restic-test-server-instanz/important_data 48 B 8517243b 2026-03-18 10:58:18 devserver automatic,daily /home/steffen/restic-test-server-instanz/important_data 48 B ------------------------------------------------------------------------------------------------------------------------- 2 snapshots 2026/03/18 10:58:23 profile 'default': finished 'snapshots'
Damit die in der Datei definierten „Schedules” auch greifen, muss ein resticprofile schedule ausgeführt werden, wodurch automatisch ein systemd-timer angelegt wird, der fortan automatisiert die Backups anlegt.
Im o. g. Beispiel-Profil finden sich außerdem die Parameter „tag” und „host”, welche für ein strukturiertes Backup-Konzept ggf. sehr nützlich sein können. Denn je nach Backup-Konzept sichern mehrere Server in das gleiche Repository und unter Umständen sogar unterschiedliche Backups. Mit dem Parameter „host” merkt sich restic, von welchem Host das Backup erzeugt wurde. Mit dem Parameter „tag” lassen sich frei wählbare Tags vergeben (z. B. 'automatic' und 'daily'). Dadurch können beispielsweise anlassbezogen händische Backups erzeugt werden, die sich von automatisierten Backups einwandfrei unterscheiden lassen. Es lassen sich auch mehrere Verzeichnisse über die „Source”-Liste eintragen, sodass auch komplexere Sicherungsprozesse abgebildet werden können.
Speicherorte und Rest-Server
Als Speicherort für die Backups unterstützt restic eine Vielzahl an gängigen Speichermethoden, darunter natürlich gemountete Netzwerkverzeichnisse, SFTP-Adressen, S3-Buckets usw., womit eine Vielzahl an Usecases bereits abgedeckt sein dürfte.
Doch gerade in der aktuellen Zeit der Ransomware-Angriffe sind Lösungen, bei denen die alten Backups nicht gelöscht oder überschrieben werden können, gefragt – und auch hier bietet restic eine Lösung: den restic-rest-server.
Der restic-REST-Server lässt sich nativ oder als Docker-Container auf einem beliebigen Zielserver starten und sollte mit einer .htpasswd-Datei vor unberechtigtem Zugriff geschützt werden.
Im Anschluss kann mittels „rest://…" der Server als Zieladresse angesprochen werden und über den Pfad <servername>/<reponame> kann ein entsprechendes Repo ausgewählt/angesprochen werden.
Die resticprofile-Konfig ändert sich dadurch wie folgt:
[...]
repository: "rest:http://httpuser:httppassword@backup.server:7766/ restic-repo"
password-file: "/root/.restic-pw"
[...]
Neben der erhöhten Sicherheit durch den Schutz vor unberechtigtem Überschreiben/Löschen liefert dieser bspw. auch einen /metrics-Endpoint zur Überwachung via Prometheus usw. direkt aus, was eine höhere Transparenz und Überwachbarkeit ermöglicht.
Fazit
Restic allein ist bereits eine sinnvolle und gute Lösung, um Backup & Recovery im kleinen Unternehmen kostengünstig zu betreiben. Es ist zwar kein vollwertiger Ersatz für so manche „Full Service”-Lösung, bietet aber eine solide Basis. Wird es um resticprofile und restic-rest ergänzt, können damit bereits viele Backup-Usecases erfüllt werden und insbesondere die wichtigen, automatischen und regelmäßigen Backups lassen sich strukturiert und zuverlässig umsetzen.
Seminarempfehlung
GRUNDLAGEN DER IT-SICHERHEIT [IT-SEC-01]
Mehr erfahrenSenior Consultant bei ORDIX
Kommentare