DarkWolfCave
raspberry

Raspberry Pi Backups automatisieren und überwachen mit CronWolf

Raspberry Pi Backup Automatisierung mit CronWolf Monitoring
DarkWolf mit Newsletter KI-Bild Generiert mit Gemini

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

Wolf Analytics - Monitoring KonzeptKI-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.

VIP Support
Wolf Support Avatar

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

ParameterBedeutung
-f, --failBehandelt HTTP-Fehler (nicht 2xx) als Fehler
-s, --silentUnterdrückt Fortschrittsanzeige und Meldungen
-S, --show-errorZeigt Fehler trotz -s an
-m 10Timeout nach 10 Sekunden
--retry 5Bis zu 5 Wiederholungsversuche (1s, 2s, 4s, 8s…)
-o /dev/nullVerwirf die Antwort (nur Fehler werden ausgegeben)

Wichtig: Der -m Parameter 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

Wolf mit Stoppuhr - LaufzeitmessungKI-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

Werbung

Backup & Storage Hardware

Bild Produkt Preis
Produktdaten werden geladen...
Letzte Aktualisierung: - | Infos zu Affiliate Links | Bilder von der Amazon Product Advertising API

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

ProblemUrsacheLösung
Ping kommt nicht anNetzwerkfehler--retry 5 verwenden
Falsche UhrzeitZeitzonetimedatectl set-timezone Europe/Berlin
Skript läuft nichtBerechtigungenchmod +x script.sh
Pfad nicht gefundenRelativer PfadImmer absolute Pfade verwenden
Backup dauert zu langeGrace Time zu kurzGrace 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

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!

FAQ - Frequently Asked Questions DarkWolfCave
DarkWolf hilft bei FAQs

Häufig gestellte Fragen

Was ist ein Dead Man's Switch bei Cronjob-Monitoring?
Ein Dead Man's Switch ist ein Überwachungsprinzip: Dein Cronjob sendet nach erfolgreicher Ausführung einen 'Ping' an CronWolf. Bleibt dieser Ping aus, weißt du, dass etwas nicht stimmt - sei es durch Stromausfall, defekte Hardware, falsche Cron-Konfiguration oder einen Skript-Fehler.
Warum sollte ich curl mit --retry und -m verwenden?
Der Parameter -m 10 setzt ein Timeout von 10 Sekunden - damit blockiert ein hängender Request nicht dein gesamtes Backup. --retry 5 wiederholt fehlgeschlagene Requests bis zu 5 Mal mit steigenden Wartezeiten (1s, 2s, 4s, 8s...). So werden temporäre Netzwerkprobleme automatisch überbrückt.
Was ist der Unterschied zwischen /fail und /{exit-status}?
Beide signalisieren einen Fehler an CronWolf. /fail ist ein generischer Fehler-Endpoint. /{exit-status} übermittelt den konkreten Exit-Code (0-255) deines Skripts - dabei wird 0 als Erfolg und alle anderen Werte als Fehler interpretiert. Mit PING_URL/$? in Bash nutzt du automatisch den Exit-Code des letzten Befehls.
Wie messe ich die Laufzeit meines Backup-Skripts?
Sende am Start deines Skripts einen Request an PING_URL/start. CronWolf misst dann die Zeit bis zum finalen Ping und zeigt dir die Laufzeit an. Bonus: Wenn der finale Ping innerhalb der konfigurierten Grace Time ausbleibt, wirst du benachrichtigt - dein Backup hängt!
Was ist die Grace Time und wie stelle ich sie ein?
Grace Time ist die Karenzzeit, die CronWolf nach dem erwarteten Ausführungszeitpunkt wartet, bevor ein Alarm ausgelöst wird. Wenn dein Backup normalerweise 15-25 Minuten dauert, setze die Grace Time auf 30 Minuten. So vermeidest du Fehlalarme bei längeren Läufen.
Kann ich die Ausgabe meines Backup-Skripts an CronWolf senden?
Ja! Mit curl --data-raw "$output" PING_URL sendest du Text per HTTP POST. CronWolf speichert die ersten Kilobytes und zeigt sie dir in der Event-Ansicht. Bei großen Outputs nutze tail --bytes=10000 um nur die letzten 10KB zu senden.

Kommentare

Kommentare werden geladen...