wildlife

[Tutorial] Sicherung des Webspace mittels Cron und Bashscript

// January 17th, 2008 // IT, Tutorials

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-Backup `date +%d.%m.%Y`" $EMAIL < mail.txt
#    less $SPACER >> mail.txt
#    less tarlog.txt >> mail.txt
#    mail -s "Webspace-Backup `date +%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 nicht 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 $BACKUPSCRIPTS

        FuncSicherung
        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:

* * * * * 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:

Technorati-Tags: , , , , , , , ,

4 Responses to “[Tutorial] Sicherung des Webspace mittels Cron und Bashscript”

  1. Danke für die umfangreiche Erläuterung. Ich habe zwar nicht den Download für das Script gefunden, dies aber nun aus den kopierte Einzelteilen zusammengesetzt. :-)

    Konrad

  2. Enrico says:

    BACKUPSTART=`/bin/date +"%d.%m.%Y, %H:%M"`
    DATUM=`/bin/date '+%Y%m%d-%H%M'`

    ändern in

    DATUM=$BACKUPSTART

    sieht einfach schöner aus.

    Mfg Enrico

    • Torsten says:

      Danke für den Hinweis, aber ich wollte bewusst Punkte und Leerzeichen im Dateinamen vermeiden, weswegen ich dann die Trennung mit Bindestrichen vorgenommen habe. :)

Leave a Reply