restic auf KNF.Storage
Dies ist eine Kurzbeschreibung der Konfiguration von restic speziell für die Benutzung mit dem KNF.Storage.
Unpriviligierter Benutzer
Als 'root' auf dem Storage legen wir zunächst einen neuen Benutzer bob an:
adduser bob
Zur Nutzung des selben ssh-Schlüssels wie für root, kann die 'authorized_keys' Datei kopiert werden und die Rechte entsprechen vergeben werden:
mkdir /home/bob/.ssh
cp ~/.ssh/authorized_keys /home/bob/.ssh
chown -R bob:bob /home/bob/.ssh
chmod 700 /home/bob/.ssh
chmod 600 /home/bob/.ssh/authorized_keys
Alle anderen Schlüssel, außer dem eigenen sollten gelöscht werden.
restic
Wir verwenden 'sftp' als Protokoll - hier muss auf dem storage nichts weiter installiert werden. Möglich wäre z.B. noch 'rclone', siehe hier auch die entsprechende restic Dokumentation.
Jetzt konfigurieren wir restic auf dem Host.
gopass für Passphrases und Repositorypfade
Das Speichern des Passworts bzw. der Passphrase im Klartex ist ein no-go. Ich nutze 'gopass' (siehe auch 'pass'), um die Passphrases und auch die repository locations zu speichern, da dies kein Mehraufwand mehr ist.
In der gopass Struktur landen bei mir alle restic bezogenen Informationen unterhalb des Hostnamens.
gopass insert $(hostname)/restic_pw
⚠Ohne dieses Passwort kommt man nicht mehr an die Daten! stating the obvious...
gopass insert $(hostname)/restic_repo
Für das restic-Repository muss die sftp-URL angegeben werden, die folgende Form hat:
sftp://<user>@<server>:<port>/<absolute_path>
Nehmen wir an, der ssh-Port ist 12345 (siehe die Begrüßungsmail mit euren Daten) und ihr wollt, dass euer restic-Repository einfach im Ordner 'restic_repo' landet, dann ergibt sich die URL:
sftp://bob@storage.franken.de:12345//data/restic_repo
Als Alternative könnte eine Hostkonfiguration für ssh in der '.ssh/config' angelegt werden
Restic kennt diverse Umgebungsvariablen und CLI Optionen, die wir verwenden können.
In einer Datei 'env.bash' (alle restic bezogenen Skripte liegen unter '~/.restic'), exportieren wir ein paar Umgebungsvariablen. 'gopass -o' liefert nur das 'Passwort' und nicht alles was innerhalb des Eintrages gespeichert ist:
#!/bin/bash #set -euo pipefail RESTIC_HOST="$(hostname)" RESTIC_REPOSITORY="$(gopass -o "$RESTIC_HOST"/restic_repo)" RESTIC_PASSWORD_COMMAND="gopass -o "$RESTIC_HOST"/restic_pw" export RESTIC_HOST RESTIC_REPOSITORY RESTIC_PASSWORD_COMMAND
Mit
source ~/.restic/env.bash
befüllen wir diese Umgebungsvariablen, die restic kennt und direkt verwenden kann. Mit
echo $RESTIC_REPOSITORY
können wir überprüfen, ob die Variable richtig gesetzt ist.
restic Repository initialisieren
restic init
Wenn restic erfolgreich war, sollte so etwas ähnliches erscheinen:
created restic repository 1a7c3cf0 at sftp://bob@storage.franken.de:12345//data/restic_repo
restic Backup erstellen
In einem Shell-Skript 'backup-knf.sh' rufen wir den eigentlichen Befehl für das restic Backup auf:
#!/bin/bash set -euo pipefail source ~/.restic/env.bash restic backup \ --compression max \ --cleanup-cache \ --tag restic,home \ --group-by 'host,tags' \ --exclude-caches \ --files-from ~/.restic/include \ --exclude-file ~/.restic/exclude
Hierbei soll es sich nur um ein Beispiel handeln. Die Beschreibung der Optionen findet sich in der restic manpage und in der Doku auf der restic Webseite.
Insbesondere mit den Optionen '--files-from' und '--exclude-file' lohnt es sich länger zu befassen.
Als einfaches Beispiel könnte in der 'include'-Datei für '--files-from' folgendes stehen:
/home/bob
In der 'exclude'-Datei für '--exclude-file':
*.o /home/bob/.cache
Das heißt, hier würde das ganze home Verzeichnis von bob gebackupt werden, das .cache Verzeichnis, sowie alle Dateien mit der Endung '.o' würden ignoriert werden.
Mehrere Repositories und Passphrases
In der env.bash können gleich mehrere Repositories exportiert werden. Zum Beispiel für ein lokales und eines für das KNF.Storage Backup:
RESTIC_REPOSITORY_LOCAL="$(gopass -o "$RESTIC_HOST"/restic_repo_local)" RESTIC_REPOSITORY_KNF="$(gopass -o "$RESTIC_HOST"/restic_repo_knf)"
Das Repository muss dann entsprechend dem 'restic backup' (oder auch 'restic init') Befehl als Option mitgegeben werden, da 'RESTIC_REPOSITORY_KNF' natürlich keine Umgebungsvariable ist, die restic kennt:
restic backup \ --repo "$RESTIC_REPOSITORY_KNF"\ --compression max \ [...]
Will man verschiedene Passphrases nutzen, können diese mit '--password-command' an den restic Befehl übergeben werden, z.B.:
restic backup \ --repo "$RESTIC_REPOSITORY_KNF" \ --password-command "gopass -o "$RESTIC_HOST"/restic_pw_knf" \ --compression max \ [...]
Natürlich muss dann restic_pw_knf existieren.