Wer seinen Bootstick ohne Unraid Connect backupen will, muss sich dafür nur das User Script Plugin installieren.
Danach einfach ein neues Script mit folgenden Inhalt anlegen:
#!/bin/bash
#Ziel des Backups
BACKUP_DEST="/mnt/user/backup/boot/"
#Logverzeichnis + Index
LOG_DIR="/mnt/user/logs/backup"
#Verzeichnis lokal auf Unraid um ZIP zu packen
TEMP_DIR="/mnt/user/backup/temp/"
#Anzahl der zu behaltenden Backups
MAX_BACKUPS=3
#Passwort für ZIP-file -> darf nicht leer sein!
PASSWORD="TEST"

#Dont touch this!
SOURCE="/boot/"
LOG_FILE="$LOG_DIR/backup.log"
ZIP_FILENAME="backup_$(date '+%Y%m%d%H%M%S').zip"
INDEX_CURRENT="$LOG_DIR/index_current"
INDEX_OLD="$LOG_DIR/index_old"
#Funktion zum Protokollieren von Informationen
log() {
local type="$1"
local message="$2"
echo "$(date '+%Y-%m-%d %H:%M:%S') - $type: $message" >> "$LOG_FILE"
}
# Funktion zum Vergleichen von Index-Dateien und Protokollieren geänderter Dateien
compare_and_log_changes() {
  local index_old="$1"
  local index_current="$2"
  # Vergleiche die Index-Dateien und protokolliere Änderungen
  diff_output=$(diff "$index_old" "$index_current")
  if [ $? -eq 0 ]; then
    log "Info" "Keine Änderungen im Quellverzeichnis festgestellt."
  else
    log "Info" "Änderungen im Quellverzeichnis festgestellt:"
    log "CHANGE" "$diff_output"
  fi
}
# Initialisierung: Überprüfen, ob ein Backup vorhanden ist
if [ ! -f "$INDEX_CURRENT" ]; then
  log "Info" "Kein vorhandenes Backup. Initialisiere Backup."
  # Erstellen Sie das Zip-Archiv
  if rsync -a --delete --checksum --modify-window=1 "$SOURCE/" "$TEMP_DIR" \
    --exclude=".fseventsd" --exclude=".git" --exclude=".Spotlight-V100" \
    --exclude=".gitattributes" --exclude="syslinux.cfg-" \
    --exclude="System Volume Information/" --exclude="previous/" \
    --exclude="ldlinux.c32" --exclude="ldlinux.sys"; then
    # Erstellen Sie das Zip-Archiv
    if TZ=UTC zip -r -P "$PASSWORD" "$BACKUP_DEST/$ZIP_FILENAME" -y "$TEMP_DIR"/*; then
      # Erstellen Sie die Index-Datei
      find "$SOURCE" -type f \( ! -path "*/.git/*" -a ! -path "*/.fseventsd/*" -a ! -path "*/.Spotlight-V100/*" -a ! -path "*/System Volume Information/*" -a ! -path "*/previous/*" -a ! -name ".gitattributes" -a ! -name "syslinux.cfg-" -a ! -name "ldlinux.c32" -a ! -name "ldlinux.sys" -a ! -name "docker.cfg" \) -exec stat --format="%n %Y" {} \; > "$INDEX_CURRENT"
      compare_and_log_changes "$INDEX_OLD" "$INDEX_CURRENT"
    else
      log "Error" "Fehler beim Erstellen des Zip-Archivs."
    fi
  else
    log "Error" "Fehler beim Synchronisieren der Daten."
  fi
else
  # Backup vorhanden: Vergleiche die Index-Dateien
  mv "$INDEX_CURRENT" "$INDEX_OLD"
   find "$SOURCE" -type f \( ! -path "*/.git/*" -a ! -path "*/.fseventsd/*" -a ! -path "*/.Spotlight-V100/*" -a ! -path "*/System Volume Information/*" -a ! -path "*/previous/*" -a ! -name ".gitattributes" -a ! -name "syslinux.cfg-" -a ! -name "ldlinux.c32" -a ! -name "ldlinux.sys" -a ! -name "docker.cfg" \) -exec stat --format="%n %Y" {} \; > "$INDEX_CURRENT"
  compare_and_log_changes "$INDEX_OLD" "$INDEX_CURRENT"
  # Überprüfe Änderungen zwischen Index-Dateien
  if ! cmp -s "$INDEX_OLD" "$INDEX_CURRENT"; then
    # Überprüfen Sie die Anzahl der vorhandenen Backups
    num_backups=$(ls -1 "$BACKUP_DEST" | grep -c "backup_.*\.zip")
    if [ "$num_backups" -ge "$MAX_BACKUPS" ]; then
      # Löschen des ältesten Backups
      oldest_backup=$(ls -1t "$BACKUP_DEST" | grep "backup_.*\.zip" | tail -1)
      rm "$BACKUP_DEST/$oldest_backup"
      log "Info" "Ältestes Backup ($oldest_backup) gelöscht."
    fi
    # Erstellen Sie das Zip-Archiv
    if rsync -a --delete --checksum --modify-window=1 "$SOURCE/" "$TEMP_DIR" \
      --exclude=".fseventsd" --exclude=".git" --exclude=".Spotlight-V100" \
      --exclude=".gitattributes" --exclude="syslinux.cfg-" \
      --exclude="System Volume Information/" --exclude="previous/" \
      --exclude="ldlinux.c32" --exclude="ldlinux.sys"; then
      # Erstellen Sie das Zip-Archiv
      if TZ=UTC zip -r -P "$PASSWORD" "$BACKUP_DEST/$ZIP_FILENAME" -y "$TEMP_DIR"/*; then
        compare_and_log_changes "$INDEX_OLD" "$INDEX_CURRENT"
      else
        log "Error" "Fehler beim Erstellen des Zip-Archivs."
      fi
    else
      log "Error" "Fehler beim Synchronisieren der Daten."
    fi
  fi
  # Lösche die temporären Dateien
  rm "$INDEX_OLD"
  rm -r "$TEMP_DIR"
fi

Danach noch den Cron auf zb. stündlich stellen.


Zuletzt geprüft und bearbeitet: 27. Nov 2023 @ 23:30