LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Blog-Übersicht /IT & Networks / Raspberry-Pi-Backups auf ein UniFi-NAS automatisieren
Diesen Artikel in anderen Sprachen lesen:

Raspberry-Pi-Backups auf ein UniFi-NAS automatisieren

Raspberry-Pi-Backups auf ein UniFi-NAS automatisieren

Direkt zum Mitmachen ↓

Schätz mal! ↓

Inhalt
  1. Voraussetzungen und Umfang
  2. 1. NAS vorbereiten
  3. 2. SMB-Freigabe einbinden
  4. 3. Datenbankzugang einrichten
  5. 4. Sicherungsskript speichern
  6. 5. Zeitplan und Kontrolle
  7. Fragen und Antworten
  8. Quellen

Eine tägliche Kopie auf einem UniFi UNAS Pro ergänzt die Anwendungsdaten des Raspberry Pi um einen zweiten Speicherort. Das Beispiel sichert ausgewählte Verzeichnisse und MySQL-Datenbanken über SMB, ein Protokoll für Netzwerkfreigaben. Für einen belastbaren Wiederherstellungsplan fehlen anschließend noch Rücksicherungstests und eine getrennte Offline- oder Außer-Haus-Kopie.

Voraussetzungen und Umfang

Das Beispiel verwendet das Linux-Konto pi, das Heimatverzeichnis /home/pi, Bash und einen passenden MySQL-Dump-Client. Kontoname, numerische Benutzer- und Gruppenkennung, Datenbanken und Quellverzeichnisse müssen zur Installation passen. Das Sicherungskonto benötigt Leserechte auf alle Quellen. Ein laufendes Docker-Datenbankverzeichnis lässt sich durch bloßes Hinzufügen zu tar nicht konsistent sichern.

1. NAS vorbereiten

In UniFi Drive dient eine Freigabe namens Pi_Backups als Ziel. Ein eigenes Sicherungskonto benötigt Schreibrechte auf diese Freigabe sowie Dateidienst-Zugangsdaten für SMB. Das Passwort für die UniFi-Konsole ist nicht zwangsläufig das SMB-Passwort. Der SMB-Dienst muss aktiviert sein; genaue Bezeichnungen hängen von der installierten Drive-Version ab.

2. SMB-Freigabe einbinden

Das Paket cifs-utils stellt das Hilfsprogramm zum Einbinden der SMB-Freigabe bereit. Die folgenden Einrichtungsschritte benötigen Administratorrechte:

sudo apt update
sudo apt install cifs-utils
sudo mkdir -p /mnt/unas_backup

Die mit sudo nano /etc/.unas_creds angelegte Datei enthält zwei Zeilen:

username=backup_user
password=REPLACE_WITH_SMB_PASSWORD

Das Passwort bleibt in dieser Datei im Klartext gespeichert. Dateirechte beschränken den Zugriff; ein Punkt am Dateianfang verschlüsselt nichts. Eigentümer muss root sein:

sudo chown root:root /etc/.unas_creds
sudo chmod 600 /etc/.unas_creds

Der folgende Eintrag gehört in /etc/fstab. Adresse und Freigabename sind Beispiele. UID und GID 1000 müssen zum Sicherungskonto passen; id pi zeigt die tatsächlichen Werte. Zusätzlich gelten weiterhin die Zugriffsrechte auf dem NAS.

//192.168.1.XXX/Pi_Backups /mnt/unas_backup cifs credentials=/etc/.unas_creds,uid=1000,gid=1000,iocharset=utf8,_netdev,nofail 0 0

sudo mount /mnt/unas_backup prüft genau diese Einbindung. Mit nofail kann der Systemstart ohne NAS weiterlaufen. Eine fehlende Einbindung verhindert trotzdem die Sicherung; nach Rückkehr des NAS ist ein erneutes Einbinden erforderlich. SMB bedeutet nicht automatisch verschlüsselte Übertragung. Verschlüsselungsanforderungen benötigen eine eigene Konfiguration und Prüfung.

3. Datenbankzugang einrichten

Die Datei /home/pi/.my.cnf gehört dem ausführenden Konto und enthält die unten angegebenen Datenbank-Zugangsdaten. chmod 600 /home/pi/.my.cnf beschränkt den Zugriff. Das separate Datenbankkonto benötigt die für die gewählten Dump-Optionen dokumentierten Rechte, einschließlich Routinen und Ereignissen.

[client]
user=backup_user
password=REPLACE_WITH_DATABASE_PASSWORD

