Raspberry Pi: Webserver Backup

Nun hat man einen eigenen kleinen Webserver zu Hause. In Form eines Raspberry Pi. Jetzt kommt gerade auf der Plattform das große Aaaaber!!!

Da der Raspberry bekanntlich über SD Flash arbeitet stellt sich dort die Frage nach der Datensicherheit in einem erhobenen Maße. Also was tun? Richtig: Backup auf ein externes Speichermedium.

Inhaltsverzeichnis:

USB Speicher

Ich nehme für dieses Beispiel mal einen USB Stick, man selbstverständlich auch eine externe USB HDD nutzen (Was ich empfehle).

Man formatiere den Stick in FAT32, sodas er auch unter Windows problemlos gelesen werden kann.

Unter Raspbian nutzt man nun lsblk um sich seine Datenträger auflisten zu lassen:

pi@DraconiXServer:~ $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1 29.3G  0 disk
└─sda1        8:1    1 29.3G  0 part
mmcblk0     179:0    0 14.9G  0 disk
├─mmcblk0p1 179:1    0  256M  0 part /boot
└─mmcblk0p2 179:2    0 14.7G  0 part /
pi@DraconiXServer:~ $

Wir haben nun den Namen unseres USB Speichers und brauchen noch einen Punkt wohin wir ihn Mounten wollen, ich hab mich für /mnt/usbstick entschieden:

sudo mkdir /mnt/usbstick

Nun möchte man den Stick natürlich auch beim Reboot automatisch Mounten lassen, also ab damit in die fstab :

sudo nano /etc/fstab

Dort fügen wir am Ende hinzu:

/dev/sda1 /mnt/usbstick vfat defaults 0 0

Wichtig hierbei ist das man mit Enter eine neue Zeile beginnt… Glaubt mir, ich hab mich tot gesucht 😅 Danach mounten wir direkt über die fstab

sudo mount -a

Danach müsste mit einer lsblk anfrage schon direkt der Mountpoint mit angegeben sein (man beachte sda1):

pi@DraconiXServer:~ $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    1 29.3G  0 disk
└─sda1        8:1    1 29.3G  0 part /mnt/usbstick
mmcblk0     179:0    0 14.9G  0 disk
├─mmcblk0p1 179:1    0  256M  0 part /boot
└─mmcblk0p2 179:2    0 14.7G  0 part /
pi@DraconiXServer:~ $

Backupscript: HTML

Wir müssen nun ein Backupscript erstellen. Wir machen es uns nun einfach und erstellen ein Backup des gesamten HTML Ordners. Selbstverständlich kann man auch nur einzelne Ordner für das Backup herstellen lassen. Wir prüfen erst einmal ob denn der USB Stick überhaupt gemountet wurde. Wir erstellen ein Script mit nano backup.sh und fügen ein:

#!/bin/bash

echo "Backup startet:" $(date +"%Y-%m-%d %H-%M")

if [ $(mount | grep '/mnt/usbstick' | wc -l) -gt 0 ]
then
        echo "  OK - Drive ist mounted"
else
        echo "  WARNING! - Drive not mounted!"
fi

echo "Backup stoped:" $(date +"%Y-%m-%d %H-%M")

Wir machen das Script nun ausführbar und starten es einmal:

pi@DraconiXServer:~ $ chmod +x backup.sh
pi@DraconiXServer:~ $ ./backup.sh
Backup startet: 2019-12-02 07:53
  OK - Drive ist mounted
Backup stoped: 2019-12-02 07:53
pi@DraconiXServer:~ $

Wunderbar, das hat ja funktioniert. Nun erstellen wir unser Backup des HTML Ordners, natürlich mit Zeitstempel. Dazu nutzen wir ZIP:

#!/bin/bash

echo "Backup startet:" $(date +"%Y-%m-%d %H:%M")

if [ $(mount | grep '/mnt/usbstick' | wc -l) -gt 0 ]
then
        echo "  OK - Drive ist mounted"
        echo "  ---> Backup: HTML"
        sudo zip -q -r "/mnt/usbstick/backup-html-$(date +"%Y-%m-%d %H-%M").zip" /var/www/html/
else
        echo "  WARNING! - Drive not mounted!"
fi

echo "Backup stoped:" $(date +"%Y-%m-%d %H:%M")

Nun führen wir das ganze mal aus, je nachdem wie umfangreich der HTML Ordner ist, kann dies eine ganze Weile dauern, also keine Angst.

Backupscript: MySQL Datenbank

Natürlich wollen wir auch unsere MySQL Datenbank sicher, dabei spielt es keine Rolle ob wir nun MySQL oder MariaDB einsetzen. Der Befehl ist der gleich. Wichtig hierbei nur: Man braucht den Benutzername für die jeweilige Datenbank, dies müsst ihr im folgenden ersetzen / erweitern – direkt hinter -u und -p (Achtung: ohne Leerzeichen!):

#!/bin/bash

echo "Backup startet:" $(date +"%Y-%m-%d %H:%M")

