Webspace Backup

Trotz guter Absicherung von medernen Hostern sollte man seine Daten sichern. Damit kann man auch Stände wieder herstellen, z.B. wenn man versehentlich was gelöscht hat, das aber wieder online stellen will.

Dazu gibt es verschiedene Möglichkeiten:

  • 1) Backup durch Hoster
  • 2) Lokales Backup
  • 3) Backup mit Mailversand
  • 4) Kommerzielles Produkte mit FTP Upload
  • 5) Ablage am Server und abholen
  • 6) On-the-fly Komprimierung und Übertragung mit SCP

Ich habe alle Ausprobiert und habe hier zusammengeschrieben, welche möglichkeiten es gibt und welche ich bereits ausprobiert habe über die letzten 10 Jahre.

zu 1) Backup durch Hoster

Ein Lokales Backup auf dem Server hilft zwar dabei Daten wiederherzustellen, die man gelöscht hat, aber wenn der Server den Dienst verweigert, dann sind die Daten verloren. Manche Hoster haben ein spezielles Verzeichnis, dass meist auf einem anderen Server liegt und so diesen Nachteil ausgleicht. Auch gibt es meist in der Administrationskonsole der Hoster Möglichkeiten, das Backup automatisch auf einen anderen Server zu übertragen. Backup ist hier meist kostenlos, aber da der Betreiber auch die zusätzliche Speicherkapazität sich bezahlen lässt, kommt es zu dem Punkt, wo man bezahlen muss, nämlich der Wiederherstellung (Restore).

zu 2) Lokales Backup

Man kann das Backup auch selber durchführen, wenn man Zugriff über SSH auf die Konsole oder wenn man einen (V)Server gebucht hat.

Beispiel für ein eigenes Backupscript:

#!/bin/sh

DATE=`date +%F`

################################
# database backup

cd /backup/data/
mysqldump -C -c --add-drop-table --allow-keywords -l -Q --user=longusername --password=longpassword --databases database > backup-db-${DATE}.sql

tar czvf backup-db-${DATE}.tar.gz backup-db-${DATE}.sql
rm -f /backup/data/backup-db-$DATE.sql