4. Sicherungsskript speichern

Das folgende Skript gehört nach /home/pi/pi_backup.sh. Vor dem Einsatz sind app1 app2 und TARGET_FOLDERS durch die tatsächlichen Datenbanken und Verzeichnisse zu ersetzen. Für MariaDB sind der installierte Client mariadb-dump und dessen unterstützte Optionen gesondert zu prüfen.

#!/bin/bash
set -euo pipefail
umask 077
PATH=/usr/local/bin:/usr/bin:/bin
NAS_MOUNT="/mnt/unas_backup"
TARGET_FOLDERS=(/var/www/html /etc/nginx)
DATABASES=(app1 app2)
exec 9>/home/pi/.pi-backup.lock
flock -n 9 || { echo "Backup already running" >&2; exit 1; }
mountpoint -q "$NAS_MOUNT" || { echo "NAS is not mounted" >&2; exit 1; }
[[ $(findmnt -n -o FSTYPE --target "$NAS_MOUNT") == cifs ]] || exit 1
BACKUP_ID=$(date +%Y-%m-%d_%H-%M-%S)
WORK_DIR="$NAS_MOUNT/.partial-$BACKUP_ID"
DEST_DIR="$NAS_MOUNT/$BACKUP_ID"
mkdir -- "$WORK_DIR"
trap 'echo "Backup failed; incomplete directory: $WORK_DIR" >&2' ERR
mysqldump --defaults-extra-file=/home/pi/.my.cnf   --single-transaction --routines --events --triggers   --databases "${DATABASES[@]}" | gzip > "$WORK_DIR/databases.sql.gz"
gzip -t "$WORK_DIR/databases.sql.gz"
tar -czf "$WORK_DIR/files.tar.gz" -- "${TARGET_FOLDERS[@]}"
tar -tzf "$WORK_DIR/files.tar.gz" > /dev/null
printf '%s\n' "$BACKUP_ID" > "$WORK_DIR/COMPLETE"
mv -- "$WORK_DIR" "$DEST_DIR"
echo "Backup written: $DEST_DIR"

pipefail macht Dump-Fehler sichtbar, die ein erfolgreiches gzip sonst verdeckt. Bei einem fehlgeschlagenen Dump oder Dateiarchiv bricht dieser geradlinige Ablauf ab. Unvollständige Läufe behalten ein Verzeichnis mit .partial-; der endgültige Ordner entsteht erst nach beiden Archivprüfungen. Diese Prüfungen erkennen beschädigte Archive, belegen aber weder logische Vollständigkeit noch Wiederherstellbarkeit.

--single-transaction liefert für transaktionale Tabellen wie InnoDB einen konsistenten Datenstand. Nichttransaktionale Tabellen und gleichzeitige Schemaänderungen erfordern eine andere Sicherungsstrategie. Die anschließend kopierten Dateien gehören nicht automatisch zum selben Zeitpunkt wie der Datenbankstand. Anwendungen mit zusammengehörigen Uploads und Datenbankeinträgen benötigen ein abgestimmtes Wartungsfenster oder ein geeignetes Snapshot-Verfahren.

5. Zeitplan und Kontrolle

Nach chmod +x /home/pi/pi_backup.sh muss ein manueller Lauf unter demselben Konto erfolgreich sein. Der folgende Eintrag in crontab -e des Kontos pi startet die Sicherung um 02:00 Uhr in der lokalen Zeitzone des Cron-Dienstes:

0 2 * * * /home/pi/pi_backup.sh >> /home/pi/backup_log.txt 2>&1

Das Protokoll wächst durch Anhängen und benötigt deshalb eine Rotation. Eine Überwachung muss fehlgeschlagene Läufe und ausbleibende aktuelle Sicherungen erkennen. Das Skript löscht bewusst keine alten Kopien. Vor dem Löschen braucht es eine Aufbewahrungsregel, die freien Platz, unvollständige Läufe und den letzten geprüften Wiederherstellungspunkt berücksichtigt.

Sicherungsablauf mit Sperre, Einbindungsprüfung, Teilverzeichnis, geprüften Archiven und endgültigem Ordner; keine automatische Löschung.
Sicherungsablauf mit Sperre, Einbindungsprüfung, Teilverzeichnis, geprüften Archiven und endgültigem Ordner; keine automatische Löschung.

Fragen und Antworten

Ist damit der gesamte Raspberry Pi gesichert?

