Backups automatisch auf einen FTP Server kopieren

2009-11-07 - kostaki 8 Kommentare »
morguefile by Grafixar

morguefile by Grafixar

In meinem Artikel über MySQL Backups habe ich ja schon angesprochen das es wichtig ist Backups nicht nur auf dem eigentlichen Server zu behalten. Nach dem erstellen sollte man sie mindestens auf einen weiteren Server kopieren um auch bei Festplatten-/Serverausfall nicht dumm da zu stehen. Viele Hoster haben in ihren Paketen schon FTP Backup Space enthalten. Das FTP Protokoll bietet sich hier natürlich durch die weite Verbreitung und einfache Verwendung an. In diesem kurzem Artikel erkläre ich am Beispiel meines Backup Scripts, wie man recht simple automatisch Backups auf einen FTP Server kopiert.

Wenn man sowieso schon einen FTP Server oder FTP Backup Space hat, warum sollte man ihn nicht auch nutzen. Es ist aber auch kein Problem wenn man keinen hat. Mittlerweile gibt es eine ganze menge Anbieter die mit immer größeren Speicherangeboten aufwarten und dabei recht günstig sind. Einige haben die Limitierung von Speicherplatz schon komplett aufgehoben und bieten unbegrenzten Platz zu Festpreisen an. Hier gehe ich mal wieder von einem Hetzner Root Server aus auf dem Debian Lenny läuft. Dieser bringt standardmäßig 100GB FTP Backup Space mit. Der Backup Server steht im gleichen Rechenzentrum, wodurch keine zusätzlichen Traffickosten entstehen und man die vollen 100MBit zum kopieren nutzen kann. Außerdem werden die Daten auf einem Raid5 gespeichert, was der Ausfallsicherheit zu gute kommt. Es ist aber auch kein Problem einen anderen FTP Server irgend wo auf der Welt zu benutzen. Als Konsolen FTP Client benutze ich NcFTP.

Sollte NcFTP noch nicht installiert sein, kann man das wie bei Debian üblich sehr leicht nachholen.

$ aptitude install ncftp

Jetzt hat man Zugriff auf ncftpput, das für diesen Zweck zum Einsatz kommt. Ein Beispielaufruf zum kopieren einer Datei könnte z.B. so aussehen.

$ ncftpput -V -m -u User -p Passwort 127.0.0.1 /zieldir/subdir/ /quelle/datei.bla.gz

Erklärung:

  • -V unterbindet die Anzeige des Progressmeters, das für automatische Backups nicht notwendig ist.
  • -m erstellt Verzeichnisse auf dem Zielserver wenn sie noch nicht vorhanden sind.
  • -u User -p Passwort sollte klar sein. ;)
  • Als nächstes folgen die Angaben des Zielhosts und des Zielverzeichnisses.
  • Abschließend muss man ncftpput natürlich noch sagen welche Datei kopiert werden soll.

Läuft der Server auf einem anderen Port als 21 (Standard), kann man diesen mit -P Port angeben. Standardmäßig werden Daten im Passivmode übertragen. Will man dies anpassen ist -E dafür ständig. Wer mehr wissen möchte kann sich die man Page angucken oder ncftpput --help eingeben.

Ein guter Punkt aus den Kommentaren ist, das man auch die FTP Daten aus dem Script ziehen kann. Man streicht damit die Parameter -u und -p aus dem Aufruf und fügt -f /pfad/zur/config hinzu. Den Host zu dem connected werden soll, kann man auch weglassen oder man gibt ihn explizit mit -h an um die Einstellungen aus der Config zu überschreiben. Das auslagern hat den Vorteil das das Script portabler wird, man die gleichen Daten zentral gespeichert in mehreren Scripten benutzen kann und es so auch sicherer ist wenn man das Script mal jemand anderem kopiert. Die Config kann man benennen wir man will.

$ nano /root/.backup.ftp
host Host/IP
user Username
pass Passwort

Der Aufruf ändert sich dann wie folgt:

$ ncftpput -V -m -f /root/.backup.ftp /zieldir/subdir/ /quelle/datei.bla.gz

Die Config sollte man dann nur noch für root/backupuser lesbar machen.

Um das ganze jetzt in das im MySQL Backups Artikel verwendete Script einzubauen muss man das Script nur leicht anpassen. Ich machs hier mal am Beispiel von mysqlhotcopy, aber funktioniert natürlich genauso mit mysqldump.

#!/bin/sh
BACKUPDIR="/backups/db";
DBFILTER="(information_schema|dev|tmp)";
MYSQLHOTCOPY="$(which mysqlhotcopy) --noindices -q";
DIRNAME=`date +%Y-%m`;
TEMPSAVEDIR="/tmp/`date +%Y-%m`";

FTP_PATH="/backups";

MYSQL=$(which mysql);
TAR=$(which tar);
NICE=$(which nice);
EGREP=$(which egrep);
NCFTPPUT=$(which ncftpput);

mkdir -p "$BACKUPDIR/$DIRNAME";

