Ich betreibe diverse Websites oder Anwendungen (meist JEE getrieben) auf eigenen Servern. Natürlich bieten so ziemlich alle Provider irgend welche Lösungen zur Datensicherung, so ganz vertrauen tue ich diesen jedoch nicht zwingend. Das Thema rsync (siehe ubuntuusers.de) in Verbindung mit curlftpfs (siehe ubuntuusers.de) stellte sich für mich als eine praktikable Problemlösung heraus.
Aus diesem Grund stellte ich mir die Frage wie ich noch etwas besser schlafen kann und wie ich mir eine eigene Datensicherung (als Fallback-Lösung) schaffen kann. Hierbei habe ich mir die folgende, für mich passende, Lösung gebaut.
inkrementelle Serversicherung auf lokalem NAS
In meinem Anwendungsfall betreibe ich 3 Server / vServer irgendwo im Internet (bei unterschiedlichen Providern). Alle diese Server haben unterschiedliche Datenbestände, teils wichtiger, teils unwichtiger. Zuhause, hinter meinem Router, habe ich eine Firewall laufen hinter welcher ein Ubuntu-Server seine Arbeit verrichtet. Innerhalb dieses Netzwerks liegt auch ein Raid-System welches ich für die Datensicherung nutze:
Auf diesem Server habe ich nun einen Cronjob eingerichtet welcher zu von mir festgelegten Zeiten läuft. Dieser Cronjob verbindet sich zu den 3 Servern im Internet und mountet ein FTP-Account per curlftpfs in das lokale Dateisystem. Weiterhin ist ein Freigabeordner des NAS-Systems gemountet. Der Cronjob selbst führt nun einen rsync zwischen den beiden Verzeichnissen durch und kopiert somit alle neuen Daten vom Server auf das NAS-System.
Remote-FTP per curlftpfs ins Filesystem mounten
Das von mir verwendete curlftpfs lässt sich am einfachsten über ein Zitat von der Webseite auf ubutnuusers.de beschreiben:
curlftpfs 🇬🇧 ist ein FUSE-Modul, mit dem man entfernte Rechner über FTP in das eigene Dateisystem einbinden kann. Der Vorteil ist, dass man damit die Dateien und Verzeichnisse auf dem entfernten Rechner sehr komfortabel editieren, kopieren oder verschieben kann – genau wie die Dateien und Verzeichnisse auf den lokalen Festplatten. Dies erfordert auf dem Server einen FTP-Dienst. Die meisten Anbieter von Webspace ermöglichen den Zugriff über FTP.
https://wiki.ubuntuusers.de/Archiv/curlftpfs/
Ja ich weiß, curlftpfs wird seit Jahren nicht mehr weiter entwickelt. Allerdings funktioniert es eben einfach wunderbar, warum sollte man es ersetzen?
Das Mounten eines FTP-Verzeichnisses in das lokale Dateisystem ist hierbei denkbar einfach:
mkdir /tmp/mountpoint
curlftpfs ftp://<user>:<passwort>@<host>/<zuSichernderPfad>/ /tmp/mountpoint
Wenn wir hier Username, Passwort, Hostname und den zu sicherenden Pfad mit den Daten des Remoteservers ersetzen wird das Verzeichnis entsprechend ins lokale Dateisystem eingebunden.
Serversicherung per rsync durchführen
Nachdem wir nun das Remote-Verzeichnis ins lokale Dateisystem eingebunden haben können wir dieses Verzeichnis mittels rsync clonen. Rsync prüft hierbei ob eine Remote-Datei neu ist, geändert wurde oder gar gelöscht wurde und übernimmt die Änderungen je nach Parameter.
In meinem Beispiel möchte ich alle Remote-Änderungen übernehmen und somit immer die aktuelle Dateiversion in meiner lokalen Sicherung vorliegen haben. Im folgenden Beispiel werden die Daten aus dem Verzeichnis /tmp/mountpoint in das Verzeichnis /tmp/nasmountpoint übernommen:
rsync -a -u --delete /tmp/mountmoint /tmp/nasmountpoint
Das fertige Script – rsync und curlftpfs in Kombination
Das mit das folgende Script funktioniert müssen einige Parameter angepasst werden. Diese sind jeweils in <> eingeschlossen. Weiterhin ist zu beachten dass im zu sichernden Verzeichnis auf dem Server eine Datei mit dem Namen “online.id” erwartet wird. Das Script prüft am Anfang ob diese Datei vorhanden ist, wenn nicht wird der curlftpfs mount hergestellt.
echo "starte download der remote datesicherung"
if [ ! -f /<lokalerPfadZumMountpoint>/online.id ];
then
echo "nicht verbunden - stelle verbindung her"
curlftpfs ftp://<user>:<passwort>@<host>/<zuSichernderPfad>/
fi
if [ -f /<lokalerPfadZumMountpoint>/online.id ];
then
echo "verbindung existent - spiegle daten"
rsync -a -u --delete /<lokalerPfadZumMountpoint> /<zielpfadFuerDatensicherung>
fusermount -u /<lokalerPfadZumMountpoint>
else
echo "verbindung konnte nicht hergestellt werden - sicherung abgebrochen"
fi