if [ $(mount | grep '/mnt/usbstick' | wc -l) -gt 0 ]
then
        echo "  OK - Drive ist mounted"

        echo "  ---> Backup: HTML"
        sudo zip -q -r "/mnt/usbstick/backup-html-$(date +"%Y-%m-%d %H-%M").zip" /var/www/html/

        echo "  ---> Backup: MySQL"
        mysqldump -uUSER -pPASS --all-databases > /mnt/usbstick/backup-sql-"$(date +"%Y-%m-%d %H-%M")".sql                                                                                                                          
else
        echo "  WARNING! - Drive not mounted!"
fi

echo "Backup stoped:" $(date +"%Y-%m-%d %H:%M")

Damit haben wir nun auch unsere MySQL Datenbank gesichert. Sehr schön! Aufpassen aber: mysqldump benötigt root Rechte. Daher ab sofort das Script wie folgt aufrufen:

sudo ./backup.sh

Backupscript: Apache2

Wir können natürlich auch unsere komplette Apache2 Installation mit den Servereinstellungen sichern. Natürlich gehe ich davon aus das Apache im Standard Verzeichnis installiert ist. dazu erweitern wir wie folgt:

#!/bin/bash

echo "Backup startet:" $(date +"%Y-%m-%d %H:%M")

if [ $(mount | grep '/mnt/usbstick' | wc -l) -gt 0 ]
then
        echo "  OK - Drive ist mounted"

        echo "  ---> Backup: HTML"
        sudo zip -q -r "/mnt/usbstick/backup-html-$(date +"%Y-%m-%d %H-%M").zip" /var/www/html/

        echo "  ---> Backup: MySQL"
        mysqldump -uUSER -pPASS --all-databases > /mnt/usbstick/backup-sql-"$(date +"%Y-%m-%d %H-%M")".sql

        echo "  ---> Backup: Apache"
        sudo zip -q -r "/mnt/usbstick/backup-apache-$(date +"%Y-%m-%d %H-%M").zip" /etc/apache2                         
else
        echo "  WARNING! - Drive not mounted!"
fi

echo "Backup stoped:" $(date +"%Y-%m-%d %H:%M")

Belegung und Dauer berechnen

Folgend noch ein paar kleine Modifikationen um sich direkt die Datenträgerbelegung sowie die Dauer des Backups ausgeben zu lassen. Ist ja immer sehr interessant:

#!/bin/bash

SECONDS=0;

echo $(date +"%Y-%m-%d %H-%M") " Start Backup:"

if [ $(mount | grep '/mnt/usbstick' | wc -l) -gt 0 ]
then

        echo "  OK - Drive ist mounted"

        DiskPerc=`df -hl | grep '/dev/sda1'| awk '{sum+=$5} END {print sum}'`
        DiskSpaceUsage=`df -hl | grep '/dev/sda1'| awk '{print $3}'`
        DiskSpaceTotal=`df -hl | grep '/dev/sda1'| awk '{print $2}'`
        echo "  OK - Space on drive:" $DiskSpaceUsage "of" $DiskSpaceTotal". Thats:" $DiskPerc"%"

        echo "  ---> Backup: HTML"
        sudo zip -q -r "/mnt/usbstick/backup-html-$(date +"%Y-%m-%d %H-%M").zip" /var/www/html/

        echo "  ---> Backup: MySQL"
        mysqldump -uUSER -pPASS --all-databases > /mnt/usbstick/backup-sql-"$(date +"%Y-%m-%d %H-%M")".sql

        echo "  ---> Backup: Apache"
        sudo zip -q -r "/mnt/usbstick/backup-apache-$(date +"%Y-%m-%d %H-%M").zip" /etc/apache2


        echo "  OK - Time to backup:" $SECONDS "seconds"
else
        echo "  WARNING! - Drive not mounted!"
fi

echo "Backup stoped:" $(date +"%Y-%m-%d %H:%M")

Das war es nun, einfach mal laufen lassen:

pi@DraconiXServer:~ $ sudo ./backup.sh
 2019-12-02 11-04  Start Backup:
   OK - Drive ist mounted
   OK - Space on drive: 1.7G of 30G. Thats: 6%
   ---> Backup: HTML
   ---> Backup: MySQL
   ---> Backup: Apache
   OK - Time to backup: 21 seconds
 Backup stoped: 2019-12-02 11:05
 pi@DraconiXServer:~ $

Cronjob erstellen

Nun müssen wir das Script regelmäßig ausführen. Ich persönlich möchte alle 12 Stunden ein Backup. Dafür bearbeiten wir unsere Crontab:

sudo crontab -e

Entweder öffnet sich dann direkt der Editor, oder man wählt sich in der Liste den Editor (nano, vi, etc…) selbst aus. Ich bevorzuge immer nano. Wir fügen nun folgende Zeile hinzu. Die Echoausgaben werden da direkt in eine Log Datei umgeleitet:

0 */12 * * * /home/pi/backup.sh >> /home/pi/backup.log 2>&1

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

© DraconiX 2019

Nach oben ↑