Viele kennen sicherlich Tassen, T-Shirts oder Blechschilder mit dem folgenden Aufdruck: Kein Backup? Kein Mitleid! Und da dem nichts hinzuzufügen ist, machte ich mir mal ein paar Gedanken dazu, wie ich die Docker-Container auf meinem heimischen Raspberry Pi schnell und einfach sichern könnte. Ziel sollte ein komprimiertes Backup auf einer NAS-Freigabe sein.
Gerade meinen DNS-Server und Adblocker PiHole möchte ich nach einem Festplattencrash nämlich so schnell wie nur möglich wieder in Betrieb nehmen. Die Motivation war also groß. Herausgekommen ist ein kleines Script, welches die meisten Anforderungen von Heimanwendern und Raspberry Pi Bastlern wie mich selbst abdecken sollte.
Um das Skript erfolgreich einsetzen zu können, muss man lediglich die ersten 3 Variablen oder genauer gesagt deren Inhalt anpassen. Dann kann es auch schon los gehen. Damit das kleine Programm auch wirklich benutzt werden kann, darf man natürlich nicht das kleine x für executable in den Dateiberechtigungen vergessen. Hinzufügen lässt sich dieses einfach mit chmod +x /Pfad/zum/Skript
#!/bin/bash
# Autor: Fabian Wüst
# Erstellung: 26.09.2022
# Aktualisierung: 27.09.2022
# Aufgabe: Erstelle ein Backup aller Container-Verzeichnisse.
# IP-Adresse + NFS-Freigabe (bitte anpassen):
nas="192.168.x.y:/mnt/deinPool/deineFreigabe"
# Einhängepunkt des über NFS freigegebenen Ordners (bitte anpassen):
nas_mountpoint="/mnt/deinOrdner"
# Zu sichernde Verzeichnisse (bitte anpassen):
zu_sichernde_verzeichnisse="/deinOrdner"
# Den Variableninhalt in ein Array umwandeln:
docker+=($zu_sichernde_verzeichnisse)
# Datum im deutschen Format:
datum=$(date +%d-%m-%Y-%H:%M)
# Hostnamen des Servers ermitteln:
hostname=$(hostname -s)
# Eindeutigen Archivnamen für das Backup erstellen:
name_sicherung="$hostname-$datum.tgz"
# Prüfen, ob Einhängepunkt existiert oder angelegt werden muss:
if [ ! -d $nas_mountpoint ]
then
sudo mkdir -p $nas_mountpoint
echo
echo "Das Verzeichnis $nas_mountpoint existierte nicht und wurde deshalb erstellt."
fi
# Mounten des NFS-Shares:
sudo mount -t nfs $nas $nas_mountpoint
# Prüfen, ob die Freigabe gemountet werden konnte:
mount_test=$(df -h | grep -i $nas_mountpoint | awk '{print $6}')
# Überprüfung, ob es ein eingehängtes Dateisystem unter dem Mountpoint gibt:
if [ $nas_mountpoint == $mount_test ]
then
# Betroffene Dockercontainer werden gestoppt:
echo
echo "Alle zu sichernden Container werden heruntergefahren:"
echo
for ((u=0; u<${#docker[*]}; u++))
do
cd ${docker[$u]}
docker-compose down
done
# Bildschirmausgabe:
echo
echo "Es wird mit der Erstellung eines komprimierten Tar-Verzeichnisses begonnen:"
echo
# Erstellung der komprimierten Sicherung:
sudo tar vczf $nas_mountpoint/$name_sicherung $zu_sichernde_verzeichnisse
echo
# Bildschirmausgabe:
echo "Das Backup aller Container und deren Daten wurde erfolgreich erstellt."
echo
# Neustart aller gesicherten Container wird ausgeführt:
echo "Alle Container werden wieder gestartet:"
echo
for ((u=0; u<${#docker[*]}; u++))
do
cd ${docker[$u]}
docker-compose up -d
done
# In das Nas-Verzeichnis wechseln:
cd $nas_mountpoint
# Alte Backups löschen bzw. nur die neuesten 5 behalten:
ls -tp | grep -v '/$' | tail -n +6 | sudo xargs -d '\n' -r rm --
# Nas-Freigabe aushängen nach getaner Arbeit:
cd / && sudo umount $nas_mountpoint
else
# Bildschirmausgabe und Beendigung mit Exit-Code 1:
echo
echo "Das Programm wird beendet, da der NFS-Share unter $nas_mountpoint nicht eingehängt werden konnte!"
echo
exit 1;
fi