Hetzner Backup Space / Storage Box: inkrementelles Backup mit rsnapshot
Dieser Artikel beschreibt die Einrichtung eines inkrementellen Backups mit rsnapshot auf einer Hetzner Storage Box.
Hierzu wird der Backup Space per SSHFS gemounted. Um auch die Benutzerrechte setzen zu können wird ein Image auf der Storage Box abgelegt.
Die Einrichtung erfolgte unter Ubuntu 20.04 .
Storage Box 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-storagebox.de
$ sftp -P23 -i ~/.ssh/id_rsa [BENUTERNAME]@[BENUTERNAME].your-storagebox.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-storagebox.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-storagebox.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
$ mkdir -p /var/cache/rsnapshot/
$ mount /var/cache/rsnapshot/
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_script /usr/local/bin/backup_mysql.sh web/mysql/
backup_script /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:
- https://wiki.hetzner.de/index.php/Backup_Space_SSH_Keys
- https://www.sotzny.de/2016/10/10/hetzner-storage-box-mit-rsnapshot/
Update 21.09.2020: Backup Space -> Storage Box, Ubuntu 20.04
Vergrößerung des Backup Images
Wird der Speicherplatz eng, so kann auf ein größeres Paket umgestiegen werden. In diesem Fall muss auch das Backup-Image verößert werden. Für ein Fallbeispiel nehmen wir an, dass von 100 GB auf 1TB vergrößert wird.
Hierzu muss das Loop-Device zunächst ausgehängt werden:
$ umount /var/cache/rsnapshot
Im Anschluss wird die Image-Datei vergrößert, wieder eingehängt und das Dateisystem vergrößert:
# 1TB = 1024*1024 MB
$ dd if=/dev/zero of=/mnt/backup/backup.img bs=1M count=0 seek=1048576
$ mount /var/cache/rsnapshot
$ resize2fs /mnt/backup/backup.img

Bemerkungen :
sample