Inhaltsverzeichnis

Automatisierte Sicherung einer Webseite unter Linux –  Wer wie ich seine Seite im Netz unter Linux betreibt und diese komplett selbst administriert, der muss ich irgendwann über Backups Gedanken machen. So ist es z.B. bei WordPress ratsam, vor jedem größeren Update eine entsprechende Sicherung anzulegen.

Selbst ohne anstehende Upgrades schadet ein regelmäßiges Backup nicht. Das ist mittlerweile selbst bei „Computer-Amateuren“ angekommen. Aber was ist „regelmäßig“? Einmal im Monat, einmal in der Woche oder einmal am Tag?

Am Ende sieht es so aus, dass man sich ein regelmäßiges Backup zwar vornimmt, aber dann vergisst und es schleifen lässt. Wird schon nichts passieren. Wenn ich ehrlich bin, habe ich das so früher auch gehandhabt mit meiner Seite. Ich habe zwar die Inhalte, wie Bilder und sonstige Dateien immer mal wieder gesichert per Skript, aber nicht die Datenbank, da mir dies doch etwas umständlich erschien, über phpMyAdmin oder dergleichen regelmäßig Datenbankabzüge zu erstellen.

Das ging eigentlich ziemlich lange gut, bis mir mein damaliger Mini-Computer nach einem Umzug abgeraucht ist. Seit Anfang 2015 betreibe ich meine Seite, wie erwähnt, auf einem „richtigen“ Server bei mir zu Hause – Selfhosting sozusagen. Bei den momentanen Aufrufen reicht das übrigens auch gut aus, da ich mit FTTH-Technik ausgestattet bin. Den örtlichen Stadtwerken sei Dank.

Backup der Webseite automatisiert erzeugen

Zurück zum Thema Backup: Dieser Datenverlust machte mir schmerzlich klar, dass meine frühere Vorgehensweise nicht gerade optimal war. So hat der neue Server zwar ein entsprechendes RAID 5 konfiguriert, aber bekanntlich ist ein RAID kein Ersatz für ein Backup. Es mildert nur den Effekt eines Hardwareausfalls, kann aber vor Datenverlust nur bedingt schützen.

Mein Ziel war es also die regelmäßigen Backups per Skript automatisch zu erzeugen. Regelmäßig bedeutet für mich täglich, das ist bei meiner Seite ausreichend.

Backup der MySQL-Datenbank

Ich betreibe meine Webseite mit Apache2 und den dazugehörigen Modulen sowie einer MySQL-Datenbank. Die übliche LAMP-Konfiguration eben. Das Wegsichern der statischen Webseiten-Dateien, die klassischerweise unter /var/www/ liegen (zumindest unter Ubuntu) ist keine Kunst, das erledige ich im zweiten Schritt. Im ersten Schritt machen wir uns aber daran mit einem Shell-Skript die Inhalte der MySQL-Datenbank(en) zu sichern.

Wir definieren uns ein Ziel, wohin das Backup gesichert werden soll, z.B. ins Homeverzeichnis. Welche Datenbanken ignoriert werden sollen kommen hinter IGNORE. Als drittes muss noch die Konfigurationsdatei von MySQL angegeben werden.

Die zu ignorierenden Datenbanken sind Beispiele und müssen individuelle angepasst werden!

TARGET=/home/reichert/Backup/Datenbank
IGNORE="phpmyadmin|mysql|information_schema|performance_schema"
CONF=/etc/mysql/debian.cnf

Der Abzug der Datenbankinhalte erfolgt dann „on the fly“ mittels mysqldump. Das ganze Skript dbbackupscript.sh schaut dann wie folgt aus:

Quellcode   
  1. #!/bin/bash
  2. # TARGET: Backup-Ziel
  3. # IGNORE: Liste zu ignorierender Datenbanken (durch | getrennt)
  4. # CONF: MySQL Config-Datei, welche die Zugangsdaten enthaelt
  5. TARGET=/home/username/Backup/Datenbank
  6. IGNORE="phpmyadmin|mysql|information_schema|performance_schema|test"
  7. CONF=/etc/mysql/debian.cnf
  8. if [ ! -r $CONF ]; then /usr/bin/logger "$0 - auf $CONF konnte nicht zugegriffen werden"; exit 1; fi
  9. if [ ! -d $TARGET ] || [ ! -w $TARGET ]; then /usr/bin/logger "$0 - Backup-Verzeichnis nicht beschreibbar"; exit 1; fi
  10.  
  11. DBS="$(/usr/bin/mysql --defaults-extra-file=$CONF -Bse 'show databases' | /bin/grep -Ev $IGNORE)"
  12. NOW=$(date +"%Y-%m-%d")
  13.  
  14. for DB in $DBS; do
  15. /usr/bin/mysqldump --defaults-extra-file=$CONF --skip-extended-insert --skip-comments $DB > $TARGET/$DB.sql
  16. done
  17.  
  18. # if [ -x /usr/bin/bzr ] && [ -d ${TARGET}/.bzr/branch ]; then
  19. # cd $TARGET
  20. # /usr/bin/bzr add .
  21. # /usr/bin/bzr commit -m "$NOW"
  22. # else
  23. # /usr/bin/logger "$0 - bzr nicht verfuegbar oder Backup-Ziel nicht unter Versionskontrolle"
  24. # fi
  25.  
  26. /usr/bin/logger "$0 - Backup von $NOW erfolgreich durchgefuehrt"
  27. exit 0