################################
# web backup
tar czvf backup-www-${DATE}.tar.gz /var/www/*

Wer die letzten Backups der letzten 40 Tage behalten will und alles andere löschen will, kann es hiermit versuchen.

################################
# remove old data (older than 40 days)
rm -f `find /backup/data/ -mtime +40`

Das ganze kann als Cronjob verpackt werden und jeden Tag ausgeführt werden. Zum editieren des Cronjobs „crontab -e“ eingeben. Im folgenden Beispiel wird der Cronjob um 3 Uhr morgen ausgeführt, wenn die meisten Besucher schlafen.

00 3 * * * /backup/scripts/backup.sh

zu 3) Backup mit Mailversand

Wenn man die Backups in eigener Hand halten will, kann man sich auch die Backups zusenden lassen, solange das Empfängerpostfach groß genug ist. Die aktuellen Postfächer bieten meist diese Möglichkeit, wenn die Backupgröße unter 20 oder 50MB bleibt. Allerdings sollte man sich bewußt sein, dass das Backup ggf. ungesichert über die Leitung geht und dort sensible Daten enthalten sein können.

Um eine Mail aus dem Backup zu erzeugen verwendet man folgende Befehle, die man natürlich auch ins Script einbauen kann:

uuenview -b -s 'test' -m user@email.de /backup/data/backup-db-${DATE}.tar.gz

Erzeugt man das Backup als root, so ist es sinnvoll, es mit einem „echten“ Benutzernamen zu versenden.

su -c "uuenview -b -s 'test' -m user@email.de /backup/data/backup-db-${DATE}.tar.gz" username

zu 4) Kommerzielle Produkte mit FTP Upload

eine weitere Möglichkeit stellen kommerzielle FTP Speicher dar. Diese sind meist auf 1-2 User oder IP Adressen begrenzt. Die Kosten halten sich auch in Grenzen und man hat einen eigenen externen Speicher. Da die Übertragung hier meist ungesichert stattfindet, hat diese Möglichkeit auch Nachteile.

Hier hilft auch wieder ein einfaches Script:

#!/bin/bash
#############################
# FTP backup

DATE=`date +%F`
cd /backup/data/

/usr/bin/ftp -i -v server08.storage.hoster.de <<EOF
binary
put backup-db-$DATE.tar.gz
quit
EOF

Die Zugangsdaten stehen in der Datei .netrc im Verzeichnis des ausführenden Benutzers:

machine server08.storage.hoster.de login ftp-username password ftp-password

zu 5) Ablage am Server und abholen

Bis hierhin haben sich die oben genannten Methoden bewärt, auch wenn sie nach dem Stand der Sicherheit nicht mehr die aktuellsten waren / sind.

Deswegen habe ich meinen kleinen Raspberry Pi bzw. Banana PI damit beauftragt, in der Nacht die Daten von Server abzuholen. Dazu wir das Backupscript aus 2) ausgeführt und der Raspberry holt sich die Daten auf den lokalen Speicher über eine gesicherte Verbindung ab.

Dazu habe ich ein SSH Public/Private Keypair erzeugt und es auf den Server abgelegt (Weiterführende Informationen gibt es bei Google).

Nachdem das Backup um 3.00Uhr gelaufen ist, wird um 3.10Uhr folgendes Script am lokalen Linux Host gestartet.

scp -q -P 22 user@domain.de:/backup/data/backup-db-`date +%Y-%m-%d`.tar.gz /mnt/storage/data/backup/domain.de/

Eine weitere Variante ist, dass die Vorbedingungen gecheckt werden und das Ergebnis über den Dienst Pushover gesendet wird.

#!/bin/bash

# check mount
if ! mountpoint -q /mnt/storage/
then
 curl -s --form-string "token=aTOKEN" --form-string "user=uUSERTOKEN" --form-string "message=ERROR: Backup dir not mounted" https://api.pushover.net/1/messages.json > /dev/null
 exit
fi

# check space - 10GB should be there
SPACE=`df -BM /mnt/storage | grep "/mnt/storage$" | awk '{ print $4}' | cut -d'M' -f1`
if [ $SPACE -lt "10000" ]
then
 curl -s --form-string "token=TOKEN" --form-string "user=USERTOKEN" --form-string "message=WARN: Space on backup dir low" https://api.pushover.net/1/messages.json > /dev/null
fi

# download yesterdays file & check
scp -q -P 22 user@domain.de:/backup/data/backup-db-`date +%Y-%m-%d`.tar.gz /mnt/storage/data/backup/domain.de/

if [ "$?" -eq "0" ]
then
 curl -s --form-string "atoken=TOKEN" --form-string "user=uUSERTOKEN" --form-string "message=INFO: Backup successful" https://api.pushover.net/1/messages.json > /dev/null
else
 curl -s --form-string "atoken=TOKEN" --form-string "user=uUSERTOKEN" --form-string "message=ERROR: Copy from Host failed $?" https://api.pushover.net/1/messages.json > /dev/null
fi

zu 6) On-the-fly Komprimierung und Übertragung mit SCP

Sollte der Hoster weitere Möglichkeiten bereitstellen, so kann man sich die Daten auch on-the-fly vom Linux Backup Host holen und vom Server komprimieren lassen.

Beispiel für Mysql

ssh user@domain.de 'cd /tmp/ && mysqldump -uusername -h127.0.0.1 --port=3307 -ppassword --all-databases | gzip -c -9' > backup_mysql_`date +%Y-%m-%d`.gz

Beispiel für Webspace

ssh user@domain.de 'cd /home/www/ && tar -cf - public | gzip -9' > backup_www_`date +%Y-%m-%d`.tar.gz

Auch hier ist es wichtig, dass man vorher überprüft im Script, ob genügen Speicher vorhanden ist. Auch sollte man sicherstellen, dass SSH sauber beendet wird, ohne das die Verbindung fehlschlägt.

ssh user@domain.de 'cd /home/www/ && tar -cf - public | gzip -9' > backup_www_`date +%Y-%m-%d`.tar.gz
if [ "$?" -eq "0" ]
then
 BACK_HOSTING="OK"
else
 BACK_HOSTING="FAILED"
fi

ssh user@domain.de 'cd /tmp/ && mysqldump -uusername -h127.0.0.1 --port=3307 -ppassword --all-databases | gzip -c -9' > backup_mysql_`date +%Y-%m-%d`.gz
if [ "$?" -eq "0" ]
then
 BACK_MYSQL="OK"
else
 BACK_MYSQL="FAILED"
fi

Das Ergebnis kann man sich dann wieder per Email oder Pushdienst mitteilen lassen.

curl -s --form-string "token=aTOKEN" --form-string "user=uUSERTOKEN" --form-string "message=INFO: Backup done
 Backup hosting: ${BACK_HOSTING}
 Backup mysql: ${BACK_MYSQL}" https://api.pushover.net/1/messages.json > /dev/null

Fazit:

Die letze vorgestellte Methode stellt meiner Meinung nach die sicherste Methode in Bezug auf Übertragung und Datenhaltung dar. Diese setze ich bei meinen Projekten ein.

Wer weitere Vorschläge oder Verbesserungen hat, kann sie mir gerne mailen oder einen Kommentar hinterlassen.

Leave a comment

Your comment