Raspberry Pi Backups automatisieren und überwachen
Dein Backup-Skript läuft seit Monaten zuverlässig - denkst du. Bis du die Daten brauchst und feststellst: Der Cronjob ist vor Wochen abgestürzt. Genau das ist mir passiert, und deshalb überwache ich heute jeden wichtigen Cronjob mit CronWolf.
In diesem Artikel zeige ich dir, wie du automatische Backups auf dem Raspberry Pi einrichtest und mit dem Dead Man’s Switch Prinzip überwachst. Du lernst, wie du Fehler aktiv signalisierst und sogar die Laufzeit deiner Backups messen kannst.
DarkWolfCave.de
Das Problem: Cronjobs versagen lautlos
Cronjobs können auf viele Arten scheitern:
- Hardware-Ausfall: Stromausfall, defekte SD-Karte, Überhitzung
- Netzwerk-Probleme: NAS nicht erreichbar, DNS-Fehler
- Software-Fehler: Skript-Bugs, fehlende Berechtigungen, volle Festplatte
- Konfigurationsfehler: Falsche Cron-Syntax, fehlende Pfade
Das Problem dabei: Du merkst es erst, wenn du das Backup brauchst - und dann ist es zu spät.
Die Lösung: Aktives Monitoring nach dem Dead Man’s Switch Prinzip.
Dead Man’s Switch - Das Prinzip
KI-BildKI-generiert mit Gemini
Das Konzept ist einfach: Dein Backup-Skript sendet nach erfolgreicher Ausführung einen HTTP-Request (“Ping”) an CronWolf. Bleibt dieser Ping aus oder kommt zu spät, wirst du benachrichtigt.
CronWolf erkennt damit verschiedene Fehlerszenarien:
- Der gesamte Raspberry Pi ist ausgefallen (Stromausfall, Hardware-Defekt)
- Der Cron-Daemon läuft nicht oder hat eine ungültige Konfiguration
- Das Backup-Skript bricht mit einem Fehler ab
- Das Backup dauert ungewöhnlich lange
CronWolf einrichten
1. Account erstellen
Registriere dich kostenlos bei CronWolf. Nach der Anmeldung erstellst du einen neuen Check für dein Backup.
2. Check konfigurieren
Wichtige Einstellungen:
- Name: Aussagekräftig, z.B. “Pi-Backup-Täglich”
- Schedule: Wann läuft dein Backup? (z.B. täglich um 3:00 Uhr)
- Grace Time: Wie lange dauert dein Backup maximal? Addiere einen Puffer (z.B. 30 Minuten)
3. Ping-URL kopieren
Nach dem Erstellen erhältst du eine eindeutige Ping-URL:
https://cronwolf.de/ping/deine-uuid-hier
Diese URL verwendest du in deinem Backup-Skript.
Du wirst hier einen groben Überblick finden.
Allerdings biete ich dir auch noch etwas mehr Support an:
- Du benötigst persönlichen Support
- Du möchtest von Beginn an Unterstützung bei deinem Projekt
- Du möchtest ein hier vorgestelltes Plugin durch mich installieren und einrichten lassen
- Du würdest gerne ein von mir erstelltes Script etwas mehr an deine Bedürfnisse anpassen
Für diese Punkte und noch einiges mehr habe ich einen limitierten VIP-Tarif eingerichtet.
Falls der Tarif gerade nicht verfügbar ist, kontaktiere mich auf Discord!
Einfaches Backup mit Monitoring
Hier ein minimales Beispiel - ein Backup-Skript mit CronWolf-Integration:
#!/bin/bash
# Konfiguration
PING_URL="https://cronwolf.de/ping/DEINE-UUID-HIER"
BACKUP_DIR="/mnt/nas/backups"
SOURCE_DIR="/home/pi"
# Backup ausführen
tar -czf "$BACKUP_DIR/backup-$(date +%Y-%m-%d).tar.gz" "$SOURCE_DIR"
# Bei Erfolg: CronWolf benachrichtigen
curl -fsS -m 10 --retry 5 -o /dev/null "$PING_URL"
Die curl-Parameter erklärt
| Parameter | Bedeutung |
|---|---|
-f, --fail | Behandelt HTTP-Fehler (nicht 2xx) als Fehler |
-s, --silent | Unterdrückt Fortschrittsanzeige und Meldungen |
-S, --show-error | Zeigt Fehler trotz -s an |
-m 10 | Timeout nach 10 Sekunden |
--retry 5 | Bis zu 5 Wiederholungsversuche (1s, 2s, 4s, 8s…) |
-o /dev/null | Verwirf die Antwort (nur Fehler werden ausgegeben) |
Wichtig: Der
-mParameter ist besonders am Skript-Anfang kritisch. Du willst nicht, dass ein hängender Ping-Request dein ganzes Backup blockiert!
Fehler aktiv signalisieren
Das obige Beispiel hat einen Schwachpunkt: Wenn das tar-Kommando fehlschlägt, wird trotzdem ein Erfolgs-Ping gesendet (sofern curl funktioniert).
Variante 1: Mit && verknüpfen
#!/bin/bash
PING_URL="https://cronwolf.de/ping/DEINE-UUID-HIER"
BACKUP_DIR="/mnt/nas/backups"
SOURCE_DIR="/home/pi"
# Backup + Ping nur bei Erfolg
tar -czf "$BACKUP_DIR/backup-$(date +%Y-%m-%d).tar.gz" "$SOURCE_DIR" && \
curl -fsS -m 10 --retry 5 -o /dev/null "$PING_URL"
Variante 2: Exit-Status übermitteln
CronWolf akzeptiert den Exit-Status als URL-Suffix. Exit-Code 0 bedeutet Erfolg, alles andere ist ein Fehler:
#!/bin/bash
PING_URL="https://cronwolf.de/ping/DEINE-UUID-HIER"
BACKUP_DIR="/mnt/nas/backups"
SOURCE_DIR="/home/pi"
# Backup ausführen
tar -czf "$BACKUP_DIR/backup-$(date +%Y-%m-%d).tar.gz" "$SOURCE_DIR"
# Exit-Status an CronWolf übermitteln (0=Erfolg, 1-255=Fehler)
curl -fsS -m 10 --retry 5 -o /dev/null "$PING_URL/$?"
Die Variable $? enthält in Bash den Exit-Code des letzten Befehls.
Variante 3: Explizit /fail verwenden
Für mehr Kontrolle kannst du /fail explizit aufrufen:
#!/bin/bash
PING_URL="https://cronwolf.de/ping/DEINE-UUID-HIER"
BACKUP_DIR="/mnt/nas/backups"
SOURCE_DIR="/home/pi"
# Backup ausführen
if tar -czf "$BACKUP_DIR/backup-$(date +%Y-%m-%d).tar.gz" "$SOURCE_DIR"; then
# Erfolg melden
curl -fsS -m 10 --retry 5 -o /dev/null "$PING_URL"
else
# Fehler melden
curl -fsS -m 10 --retry 5 -o /dev/null "$PING_URL/fail"
fi
Laufzeit messen mit /start
KI-BildKI-generiert mit Gemini
CronWolf kann die Laufzeit deiner Backups messen. Sende dazu am Skript-Anfang einen Request an /start:
#!/bin/bash
PING_URL="https://cronwolf.de/ping/DEINE-UUID-HIER"
BACKUP_DIR="/mnt/nas/backups"
SOURCE_DIR="/home/pi"
# Start signalisieren
curl -fsS -m 10 --retry 5 -o /dev/null "$PING_URL/start"
# Backup ausführen
tar -czf "$BACKUP_DIR/backup-$(date +%Y-%m-%d).tar.gz" "$SOURCE_DIR"
# Ende signalisieren (mit Exit-Status)
curl -fsS -m 10 --retry 5 -o /dev/null "$PING_URL/$?"
Bonus-Feature: Wenn der finale Ping nicht innerhalb der Grace Time nach dem Start-Signal kommt, markiert CronWolf den Job als “down”. So erkennst du hängende Backups!
Parallele Jobs mit Run-IDs
Wenn mehrere Instanzen deines Backup-Skripts gleichzeitig laufen können, nutze den rid-Parameter:
#!/bin/bash
PING_URL="https://cronwolf.de/ping/DEINE-UUID-HIER"
RID=$(uuidgen)
# Start mit Run-ID
curl -fsS -m 10 --retry 5 "$PING_URL/start?rid=$RID"
# ... Backup hier ...
# Ende mit gleicher Run-ID
curl -fsS -m 10 --retry 5 "$PING_URL?rid=$RID"
CronWolf ordnet Start- und End-Pings anhand der Run-ID korrekt zu.
Logs an CronWolf senden
Du kannst die Ausgabe deines Backup-Skripts an CronWolf übermitteln. Das ist Gold wert für die Fehleranalyse:
#!/bin/bash
PING_URL="https://cronwolf.de/ping/DEINE-UUID-HIER"
BACKUP_DIR="/mnt/nas/backups"
SOURCE_DIR="/home/pi"
# Backup ausführen und Output capturen
output=$(tar -czvf "$BACKUP_DIR/backup-$(date +%Y-%m-%d).tar.gz" "$SOURCE_DIR" 2>&1)
exit_code=$?
# Output per POST an CronWolf senden
curl -fsS -m 10 --retry 5 --data-raw "$output" "$PING_URL/$exit_code"
Bei sehr großen Outputs begrenzt CronWolf die Speicherung auf die ersten Kilobytes. Tipp: Sende nur die letzten Zeilen:
# Nur die letzten 10KB senden
output=$(tar -czvf ... 2>&1 | tail --bytes=10000)
curl -fsS -m 10 --retry 5 --data-raw "$output" "$PING_URL/$exit_code"
Beispiel: Backup-Skript mit CronWolf-Integration
Das folgende Skript demonstriert alle besprochenen Monitoring-Techniken. Passe SOURCE_DIRS an deine Bedürfnisse an (z.B. Docker-Volumes, Home Assistant Config, etc.):
#!/bin/bash
#
# Raspberry Pi Backup mit CronWolf Monitoring
# Autor: DarkWolfCave.de
#
set -o pipefail # Auch Pipeline-Fehler erkennen
# === KONFIGURATION ===
PING_URL="https://cronwolf.de/ping/DEINE-UUID-HIER"
BACKUP_DIR="/mnt/nas/pi-backups"
SOURCE_DIRS="/home/pi /etc"
RETENTION_DAYS=30
LOG_FILE="/var/log/pi-backup.log"
# === FUNKTIONEN ===
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# === START ===
log "=== Backup gestartet ==="
# Start-Signal an CronWolf
curl -fsS -m 10 --retry 5 -o /dev/null "$PING_URL/start"
# Backup-Verzeichnis prüfen
if [ ! -d "$BACKUP_DIR" ]; then
log "FEHLER: Backup-Verzeichnis nicht erreichbar: $BACKUP_DIR"
curl -fsS -m 10 --retry 5 --data-raw "Backup-Verzeichnis nicht erreichbar" "$PING_URL/fail"
exit 1
fi
# Speicherplatz prüfen (mindestens 1GB frei)
available_kb=$(df "$BACKUP_DIR" | awk 'NR==2 {print $4}')
if [ "$available_kb" -lt 1048576 ]; then
log "FEHLER: Weniger als 1GB Speicherplatz verfügbar"
curl -fsS -m 10 --retry 5 --data-raw "Zu wenig Speicherplatz: ${available_kb}KB frei" "$PING_URL/fail"
exit 1
fi
# Backup erstellen
BACKUP_FILE="$BACKUP_DIR/backup-$(hostname)-$(date +%Y-%m-%d_%H%M%S).tar.gz"
log "Erstelle Backup: $BACKUP_FILE"
backup_output=$(tar -czf "$BACKUP_FILE" $SOURCE_DIRS 2>&1)
backup_exit=$?
if [ $backup_exit -ne 0 ]; then
log "FEHLER: Backup fehlgeschlagen (Exit-Code: $backup_exit)"
curl -fsS -m 10 --retry 5 --data-raw "$backup_output" "$PING_URL/$backup_exit"
exit $backup_exit
fi
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log "Backup erstellt: $BACKUP_SIZE"
# Alte Backups aufräumen
log "Lösche Backups älter als $RETENTION_DAYS Tage..."
find "$BACKUP_DIR" -name "backup-*.tar.gz" -mtime +$RETENTION_DAYS -delete
# Erfolg melden
SUMMARY="Backup erfolgreich: $BACKUP_FILE ($BACKUP_SIZE)"
log "$SUMMARY"
curl -fsS -m 10 --retry 5 --data-raw "$SUMMARY" "$PING_URL"
log "=== Backup beendet ==="
Hardware für Docker-Backups und Datensicherung
Backup & Storage Hardware
| Bild | Produkt | Preis | |
|---|---|---|---|
| Produktdaten werden geladen... | |||
Für produktive Umgebungen: Schau dir raspiBackup an - ein ausgereiftes Backup-Tool speziell für Raspberry Pi mit rsync/tar/dd-Methoden, Smart Recycle, NFS-Support und vielem mehr. Die CronWolf-Integration funktioniert genauso: Ping am Ende des Backup-Skripts.
Cronjob einrichten
Nutze den Crontab Generator, um den passenden Cron-Ausdruck zu erstellen. Dann öffne die Crontab:
crontab -e
Füge eine Zeile hinzu:
# Tägliches Backup um 3:00 Uhr
0 3 * * * /home/pi/scripts/backup.sh >> /var/log/backup-cron.log 2>&1
Wichtig: Verwende immer absolute Pfade! Cronjobs haben eine minimale Umgebung ohne dein normales PATH.
Benachrichtigungen einrichten
CronWolf unterstützt verschiedene Benachrichtigungskanäle:
- E-Mail: Standard, für alle wichtigen Alerts
- Webhooks: Für eigene Integrationen
- Chat-Integration: Discord, Slack, Telegram
- SMS: Für kritische Systeme
Mein Tipp: Richte mindestens zwei verschiedene Kanäle ein - falls einer ausfällt, erreichst du noch der andere.
Pro-Tipp: In den Account-Einstellungen kannst du wiederholte E-Mail-Benachrichtigungen aktivieren. So bekommst du stündlich oder täglich eine Erinnerung, solange ein Job “down” ist. Perfekt, damit nichts in Vergessenheit gerät!
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Ping kommt nicht an | Netzwerkfehler | --retry 5 verwenden |
| Falsche Uhrzeit | Zeitzone | timedatectl set-timezone Europe/Berlin |
| Skript läuft nicht | Berechtigungen | chmod +x script.sh |
| Pfad nicht gefunden | Relativer Pfad | Immer absolute Pfade verwenden |
| Backup dauert zu lange | Grace Time zu kurz | Grace Time in CronWolf erhöhen |
Zeitzone prüfen
Cronjobs verwenden die Systemzeit. Prüfe sie mit:
timedatectl status
Bei Bedarf korrigieren:
sudo timedatectl set-timezone Europe/Berlin
Logs analysieren
# Cron-Logs anzeigen (letzte Stunde)
journalctl --since "1 hour ago" -t CRON
# Dein Backup-Log
tail -100 /var/log/pi-backup.log
Weiterführende Links
- Crontab Generator - Cron-Ausdrücke einfach erstellen
- Docker Backup für Raspberry Pi - Container-Backups automatisieren
- CronWolf Monitoring - Cronjob-Überwachung einrichten
- CronWolf Einführung - Ausführliche Anleitung
Ein überwachtes Backup ist ein gutes Backup. Mit CronWolf und den Techniken aus diesem Artikel weißt du immer, ob deine Sicherungen laufen - oder ob etwas schief geht. Das gibt dir die Sicherheit, die du brauchst.
Hast du Fragen oder eigene Backup-Strategien? Schreib mir in den Kommentaren oder komm auf meinen Discord-Kanal!
Kommentare