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:
- Komplette MySQL-Datenbank
- ISPconfig3-Datenbank
- RoundCube-Mail-Datenbank
- Client: MySQL-Datenbanken
- Client: Maildomains
- 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


Am 14.09.2010 um 13:08 Uhr
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
Am 06.10.2010 um 10:52 Uhr
Danke für den Hinweis
Am 07.10.2010 um 11:51 Uhr
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
Am 14.10.2010 um 16:49 Uhr
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 ?
Am 21.10.2010 um 11:43 Uhr
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.
Am 01.11.2010 um 16:45 Uhr
Hi Till,
Du hast vollkommen Recht, ich habe mich mit der 7Zip-Dekompriemierung unter Windows getäuscht! Danke !