einfache Backuplösung mittels crontab (Debian)

crontab erstellen

Die hier gezeigte Lösung weist jedem Schritt eine eigene Zeit zu. Selbstverständlich kann dies viel eleganter mit einem Backup-Script gelöst werden. Dabei erstellen wir ein Backup-Script wie z. B. backup.sh und weisen den Crontab zu, das Script zu einem bestimmten Zeitpunkt auszuführen. Siehe dazu weiter unten.

Mittels crontab lassen sich auf deinen Server Prozesse automatisieren.
Angenommen, ich möchte jeden Tag um 20:00 Uhr meinen Ordner /data sichern und um 21:00 Uhr die Datenbank. Der Ausgabeordner ist dabei /opt

Starte crontab:

# crontab -e

Im Editorfenster geben wir nun den gewünschten crontab ein:
# tar-Archiv von /data alle Tage um 20:00. Überschreibe das aktuelle File jeweils:
0 20 * * * tar cfv /opt/data.tar /var/www/html/data

# sichere die Datenbank alle Tage um 21:00. Überschreibe das aktuelle File jeweils:
0 21 * * * mysqldump --all-databases --single-transaction --quick --lock-tables=false -r /opt/dbfull.sql

Starte den Service neu:

# /etc/init.d/cron restart

crontab sorgt dafür, dass die jeweiligen Files zum angegebenen Zeitpunkt auf dem Server liegen.

Soll crontab das aktuelle File nicht überschreiben, fügen wir einen Zeitstempel hinzu:
# DB alle 20 Minuten sichern, Zeitstempel hinzufügen
*/20 * * * * /usr/bin/mysqldump --all-databases --single-transaction --quick --lock-tables=false -r /opt/dbfull_$(date +"\%Y-\%m-\%d_\%H-\%M").sql
#

Vorsicht: dieses führt sehr schnell zu grossen Datenmengen und ist nur als Beispiel gedacht.

Backup-Dateien abholen (manuell)

Um die Dateien abzuholen, genügt ein PC mit Debian, mit welchem wir auf den Server zugreiffen können. Installiere das Paket sshfs auf deinem Client-PC und nicht auf dem Server!

# apt install sshfs
$ sshfs benutzer@123.45.678.900:/opt /home/benutzer/share

Blau: Angaben zum Server
Orange: Angaben zum Client-PC

Beispiel

Hier eine funktionierende Lösung, welche mir die Datenbank und den Uploadordner /data täglich sichert. Die Dateien werden dann von einem Backup-Server abgeholt.

# tar-Archiv von /data alle Tage um 00:50 Uhr
50 0 * * * tar cfv /opt/data_$(date +"\%Y-\%m-\%d_\%H-\%M").tar /var/www/html/data

# sichere die Datenbank alle Tage um 00:55 Uhr
55 0 * * * mysqldump --all-databases --single-transaction --quick --lock-tables=false -r /opt/dbfull_$(date +"\%Y-\%m-\%d_\%H-\%M").sql

