Server
Backups der Server werden mit Borg auf StorageBoxes bei Hetzner erstellt.
Befehlsübersicht
Man kann alle Backups eines Servers auflisten, Informationen zu einem Backup anzeigen und die in einem Backup erfassten Dateien wie folgt auflisten:
borg list ::
borg info ::wcp01.node.b5c.eu_2015-11-25T23:03:01Z
borg list ::wcp01.node.b5c.eu_2015-11-25T23:03:01Z
Um den Inhalt der gesicherten Dateien überprüfen zu können muss das entsprechende Backup vorübergehend als virtuelles Dateisystem eingehängt werden. Danach lassen sich sie sich mit den üblichen Werkzeugen traktieren:
borg mount ::wcp01.node.b5c.eu_2015-11-25T23:03:01Z /mnt
cd /mnt
less etc/hosts
...
cd /
fusermount -u /mnt
Dieses virtuelle Dateisystem ist aber nicht dazu gedacht, um daraus die gewünschten Dateien heraus zu kopieren. Stattdessen lassen sich ganze Backups, oder einzelne Dateien daraus mit folgendem Kommando extrahieren:
cd /
borg extract --verbose ::wcp01.node.b5c.eu_2015-11-25T23:03:01Z etc/hosts
Anwendungsbeispiele
Im Folgenden finden sich Befehle, um mit den Backups zu interagieren.
Die Befehle sind darauf ausgelegt kopiert, eingefügt und ausgeführt zu werden. Um das zu erreichen werden Variablen verwendet. Diese müssen vor dem Ausführen der Befehle jeweils einmalig pro Shell wie folgt gesetzt werden:
VARIABLE=wert
Zurücksetzen aller Volumes eines Docker-Containers
Folgende Variablen haben Einfluss auf die Unten stehenden Befehle:
ARCHIVE
: Name des Borg-Archivs; notwendig; Beispiel:wcp01.node.b5c.eu_2015-11-25T23:03:01Z
CONTAINER
: Name des Docker-Containers; notwendig; Beispiel:wcp-postgresql
Extrahiere zuerst die wiederherzustellenden Dateien.
cd /tmp
docker container inspect --format='
{{- range .Mounts -}}
{{- if eq .Type "volume" -}}
{{- slice .Source 1 (len .Source) -}}{{- "\x00" -}}
{{- end -}}
{{- end -}}
' -- "$CONTAINER" |
head --bytes=-1 |
xargs -0r borg extract --verbose -- "::$ARCHIVE"
Verschiebe dann die wiederherzustellenden Dateien an ihr Ziel während der Container vorübergehend gestoppt wird.
Warning
Das Verschieben der Dateien löscht und ersetzt die bestehenden Dateien unwiederbringlich.
docker container stop -- "$CONTAINER"
docker container inspect --format='
{{- range .Mounts -}}
{{- if eq .Type "volume" -}}
/tmp{{- .Source -}}{{- "\x00" -}}{{- .Source -}}{{- "\x00" -}}
{{- end -}}
{{- end -}}
' -- "$CONTAINER" |
head --bytes=-1 |
xargs -0rn2 echo mv --force --no-target-directory --
docker container start -- "$CONTAINER"
Sichern aller Volumes eines Docker-Containers
Folgende Variablen haben Einfluss auf die Unten stehenden Befehle:
ARCHIVE
: Name des Borg-Archivs; notwendig; Beispiel:wcp01.node.b5c.eu_2015-11-25T23:03:01Z
CONTAINER
: Name des Docker-Containers; notwendig; Beispiel:wcp-postgresql
Extrahiere zuerst die zu sichernden Dateien.
cd /tmp
docker container inspect --format='
{{- range .Mounts -}}
{{- if eq .Type "volume" -}}
{{- slice .Source 1 (len .Source) -}}{{- "\x00" -}}
{{- end -}}
{{- end -}}
' -- "$CONTAINER" |
head --bytes=-1 |
xargs -0r borg extract --verbose -- "::$ARCHIVE"
Archiviere und komprimiere dann die extrahierten Dateien.
docker container inspect --format='
{{- range .Mounts -}}
{{- if eq .Type "volume" -}}
{{- slice .Source 1 (len .Source) -}}{{- "\x00" -}}
{{- end -}}
{{- end -}}
' -- "$CONTAINER" |
head --bytes=-1 |
tar --create --directory=/tmp --file=- --files-from=- --null --verbatim-files-from |
zstd --adapt --compress > "/tmp/$CONTAINER.tar.zst"
Die erstellte Datei kann jetzt heruntergeladen werden.
Sichern einer einzelnen Datenbank
Folgende Variablen haben Einfluss auf die Unten stehenden Befehle:
ARCHIVE
: Name des Borg-Archivs; notwendig; Beispiel:wcp01.node.b5c.eu_2015-11-25T23:03:01Z
CONTAINER
: Name des Docker-Containers; notwendig; Beispiel:wcp-postgresql
Extrahiere zuerst die Dateien der Volumes des Datenbank-Containers.
cd /tmp
docker container inspect --format='
{{- range .Mounts -}}
{{- if eq .Type "volume" -}}
{{- slice .Source 1 (len .Source) -}}{{- "\x00" -}}
{{- end -}}
{{- end -}}
' -- "$CONTAINER" |
head --bytes=-1 |
xargs -0r borg extract --verbose -- "::$ARCHIVE"
Starte eine Kopie des Datenbank-Containers mit den extrahierten Dateien.
docker container inspect --format='
{{- range .Mounts -}}
{{- if eq .Type "volume" -}}
--volume=/tmp{{- .Source -}}:{{- .Destination -}}:{{- .Mode -}}{{- "\x00" -}}
{{- end -}}
{{- end -}}
{{- "--\x00" -}}{{- .Image -}}{{- "\x00" -}}
' -- "$CONTAINER" |
head --bytes=-1 |
xargs -0r docker container run --detach --name=backup
Der Container steht jetzt unter dem Namen backup
zur Verfügung.
Nach dem Setzen das Container-Names kann man mit ihm
wie gewohnt interagieren,
um Datenbanken zu sichern.
CONTAINER=backup
...
Nachdem die gewünschten Aktionen erfolgt sind kann der temporäre Container und die extrahierten Dateien wieder gelöscht werden.
docker container rm --force --volumes backup
rm -fr /tmp/var/lib/docker/volumes
Backup-Key ziehen
borg key export ssh://u172613@u172613.your-storagebox.de:23/./wcp04.node.b5c.eu.borg ./wcp04.node.b5c.eu.borg.key
borg key export --qr-html ssh://u172613@u172613.your-storagebox.de:23/./wcp04.node.b5c.eu.borg ./wcp04.node.b5c.eu.borg.qr-code.key.html
Backup als Archiv ziehen
Manchmal möchte man das gesamte Backup eines Servers oder Teile eines Backups als Archiv herunterladen um es bspw. per Post an den Kunden zu senden.
Benötigt wird:
- Borg Backup-Key des Servers von dem das Backup versendet werden soll
- Borg Encryption Key mit dem die Borg Backup-Keys verschlüsselt sind
- SSH-Benutzer und Passwort der Storage-Box auf der die Backups abgelegt sind
# Borg Backup-Key auf lokalem Rechner importieren
# borg key import <borg-repository> <keyfile>
borg key import ssh://u172613@u172613.your-storagebox.de:23/./wcp04.node.b5c.eu.borg /path/to/key
# Verfügbare Backups auflisten
borg list
# Infos zu einem bestimmten Backup einsehen
borg -v info ssh://u172613@u172613.your-storagebox.de:23/./wcp04.node.b5c.eu.borg::wcp04.node.b5c.eu_2022-11-02T23:32:03Z
# Borg Backup in tar.gz Archiv schreiben
# borg export-tar --list <repository>::<zeitstempel> <destination-file>
borg export-tar --list ssh://u172613@u172613.your-storagebox.de:23/./wcp04.node.b5c.eu.borg::wcp04.node.b5c.eu_2022-11-10T23:32:02Z wcp04.node.b5c.eu_2022-11-10T23:32:02Z.tar.gz