Prolog
Durch Zufall bin ich auf restic gekommen, es ist ein Backup Programm, welches sehr ähnlich zu borg Backup funktioniert, aber von Grund auf neu geschrieben wurde und eine andere Syntax benutzt. Der Original Autor ist Alexander “fd0” Neumann, er hat das Programm in go geschrieben.
Für mich sind die herausragenden Eigenschaften:
- Verschlüsselung der Daten (auch die Struktur ist ohne Passphrase nicht einsehbar)
- Deduplizierung (ist im Video von 2016³ endlich mal gut erklärt)
- immer Vollbackups
- man kann Snapshots auch per z.B.: SFTP Storage lokal mounten (Stichwort FUSE)
- sehr schnell
- Verifizierung der Daten mit Hashsummen
- leicht zu konfigurieren
- integrierte Update Funktion
Hier soll es um das Backup Programm im praktischen Einsatz gehen.
Gesichert werden 2 Laptops und ein Server (später) auf meinem Storage bei Hetzner. Mein Artikel soll kein selber lesen der Dokumentation ersetzen oder ersparen, sondern ein Leitfaden für mich und Leute sein, die eine ähnliche Situation haben. Es ist also ein Notizblock, um schnell das setup zu verstehen und als Hilfe gedacht, wenn nach Monaten mal ein Problem auftritt und ich wissen möchte, wie hatte ich mir das gedacht.
Ich benutze derzeit restic nur als user zum sichern von Bildern und persönlichen Dokumenten. Natürlich würde es auch für die komplette Installation der Laptops gehen, das brauche ich aber momentan nicht.
Voraussetzungen
Hetzner hat die Besonderheit, dass der Storage über Port 22 und 23 erreichbar ist. Hinweis: Bei Hetzner ist user@name durch eure Kennung z.B. u0815@u0815 zu ersetzen, ich wollte hier nicht meinen realen Account offenbaren.
Hat man den Public_Key auf dem Storage unter .ssh/authorized_keys hinterlegt, ist der Zugriff über Port 23 für Backup Programme ohne Passwort möglich.
Einloggen per ssh ist unterbunden.
Bevor man sich einen Wolf sucht, bitte entweder mit
lftp -p 23 sftp://user@name.your-storagebox.de
oder
sftp -P 23 user@name.your-storagebox.de
testen. Es sollte nun ohne Passwortabfrage eine Verbindung zum Storageserver hergestellt werden.
Warum lftp?
Nun es geht auch mit sftp, das ist ja standardmäßig bereits installiert, allerdings ist lftp der klare Sieger, wenn man rekursiv mal etwas löschen muss, was bei mir der Fall war, das beschreibe ich weiter unten. Ansonsten ist die Verwendung weitgehend identisch. Bei sftp gibt man den Port mit großem -P an und es versteht df -h, lftp dafür du -hs (Achtung u.U. langsam).
Eine Merkwürdigkeit ist bei lftp, dass man trotz ssh Key eine Passwort Aufforderung bekommt, wo man einfach nur <ENTER> drücken muß.
Ein Workaround um die Passwort Abfrage zu umgehen, ist der Trick, einen eigentlich unnötigen Platzhalter "platz" zu verwenden:
lftp -p 23 -u user,platz sftp://name.your-storagebox.de
Zum experimentieren mit restic verwende ich einen Alias. (Hetzner storagebox)
# -p password_file -r repository pfad
alias back='restic -p ~/.ssh/restic_pw -r sftp://user@name.your-storagebox.de:23/privat/bernd/T500
Mit dem alias back erspare ich mir die Angabe des Repositories und des Passwords. Man könnte natürlich auch mit Environment Variablen arbeiten, das finde ich aber unsicherer, weil die für Angreifer leichter auslesbar wären. Ich denke z.B. aber auch an die .bash_history. Der Nachteil des Alias ist, dass man die Autocompletion von bash verliert, wenn man allerdings als alias restic verwendet, fällt dieser Nachteil weg, man handelt sich dann ggfs. andere Nachteile ein. Zum Beispiel, wenn man mit mehreren Repositories arbeiten will.
#In restic_pw ist das lange Password des Repositories abgelegt, es darf nur für den User lesbar sein
~/.ssh/restic_pw
chmod 600 ~/.ssh/restic_pw
In den weiteren Beschreibungen verwende ich den Alias back und nicht restic, um Verwirrungen beim Leser zu vermeiden.
Anlegen des Repository
Vorher auf dem sftp Server nachschauen, welche Verzeichnisstruktur bereits vorhanden ist. Das Verzeichnis des Repositories wird angelegt, es muss nicht existieren! Bei mir z.B. /home/privat/bernd. wobei das /home nicht mit angegeben wird! Im obigen Beispiel ist dies bereits berücksichtigt und deshalt reicht ein einfaches
back init
created restic repository e5f00e22 at sftp://user@name.your-storagebox.de:23/privat/bernd/T500
(...)
Damit ist in kurzer Zeit die notwendige Datenstruktur auf dem Storage angelegt und bereit für ein erstes Backup
Erstes Backup erstellen
Ich habe als erstes mal meine Dokumente gesichert.
Hier das Protokoll des dritten Aufrufes, das erst Backup lief ca. 40 Minuten
back backup Dokumente
repository e5f00e22 opened successfully, password is correct
using parent snapshot 3504f0f6
Files: 0 new, 0 changed, 139 unmodified
Dirs: 0 new, 0 changed, 12 unmodified
Added to the repo: 0 B
processed 139 files, 2.634 GiB in 0:00
snapshot b982a7d0 saved
Backup auflisten
back snapshots
repository e5f00e22 opened successfully, password is correct
ID Time Host Tags Paths
--------------------------------------------------------------------------
99494f33 2021-02-18 19:01:31 T500 /home/bed/Dokumente
3504f0f6 2021-02-19 19:42:50 T500 /home/bed/Dokumente
b982a7d0 2021-02-19 21:10:30 T500 /home/bed/Dokumente
--------------------------------------------------------------------------
3 snapshots
Backup Dateien auflisten
#back ls b982a7d0 # oder das aktuellste mit latest
back ls latest
(...)
/Dokumente/SchaubLorenz_Golf100.pdf
/Dokumente/Toshiba_TLG373.pdf
(...)
Das Ergebnis ist mit pipe weiter verarbeitbar. Zum Beipiel
back ls latest|grep -i toshiba
/Dokumente/Toshiba_TLG373.pdf
Backup Dateien suchen
restic bietet auch eine Suchfunktion
back find toshiba* --ignore-case
repository e5f00e22 opened successfully, password is correct
Found matching entries in snapshot 3504f0f6 from 2021-02-19 09:42:50
/Dokumente/Toshiba_TLG373.pdf
Found matching entries in snapshot 99494f33 from 2021-02-18 09:01:31
/home/bed/Dokumente/Toshiba_TLG373.pdf
Found matching entries in snapshot b982a7d0 from 2021-02-19 13:10:30
/Dokumente/Toshiba_TLG373.pdf
Backup checken
Ein Hilite von restic ist die check Funktion, hier wird die Struktur auf Integrität geprüft.
Sie testet das Repository auf Fehler und meldet gefundene Fehler. Sie kann auch verwendet werden, um alle Daten zu lesen und somit eine Wiederherstellung zu simulieren.
Standardmäßig lädt der "check"-Befehl immer alle Daten direkt aus dem Repository und verwendet keinen lokalen Cache.
Die 2 Beispiele sind nicht vom T500, sondern vom Tuxedo, dort läuft durch den moderneren Prozessor auch die Hardware decryption, was natürlich dem Vorgang den Marsch bläst.
back check
time back check
using temporary cache in /tmp/restic-check-cache-775446915
repository cfa22dd6 opened successfully, password is correct
created new cache in /tmp/restic-check-cache-775446915
create exclusive lock for repository
load indexes
check all packs
check snapshots, trees and blobs
[0:01] 100.00% 3 / 3 snapshots
no errors were found
real 0m31,592s
user 0m1,660s
sys 0m0,359s
Nicht schlecht, oder? nach gerade mal 32 Sekunden weiß ich, dass mein Backup in Ordnung ist. Doch was ist wirklich los, simulieren wir doch einen kompletten Restore... des 55GiB großen Repo (ok, Download Speed nicht mit einberechnet)
back check --read-data
time back check --read-data
using temporary cache in /tmp/restic-check-cache-410215478
repository cfa22dd6 opened successfully, password is correct
created new cache in /tmp/restic-check-cache-410215478
create exclusive lock for repository
load indexes
check all packs
check snapshots, trees and blobs
read all data 2 / 3 snapshots
[0:01] 100.00% 3 / 3 snapshots
[1:12:32] 100.00% 9019 / 9019 packs
no errors were found
real 72m58,199s
user 12m50,579s
sys 4m16,768s
Repository Password ändern
Beim ausprobieren und einrichten ist mir ein Fehler unterlaufen. Ich wollte eigentlich ein password file benutzen, habe es aber ich der command line nicht angegeben. Damit wurde als Password File der Private Key genommen, wahrscheinlich keine gute Idee 
Das merkte ich aber erst, als das erste Backup lief.
Da es hier aber ein größeres Backup war, wollte ich es nicht neu machen, sonder habe mich nach der sehr guten Dokumentation gerichtet und einfach einen neuen Key angelegt, dann meinen Aufruf korrigiert und den nun nicht mehr notwendigen Key gelöscht. Fertig.
Weil hier der Alias back benutzt wird, besonders darauf achten, dass das hinterlegte password auch händisch im
~/.ssh/restic_pw
angepasst wird, sonst könnte es böse Überraschungen geben 
Also:
Auflisten aller Keys
back key list
password ändern
back key passwd
Key hinzufügen
back key add
Key löschen
back key delete
Restore
Ich komme nun zum eigentlichen Zweck eines Backup Programms, dem zurückholen von einzelnen Dateien oder des gesamten gesicherten Bestands.
Zuerst feststellen was alles, wann gesichert wurde:
back snapshots
repository cfa22dd6 opened successfully, password is correct
ID Time Host Tags Paths
--------------------------------------------------------------------------
00fbbd64 2021-02-18 19:01:26 Bullseye /home/bed/Bilder
84e0f2bc 2021-02-19 12:17:52 Bullseye /home/bed/Dokumente
c3d0c516 2021-02-19 17:16:48 Bullseye /home/bed/Dokumente
7d2d6547 2021-02-19 20:07:09 Bullseye /home/bed/Bilder
--------------------------------------------------------------------------
4 snapshots
Ich möchte die Bilder im Ordner usb-warzen zurück sichern, Witzigerweise sind die nicht im gesicherten Ordner Bilder, sondern in Dokumente.
Siehe auch Datei suchen
Einzelne Dateien finden und zurück holen
Mehrere Möglichkeiten:
back ls c3d0c516|grep usb-warzen
/Dokumente/usb-warzen
/Dokumente/usb-warzen/1.png
/Dokumente/usb-warzen/1.png_max_200kb.jpg
/Dokumente/usb-warzen/10.png
/Dokumente/usb-warzen/10.png_max_200kb.jpg
/Dokumente/usb-warzen/11.png
/Dokumente/usb-warzen/11.png_max_200kb.jpg
/Dokumente/usb-warzen/2.png
/Dokumente/usb-warzen/2.png_max_200kb.jpg
/Dokumente/usb-warzen/3.png
/Dokumente/usb-warzen/3.png_max_200kb.jpg
/Dokumente/usb-warzen/4.png
/Dokumente/usb-warzen/4.png_max_200kb.jpg
/Dokumente/usb-warzen/5.png
/Dokumente/usb-warzen/5.png_max_200kb.jpg
/Dokumente/usb-warzen/6.png
/Dokumente/usb-warzen/6.png_max_200kb.jpg
/Dokumente/usb-warzen/7.png
/Dokumente/usb-warzen/7.png_max_200kb.jpg
/Dokumente/usb-warzen/8.png
/Dokumente/usb-warzen/8.png_max_200kb.jpg
/Dokumente/usb-warzen/9.png
/Dokumente/usb-warzen/9.png_max_200kb.jpg
back ls latest listet alle Dateien auf, die gesichert worden, kann prima mit pipe und den unix tools verarbeitet werden.
z.B.
back ls latest|grep usb-warzen
Kein Treffer
Aber Achtung! latest listet also nur den aktuellen snapshot, wenn man nach Bildern sucht passt das hier zufällig, wenn man Dokumente finden will, muss in diesem Fall die korrekte snapshotid verwendet werden.
Oder das Kommando find nutzen Achtung Case sensitiv!
Vorteil gegenüber der ersten Methode, es sucht in allen snapshots...
back find usb-warzen*
repository cfa22dd6 opened successfully, password is correct
Found matching entries in snapshot 84e0f2bc from 2021-02-19 12:17:52
/Dokumente/usb-warzen
/Dokumente/usb-warzen/1.png
/Dokumente/usb-warzen/1.png_max_200kb.jpg
/Dokumente/usb-warzen/10.png
/Dokumente/usb-warzen/10.png_max_200kb.jpg
/Dokumente/usb-warzen/11.png
/Dokumente/usb-warzen/11.png_max_200kb.jpg
/Dokumente/usb-warzen/2.png
/Dokumente/usb-warzen/2.png_max_200kb.jpg
/Dokumente/usb-warzen/3.png
/Dokumente/usb-warzen/3.png_max_200kb.jpg
/Dokumente/usb-warzen/4.png
/Dokumente/usb-warzen/4.png_max_200kb.jpg
/Dokumente/usb-warzen/5.png
/Dokumente/usb-warzen/5.png_max_200kb.jpg
/Dokumente/usb-warzen/6.png
/Dokumente/usb-warzen/6.png_max_200kb.jpg
/Dokumente/usb-warzen/7.png
/Dokumente/usb-warzen/7.png_max_200kb.jpg
/Dokumente/usb-warzen/8.png
/Dokumente/usb-warzen/8.png_max_200kb.jpg
/Dokumente/usb-warzen/9.png
/Dokumente/usb-warzen/9.png_max_200kb.jpg
Found matching entries in snapshot c3d0c516 from 2021-02-19 17:16:48
/Dokumente/usb-warzen/1.png
/Dokumente/usb-warzen/1.png_max_200kb.jpg
/Dokumente/usb-warzen/10.png
/Dokumente/usb-warzen/10.png_max_200kb.jpg
/Dokumente/usb-warzen/11.png
/Dokumente/usb-warzen/11.png_max_200kb.jpg
/Dokumente/usb-warzen/2.png
/Dokumente/usb-warzen/2.png_max_200kb.jpg
/Dokumente/usb-warzen/3.png
/Dokumente/usb-warzen/3.png_max_200kb.jpg
/Dokumente/usb-warzen/4.png
/Dokumente/usb-warzen/4.png_max_200kb.jpg
/Dokumente/usb-warzen/5.png
/Dokumente/usb-warzen/5.png_max_200kb.jpg
/Dokumente/usb-warzen/6.png
/Dokumente/usb-warzen/6.png_max_200kb.jpg
/Dokumente/usb-warzen/7.png
/Dokumente/usb-warzen/7.png_max_200kb.jpg
/Dokumente/usb-warzen/8.png
/Dokumente/usb-warzen/8.png_max_200kb.jpg
/Dokumente/usb-warzen/9.png
/Dokumente/usb-warzen/9.png_max_200kb.jpg
Angenommen, ich möchte das Verzeichnis /Dokumente/usb-warzen/ wieder herstellen, es aber, weil ich unsicher bin vorerst in /tmp speichern:
time back restore c3d0c516 -i /Dokumente/usb-warzen/ --target /tmp
repository cfa22dd6 opened successfully, password is correct
restoring <Snapshot c3d0c516 of [/home/bed/Dokumente] at 2021-02-19 17:16:48.706292257 +0100 CET by bed@Bullseye> to /tmp
real 0m17,422s
user 0m1,095s
sys 0m0,399s
bed@Bullseye:~$ ls -ltr /tmp/Dokumente/usb-warzen/
insgesamt 24392
-rw-r--r-- 1 bed bed 1851594 11. Nov 19:28 7.png
-rw-r--r-- 1 bed bed 1484032 11. Nov 19:28 2.png
-rw-r--r-- 1 bed bed 1573462 11. Nov 19:28 1.png
-rw-r--r-- 1 bed bed 1877277 11. Nov 19:28 6.png
-rw-r--r-- 1 bed bed 1629634 11. Nov 19:28 5.png
-rw-r--r-- 1 bed bed 600155 11. Nov 19:28 4.png
-rw-r--r-- 1 bed bed 4588086 11. Nov 19:28 3.png
-rw-r--r-- 1 bed bed 1615798 11. Nov 19:28 9.png
-rw-r--r-- 1 bed bed 1986633 11. Nov 19:28 8.png
-rw-r--r-- 1 bed bed 2383447 11. Nov 19:28 10.png
-rw-r--r-- 1 bed bed 168904 11. Nov 19:28 9.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 187365 11. Nov 19:28 8.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 188381 11. Nov 19:28 7.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 191964 11. Nov 19:28 6.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 188648 11. Nov 19:28 5.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 166986 11. Nov 19:28 4.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 198799 11. Nov 19:28 3.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 198531 11. Nov 19:28 2.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 180148 11. Nov 19:28 1.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 199263 11. Nov 19:28 11.png_max_200kb.jpg
-rw-r--r-- 1 bed bed 3276158 11. Nov 19:28 11.png
-rw-r--r-- 1 bed bed 197313 11. Nov 19:28 10.png_max_200kb.jpg
Wie lösche ich auf dem sftp Server rekursiv?
Das hat zwar direkt nichts mit restic zu tun, aber da ich es beim experimentieren brauchte ....
Weil ich mich beim Testen im Pfad geirrt hatte, war der Wunsch nach einem rekursiven Löschen vorhanden.
lftp bietet das und erspart damit u.U. eine Menge Tipparbeit
(Bei Debian apt install lftp)
Bei lftp gibt man einfach rm -r Directory ein, dann rattert es im Karton und man kann derweil in einem anderen Tab weiterarbeiten.
Wenn ich überhaupt mäkeln wollte, dann ist es der name "restic" Wie bitte? Weiß jemand wie dieser Name zu Stande kam? Ich habe gefragt, ein Namengenerator war schuld
Aber mittlerweile kann ich restic fehlerfrei tippen, alles gut.
Eine gute Idee ist immer back command --help. (oder eben restic command --help)
Damit komme ich gut zurecht.
Ps: Ich musste den Quellcode editieren, werde wohl auch noch etwas dran schrauben, also ab- und zu mal schauen, wen es denn interessiert ...
Linksammlung:
blog.datentraeger.li/?p=1733
techgoat.net/index.php?id=5
³ media.ccc.de/v/c4.openchaos.2016.01.restic
restic.readthedocs.io/en/stable/index.html