Aktionen

Ubuntu Backupskript Apache Webserver und MySQL Datenbank

Aus znilwiki

Meinen Webserver sichere ich mehrfach und auf verschiedene Arten parallel.
Eine davon ist das ich alle meine Webseiten, die dazu gehörigen Datenbanken und das /etc Verzeichnis auf eine NFS Freigabe kopieren.

Dazu habe ich mir das folgende Skript gebaut:

#!/bin/bash
# Für MySQL Datenbankzugriff - Benutzer mit vollen rechten auf allen Datenbanken
username=root
password=*****

# Sichert alle MySQL Datenbanken, Webverzeichnisse sowie die wichtigsten Systemeinstellungen in ein Verzeichnis parallel zu dem Verzeichnis in dem das Skript selbst liegt.
# /Backuppfad/scripte/diesesSkript.sh
# /Backuppfad/Name-des-Server/...

# Aktuellen Pfad des Scripts ermitteln
# Lösung stammt von https://stackoverflow.com/questions/59895/can-a-bash-script-tell-which-directory-it-is-stored-in
echo "Ermittle den Pfad für die Backup-Dateien ..."
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

# Der Backuppfad ist über unserem Scriptpfad:
BACKUPPATH="$( cd -P "$( dirname "$SOURCE" )" && cd .. && pwd )/$( hostname )"
echo "Pfad Datenbanken ist : ${BACKUPPATH}/databases"
echo "Pfad Webseiten ist ..: ${BACKUPPATH}/www"
echo "Pfad Sonstiges ist ..: ${BACKUPPATH}/other"

DATETIME=$(date '+%Y-%m-%d--%H-%M-%S')

echo "Erstelle ggf. die Verzeichnisse ..."
mkdir -p "${BACKUPPATH}/databases"
mkdir -p "${BACKUPPATH}/www"
mkdir -p "${BACKUPPATH}/other"

echo "Lösche Backupdateien älter als 7 Tage ..."
find "${BACKUPPATH}/databases" -type f -mtime +7 -delete
find "${BACKUPPATH}/www" -type f -mtime +7 -delete
find "${BACKUPPATH}/other" -type f -mtime +7 -delete

echo "Sichere alle Datenbanken ..."
for x in $(mysql -u$username -p$password -Bse 'show databases'); do
    case ${x} in
        information_schema|performance_schema|mysql)
            echo Skipping Database ${x} ...
            ;;
        *)
            echo Backup Database ${x} ...
            mysqldump -u$username -p$password $x | gzip > "${BACKUPPATH}/databases/${x}__${DATETIME}.sql.gz"
    esac
done
echo "Alle Datenbanken gesichert!"
echo "Sichere Webseiten ..."
for folder in $(ls /var/www); do
    case ${folder} in
        clients)
            echo Skipping Folder ${folders}
            ;;
        *)
            echo Backup Folder /var/www/${folder}
            /usr/bin/nice -n 19 tar -hczf "${BACKUPPATH}/www/${folder}_$DATETIME.tar.gz" /var/www/${folder} 1>/dev/null
            # tar Optionen:
            # c = create Archiv / neues Archiv erstellen
            # z = gzip = Mit gzip komprimieren
            # f = Filename = angegebene Arhcivdatei nutzen
            # h = Symbolischen Links folgen und die Dateien dahinter sichern
    esac
done
echo "Alle Webseiten gesichert!"

echo "Sichere Konfiguartionsdateien ..."
/usr/bin/nice -n 19 tar -czf "${BACKUPPATH}/other"/etc+more_$DATETIME.tar.gz /etc /root /usr/local/etc /usr/local/sbin 1>/dev/null
echo "Alle Konfigurationsdateien gesichert!"
echo "Fertig!"

Einsatz im crontab z.B. wie folgt:

0 0 * * * /BACKUP/scripts/UniversalBackup.sh 1>/dev/null

Sichert um Mitternacht, bei Fehlern gibt es eine Email an den root-Benutzer (der per mir auf ein externes Postfach weitergeleitet wird)


Loading comments...