Backup der statischen Datein unter /var/www/

Neben der Datenbank will ich natürlich auch eine dazu passende Sicherung der statischen Webseiten-Dateien aus /var/www haben. Das ist auf eine sehr einfach Weise zu erledigen. Im Endeffekt müsste man die Dateien einfach mit rsync oder cp kopieren/sichern. Nachdem die Datenbank und der /var/www-Ordner sehr groß sind, wollte ich sie für das Backup komprimieren um Speicherplatz zu sparen.

Somit erledige ich das Kopieren und Komprimieren in einem Schritt indem ich tar so ausführe, dass mir die komprimzierte Datei gleich im richtigen Ordner abgelegt wird.

Das ganze Skript gz-backupscript.sh beinhaltet also erstens das Komprimieren des Datenbankabzugs und der Abzug der Webseiten-Dateien:

Quellcode   
  1. #!/bin/sh
  2.  
  3. tar -czf /home/username/Backup/00_komprimiert/Datenbank-Backup.tar.gz /home/username/Backup/Datenbank/
  4. tar -czf /home/username/Backup/00_komprimiert/www-Backup.tar.gz /var/www/

Backup-Dateien auslagern und Cronjob erstellen

Jetzt habe ich also die nötigen Skripte geschrieben, die mir das Backup automatisieren, jedoch liegt selbiges immer noch lokal auf dem selben RAID-Verbund ab, wie die die Seite selbst. Zusätzlich dazu kopiere ich dein Duplikat auf eine Sicherungsfestplatte mit rsync weg.

Das Skript dazu verdient den Namen „Skript“ fast nicht, da es lediglich den rsync-Befehl enthält (rsync-script.sh):

Quellcode   
  1. #!/bin/sh
  2.  
  3. rsync -av /home/username/Backup/00_komprimiert/ /media/server-backup/04_Webserver

Jetzt müssen die Skripte nur noch täglich ausgeführt werden, was man unter Linux ganz einfach mit einem Cronjob erledigen kann. Ich kopiere dazu meine Skripte nach /etc/ und führe dann folgenden Befehl aus:

sudo crontag -e

Dieser Befehl öffnet die Crontab mit root-Rechten, welche wir für den Abzug der SQL Dateien und das Anlegen der Backups benötigen. In die Crontab selbst trägt man folgendes ein, das Datenbankbackup wird dann täglich um 03:00 Uhr nachts erstellt und das komprimierte Backup um 03:30 Uhr. Die genaue Syntax eines Cronjob wird HIER sehr gut erläutert.

0 3 * * * sh /etc/dbbackupscript.sh > /dev/null 2>&1
30 3 * * * sh /etc/gz-backupscript.sh > /dev/null 2>&1

Das zusätzliche Sichern der Backupdateien auf einen weiteren Datenträger erfordert bei mir keine root-Rechte, weshalb ich das rsync-script.sh Skript mit normalen Userrechten ausführe und dazu die Crontab ohne „sudo“ aufrufe:

crontab -e

Das Skript lasse ich dann um 03:45 ausführen:

45 3 * * * sh /home/reichert/Backup/rsync-script.sh > /dev/null 2>&1

Fazit

Mit diesen Skripten lassen sich also wunderbar komplette Webseiten inkl. der dazugehörigen Datenbanken automatisiert wegsichern, ohne, dass man manuell eingreifen muss. Natürlich hat man mit rsync auch die Möglichkeit die Dateien auf einen entfernten Rechner zu sichern oder über das Netzwerk auszulagern.

Imrazor.de unterstützen (* = Amazon Partnerlinks)
Dir gefallen meine Beiträge und Du möchtest mich unterstützen?

Ich schalte keine Werbebanner, weil ich diese selbst nicht mag. Wenn Du aber über die mit * gekennzeichneten Produktlinks/Affiliate-Links bei Amazon bestellst, erhalte ich eine kleine Provision. Du selbst hast dadurch keinen Nachteil.

Die Produktlinks sind für Dich nicht interessant, aber Du möchtest mich trotzdem unterstützen? Dann kannst du ganz einfach deinen nächsten Amazon-Einkauf über diesen Amazon-Link tätigen.

Vielen Dank! :-)

Autor

Hi! Ich bin Andreas und betreibe diese Seite, auf der ich über Themen rund um IT-Technik, Reisen und Fotografie schreibe. Dir gefallen meine Artikel und du möchtest mir einen virtuellen Kaffee ausgeben? Gerne! PayPal.me/imraz0r

Einen Kommentar schreiben

Pin It