Zum Inhalt

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