Unixery & daemon worship 🔥


It's a Unix system! I know this!

Hetzner Storage Box für Restic Backups

Die Hetzner Hetzner Storage Box lässt sich als Speicher für Backups mit restic nutzen. Dabei kann man die Storage Box entweder per SFTP direkt an restic anbinden oder man bindet sie über rclone an.

SSH-Zugang einrichten

Für beide Varianten braucht man einen passwortlosen SSH-Zugang. Dazu mittels ssh-keygen ein Schlüsselpaar erstellen und in der Storage Box hinzufügen:

cat restic.pub | ssh -p 23 xyz@xyz.your-storagebox.de install-ssh-key --no-rfc

SFTP

Wenn die Daten direkt über SFTP gesichert werden sollen, dann geht das einfach mit:

export RESTIC_PASSWORD="a-secret-password"
export RESTIC_REPOSITORY="sftp://xyz@xyz.your-storagebox.de:23/restic-repo"
restic init
restic backup /path/to/folder

rclone

Loggt man sich per ssh auf der Storage Box in die restricted Shell ein und gibt dann den Befehl help ein, dann sieht man unter anderem das:

| Available as server side backend:                                           |
|   borg                                                                      |
|   rsync                                                                     |
|   scp                                                                       |
|   sftp                                                                      |
|   rclone serve restic --stdio                                               |
|                                                                             |
| Please note that this is only a restricted shell which do not               |
| support shell features like redirects or pipes.                             |

Irgendwie kann man offenbar den rclone Web Server benutzen, der eine REST API für restic bereitstellt. Die Frage ist nur wie? Dokumentation seitens Hetzner existiert nicht. In der restricted Shell kann man rclone auch nicht ausführen.

Einiges Ausprobieren später, die Lösung: Man kann zwar in der restricted Shell rclone nicht ausführen, auch nicht rclone serve restic --stdio, aber rclone serve restic --stdio random-repo-name ist freigegeben. Deshalb könnte man rclone per ssh starten:

ssh -p 23 xyz@xyz.your-storagebox.de "rclone serve restic --stdio restic-repo"

Wenn man mit restic auf einen rclone Web Server zugreifen möchte, dann geht das im einfachsten Fall so: restic -r "rclone:restic-repo" init. Dabei startet restic den rclone Web Server selbst und verbindet sich über stdin/stdout mit ihm.

Und jetzt kommt der Trick: Da man restic mitteilen kann, wie es rclone zu starten hat, macht man folgendes:

export RESTIC_PASSWORD="a-secret-password"
export RESTIC_REPOSITORY="rclone:restic-repo"
restic -o rclone.program="ssh -p 23 xyz@xyz.your-storagebox.de rclone" init
restic -o rclone.program="ssh -p 23 xyz@xyz.your-storagebox.de rclone" backup /path/to/folder

Dabei ist restic-repo dann der Ordnername auf der Storage Box in oberster Ebene. Restic startet dann rclone mit dem genannten Befehl über ssh, stdio wird über ssh weitergeleitet. Die weiteren rclone Argumente fügt restic selbstständig hinzu.

Und so hat man dann ein stdio-Verbindung über ssh vom lokal ausgeführten restic zum rclone auf der Storage Box.