DBS=$($MYSQL -Bse "show databases");
for db in $DBS
do
	if !(echo $db | $EGREP $DBFILTER > /dev/null);
	then
		FILENAME="$db-`date +%Y_%m_%d_%H_%M_%S`.tar.gz";
		mkdir -p "$TEMPSAVEDIR";
		$NICE -n 20 $MYSQLHOTCOPY $db "$TEMPSAVEDIR";
		$NICE -n 20 $TAR -cPzf "$BACKUPDIR/$DIRNAME/$FILENAME" "$TEMPSAVEDIR";
		rm -rf "$TEMPSAVEDIR";

        if ( [ "$NCFTPPUT" ] );
        then
$NCFTPPUT -V -m -f /root/.backup.ftp "$FTP_PATH/$DIRNAME/" "$BACKUPDIR/$DIRNAME/$FILENAME";
        fi
	fi
done

Die markierten Zeilen sind neu. Erst werden die FTP Server Daten gesetzt. Dann wird ncftpput gesucht und nach dem das Backup angelegt wurde, wird es auf den Backup FTP kopiert. Somit hat man nun ein Backup direkt auf dem Server und das gleiche auf einem anderen Server.

Wichtig ist zu bedenken das die Daten unverschlüsselt übertragen werden und man auch nicht wirklich weiß was der Anbieter des Backup Spaces mit den Daten macht oder ob sie dort sicher gespeichert werden. Wer also besonders schützenswerte Daten hat und diese auf einem unbekannten (fremden) Backup FTP kopiert, sollte sie vorher verschlüsseln. Damit ist auch die unverschlüsselte Übertragung kein Problem mehr.

Wer sich diesen Schritt sparen möchte und den Backup Space eh selbst betreibt kann an Stelle von FTP, SSH/SCP verwenden und damit immerhin die Übertragung verschlüsseln. Durch den Einsatz von Schlüsseln entfällt auch die Verwendung von Passwörtern. Rsync bietet sich hier natürlich auch an, aber darauf gehe ich in einem anderen Artikel ein.

Related Links

Ähnliche Artikel

  1. 8 Kommentare

  2. goebelmeier
    schrieb am 11.11.2009 um 08:07 Uhr

    Es ist gut, dass du die mysql Zugangsdaten in die my.cnf auslagerst und mit Leserechten nur für root ausstattest. Dasselbe könntest du aber auch für ncftp machen und die Security noch mehr erhöhen.

    Die entsprechende Config würde so aussehen:
    root@server:~/scripts# cat http://ftp.cfg
    host
    user
    pass

    und deinen ncftp-Aufruf würdest du mit
    -f /path/to/ftp.cfg
    erweitern, sowie deine -u und -p Parameter streichen.

    Nur mal so als Gedankenanregung. Ich bin immer ganz froh, wenn ich keinerlei Passworte im Script stehen habe.

  3. goebelmeier
    schrieb am 11.11.2009 um 08:08 Uhr

    Naja gut, jetzt hat dein Blog den Eintrag etwas verändert, http://ftp.cfg müsste natürlich ohne http:// da stehen und nach host, user und pass sind die entsprechenden Parameter einzutragen ;-)

  4. kostaki
    schrieb am 11.11.2009 um 10:19 Uhr

    Guter Tipp ich werds ergänzen. Das http bekomme ich auch irgend wie nicht weg. Manchmal ist WordPress schon etwas sperrig. :)

  5. kostaki
    schrieb am 12.11.2009 um 11:36 Uhr

    Ich habe den Artikel erweitert um das Auslagern der FTP Konfiguration.

  6. Marco
    schrieb am 05.07.2010 um 17:51 Uhr

    Hi!

    Wunderbare HowTo! Danke :) Nur habe ich noch keine Option gefunden, dass alte Backups gelöscht werden, z.B. nach 7 Tagen.

    Gibt es da eine Möglichkeit?

  7. kostaki
    schrieb am 06.07.2010 um 08:15 Uhr

    Hi,

    ich mache das einfach indem ich den Filenamen anpasse. Für eine Wochensicherung kann man einfach den Tag der Woche benutzen.

    FILENAME="$db-`date +%u`.tar.gz";
    

    %u – day of week (1..7); 1 is Monday

  8. Till
    schrieb am 28.09.2010 um 13:41 Uhr

    Danke @kostaki für den Hinweis mit der Wochensicherung bzw. den Wochentagen. Habe es gleich engerichtet. Übrigens wegen des Backup-Space, habe bei meiner Recherche bei Strato einen relativ neuen Service gefunden. HiDrive ab 20GB für 2,- im Monat.

  9. Simon Schick
    schrieb am 23.12.2010 um 20:55 Uhr

    Ich finde, man sollte sich auf jeden Fall den Parameter -c ansehen. Mit dem kann man einen direkten Stream zum FTP-Server aufbauen.

    Beispiel:
    tar cf – /var/www | ncftpput -c http://ftp.example.de /external/backup_www.tar

Kommentar schreiben

*

*