# lösche auf /opt jeden Tag um 01:00 Uhr alle Dateien die älter als 3 Tage alt sind
0 1 * * * find /opt/* -mtime +3 -exec rm {} \;
#


Backupserver einrichten (automatisch)

Der eigene Backupserver kann sich jeder zu Hause einrichten. Ich meinem Fall entschied ich mich für den HP Pavillion 500-330nz. Obwohl der Rechner nahezu 10 Jahre als ist, schnurrte er nach einer gründlichen Reinigung und neuer Wärmeleitpaste wie ein Kätzchen. Ebenfalls Einplatinencomputer wie z. B. der Raspberry Pi eignen sich als simple Backupserver.

Der grosse Vorteil beim Raspberry Pi 5 ist der geringe Stromverbrauch. Während mein HP Pavillion durchschnittlich 30 Watt Leistung bezog (ohne Monitor) verbraucht der Rasperry Pi 5 nur gerade mal 6 Watt Leistung.

entfernter Server
damit ist ein Server in einem Rechenzentrum gemeint. In diesen Beispiel bezieht er sich auf meinen Cloud-Server von Hetzner in Falkenstein, wo auch diese Webseite abgelegt ist. Dieser Server macht mittels crontab täglich Backups nach /opt

Backup- oder Zielserver
dieser Server steht bei mir zu Hause. Täglich holt dieser nun die Daten mittels rsync unter /opt ab.

Der Backupserver ist wie der Cloud-Server ein klassischer 24/7 Rechner, der einfach läuft und läuft und läuft. Auf eine grafische Oberfläche wird in der Regel verzichtet, da diese nur Ressourcen verbraucht und das System ausbremst. Auf dem Backupserver genügt es, eine minimale Installation von Debian einzurichten.

entfernter Server (IP: 123.45.678.90)

Ziel auf dem entfernten Server ist es, sämtliche Backupdateien nach /opt mittels crontab zu laden. Diese Dateien lassen wir maximal für drei Tage auf dem Server. Dieser Server sollte per ssh-key erreichbar sein. Somit benötigen wir kein Passwort, wenn wir uns mit dem Zielserver verbinden!

$ crontab -e

# tar-Archiv von /pfad/zum/Ordner alle Tage um 00:10 Uhr
10 0 * * * tar cfv /opt/Ordner_$(date +"\%Y-\%m-\%d_\%H-\%M").tar /pfad/zum/Ordner

# sichere die Datenbank datenbank1 alle Tage um 00:15 Uhr
15 0 * * * mysqldump datenbank1 --single-transaction --quick --lock-tables=false -r /opt/datenbank1_$(date +"\%Y-\%m-\%d_\%H-\%M").sql

# sichere die Datenbank datenbank2 alle Tage um 00:20 Uhr
20 0 * * * mysqldump datenbank2 --single-transaction --quick --lock-tables=false -r /opt/datenbank2_$(date +"\%Y-\%m-\%d_\%H-\%M").sql

# lösche auf /opt jeden Tag um 00:25 Uhr alle Dateien die älter als 3 Tage alt sind
25 0 * * * find /opt/* -mtime +3 -exec rm {} \;
#

Backupserver (Zielserver)

Ziel vom Backupserver ist es, alle Dateien regelmässig vom entfernten Server unter /opt abzuholen, und diese nach /backup_volume/ abzulegen. In diesem Beispiel lassen wir immer 7 Slots stehen, bevor die ältesten gelöscht werden. Auf dem Zielserver sollte sich der ssh-key (id_rsa) befinden, an sonst wird die Verbindung abgelehnt!

Prüfe, ob rsync auf dem Server installiert ist:

# apt install rsync

Starte nun einen crontab als normaler Benutzer: (nicht root)

$ crontab -e

# Baue die Verbindung zum Server 123.45.678.90 um 00:30 Uhr jeden Tag auf, kein Passwort notwendig, da id_rsa.
# Den entfernten Server hängen wir unter /home/benutzer/backup ein. Unser entfernter Server wird somit Teil des
# Zielservers.
30 0 * * * sshfs benutzer@123.45.678.90:/opt /home/benutzer/backup/

# führe rsync um 00:35 Uhr jeden Tag aus. Den eingehängten Server spiegeln wir hier nach /home/benutzer/backup_volume
35 0 * * * rsync -a /home/benutzer/backup/ /home/benutzer/backup_volume/

# trenne die Verbindung zum entfernten Server um 00:50 jeden Tag
50 0 * * * umount /home/benutzer/backup

# lösche auf /backup_volume jeden Tag um 06:00 Uhr alle Dateien die älter als 7 Tage alt sind
0 6 * * * find /home/benutzer/backup_volume/* -mtime +7 -exec rm {} \;
#


Backuplösung mit dem Raspberry Pi

Der Einplatinencomputer Raspberry Pi eignet sich ideal für einen kleinen, privaten Backupserver. Selbst mein alter Rasperry Pi 2 aus dem Jahre 2013 verrichtete Jahrelang seinen Job. Inzwischen ist ein Raspberry Pi 5 der neusten Generation (2023) im Einsatz.

01. Backup per crontab und das entsprechende Script auf dem entfernten Server erstellen:

# crontab -e

# starte Backupscript um 01:00
00 01 * * * bash /root/backup.sh
#

# nano backup.sh

#!/bin/bash
# wird ausgeführt um 01:00 Uhr
echo "Starte das Backup der Datenbank nach ~/backup"
mysqldump DATENBANK1 --single-transaction --quick --lock-tables=false -r /home/SERVERUSER/backup/DATENBANK1_$(date +"%d-%m-%Y_%H:%M").sql
mysqldump DATENBANK2 --single-transaction --quick --lock-tables=false -r /home/SERVERUSER/backup/DATENBANK2_$(date +"%d-%m-%Y_%H:%M").sql
echo ""
echo "Starte das Backup von /data nach ~/backup"
tar cf /home/SERVERUSER/backup/data_$(date +"%d-%m-%Y_%H:%M").tar /var/www/html/data
echo ""
echo "ändere den Benutzer auf SERVERUSER:SERVERUSER"
chown -cR SERVERUSER:SERVERUSER /home/SERVERUSER/backup/
echo ""
echo "lösche alles auf ~/backup/data > 1 Tage"
find /home/SERVERUSER/backup/* -mtime +1 -exec rm {} \;
echo "Backup erfolgreich"

02. Crontab definieren

$ crontab -e

# Starte das Backupscript um 02:00 Uhr jeden Tag
00 02 * * * bash /home/piuser/.rsync.sh
#
# alle 3 Stunden ping an google.ch
0 */3 * * * ping -c3 google.ch

03. Backupscript für den Webser schreiben:

$ nano .rsync.sh

#!/bin/bash
# wird ausgeführt um 02:00 Uhr
# baue Verbindung auf:
sshfs SERVERUSER:/home/SERVERUSER/backup /home/piuser/.mountpoint
# starte rsync
rsync -a /home/piuser/.mountpoint/ /home/piuser/HDD/ZIELORDNER/
# trenne Verbindung
umount /home/piuser/.mountpoint
# lösche alles auf der HDD/ZIELORDNER > 30 Tage
find /home/piuser/HDD/ZIELORDNER/* -mtime +30 -exec rm {} \;
#