Überarbeitet am 8. September 2026.
BorgBackup nutze ich gern für Server-Backups, weil es drei Dinge ziemlich elegant verbindet: Verschlüsselung, Deduplizierung und inkrementelle Sicherungen. Beim ersten Lauf wird viel übertragen, danach landen im Repository im Wesentlichen nur noch neue beziehungsweise veränderte Datenblöcke.
Meine alte Anleitung war an einigen Stellen unnötig kompliziert und bezeichnete die Hetzner Storage Box sogar als „FTP-Server“. Für Borg läuft die Verbindung aber über SSH. Deshalb habe ich das komplette Setup neu aufgebaut.
Stand September 2026: Die stabile Borg-Reihe ist Borg 1.4. Borg 2 befindet sich weiterhin im Beta-Stadium und ist laut Projekt nicht für produktive bestehende Repositories gedacht.
1. BorgBackup installieren
Unter Debian und Ubuntu ist Borg direkt über die Paketverwaltung verfügbar:
sudo apt update
sudo apt install borgbackup openssh-client
Danach prüfe ich kurz die installierte Version:
borg --version
2. SSH-Zugang zur Storage Box aktivieren
Bei einer Hetzner Storage Box muss der SSH-Support in der Console aktiviert sein. Borg und rsync verwenden dort den erweiterten SSH-Dienst auf Port 23.
Die Verbindung sieht grundsätzlich so aus:
ssh -p 23 uXXXXX@uXXXXX.your-storagebox.de
Die Platzhalter ersetzt du natürlich durch den Benutzernamen deiner eigenen Storage Box.
3. Eigenen SSH-Key fürs Backup anlegen
Für einen automatischen Backup-Job verwende ich einen eigenen Schlüssel statt den normalen Login-Key des Servers. ED25519 wird von der Storage Box auf Port 23 unterstützt:
sudo ssh-keygen -t ed25519 \
-f /root/.ssh/borg_storagebox \
-C "borg-backup"
Bei einem unbeaufsichtigten Backup muss der Key ohne manuelle Eingabe verwendbar sein. Deshalb sollte er ausschließlich für diesen Zweck verwendet und auf dem Server gut geschützt werden.
Den öffentlichen Schlüssel übertrage ich anschließend:
sudo ssh-copy-id -p 23 -s \
-i /root/.ssh/borg_storagebox.pub \
uXXXXX@uXXXXX.your-storagebox.de
Danach sollte der Test ohne Account-Passwort funktionieren:
sudo ssh -i /root/.ssh/borg_storagebox \
-p 23 uXXXXX@uXXXXX.your-storagebox.de
4. Repository verschlüsselt anlegen
Als Beispiel verwende ich ein Repository namens borg-server:
export BORG_RSH="ssh -i /root/.ssh/borg_storagebox -p 23"
export BORG_REPO="ssh://uXXXXX@uXXXXX.your-storagebox.de:23/./borg-server"
Jetzt wird das verschlüsselte Repository initialisiert:
borg init \
--encryption=repokey \
--remote-path=borg-1.4 \
"$BORG_REPO"
Hetzner stellt mehrere Borg-Versionen bereit. Für Borg 1.4 empfiehlt Hetzner, --remote-path=borg-1.4 explizit mitzugeben, damit Client und Server zusammenpassen.
5. Borg-Schlüssel unbedingt separat sichern
Bei einem verschlüsselten Repository ist der Borg-Key genauso wichtig wie die Backupdaten selbst. Ohne Schlüssel und Passphrase kommst du nicht mehr an das Repository.
borg key export \
--remote-path=borg-1.4 \
"$BORG_REPO" \
/root/borg-repository-key.txt
Diese Exportdatei gehört anschließend nicht nur auf denselben Server. Ich würde sie zusätzlich offline beziehungsweise an einem zweiten sicheren Ort aufbewahren.
6. Passphrase nicht ins Backup-Skript schreiben
Für automatische Backups kann Borg die Repository-Passphrase über BORG_PASSCOMMAND beziehen. So muss sie nicht im eigentlichen Skript stehen.
sudo install -d -m 700 /root/.config/borg
sudo nano /root/.config/borg/passphrase
sudo chmod 600 /root/.config/borg/passphrase
In die Datei kommt ausschließlich die Passphrase. Im Skript wird dann verwendet:
export BORG_PASSCOMMAND="cat /root/.config/borg/passphrase"
7. Erstes Backup erstellen
Ein Beispiel für einen typischen Linux-Server:
borg create \
--remote-path=borg-1.4 \
--stats \
--show-rc \
--compression zstd,3 \
"$BORG_REPO::{hostname}-{now:%Y-%m-%d_%H-%M}" \
/etc \
/home \
/opt \
/srv \
/var/www \
/usr/local/bin
Welche Verzeichnisse hineingehören, hängt natürlich vom Server ab. Cache-, Temp- und andere reproduzierbare Daten würde ich eher ausschließen.
Wichtig bei Datenbanken: MariaDB, MySQL oder PostgreSQL sollte man nicht einfach nur über ihre laufenden Datenverzeichnisse sichern. Vor dem Borg-Lauf sollte ein konsistenter Datenbank-Dump erzeugt und anschließend zusammen mit den Dateien gesichert werden.
8. Aufbewahrung mit prune festlegen
Zum Beispiel sieben tägliche, vier wöchentliche und sechs monatliche Sicherungen:
borg prune \
--remote-path=borg-1.4 \
--list \
--glob-archives='{hostname}-*' \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6 \
"$BORG_REPO"
Beim ersten Einrichten würde ich immer zuerst einen Dry-Run machen:
borg prune \
--remote-path=borg-1.4 \
--dry-run --list \
--glob-archives='{hostname}-*' \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6 \
"$BORG_REPO"
Der Filter ist wichtig, wenn mehrere Rechner dasselbe Repository verwenden. Ohne passenden Archivfilter kann prune sonst auch andere Archivserien berücksichtigen.
9. Nach prune kommt compact
Seit neueren Borg-1.x-Versionen gibt prune den belegten Speicher nicht automatisch vollständig frei. Dafür gibt es compact:
borg compact \
--remote-path=borg-1.4 \
"$BORG_REPO"
Das muss nicht zwingend nach jedem einzelnen Backup laufen. Für einen einfachen täglichen Backup-Job ist es aber wichtig zu wissen, dass gelöschte Archive erst durch Compact tatsächlich Speicher freigeben.
10. Automatisches Backup-Skript
#!/bin/bash
set -Eeuo pipefail
export BORG_REPO="ssh://uXXXXX@uXXXXX.your-storagebox.de:23/./borg-server"
export BORG_RSH="ssh -i /root/.ssh/borg_storagebox -p 23"
export BORG_PASSCOMMAND="cat /root/.config/borg/passphrase"
borg create \
--remote-path=borg-1.4 \
--stats \
--compression zstd,3 \
"$BORG_REPO::{hostname}-{now:%Y-%m-%d_%H-%M}" \
/etc /home /opt /srv /var/www /usr/local/bin
borg prune \
--remote-path=borg-1.4 \
--glob-archives='{hostname}-*' \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6 \
"$BORG_REPO"
Das Skript sollte nur für root lesbar und ausführbar sein:
sudo chown root:root /usr/local/sbin/borg-backup.sh
sudo chmod 700 /usr/local/sbin/borg-backup.sh
11. Backup kontrollieren
Nur weil das Skript ohne rote Fehlermeldung endet, ist eine Sicherung noch nicht bewiesen. Deshalb schaue ich regelmäßig, welche Archive tatsächlich vorhanden sind:
borg list \
--remote-path=borg-1.4 \
"$BORG_REPO"
Zusätzlich sollte ein Repository regelmäßig mit borg check geprüft werden. Ein vollständiger Check kann bei großen Repositories allerdings lange dauern.
12. Wiederherstellung testen
Der wichtigste Test überhaupt: Kann ich wirklich eine Datei zurückholen?
mkdir /tmp/borg-restore-test
cd /tmp/borg-restore-test
borg extract \
--remote-path=borg-1.4 \
"$BORG_REPO::ARCHIVNAME" \
etc/hostname
Wenn die Testdatei sauber zurückkommt, weiß ich zumindest, dass nicht nur Archive erzeugt werden, sondern der Rückweg grundsätzlich funktioniert.
Gerade vor größeren Arbeiten wie dem Verschieben eines Nextcloud-Datenverzeichnisses oder dem Umzug einer bestehenden Nextcloud in Docker ist so ein geprüftes externes Backup Gold wert.
Weiterführend: BorgBackup 1.4 Dokumentation und Hetzner Storage Box: SSH, rsync und BorgBackup.
Gedanken dazu 0 Kommentare
Noch ist es ruhig hier. Dein Gedanke könnte der erste sein.
Was denkst du dazu?
Dein Kommentar erscheint nach der Freigabe.