Hetzner Backup Space / Storage Box: inkrementelles Backup mit rsnapshot

Mit etwas Aufwand lässt sich auch im Hetzner Backup Space (Storage Box) ein inkrementelles Backup mit rsnapshot einrichten.

Dieser Artikel beschreibt die Einrichtung eines inkrementellen Backups mir rsnapshot auf dem Hetzner Backup Space (Storage Box).
Hierzu wird der Backup Space per SSHFS gemounted. Um auch die Benutzerrechte setzen zu können wird ein Image im Backupspace angelegt.
Die Einrichtung erfolgte unter Ubuntu 18.04 .

Backup-Space per SSHFS mounten

SSH Key generieren und hochladen

Zunächst erstelle ich einen SSH Key und lade diesen auf den Backupspace, damit ich mich vom Server aus automatisiert einloggen kann:

 

# SSH Key generieren, alles akzeptieren, kein Passwort
$ ssh-keygen -t rsa -b 4096
# Quelle: wiki.hetzner.de/index.php/Backup_Space_SSH_Keys
$ cat /root/.ssh/id_rsa.pub >> storagebox_authorized_keys
$ echo -e "mkdir .ssh \n chmod 700 .ssh \n put storagebox_authorized_keys .ssh/authorized_keys \n 
# [BENUTERNAME] bitte entsprechend durch den Benutzernamen ersetzen.
chmod 600 .ssh/authorized_keys" | sftp [BENUTERNAME]@[BENUTERNAME].your-backup.de
$ sftp -P23 -i ~/.ssh/id_rsa [BENUTERNAME]@[BENUTERNAME].your-backup.de

 

Image erstellen und hochladen

 

$ apt install sshfs
$ fallocate -l 100G backup.img
$ mkfs.ext4 backup.img
$ mkdir /mnt/backup/
$ mount -t fuse sshfs#[BENUTERNAME]@[BENUTERNAME].your-backup.de:/home/ /mnt/backup/ -o port=23 -o debug
$ mv backup.img /mnt/backup/

 

Wer auf Nummer Sicher gehen möchte, kann das Image dann auch gleich mit cryptsetup/LUKS verschlüsseln.

Mount-Einträge in fstab schreiben

 

$ vim /etc/fstab

 

sshfs#[BENUTERNAME]@[BENUTERNAME].your-backup.de:/home/ /mnt/backup fuse uid=0,gid=0,umask=0007,port=23,reconnect,BatchMode=yes,_netdev 0 0
/mnt/backup/backup.img /var/cache/rsnapshot/ ext4 loop 0 0

 

Rsnapshot installieren & konfigurieren

 

$ apt install rsnapshot

 

Vorbereitung für MySQL-Backups

Da der Backup-Speicherplatz meistens eher knapp bemessen ist, komprimiere ich die Datenbank, wodurch im Normalfall sehr viel Speicherplatz eingespart werden kann.

 

$ cp /usr/share/doc/rsnapshot/examples/utils/backup_mysql.sh /usr/local/bin/
$ echo "gzip mysqldump_all_databases.sql" >> /usr/local/bin/backup_mysql.sh
$ chown root:root /usr/local/bin/backup_mysql.sh
$ chmod 755 /usr/local/bin/backup_mysql.sh

 

Vorbereitung für PostgreSQL-Backups (optional)

Auch für PostgreSQL bietet rsnapshot bereits ein Beispiel-Script an

 

$ cp /usr/share/doc/rsnapshot/examples/utils/backup_pgsql.sh /usr/local/bin/
$ echo "gzip pg_dumpall.sql" >> /usr/local/bin/backup_pgsql.sh
$ chown root:root /usr/local/bin/backup_pgsql.sh
$ chmod 755 /usr/local/bin/backup_pgsql.sh

 

Rsnapshot Konfiguration

Mein bevorzugter Kommandozeilen-Editor ist vim, dieser ist aber so eingestellt, dass Tabs mit Leerzeichen ersetzt werden. Bei rsnapshot muss man aber unbedingt auf die Tabs achten, daher verwende ich zum Bearbeiten der Konfiguration den Editor nano:

 

$ nano /etc/rsnapshot.conf

 

Im folgenden werden nur die geänderten Zeilen abgebildet.
Unbedingt auf die Tabs achten!

 

snapshot_root	/var/cache/rsnapshot

verbose	4
loglevel	4
logfile	/var/log/rsnapshot.log

retain	daily	7
retain	weekly	4
retain	monthly	6

rsync_long_args	--stats --delete --numeric-ids --relative --delete-excluded

backup	/etc/	web/
backup	/var/www/example.com/	web/	exclude=var/log,exclude=var/session
backup	/usr/local/bin/backup_mysql.sh	web/mysql/
backup	/usr/local/bin/backup_pgsql.sh	web/mysql/

 

Test und initiales Backup

Damit ich auch über den Backup-Status informiert werde, richte ich hier gleich noch rsnapreport ein und lasse mir eine Zusammenfassung per Mail senden.

 

# Test-Durchlauf
$ rsnapshot -t daily
# Repots einrichten
$ cp /usr/share/doc/rsnapshot/examples/utils/rsnapreport.pl /usr/local/bin/rsnapreport
$ chown root:root /usr/local/bin/rsnapreport
$ chmod 755 /usr/local/bin/rsnapreport
# Initiales Backup
# backup@example.com durch die eigene Mail-Adresse ersetzen!
$ rsnapshot daily 2>&1 | rsnapreport | mail -s"Backup srv001.example.com" backup@example.com

 

Cronjobs einrichten

Abschließend richte ich noch Cronjobs ein, damit das Backup künftig automatisch läuft

 

$ crontab -e

 

 Die Zeiten können selbstverständlich angepasst werden.

 

# täglich um 03:30
30 3 * * *  rsnapshot daily 2>&1 | /usr/local/bin/rsnapreport | mail -s"Backup srv001.example.com" backup@example.com
# Jeden 1. Tag der Woche um 06:30
30 6 * * 1  rsnapshot weekly 2>&1
# Jeden 1. Tag des Monats um 07:30
30 7 1 * *  rsnapshot monthly 2>&1

 

Quellen:

Oops, an error occurred! Code: 20200812093453b2aafc79