Container sind in aller Munde und Kubernetes-Cluster sind längst nichts Außergewöhnliches mehr. Doch in der Cloud kann der Betrieb eines solchen Clusters kostspielig sein. Deshalb setze ich privat auf einen kosteneffizienten Docker-Host. Eine tägliche Sicherung war auch noch für wenige Euro dazu gebucht. Allerdings werden die Backups lediglich für 7 Tage gespeichert.
Und das ist mir nicht lang genug. Noch dazu muss man wissen, dass ich keinen zustandslosen Container betreibe. Das Zurückspielen eines Backups setzt also alle Anwendungen auf den alten Datenbestand zurück. Das gilt auch, wenn nur einer der Container gecrasht ist und eine Wiederherstellung notwendig wird. Natürlich kann ich vorher alle Ordner mit den darin enthaltenen Bind-Mounts sichern.
Aber wirklich komfortabel ist das nicht. Noch dazu könnte im Eifer des Gefechts ein Verzeichnis vergessen werden. So einen Zustand möchte ich selbst privat nicht haben. Auf der Suche nach einer besseren Lösung erstellte ich zunächst ein Bash-Skript auf der Basis von Rsync. Das funktionierte einwandfrei, aber es fehlte mir die Benutzerfreundlichkeit einer grafischen Oberfläche.
Hier kam die Open-Source-Software BackupPC ins Spiel. Damit sichere ich meine Container nun schon seit geraumer Zeit. Das hat auch seine Gründe. Die Software ist grundsolide und man muss keinen Client auf dem Zielsystem installieren. Doch für BackupPC spricht noch weit mehr. Was das genau ist und wie man die Applikation in der Praxis einsetzt, erfährst du jetzt.
Was kann BackupPC alles?
Besonders die breite Palette an Einstellungsmöglichkeiten hat es mir hier angetan. Aber fangen wir bei den Grundlagen an. Es lassen sich Backups von Linux-, Windows- und macOS-Systemen erstellen. Die Datenübertragung kann dabei über Rsync, Samba oder FTP erfolgen. Die Erstellung eines Tar-Archivs über SSH, RSH oder auf eine NFS-Freigabe ist ebenfalls möglich.
In meinem Homelab steht der Speicherplatz nicht im Überfluss zur Verfügung. Zum Glück hat BackupPC eine Deduplizierungs-Funktion. Unveränderte Dateien werden bei diesem Prozess erkannt und daher nur einmal auf der Festplatte gespeichert. In meinem Anwendungsszenario senkt das den benötigten Speicherplatz um etwas mehr als 90 %.
Weiterhin habe ich viel Speicherplatz eingespart, indem ich ausschließlich die Verzeichnisse mit den Docker-Compose-Dateien und Bind-Mounts sichere. Das trägt außerdem dazu bei, die Dauer der Backup-Prozesse stark zu minimieren. Falls es während der Sicherung zu einem Fehler kommt, erhalte ich direkt eine Benachrichtigung per E-Mail.
Natürlich ist es ist möglich, sowohl Vollsicherungen als auch inkrementelle Sicherungen durchzuführen. Zudem kann beim Wiederherstellen gezielt nur auf bestimmte Dateien oder Ordner zurückgegriffen werden. Die Backup-Dateien sind im Dashboard komplett einsehbar, und es besteht die Möglichkeit, Files anhand ihrer Endung zu exkludieren.
Zusammengefasst sind das alle Pluspunkte von BackupPC:
- Sicherungen können mittels gzip oder bzip2 komprimiert werden.
- Identische Dateien werden nur einmal gesichert.
- Keine Backup-Software auf dem Client notwendig.
- Leistungsstarkes Web-Dashboard mit rollenbasiertem Zugriff.
- Selektives Sichern von Ordnern oder Dateien möglich.
- Flexible Wiederherstellungs-Optionen nutzbar.
- Benachrichtigungen per E-Mail oder CheckMK-Plugin möglich.
- Vollkommen kostenlose Open-Source-Software mit 1a Doku.
Wie wird BackupPC implementiert?
In den folgenden Zeilen werde ich dir ausführlich zeigen, wie du BackupPC auf dem RHEL-Klon Rocky Linux 9 installieren kannst. Es gibt allerdings auch fertige Pakete in den Standard-Paketquellen von Ubuntu und Debian. Beachte jedoch, dass diese Schritt-für-Schritt-Anleitung nicht auf Debian basierten Distributionen verwendet werden kann.
Die DEB-Pakete weichen nämlich in den Pfaden und der Installationsprozedur ab. Sie begrüßen dich zum Start sogar noch mit einem praktischen Installationsmenü. Auf Rocky Linux Systemen ist hingegen alles etwas einfacher gehalten. Ganz ohne Zutun lässt sich die BackupPC 4.4 aber auf beiden Distributionen nicht installieren. Was es dabei zu beachten gibt, erfährst du nun.
Installation von BackupPC:
In den Standard-Quellen von Rocky Linux 9 findet man leider kein Paket mit der Bezeichnung BackupPC. Daher muss man erstmal das EPEL-Repository im System einbinden. Das gelingt sogar mit nur einem einzigen Befehl:
dnf install epel-release -y
Direkt im Anschluss lässt sich BackupPC auch schon ausrollen:
dnf install backuppc -y
Optimierung der Einstellungen:
Nach erfolgreichem Abschluss der Installation widmen wir uns an dieser Stelle der Konfiguration von BackupPC 4.4. In diesem Schritt vergeben wir zunächst einen Benutzernamen für ein administratives Konto. Diese Vorgehensweise wird aus Sicherheitsgründen empfohlen. Alternativ dazu kann man natürlich auch den Standardbenutzernamen backuppc behalten.
vim /etc/BackupPC/config.pl
$Conf{CgiAdminUsers} = 'backup_admin';
Feinabstimmung des Apache-Services:
So oder so benötigen wir ein Passwort für das hinterlegte Administrator-Konto. Da das Web-Dashboard über keinerlei Login-Funktion verfügt, wird das Apache Modul htpasswd für diese Aufgabe herangezogen. Das hat den Vorteil, dass man das Passwort direkt im Terminal setzen kann:
htpasswd /etc/BackupPC/apache.users backup_admin
Jetzt sind noch einige Anpassungen in der Konfiguration des Webservers erforderlich. Der erste Schritt besteht darin, den Benutzer festzulegen, der den Httpd-Prozess ausführt. Das erreichst du auf folgende Weise:
sed -i.bak 's/User apache/User backuppc/g' /etc/httpd/conf/httpd.conf
Im Zuge unserer Anpassungen an der Webserver-Konfiguration können wir gleichzeitig den darunterliegenden Apache-Server weiter absichern. Hierzu deaktivieren wir die Option Indexes. Dieses Vorgehen hat sich in der Praxis bewährt, um sicherzustellen, dass Benutzer den Inhalt von Verzeichnissen nicht ohne eine vorhandene Indexdatei einsehen können.
sed -i.bak 's/Options Indexes FollowSymLinks/Options -Indexes +FollowSymLinks/' /etc/httpd/conf/httpd.conf
Nach der grundlegenden Absicherung des Webservers muss man jetzt noch den Zugriff von überall aus erlauben. Ohne diese Anpassung könnte das BackupPC-Dashboard nur von der lokalen Maschine aus erreicht werden. Und das macht bei einem Server natürlich gar keinen Sinn. Vorgegangen wird dabei wie folgt:
sed -i.bak 's/Require local/Require all granted/g' /etc/httpd/conf.d/BackupPC.conf
Aus Sicherheitsgründen und weil man die Standard-Willkommensseite des Apache-Webservers nicht braucht, kann man diese zum Schluss noch deaktivieren:
mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.old
Es ist auch ratsam, die Syntax der vorgenommenen Konfigurationsänderungen zu überprüfen. Hierfür kannst du den nachfolgenden Befehl ausführen. Als Rückmeldung solltest du die Ausgabe Syntax OK in der Konsole erhalten:
httpd -t
Endlich ist der Moment gekommen, in dem du BackupPC und den Webserver Apache in den Autostart integrieren kannst. Beim Ausführen der unten stehenden Befehle werden beide Dienste auch gleich noch gestartet:
systemctl enable --now httpd
systemctl enable --now backuppc
Durchführung des Troubleshootings:
An diesem Punkt angekommen, wird es Zeit für einen kurzen Funktionstest. Mit den unten aufgeführten Befehlen kannst du schauen, ob du eine Antwort von BackupPC erhältst:
# BackupPC-Status
sudo -u backuppc /usr/share/BackupPC/bin/BackupPC_serverMesg status info
# Job-Status
sudo -u backuppc /usr/share/BackupPC/bin/BackupPC_serverMesg status jobs
# Hosts-Status
sudo -u backuppc /usr/share/BackupPC/bin/BackupPC_serverMesg status hosts
Sollte das nicht so sein, kannst du den Status beider Dienste überprüfen und einen kurzen Blick in die entsprechenden Logs werfen:
systemctl status httpd
systemctl status backuppc
tail -f /var/log/httpd/error_log
tail -f /var/log/BackupPC/LOG
Nachdem alle Probleme behoben sind, kannst du dich in der Benutzeroberfläche anmelden. Dieser Schritt ist jedoch etwas knifflig. Ein einfacher Aufruf der IP-Adresse im Browser wird nicht funktionieren. Stattdessen musst du die URI /backuppc besuchen. Dort angekommen, wirst du auch gleich von der schlicht gehaltenen Nutzer-/Passwortabfrage des Htpasswd-Moduls begrüßt.
Einrichtung der Portfreigaben:
Nicht fehlen dürfen natürlich noch die Firewall-Regeln für HTTP sowie HTTPS. Wenn du das standardmäßig in Rocky Linux 9 installierte Paket Firewalld nutzt, kannst du die beiden Regeln wie folgt anlegen:
firewall-cmd --add-service={http,https} --permanent
firewall-cmd --reload
Für diejenigen, die nicht mit Firewalld arbeiten und stattdessen den Klassiker Iptables bevorzugen, können die nachstehenden Schritte befolgen:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
service iptables save
service iptables restart
Erstellung der SSH-Keys:
In diesem Stadium ist die Konfiguration für die Anmeldung als Administrator bei BackupPC 4.4 bereits fertig. Beachte jedoch, dass eine Sicherung über Rsync noch nicht funktionieren wird. Rsync-Backups werden nämlich vom Benutzer backuppc durchgeführt, der noch nicht über seine SSH-Schlüssel verfügt. Du musst diese daher noch generieren.
Das erfordert etwas Geschick. Die privaten und öffentlichen Schlüssel müssen im Verzeichnis /var/lib/BackupPC/.ssh/ abgelegt werden. Zusätzlich darfst du kein Passwort für den Schlüssel vergeben. Und als wäre das noch nicht genug, müssen alle Berechtigungen korrekt gesetzt worden sein. Aber keine Sorge, die Schritte dazu findest du hier:
mkdir var/lib/BackupPC/.ssh
chown backuppc:backuppc /var/lib/BackupPC/.ssh
chmod 700 /var/lib/BackupPC/.ssh
sudo -u backuppc ssh-keygen -t rsa -b 4096 -f /var/lib/BackupPC/.ssh/id_rsa
chown -R backuppc:backuppc /var/lib/BackupPC/.ssh
chmod 600 /var/lib/BackupPC/.ssh/*
Wie kann man ein Backup erstellen?
In diesem Kapitel werde ich erläutern, wie man mit BackupPC eine Sicherung mithilfe von Rsync durchführt. Es handelt sich hierbei nämlich um die mit Abstand am häufigsten verwendete Backup-Variante. Zudem würde das Vorstellen aller vorhandenen Methoden den Rahmen dieses Artikels gewaltig sprengen. Und bei Rsync spart man sich eine Menge Konfigurations- und Installationsaufwand.
Einrichtung der SSH-Verbindung:
Die Software baut standardmäßig eine Verbindung als Benutzer backuppc auf. Um sicherzustellen, dass dies reibungslos funktioniert, muss der öffentliche Schlüssel natürlich auf dem Zielsystem hinterlegt sein. Wenn für die SSH-Verbindung eine Passwortauthentifizierung verwendet wird, bietet sich die Nutzung des vorinstallierten Tools SSH-Copy-ID an. Die Syntax ist denkbar einfach:
sudo -u backuppc ssh-copy-id root@backup-target.tld
In allen anderen Fällen muss man den öffentlichen Schlüssel manuell aus dem Verzeichnis /var/lib/BackupPC/.ssh in die authorized_keys-Datei des Root-Benutzers auf dem Zielsystem zu kopieren. Wer besonders viel Wert auf Sicherheit legt, kann natürlich auch einen dedizierten Backup-Nutzer anlegen. Dieser kann dann global gültig in der Datei /etc/BackupPC/config.pl hinterlegt werden.
Falls dieser Benutzer nur auf bestimmten Hosts vorhanden ist, kann dieser auch direkt im Admin-Dashboard für einzelne Systeme festgelegt werden. Vor dem ersten Sicherungsdurchlauf ist es außerdem erforderlich, eine SSH-Verbindung herzustellen, um den Hostkey akzeptieren zu können. Andernfalls wird die Sicherung genau aus diesem Grund fehlschlagen.
sudo -u backuppc ssh root@backup-target.tld
Konfiguration der Backup-Einstellungen:
Endlich können wir uns den wichtigen Details widmen. Bevor jedoch die Konfiguration des Hosts durchgeführt werden kann, muss der Server zunächst in BackupPC angelegt werden. Hierfür wechseln wir auf der linken Seite zum Menü Edit Hosts und erstellen dort den neuen Server. Nach einem Klick auf Save kann es auch schon losgehen.
Oben links kann man unter Hosts den neuen Server auswählen. Die dort hinterlegten Einstellungen sind voll funktionsfähig. Unter Edit Config können jedoch noch einige Anpassungen vorgenommen werden. Im Untermenü Schedule lässt sich die Periode bis zur nächsten Vollsicherung einstellen, standardmäßig sind das 7 Tage bei FullPeriod.
Unter FullKeepCnt wird die Anzahl der zu behaltenden Vollsicherungen festgelegt. Wenn das Backup nur nachts ausgeführt werden soll, müssen noch die BlackoutPeriods angepasst werden. Ich habe hourEnd auf 0 Uhr eingestellt. Ab diesem Zeitpunkt kann BackupPC bis zum Wert von hourBegin eine Sicherung durchführen. Auch ein Blick ins Menü Xfer sollte geworfen werden.
Dort können unter RsyncShareName nur die Verzeichnisse von zu sichernden Docker-Containern eingetragen werden. Sollten sich darin noch Daten befinden, die kein Backup benötigen, können diese ganz einfach unter BackupFilesExclude ausgeschlossen werden. Im Prinzip war es das auch schon mit den ganzen Einstellungen.
Wer den Rsync-Befehl für seinen Host noch individuell anpassen möchte, kann das unter RsyncArgs sowie RsyncSshArgs tun. Letzteres ermöglicht zum Beispiel die Angabe eines anderen SSH-Users. Wer will, kann im Menü E-Mail noch die Benachrichtigungseinstellungen anpassen. Ich persönlich nutze allerdings ein CheckMK-Plugin zur Überwachung von BackupPC.