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