einfache Backuplösung mittels crontab (Debian)

crontab erstellen

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

hat geklappt: unser Server ist nun eingebunden und die Backup-Dateien können bequem abgeholt werden.

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.

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>

# 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>

# 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 {} \;
#