Backup des ISPconfig3 mit Mails, Datenbanken und Webinhalt

Vorwort

Da ISPconfig3 derzeit über keine Backup-Funktion verfügt habe ich mich mal rangesetzt und mir ein Skript gebaut, dass mehrere Funktionen in einem Durchlauf erfüllt.

Meine Systemkonfiguration: Ubuntu 10.04.1 LTS - 64bit, Kernel: Linux 2.6.32-24-server
Prinzipiell sollte das Backup-Skript aber auch auf jedem anderen System funktionieren.

Was macht das Skript

Sicherung der folgenden Elemente:
  1. Komplette MySQL-Datenbank
  2. ISPconfig3-Datenbank
  3. RoundCube-Mail-Datenbank
  4. Client: MySQL-Datenbanken
  5. Client: Maildomains
  6. Client: Webdomains

Vorbereitung

Man sollte sich vorab eine Verzeichnis für das Backup anlegen. Z.B. /var/backups
Dies kann man über die Konsole vornehmen mit

mkdir /var/backups

vornehmen.

Nun braucht man noch ein paar weitere Unterverzeichnisse für die einzelnen Backups, da man bei größeren Hostings sehr schnell den Überblick verlieren würde.

mkdir /var/backups/BASE

mkdir /var/backups/databases

mkdir /var/backups/maildomains

mkdir /var/backups/webdomains

Zur Erklärung:

BASE wird die Backups der gesamten MySQL-, die ISPconfig3- und die RoundCubeMail-Datenbank enthalten.

databases wird die Datenbankbackups der einzelnen Clienten enthalten.

maildomains wird das Backup der Maildomains inkl. aller Mails beinhalten.

webdomains wird die einzelnen Domains mit gesamten Webinhalt beinhalten.

Die Backups sind nachher alles tar.gz-Dateien (GZip).

Das Backup-Skript

Ich habe kleine Bemerkungen mit Rauten angefügt, sofern diese sinnvoll sind.

Achtung: Ggf. müssen die Datenbank-Tabellennamen, aber in jedem Fall die Pfade angepasst werden!
#!/bin/bash
# Variables for the workflow SQLDUMP="/usr/bin/mysqldump" SQLBIN="/usr/bin/mysql" USER="root" # root-user for the mysql-db PASS="yourMySQLDBpass" # root password for the mysql-db MYHOST="localhost" BPATH="/yourpathforbackup" # like /var/backups no slash at the end! DATUM=`date +%A` # converts the date to day for filename # Complete MySQL-DB-Dump ------------------------------------------------------------------------------------ # `$SQLDUMP -u$USER -p$PASS -h $MYHOST --all-databases --add-drop-table | gzip -9 > $BPATH/BASE/$DATUM'_BASE__'complete_MySQL-DB'.sql.gz'` # ISPConfig-DB ---------------------------------------------------------------------------------------------- # DBISPconfig="dbispconfig" `$SQLDUMP -u$USER -p$PASS -h $MYHOST $DBISPconfig | gzip -9 > $BPATH/BASE/$DATUM'_BASE__'$DBISPconfig'.sql.gz'` # Roundcubemail-DB ------------------------------------------------------------------------------------------ # DBM="roundcubemail" `$SQLDUMP -u$USER -p$PASS -h $MYHOST $DBM | gzip -9 > $BPATH/BASE/$DATUM'_BASE__'$DBM'.sql.gz'` # Client databases ------------------------------------------------------------------------------------------ # $SQLBIN -u$USER -p$PASS dbispconfig -e "select database_name from web_database order by database_id asc;" | grep [a-zA-Z0-9] | grep -v 'database_name' | while read DBNAME do $SQLBIN -u$USER -p$PASS dbispconfig -e "SELECT CONCAT(c.username,'_',w.database_name) AS FILENAME FROM client c, web_database w WHERE w.sys_groupid = c.client_id+1 AND w.database_name = '$DBNAME';" | grep [a-zA-Z0-9] | grep -v 'FILENAME' | while read FILENAME do $SQLDUMP -u$USER -p$PASS -h $MYHOST $DBNAME | gzip -9 > $BPATH/databases/$DATUM'_client__'$FILENAME'.sql.gz' done done # Client maildomains ---------------------------------------------------------------------------------------- # $SQLBIN -u$USER -p$PASS dbispconfig -e "SELECT domain AS MAILDOMAIN FROM mail_domain order by domain asc;" | grep [a-zA-Z0-9] | grep -v 'MAILDOMAIN' | while read MAILDOMAIN do tar czvf $BPATH/maildomains/$DATUM'_mails__'$MAILDOMAIN'.tar.gz' /var/vmail/$MAILDOMAIN done # Client websites ------------------------------------------------------------------------------------------- # $SQLBIN -u$USER -p$PASS dbispconfig -e "SELECT domain AS WEBSITE FROM mail_domain order by domain asc;" | grep [a-zA-Z0-9] | grep -v 'WEBSITE' | while read WEBSITE do tar czvf $BPATH/webdomains/$DATUM'_website__'$WEBSITE'.tar.gz' /var/www/$WEBSITE done # End of the script ----------------------------------------------------------------------------------------- # exit 0
Das Skript speichert man z.B im root-Verzeichnis unter "mysql-backup.sh"ab.

Nun muss das Skript noch ausführbar gemacht werden. Hier sollte man nur den Zugriff über den root erlauben [500 (lesen und ausführen)].

chmod 500 mysql-backup.sh


Automation mit einem cronjob

Um das Backup zu automatisieren sollte man einen cron-job verwenden, der irgendwann morgens läfut, wenn das System nicht unter Last ist, da auch das Backup etwas Systemresourcen verbraucht. Der cron sollte als root ausgeführt werden, da sonst vermutlich Berechtigungn zur Ausführung fehlen. - Meinen cron lasse ich z.B. morgens gegen 4:30 Uhr laufen.
Das sieht dann in der crontab wie folgt aus:

crontab -u root -l


30  4  * * * /root/mysql-backup.sh > /dev/null 2>&1