Daten vom FTP mit rsync sichern

27. März 2010 | #backup #linux #webhosting

Eine große Schwächer der meisten günstigen Webhoster ist die fehlende Möglichkeit, sich beispielsweise über Dienste wie ssh mit dem Server zu verbinden. Stattdessen tauscht man wie in der Internet-Steinzeit Dateien über das träge FTP-Protokoll aus. Aber zumindest auf inkrementelle Backups muss man nicht ganz verzichten:

Die Idee ist, nur diejenigen Dateien herunterzuladen, die sich seit dem letzten Backup geändert haben. Unter Linux ist hierfür rsync das Programm der Wahl, nur Leider kann rsync nicht direkt auf FTP-Server zugreifen. Im Folgenden wird jedoch ein gangbarer Umweg beschrieben.

Zunächst benötigen wir das Programm curlftpfs, das in den Repositorien der meisten Distributionen unter selbem Namen vorliegen sollte. Mit diesem Werkzeug kann man FTP-Server fast genau wie beliebige Laufwerke in das Dateisystem seines Rechners einbinden.

Um den ganzen Vorgang ein wenig zu beschleunigen, bietet sich ein kleines Skript an, das in etwa so aussehen könnte und bereits einen beispielhaften rsync-Befehl enthält:

#!/bin/bash

# „mounte“ den FTP-Server unter /media/ftp. Dieses
# Verzeichnis vorher ggf. mit „sudo mkdir /media/ftp“
# erstellen!

curlftpfs ftp.meinbeispielhoster.de /media/ftp 

# Jetzt die Sicherung mit rsync vornehmen. Folgende
# Parameter werden verwendet:
#
# --delete-after: Alte Backup-Dateien werden nach der
#                 Übertragung gelöscht. 
# -r:             sichere auch Unterverzeichnisse
# -P:             Gibt eine Fortschrittsanzeige aus
# --exclude-from: Verweise auf eine Text-Datei, in
#                 der vom Backup auszuschließende
#                 Dateien und Ordner vermerkt sind

rsync -rP --delete-after --exclude-from=$HOME/rsync_exclude.txt /media/ftp $HOME/Webseiten-Backups

# Einbindung des FTP-Servers wieder lösen

fusermount -u /media/ftp

Weitere Erläuterungen:

Dein FTP-Server ist vermutlich passwortgeschützt. Du kannst die Zugangsdaten entweder direkt in den Befehl einbauen:

$ curlftpfs benutzername:passwort@ftp.meinbeispielhoster.de /media/ftp

oder in der Datei ~/.netrc ablegen. Die Datei muss nach diesem Schema aufgebaut sein:

machine ftp.meinbeispielhoster.de login MeinBenutzername password MeinPasswort

Ein Wort zur Sicherheit: In beiden Fällen ist der Nachteil in Kauf zu nehmen, dass die FTP-Zugangsdaten im Klartext gespeichert werden – wer kann, sollte für diesen Job also einen eigenen FTP-Zugang einrichten, der nur über Leserechte verfügt.

Noch ein Hinweis: die im Skript genannte Exclude-Datei ist natürlich optional. Ich verwende sie, um bspw. temporäre Dateien und Log-Files nicht zu sichern. Die genannte rsync_exclude.txt könnte in etwa so aussehen:

# Gehen wir mal von folgender Ordner-Struktur aus:
#
#  .
#  |-- meineseite
#  |   |-- piwik
#  |   |   `-- tmp
#  |   |
#  |   `-- textpattern
#  |       `-- tmp
#  |
#  `-- logs
#
# Es können alle tmp-Verzeichnisse ignoriert werden.
# Außerdem möchte ich den Ordner „logs“ im
# Stammverzeichnis aus dem Backup ausschließen.
# So könnte man dies bewerkstelligen:

- **/tmp
- logs

Wie gezeigt müssen alle Pfade relativ sein. Die Benutzung von Wildcards (*) ist dabei erlaubt. Genauere Details zu den sogenannten Exclude-Patterns finden sich in der Manpage von rsync (siehe unter „INCLUDE/EXCLUDE PATTERN RULES“). Das Ganze sieht komplizierter aus, als es ist. Notfalls versucht man eben per Trial & Error die richtige Ausschlussregel zu formulieren oder verzichtet komplett darauf.

Und damit haben wir auch schon alles, was wir für ein schlankes Backup brauchen. Wer will, kann aus dem Skript natürlich einen Cronjob machen und es auf diese Weise bspw. täglich oder wöchentlich automatisch ausführen lassen.

Noch ein wenig Lektüre zum Thema:

(via Simlau.net / Schnappschuss bei archive.org)

P.S.: Betreiber von Blogs, Foren, etc. möchten vielleicht auch den Inhalt ihrer MySQL-Datenbank bequem sichern. Über dieses Thema habe ich mich auch schon ausgelassen.