[Tutorial] Sicherung des Webspace mittels Cron und Bashscript
Da ich mittlerweile zwei Blogs auf einem Webspace betreibe und diese aufgrund der Beiträge, Bildern und Fotos stetig mehr Speicherplatz benötigen, wurde es nun mal Zeit, eine Backupstrategie zu erstellen.
Die MySQL-Datenbanken werden über MySQLDumper per Cron und Perlscript gesichert und über E-Mail und FTP hinterlegt.
Für die hier gezeigte Sicherungslösung werden Cron-Jobs und (für die bequemere Verwaltung) ein SSH-Zugang benötigt.
Das Script gibt es hier zum Download. Einfach das .txt entfernen.
Zu der Erklärung des Scripts:
Kommentarblock:
Hier wird nur mittels "#!/bin/bash" angegeben, dass es sich um ein Bash-Script handelt. Mit "set -x" werden die Systemparameter gesetzt. Der Kommentarblock dient nur dazu, sich die Pfade vor Augen zu halten.
#!/bin/bash
set -x
#########################################
# Backup ausfuehren
#########################################
#
# Backupverzeichnis: /hp/as/ac/ky/backup
# Backupdaten: /hp/as/ac/ky/backup/daten
# Backupscripts: /hp/as/ac/ky/backup/scripts
#
#########################################
1. Variablenblock:
Hier werden die benötigten Variablen deklariert und mit Inhalten gefüllt. Wichtig ist, dass bei der Variable Arbeitsverzeichnis kein abschließender / hinzugefügt werden darf, da dieser von den Variablen "BACKUPDATEN", "BACKUPSCRIPTS" und "WWWROOT" angefügt wird.
Bei den FTP-Variablen müssen die Daten des FTP-Servers angegeben werden, auf welchen die Sicherungen gespeichert werden sollen. An die E-Mail-Adresse, die man bei "EMAIL" angibt, wird die Statusmeldung über die Sicherung geschickt und das Tar-Log angehängt.
# Variablen erstellen
ARBEITSVERZEICHNIS=/hp/as/ac/ky
BACKUPDATEN=$ARBEITSVERZEICHNIS/backup/daten
BACKUPSCRIPTS=$ARBEITSVERZEICHNIS/backup/scripts
WWWROOT=$ARBEITSVERZEICHNIS/www
FTPDOMAIN=
FTPUSER=
FTPPASSWORT=
EMAIL=
2. Variablenblock:
Hier werden den restlichen Variablen die Werte zugewiesen, die für die Ausführung des Scripts benötigt werden.
"SPACER" beinhaltet eine Zeichenfolge, um in der Statusmail die Statistiken von den Tar-Logs zu trennen. Da das Log mittlerweile als Datei an die E-Mail angehängt wird und so der Textkörper der Mail übersichtlicher wird, ist der Spacer nicht mehr zwingend erforderlich und zur Zeit auch nicht aktiv.
Der Variable "BACKUPART" wird der erste Parameter übergeben, der hinter dem Aufruf des Scripts angegeben wird. Dieser
#########################################
# Ab hier nichts mehr ändern!
#########################################BACKUPSTART=
/bin/date +"%d.%m.%Y, %H:%M"
DATUM=/bin/date '+%Y%m%d-%H%M'
VERZEICHNIS=/bin/date '+%Y%m%d'
SPACER=$BACKUPSCRIPTS/spacer.txt
BACKUPART=$1
Funktion FuncCheckdir:
sie dient dazu, direkt nach dem Scriptaufruf zu überprüfen, ob die Pfade und Verzeichnisse vorhanden sind, die in den Variablen angegeben wurden. Sollte das Verzeichnis nicht vorhanden sein, wird es automatisch erstellt.
#########################################
# Funktionen
#########################################function FuncCheckdir () {
# Prüfung ob Verzeichnisse vorhanden sind
if [ ! -d $1 ]; then
echo "Verzeichnis $1 nicht vorhanden, wird erstellt."
mkdir $1
fi
return 0
}
Funktion FuncSicherung:
In dieser Funktion wird die eigentliche Sicherung durchgeführt. Zu erst wird in das Verzeichnis gewechselt, in dem Sicherungsdateien erstellt werden sollen und der gesamte Inhalt gelöscht.
Mittels tar werden alle Dateien aus dem Pfad gesichert, der in der Variable "WWWROOT" hinterlegt ist. Dateien und Pfade, welcher in der Ausschlussdatei ("-X $BACKUPSCRIPTS/$BACKUPART.lst") aufgeführt sind, werden nicht gesichert. Dies ist zum Beispiel nützlich, wenn nicht jeden Tag der komplette Webspace gesichert werden soll, sondern nur ein Teil, der sich relativ häufig ändert.
Die Bildschirmausgabe bzw. evtl. auftretende Fehler werden in der Datei tarlog.txt gespeichert und später an die Statusmail angehängt.
function FuncSicherung () {
# ins Backupdatenverzeichnis wechseln
cd $BACKUPDATEN
# alte Daten löschen
rm -Rf $BACKUPDATEN/*
# Auswahl des Inhalts per Kommandozeilenparameter
tar -cpvz –atime-preserve -f backup-$DATUM-$BACKUPART.tar.gz $WWWROOT -X $BACKUPSCRIPTS/$BACKUPART.lst >& tarlog.txt
# Fehlermeldung abfangen
if [ "$?" != 0 ]; then
backup_msg="Fehler bei der Sicherung"
else
backup_msg="Sicherung erfolgreich beendet"
fi
return 0
}
Funktion FuncUpload:
Mittels dieser Funktion wird die erstellte .tar.gz Datei auf einen FTP-Server geladen. Schöner wäre es, wenn man dazu Curl oder wput nutzt, nur leider sind diese Tools nicht auf allen Webservern verfügbar, so dass ich auf diese Alternative zurückgegriffen habe.
function FuncUpload () {
# Verzeichnisinhalt auf einen FTP-Server legen
ftp -n $FTPDOMAIN << EOT
user $FTPUSER $FTPPASSWORT
put *.tar.gz
quit
EOT
# Fehlermeldung abfangen
if [ "$?" != 0 ]; then
ftp_msg="Fehler beim FTP-Transport"
else
ftp_msg="FTP erfolgreich beendet"
fi
return 0
}
Funktion FuncMail:
Mit Hilfe dieser Funktion wird eine Statusmail erzeugt, welche die Start- und Endzeit der Sicherung und die Stati der Sicherung und des FTP-Uploads beinhaltet. Außerdem wird das Logfile der Tar-Sicherung als Datei angehängt.
function FuncMail () {
start="Backup-Start: $BACKUPSTART"
ende="Backup-Ende:date +"%d.%m.%Y, %H:%M"
"
echo $start > mail.txt
echo $ende >> mail.txt
echo $backup_msg >> mail.txt
echo $ftp_msg >> mail.txt
mutt -a tarlog.txt -s "Webspace-Backupdate +%d.%m.%Y
" $EMAIL < mail.txt
# less $SPACER >> mail.txt
# less tarlog.txt >> mail.txt
# mail -s "Webspace-Backupdate +%d.%m.%Y
" $EMAIL < mail.txt
return 0
}
Programmablauf:
Vor dem eigentlichen Programmablauf wird überprüft, ob dem Script beim Start Parameter übergeben worden sind. Ist dies nicht der Fall oder ist der Pfad, welcher für "WWWROOT" angegeben wurde nic
ht vorhanden, wird das Script abgebrochen
#########################################
# Programmablauf
########################################## sind Parameter übergeben worden?
if [ $# -lt 1 ]; then
echo "Fehler: kein Parameter"
else
# Prüfung ob Verzeichnis zur Sicherung vorhanden ist
if [ ! -d $WWWROOT ]; then
echo "Verzeichnis nicht vorhanden, Sicherung abgebrochen."
else
FuncCheckdir $BACKUPDATEN
# FuncCheckdir $BACKUPSCRIPTSFuncSicherung
FuncUpload
FuncMail
fi
fi
Um das Script nun automatisch ausführen zu lassen, müssen entsprechende Aufrufe in der Crontab eingetragen werden.
Dazu muss die Crontab mit dem Parameter -e gestartet werden, um in den Schreibmodus zu gelangen.
Die Crontab selbst ist wie folgt aufgebaut:
12345678 * * * * * auszuführender Befehl┬ ┬ ┬ ┬ ┬│ │ │ │ ││ │ │ │ └──── Wochentag (0-7) (Sonntag =0 oder =7)│ │ │ └────── Monat (1-12)│ │ └──────── Tag (1-31)│ └────────── Stunde (0-23)└──────────── Minute (0-59)von Wikipedia
40 3 * * * /usr/bin/backup.sh
würde also dafür sorgen, dass das Script "backup.sh" aus dem Verzeichnis "/usr/bin" jeden Morgen um 0340 Uhr ausgeführt wird.
Nach diesem Schema müssen wir nun auch unser Backupscript einrichten.
weiterführende Informationen:
Neueste Kommentare