Die folgende Anleitung habe ich mit einer Linksys NSLU2 und Unslung 6.10 inkl. OpenSSH ausprobiert. Sollte aber auch mit jeder anderen NAS, die mit Linux läuft und SSH-Zugriff von außen erlaubt zulassen.

Das Skript muss mit hoher Wahrscheinlichkeit von Euch noch angepasst werden. Es handelt sich nicht um eine AufDenServerOhneZuDenkenKopierenUndAusführen-Variante. Also Skript genau anschauen und verstehen.

Das Problem

Ich möchte von meinem Webserver jede Nacht ein Backup machen und dieses auf meinen NAS-Server zu Hause kopieren. Gesichert werden sollen die MySQL-Datenbanken und die Verzeichnisse mit den Dateien.

Die Voraussetzungen

  • Linux-Webserver mit der Möglichkeit Skripte auszuführen und Cronjobs zu erstellen
  • NAS mit Linux auf die man von außen Zugriff per SSH hat

Das Vorgehen im Groben

  • Ein Archiv der MySQL-Datenbanken mit tar erzeugen
  • Ein Archiv des zu sichernden Verteichnisses mit tar erzeugen
  • Archive per SCP übertragen
  • Archive auf dem Server löschen

Kopieren per SCP ohne Passwort-Eingabe

Da ich den SCP-Befehl benutze um die Dateien zu übertragen muss ich das Problem lösen diesen ohne Abfrage des Passwortes auszuführen. SCP kennt leider keinen Parameter um das Passwort mit in der Kommandozeile zu übergeben. Dir Syntax für unser Problem ist

scp <dateiname> user@host.de:/ziel/verzeichnnis

Danach wird allerdings nach einem Passwort gefragt, was wir zunächst umgehen müssen.

Dafür gibt es eine prima Anleitung, die ich für diesen Zweck verwendet habe. Einfach Step by Step abarbeiten.

Backup Script auf Server erstellen

Wenn das grundsätzliche Kopieren per SCP vom Server auf die NAS funzt, geht es an das Skript, welches alles automatisch ausführt. Dieses läuft später per Cronjob auf dem Webserver.

In dem Skript gehe ich von der Konfiguration auf meinem Rootserver aus. Das müsst Ihr evtl. für Eure Zwecke anpassen.

  • MySQL-Datenbanken liegen in /var/lib/mysql
  • Die Daten der einzelnen Domains liegen für neunzehn72.de in /home/n/neunzehn72.de
    Es gibt also für jeden Buchstaben ein Subdirectory, in diesem Fall “n” wo dann neunzehn72.de liegt.

Skript Teil 1 – Die Variablen

today=`date +%Y%m%d`
webroot='/home'
dbuser='root'
dbpass='password'
databases=( neunzehn72_blog zweiteMySQLDB dritteMySQLDB )
domains=( neunzehn72.de zweite-domain.de dritte-domain.de )

databases sind die einzelnen Unterverzeichnisse unterhalb vom MySQL-Verzeichnis in denen die jeweiligen Datenbanken liegen.

domains sind auch jeweils die Unterverzeichnisse unterhalb des Webroots, in meinem Fall heißen die genau wie die Domain selbst.

Skript Teil 2 – Datenbanken sichern

for database in ${databases[@]}
do
filename=$today\_$database\_mysql.tar.gz
mysqldump -u $dbuser -p$dbpass --add-drop-table $database > /root/backup/$database.sql
tar zcvf /root/backup/$filename /root/backup/$database.sql >/dev/null
scp /root/backup/$filename user@host.dyndns.org:/path/to/save/backup
rm /root/backup/$filename
rm /root/backup/$database.sql
done

In dieser Schleife wird jede Datenbank per mysqldump exportiert und dann als Tar-Archiv im Verzeichnis /root/backup abgelegt. Anschließend dann per SCP auf die NAS geschoben und wieder auf dem Server gelöscht. Im Dateinamen des Archives ist jeweils das Tagesdatum enthalten.

Skript Teil 3 – Webroots sichern

for domain in ${domains[@]}
do
firstletter=${domain:0:1}
filename=$today\_${domain/./_}.tar.gz
tar zcvf /root/backup/$filename /home/$firstletter/$domain >/dev/null
scp /root/backup/$filename user@host.dyndns.org:/path/to/sav/backup
rm /root/backup/$filename
done

Der dritte Teil des Skriptes funktioniert ähnlich dem zweiten. Lediglich die Variable “firstletter” wird erstellt, da ich den ersten Buchstaben der Domain für den Pfad benötige.

Das komplette Skript gibt es hier noch einmal zum Download.

Cronjob erstellen

Zuletzt müssen wir noch einen Cronjob erstellen. Ich lasse das Skript jede Nach um 5:00 Uhr laufen. Dazu in der crontab einen Eintrag erzeugen

0 5 * * * /root/backup_remote.sh > /dev/null

und die Crontab installieren. Wie das genau geht findet Ihr notfalls über Google.

Viel Spaß damit. Es bleibt genug Raum für Verbesserungen, z.B.

  • für jeden Tag ein Verzeichnis auf dem Backup-NAS erstellen
  • Backups nur für einen bestimmten Zeitraum aufbewahren