Nein. Gesichert werden die ausgewählten Anwendungsdatenbanken und Verzeichnisse. Betriebssysteminstallation, Bootkonfiguration, Datenbankkonten und ausgelassene Dienste benötigen einen gesondert dokumentierten Wiederherstellungsablauf.

Wann ist eine Sicherung verwendbar?

Erst eine Rücksicherung auf einem isolierten Testsystem belegt die Wiederherstellbarkeit. Dazu gehören eine kompatible Datenbankversion, SQL-Import, entpackte Dateien und ein Funktionstest der Anwendung. Eine Größenprüfung oder eine COMPLETE-Markierung ersetzt diesen Test nicht.

Warum fehlt die automatische Bereinigung?

Das Löschen alter Kopien nach einem ungeprüften Lauf kann den letzten nutzbaren Wiederherstellungspunkt vernichten. Eine getrennte Aufbewahrungsregel muss erfolgreiche Rücksicherungen und freien Speicher berücksichtigen.

Verstehen durch Ausprobieren

Wie weit musst Du nach einem Ausfall zurück?

Verschiebe den Ausfall und ändere den Backup-Abstand. Vergleiche den letzten gesicherten Stand mit der Zeit, die Du zum Wiederherstellen brauchst.

Punkte: erfolgreiche Backups. Orange: fehlgeschlagener Lauf. Rote Linie: Ausfall. Fläche: Zeitraum seit dem letzten gesicherten Stand.

Letzter gesicherter Stand
Nicht gesicherter Zeitraum
Angenommene Ausfallzeit

Vereinfachtes Modell: Zu Stunde 0 existiert eine geprüfte Sicherung. Weitere Backups sichern und beenden sich sofort zum geplanten Zeitpunkt; ein genau dann eintretender Ausfall liegt danach. Optional scheitert nur der letzte fällige Lauf nach Stunde 0. Keine Log-Replikation, Backup-Dauer, Aufbewahrung oder Dateimenge simuliert. Der Zeitraum zeigt mögliche ungesicherte Änderungen; die Wiederherstellungsdauer ist Deine Annahme, keine Messung oder RTO-/RPO-Zusage.

Dieses Modul rechnet im Browser und sendet oder speichert Deine Eingaben nicht.

Im passenden Werkzeug weiterarbeiten →

Grundlage ↗

Verstehen durch Ausprobieren

Eine Minute: Findest Du den Denkfehler?

Letzte gültige Sicherung: vor 23 Stunden. Wiederherstellung: 2 Stunden. Welcher Zeitraum an Änderungen könnte beim Rücksetzen fehlen?

Im passenden Werkzeug weiterarbeiten →

Grundlage ↗

Schätz mal!

Entdecken

Schätz mal!

Gib zuerst Deine Schätzung ab. Danach erscheinen Rechnung, Ergebnis und Abweichung.

PNG mit Einstellungen, Ergebnis und Artikelverweis. Erst beim Klick lokal erstellt.

Die Übungen rechnen im Browser. Deine Antworten werden vom Lernmodul nicht versendet.

Mehr entdecken & ausprobieren →

Eine Entscheidung, zwei Folgen

Vereinfachtes Lernmodell

Eine Entscheidung, zwei Folgen

Es gibt selten nur eine richtige Lösung. Entscheide Dich und vergleiche die Folgen.

Zum passenden Artikel →

Diese Beispiele rechnen nur in Deinem Browser. Es werden keine echten Systeme gestört.

PNG mit Einstellungen, Ergebnis und Artikelverweis. Erst beim Klick lokal erstellt.

Das Technik-Duell

Vereinfachtes Lernmodell

Das Technik-Duell

Gleiche Bedingungen, zwei Verfahren. Verändere die Zahlen und beobachte, wie sich der Vergleich verschiebt.

WebSocket · RFC 6455 ↗

Zum passenden Artikel →

Diese Beispiele rechnen nur in Deinem Browser. Es werden keine echten Systeme gestört.

PNG mit Einstellungen, Ergebnis und Artikelverweis. Erst beim Klick lokal erstellt.

Dein Entdeckungsweg →

Lukas Wojcik

Lukas Wojcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Eine Frage oder eine Idee für ein Webprojekt? Schreib mir kurz, worum es geht. Das Formular nutzt reCAPTCHA zum Schutz vor Spam.

Kommentar schreiben

Erfahrungen mit anderer Hardware oder Firmware und Rückfragen zur Konfiguration sind hier willkommen.

Die E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind mit einem Stern versehen.