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

6 Kommentar(e)

Zum Posten von Kommentaren bitte

Kommentare

Von: mascoxx

Zwei Bugs sind mir aufgefallen:
-) Das Script folgt bei der Sicherung keinen Symlinks. Bei den Mails ist das egal, jedoch nicht bei den Webverzeichnissen.
Als schnelle Abhilfe kann man den tar-Befehl um ein "h" erweitern:
tar czvf $BPATH/webdomains/$DATUM'_website__'$WEBSITE'.tar.gz' /var/www/$WEBSITE
durch
tar chzvf $BPATH/webdomains/$DATUM'_website__'$WEBSITE'.tar.gz' /var/www/$WEBSITE
ersetzen.
Oder gibts eine bessere Lösung?

-) Wenn ein Kunde keine Maildomain hat, sondern lediglich ein Webauftritt gehostet wird, sichert das Script das Webverzeichnis nicht.
Daher
$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' |
durch
$SQLBIN -u$USER -p$PASS dbispconfig -e "SELECT domain AS WEBSITE FROM web_domain order by domain asc;" | grep [a-zA-Z0-9] | grep -v 'WEBSITE' |
ersetzen.

LG


Von: andreea

Danke für den Hinweis :-)


Von: xabbu

Hallo,

also -h beim tar ist nicht die Sicherung die man haben möchte, denn dies würde den Ihnalt der Links kopieren und nicht den links selber.
Somit vergrößert sich das Backupvolumen.
Die Webseiten würde ich mit:

tar czf $BPATH/webdomains/$DATUM'_website__'$WEBSITE'.tar.gz' $PFAD-zum-Webspace

sicern. Dann sind auch die Links als Links gesichert.

Und ich würde zusätzlich noch sichern:

tar czf /backup/ispconfig/DATA/ispconfig_$DATUM'_DATA__'.tar.gz /usr/local/ispconfig
tar czf /backup/ispconfig/DATA/etc_$DATUM'_DATA__'.tar.gz /etc
tar czf /backup/ispconfig/DATA/root_$DATUM'_DATA__'.tar.gz /root

Und nach den Variablen:
if [ -d $BPATH ] ; then
echo
else
mkdir -p $BPATH/{BASE,databases,maildomains,webdomains,DATA}
fi

Gruß
xabbu


Von: wahid

ich hätte gern das /var/vmail komplett sichern, aber irgendwie wenn ich das Verzeichnis mit "tar czvf" oder "tar chzvf" oder auch "tar pcfz" komprimiere, wird das komprimierte Archiv nicht wirklich 1:1 identisch mit dem Inhalt von /var/vmail, Also z.B.:
IMAP-Ordner unter: "/var/vmail/domainname/EmailAccount/.Sent/cur/" enthält die originalen Mail-Dateien, die nämlich einen sehr langen Dateinamen haben (etwa wie 1281618482.M181016P21652V00000000000092AFI00000000035640EA_0.myserver,S=106744:2,S). Wenn man diese mit einem Texteditor öffnet, sieht man den Inhalt des geschickten Mail. Aber die TAR-Sicherung speichert diese in leerer 0-Bytes Dateien !! Any idea ?


Von: Till

Wie hast Du denn den Inhalt der tra Sicherung überprüft? Wenn Du solch ein tar z.B. testweise unter windows entpackst, dann kann es sein dass die Pfade zu lang sind. Entpackst Du es aber wieder unter Linux, sollte es gehen.


Von: wahid

Hi Till,

Du hast vollkommen Recht, ich habe mich mit der 7Zip-Dekompriemierung unter Windows getäuscht! Danke !