Backup auf Hetzner Storagebox mit Borg

Diese Seite ist (wie fast alles was ich betreibe) auf einem Hetzner Server gehostet.
Neben dem im Vergleich zur Konkurrenz relativ günstigen Preis ist ein weiterer Vorteil, dass man immerhin 100GB Speicherplatz auf einer Hetzner Storagebox erhält.
Der Zugriff ist mit verschiednen Protokollen möglich. Ich bevorzuge das ssh-Protokoll mit dem Tool Borg. (https://borgbackup.readthedocs.io/en/stable/).

Die Einrichtung ist relativ einfach. Es kann sowohl einen ssh-key als auch ein Passwort zur Authentifizierung genutzt werden. Auch wenn ersteres natürlich deutlich sicherer wäre, habe ich mich doch für die zweite Möglichkeit entschieden, da die Storagebox zum Einen von außen eh nicht erreichbar ist und das Secret zum Anderen sowieso auf dem Server gespeichert sein muss.

Zur Einrichtung speichere ich zunächst das Borg Repository in einer Umgebungsvariable, das erleichtert die zukünftige Arbeit:

export BORG="username@u000000.your-storagebox.de:~/repo_name"

Anschließend muss Borg mitgeteilt werden, wie es eine Verbindung zur Storagebox aufbauen kann. Das geschieht in der Umgebungsvariable BORG_RSH. Statt dem Standardport 22 benutzt die Hetzner Storagebox für SSH-Verbindungen Port 23:

export BORG_RSH="sshpass -p passwort ssh -o StrictHostKeyChecking=no -p 23"

Anschließend kann das Repository initialisiert werden:

borg init -e repokey-blake2 $BORG
borg key export $BORG /dev/stdout

Der zweite Befehl gibt den Verschlüsselungskey für das Repository aus. Dieser muss unbedingt gespeichert werden (z.B. in KeePass), da ansonsten bei Datenverlust kein Zugriff mehr möglich ist.

Das Backup kann anschließend erstellt werden:

ARCHIVE_NAME="$(date)"
FILES="/opt /home"
borg create --progress $BORG::"$ARCHIVE_NAME" $FILES

Es empfielt sich zu überprüfen, ob das Backup erfolgreich war. Der Folgende Befehl zeigt eine Liste aller durchgeführten Backups an:

borg list $BORG

Automatisierung

Um die Backups automatisch auszuführen empfielt es sich ein Skript anzulegen. Für die Storagebox verwende ich eine Abwandlung dieses Skripts:

#!/usr/bin/env bash

REPO="ssh://<user>.your-storagebox.de/home/cloud_app_1"
FILES="/home/matthias" # Files to backup

export BORG_RSH="sshpass -p <ssh password> ssh -p 23 -l <user> -o StrictHostKeyChecking=no"
export BORG_PASSPHRASE="<borg password>"

if [ $1 == "init" ]; then
    borg init -e repokey $REPO
fi

if [ $1 == "create" ]; then
    borg create  --progress "$REPO::$(date +"%y-%m-%d_%H-%M-%S")" $FILES
fi

if [ $1 == "mount" ]; then
    mkdir -p ~/_borg
    borg mount $REPO ~/_borg
fi

if [ $1 == "umount" ]; then
    borg umount ~/_borg
    rm -rf ~/_borg
fi

if [ $1 == "list" ]; then
    borg list $REPO
fi

Das ganze lässt sich dann einfach in die Crontab einbauen:

matthias@bespin:~$ sudo crontab -l
#Ansible: storagebox_backup
15 7,11,22 * * * /opt/borg.sh create