Server Backups

Veröffentlicht am 08.03.2016.

Da auf meinem Server nur die eigenen Webseiten, Mails und Spielereien gehostet werden, kann ich beim Backup-Konzept einige Abstriche machen. Ganz ohne Stützräder fahre ich aber auch nicht.

Mein Hoster bietet gegen kleines Geld Snapshot-Images des virtuellen Servers an. Ein solches habe ich nach der Grundkonfiguration meines Servers erstellt. D.h., dass ich im Fall der Fälle in vertretbarer Zeit wieder ein lauffähiges Basissystem herstellen kann.

Die veränderlichen Dateien, die ich benötige, um das System wieder nutzbar zu machen, sind

  • Konfigurationsdateien (/etc/*)
  • Benutzerverzeichnisse (/home/*)
  • Mails (/var/mail/*)
  • Webseiten (/var/www/*)
  • MySQL-Datenbanken

Um neben Datenverlusten auch Unzulänglichkeiten in der Administration auszubügeln (Don’t drink and root), möchte ich zudem Sicherungen der letzten 7 Tage anlegen. Dazu habe ich folgendes Skript zurecht gebastelt, dass die oben genannten Verzeichnisse rollierend nach Wochentag unter /opt/backup/ komprimiert ablegt und auf einen externen Server via scp hochlädt:

#!/bin/bash
_day=$(date +%A) 
_basedir=/opt/backup
_dir=$_basedir/$_day
_archive=$_day.tgz
_dbu=user
_dbp=password
_scpu=user
_scpp=password
_scph=host
_scprd=/server_backups

echo $(date)
echo "Cleaning $_dir"
rm -rf $_dir
mkdir -p $_dir
echo "Deleting $_basedir/$_archive"
rm $_basedir/$_archive

echo "Compressing /home/*"
mkdir -p $_dir/home
for path in /home/*; do     
    tar czf $_dir/home/$(basename "${path}").tgz $path
done

echo "Compressing /etc"
tar czf $_dir/etc.tgz /etc

echo "Compressing /var/mail"
mkdir -p $_dir/var/mail
for path in /var/mail/*; do
    tar czf $_dir/var/mail/$(basename "${path}").tgz $path
done

echo "Compressing /var/www/*"
mkdir -p $_dir/var/www
for path in /var/www/*; do
    tar czf $_dir/var/www/$(basename "${path}").tgz $path
done

echo "Dumping MySQL databases"
mkdir -p $_dir/mysql
_dbs="$(mysql -u $_dbu -p$_dbp -Bse 'show databases')"
for db in $_dbs; do
    mysqldump --add-drop-database --opt --lock-all-tables -u $_dbu -p$_dbp $db | gzip > $_dir/mysql/$db.tgz
done

echo "Compressing backup"
tar czf $_basedir/$_archive $_dir

echo "Uploading $_archive to $_scph"
sshpass -p "$_scpp" scp $_basedir/$_archive $_scpu@$_scph:/$_scprd/$_archive

sshpass ist ggf. zu installieren.

Das Skript ist dann täglich auszuführen. Dazu lege ich folgenden Cronjob (crontab -e) an für meinen User tilman, der sudo-Rechte auf dem Skript hat:

0   2   *   *   *   sudo /opt/backup/backup.sh > /opt/backhup/backup.log
Tilman Moser

Hejdå! Jag är Tilman Moser.

Ich bin Management Berater in der IT Branche.

Im wahren Leben bin ich Vater, Ehemann, Gewicht reduzierender Freizeit-Sportler, Hobby-Linux-Admin und Programmierer. Ich interessiere mich für Darts, Whiskey und Skandinavien.

Auf dieser Seite schreibe ich Dinge auf, die ich sonst wahrscheinlich wieder vergesse. Manches davon ist vielleicht auch für andere interessant... :-)