Wie ich meine Nextcloud lokal sichere
Veröffentlicht am 03 April 2026 von oemmes — 3 min
Ich habe mir eine gehostete Nextcloud Instanz gemietet. Der Hoster macht zwar Backups, aber ich traue dem nicht so ganz und hätte gerne Backups bei mir lokal und geografisch redundant.
Ich habe bereits als ich meine Nextcloud zuhause selbst gehostet habe einen "Backup-PC" gehabt. Die lokalen Backups wurden auf externe Platten kopiert die niedrigschwellig rotiert werden können. (Wird später in einem separaten Beirag beschrieben)
Kürzlich habe ich entdeckt, wie gut mir KI bei bestimmten Aufgaben (Bash-Scripting) helfen kann. Ich habe KI bisher als "böse" erachtet und eher gehasst, aber ich war offen genug es auf einen Versuch ankommen zu lassen. So habe ich mir von Claude helfen lassen meine Backupskripte zu verbessern und anzupassen und bin begeistert.
Bisher habe ich meine Nextcloud per webdav als Eintrag in der /etc/fstab eingebunden und die Daten kopiert. Das klappte seit einiger Zeit nicht mehr, ich hatte aber auch nicht die Motivation dort auf Fehlersuche zu gehen.
Bisher habe ich mich auch per ntfy benachrichtigen lassen, wollte aber aus Komfort- und Sicherheitsgründen auf eine Benachrichtigung per Gotify umsteigen.
Nach einigem hin& her und Verbesserungen durch Claude wird die Nextcloud nun per rclone (das kannte ich bis dahin nicht, tolles Tool!) eingebunden und gesichert.
Das Backupskript wird per crontab gestartet, meldet Start und Ende (mit Statistiken) per Gotify auf mein Handy:

Nun also zum Backupskript:
Zuerst wird rclone installiert:
sudo apt install rclone
Danach wird rclone konfiguriert
rclone config
Folgende Angaben werden gemacht:
n → New remote
Name: nextcloud
Type: webdav
URL: https://DEINE-NEXTCLOUD-URL/remote.php/dav/files/DEIN-USERNAME/
Vendor: nextcloud
User: DEIN-USERNAME
Password: (Hier ein Nextcloud App-Passwort erstellen und das verwenden)
Danach wird das Backupskript erzeugt und befüllt
sudo nano /usr/local/bin/nextcloud-backup.sh
So sieht das endgültige Skript aus:
#!/bin/bash
REMOTE="nextcloud:"
LOCAL="/mnt/backup/nextcloud"
LOG="/var/log/nextcloud-backup.log"
STATS_LOG="/tmp/nextcloud-backup-stats.log"
# --- Gotify Konfiguration ---
GOTIFY_URL="https://DEINE-GOTIFY-URL"
GOTIFY_TOKEN="DEIN-APP-TOKEN"
gotify_send() {
local TITLE="$1"
local MESSAGE="$2"
local PRIORITY="$3" # 5=normal, 8=hoch (Fehler)
curl -s -X POST "${GOTIFY_URL}/message" \
-H "X-Gotify-Key: ${GOTIFY_TOKEN}" \
--data-urlencode "title=${TITLE}" \
--data-urlencode "message=${MESSAGE}" \
--data-urlencode "priority=${PRIORITY}" \
>> "$LOG" 2>&1
}
# --- Start ---
START_TIME=$(date +%s)
echo "=== Backup gestartet: $(date) ===" >> "$LOG"
MSG="Synchronisation mit Nextcloud wurde gestartet.
Ziel: ${LOCAL}"
gotify_send "☁️ Nextcloud-Backup gestartet" "$MSG" 5
mkdir -p "$LOCAL"
# --- rclone sync ---
rclone sync "$REMOTE" "$LOCAL" \
--transfers=4 \
--checkers=8 \
--log-file="$LOG" \
--log-level=INFO \
--stats=60s \
--stats-log-level=INFO \
--backup-dir="/mnt/backup/nextcloud-deleted/$(date +%Y-%m-%d)" \
2>&1 | tee -a "$STATS_LOG"
EXIT_CODE=${PIPESTATUS[0]}
# --- Statistik aus rclone-Log extrahieren ---
TRANSFERRED=$(grep -oP 'Transferred:.*' "$LOG" | tail -1)
ERRORS=$(grep -oP 'Errors:\s*\K[0-9]+' "$LOG" | tail -1)
# --- Laufzeit berechnen ---
END_TIME=$(date +%s)
DURATION=$(( END_TIME - START_TIME ))
DURATION_FMT=$(printf '%02d:%02d:%02d' $((DURATION/3600)) $((DURATION%3600/60)) $((DURATION%60)))
# --- Erfolg oder Fehler melden ---
if [ "$EXIT_CODE" -eq 0 ]; then
echo "=== Backup erfolgreich beendet: $(date) ===" >> "$LOG"
MSG="Backup erfolgreich abgeschlossen.
Dauer: ${DURATION_FMT}
${TRANSFERRED}
Fehler: ${ERRORS:-0}
Log: ${LOG}"
gotify_send "✅ Nextcloud-Backup erfolgreich" "$MSG" 5
else
echo "=== Backup FEHLGESCHLAGEN (Exit-Code: ${EXIT_CODE}): $(date) ===" >> "$LOG"
LAST_ERROR=$(grep -i "error\|failed" "$LOG" | tail -3 | tr '\n' ' ')
MSG="Backup fehlgeschlagen! Exit-Code: ${EXIT_CODE}
Dauer: ${DURATION_FMT}
Letzte Fehler:
${LAST_ERROR}
Log: ${LOG}"
gotify_send "❌ Nextcloud-Backup FEHLGESCHLAGEN" "$MSG" 8
fi
# Temp-Datei aufräumen
rm -f "$STATS_LOG"