snap shots Backup script

Bist du selber in der Lage den Code einer KI zu bewerten, ob er gut ist oder nicht? Funktionieren ist kein Kriterium dafür. Es bringt nichts, wenn es funktioniert, aber da Sicherheitslücken ohne Ende drin sind. Oder nur der Happy Path ordentlich läuft. Das ist halt nicht alles so schön wie man denkt bei der tollen KI.
 
das script
Code:
#!/bin/bash
# ==============================================================================
# SCRIPT: 01_backup_remote.sh (V3 - Robust-Edition)
# ZWECK: ZFS Snapshots + System-Konfig + Sicherheits-Checks + Push
# ==============================================================================

# --- 1. INITIALISIERUNG & KONFIGURATION ---
source /usr/local/sbin/01_backup/001_global_config.sh

BLUE='\033[0;34m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'

ALERT=0
START_TIME=$(date +%s)
TIMESTAMP=$(date '+%Y-%m-%d_%H-%M-%S')
SYS_REMOTE_PATH="${BACKUPPOOL}/sysdata-${MY_IP##*.}"

clear
echo -e "${BLUE}================================================================${NC}"
echo -e " Start ZFS & System Remote-Backup: $(date '+%d.%m.%Y %H:%M')"
echo -e "️  Quelle: ${YELLOW}$HOST ($MY_IP)${NC} |  Ziel: ${YELLOW}$REMOTE_HOST${NC}"
echo -e "${BLUE}================================================================${NC}\n"

# --- 2. PRE-FLIGHT CHECKS (Sicherheits-Prüfungen) ---
echo -e "${BLUE}▶ Starte Sicherheits-Checks...${NC}"

# A) Ist der Quell-Pool gesund?
POOL_HEALTH=$(zpool status "$MASTERPOOL" | grep "state:" | awk '{print $2}')
if [ "$POOL_HEALTH" != "ONLINE" ]; then
    msg=" ABBRUCH: Quell-Pool $MASTERPOOL ist $POOL_HEALTH! Backup riskant."
    echo -e "${RED}$msg${NC}"
    [ -f "$SEND_PUSH" ] && "$SEND_PUSH" "$msg" warn
    exit 1
fi

# B) Ist der Ziel-Server per Ping erreichbar?
if ! ping -c 1 -W 2 "$REMOTE_HOST" >/dev/null 2>&1; then
    msg=" ABBRUCH: Ziel-Server $REMOTE_HOST ist nicht erreichbar (Ping failed)!"
    echo -e "${RED}$msg${NC}"
    [ -f "$SEND_PUSH" ] && "$SEND_PUSH" "$msg" warn
    exit 1
fi

# C) Speicherplatz auf dem Ziel-Pool prüfen (Abbruch bei > 95%)
REMOTE_USAGE=$(ssh root@$REMOTE_HOST "zfs list -H -o capacity $BACKUPPOOL" 2>/dev/null | cut -d'%' -f1)
if [ -n "$REMOTE_USAGE" ] && [ "$REMOTE_USAGE" -gt 95 ]; then
    msg=" ABBRUCH: Ziel-Pool $BACKUPPOOL ist zu $REMOTE_USAGE% voll!"
    echo -e "${RED}$msg${NC}"
    [ -f "$SEND_PUSH" ] && "$SEND_PUSH" "$msg" warn
    exit 1
fi
echo -e "  ✅ Sicherheits-Checks bestanden (Pool OK, Ping OK, Platz: ${REMOTE_USAGE:-0}%).\n"

# --- 3. SYSTEM-KONFIGURATION SICHERN (/etc & Paketliste) ---
echo -e "${BLUE}▶ Sichere System-Konfiguration...${NC}"
ssh root@$REMOTE_HOST "mkdir -p /${SYS_REMOTE_PATH}/etc" 2>/dev/null

dpkg --get-selections > /tmp/packages.txt
rsync -az /tmp/packages.txt root@$REMOTE_HOST:/${SYS_REMOTE_PATH}/ 2>/dev/null
rm -f /tmp/packages.txt

if rsync -avz --delete /etc/ root@$REMOTE_HOST:/${SYS_REMOTE_PATH}/etc/ >/dev/null 2>&1; then
    echo -e "  ✅ /etc & Paketliste nach ${YELLOW}${SYS_REMOTE_PATH}${NC} gesichert.\n"
else
    msg=" SYSTEM-BACKUP FEHLER: /etc auf $HOST konnte nicht übertragen werden."
    echo -e "  ❌ ${RED}$msg${NC}\n"
    [ -f "$SEND_PUSH" ] && "$SEND_PUSH" "$msg" warn
    ALERT=1
fi

# --- 4. ZFS BACKUP-SCHLEIFE ---
for DS in "${DATASETS[@]}"; do
    MASTER_DS="${MASTERPOOL}/${DS}"
    TARGET_DS="${BACKUPPOOL}/pve_${MY_IP}/${DS}"
    NEWSNAP="${MASTER_DS}@${PREFIX}-${TIMESTAMP}"

    echo -e "${BLUE}▶ ZFS Dataset:${NC} ${YELLOW}$DS${NC}"
    
    # Snapshot erstellen
    if zfs snapshot "$NEWSNAP" 2>/dev/null; then
        echo -e "  ✅ Snapshot: ${PREFIX}-${TIMESTAMP}"
    else
        msg=" SNAPSHOT FEHLER: $DS auf $HOST fehlgeschlagen!"
        echo -e "  ❌ ${RED}$msg${NC}"
        [ -f "$SEND_PUSH" ] && "$SEND_PUSH" "$msg" warn
        ALERT=1; continue
    fi

    # Remote-Check & Transfer
    LAST_REMOTE_SNAP=$(ssh root@$REMOTE_HOST "zfs list -H -t snapshot -o name -s creation $TARGET_DS" 2>/dev/null | grep "@${PREFIX}-" | tail -1 | cut -d@ -f2)

    if [ -z "$LAST_REMOTE_SNAP" ]; then
        echo -e "   ${YELLOW}Modus: FULL-TRANSFER${NC}"
        zfs send -cL "$NEWSNAP" | pv -N "Full: $DS" | mbuffer -m 256M | ssh root@$REMOTE_HOST "zfs recv -Fp $TARGET_DS"
    else
        echo -e "   ${YELLOW}Modus: INKREMENTELL (ab $LAST_REMOTE_SNAP)$NC"
        zfs send -cL -i "${MASTER_DS}@${LAST_REMOTE_SNAP}" "$NEWSNAP" | pv -N "Incr: $DS" | mbuffer -m 256M | ssh root@$REMOTE_HOST "zfs recv -Fu $TARGET_DS"
    fi

    if [ ${PIPESTATUS[0]} -eq 0 ]; then
        echo -e "  ✨ ${GREEN}ZFS Transfer erfolgreich.${NC}\n"
    else
        msg=" ZFS TRANSFER FEHLER: $DS konnte nicht an $REMOTE_HOST gesendet werden!"
        echo -e "   ${RED}$msg${NC}\n"
        [ -f "$SEND_PUSH" ] && "$SEND_PUSH" "$msg" warn
        ALERT=1
    fi

    # Retention (Aufräumen)
    zfs list -H -t snapshot -o name -s creation "$MASTER_DS" | grep "@${PREFIX}-" | head -n -"$KEEPOLD_MASTER" | xargs -n 1 zfs destroy -r 2>/dev/null
    ssh root@$REMOTE_HOST "zfs list -H -t snapshot -o name -s creation $TARGET_DS | grep '@${PREFIX}-' | head -n -"$KEEPOLD_BACKUP" | xargs -n 1 zfs destroy -r 2>/dev/null"
done

# --- 5. ABSCHLUSS & PUSH ---
DURATION=$(( $(date +%s) - START_TIME ))

if [ $ALERT -eq 0 ]; then
    PUSH_TEXT="✅ Backup OK: $HOST -> $REMOTE_HOST (${DURATION}s). /etc & Datasets synchron."
    [ -f "$SEND_PUSH" ] && "$SEND_PUSH" "$PUSH_TEXT" success
    echo -e "${GREEN} Alles erledigt. Erfolgs-Push gesendet.${NC}"
else
    echo -e "${RED} Backup mit Fehlern beendet. Warnungen wurden gesendet.${NC}"
fi
echo -e "${BLUE}================================================================${NC}"
 
Wie erwartet, stumpfer KI Slop.
KI ist halt echt eine Dunning Kruger Machine.

Ist nett gemeint Kleiner, aber glaube niemand hat hier interesse an einem Backup KI Slop von jemandem, der noch nicht mal weiss, wie er 4 Dateien auf Github teilt.

Nur mal so als kleiner Input, warum dein Script strunzdumm ist:
- Ob der Quell Pool gesund ist, geht ein Backup tool nix an. Was wenn dieser health check versehentlich failed? Dann gibt es kein Backup mehr, weil das check failed?

- Es geht das Backup tool auch nix an, ob das Ziel erreichbar ist oder nicht. Das Backup soll einfach versucht werden, wenn das Ziel nicht erreichbar ist, schlägt es fehl und löst Konsequenzen wie alarmierung aus. Dein Script hingegen checked den online Status mittels Ping. Ping ist ICMP. ICMP wird von fast allen per default geblockt. Dein script meint also immer, das Ziel wäre offline.

Weiter habe ich gar nicht erst gelesen.

Weiterer Kritikpunkt: Beschreib doch bitte mal zuerst was dein Tool können soll, wozu es da ist, und wie es das macht. Zum Beispiel so:

Mein Tool "Proxmox_ZFS_Send" ist ein tool, welches automatisiert ZFS snapshots macht und diese mittels ZFS send an remote destinations schickt.

Dann kann sich jemand der auf PBS schwört vielleicht schon mal sagen, "das ist nicht mein use case, da bin ich raus" und muss gar nicht weiter lesen.

Wenn du jetzt meine sachliche Kritik als "AI Hate" abtun möchtest, feel free.
 
Last edited:
Es wäre auch nicht schlecht wenn man ALLES posten würde. Du hast gesagt, das wären 4 Dateien.
 
Ohne jetzt noch gross auf die Diskussion „KI gut oder böse” einzugehen, hier nur eine Zusatzinfo für alle, die auf diesen Thread stossen, weil sie ZFS-Snapshots/Replikation machen wollen. Vielleicht ist es ja auch hilfreich für dich, @hackmann

Sanoid/Synchoid existiert. Ich bin kein Experte, wenn es darum geht, den Code von Sanoid oder deinen zu beurteilen. Sanoid gibt es aber schon seit Jahren, es ist sogar in den Debian-Repositories enthalten und kann somit auch über apt installiert werden (allerdings von dort nicht in der neuesten Version). Meiner Meinung nach ist es doch einiges ausgeklügelter als dein KI-Experiment, soweit ich es mit meinen sehr begrenzten Programmierkenntnissen beurteilen kann. Was ich definitiv sagen kann, ist, dass ich es seit Jahren nutze (nur den Snapshot-Teil ohne Replikationen) und es absolut zuverlässig und unauffällig im Hintergrund läuft. Ich habe auch schon Snapshots, die damit erstellt wurden, zurückgerollt oder geklont, und das hat immer einwandfrei funktioniert.

Also, liebe A.I.-Fans und Vibecoder: Schaut euch doch auch mal an, was es da draussen bereits alles gibt, bevor ihr versucht, das Rad neu zu erfinden, und es dann auf die Öffentlichkeit loslasst bzw. von dieser prüfen lassen wollt. ;)
 
Last edited:
Andere Optionen:
Ich habe schon länger auf meiner todo mein Homelab von zfs-auto-snapshots zu c4pve-autosnap zu migrieren, finde aber nicht die Zeit dazu. Warum sollte ich die Zeit stattdessen dann in eine per Vibecoding verbrochenes Skript investieren?
 
ich nutze zfs-auto-snapshots und c4pve-autosnap parallel, c4pve-autosnap für meine VMs und Kontainer und zfs-auto-snapshots für meine Datasets
man kommt damit sehr schnell an ältere Daten falls man diese mal benötigen sollte
 
Na wenigstens scheint die Ausgabe schön bunt zu sein.
Womöglich bekommen wir noch ein script für die Rücksicherung geliefert, bevor der KI-Apologet erkennt, dass ein PBS sein (vermutetes) Ansinnen bereits erheblich eleganter abbildet.
 
Last edited:
  • Like
Reactions: Johannes S
Womöglich bekommen wir noch ein script für die Rücksicherung geliefert, bevor der KI-Apologet erkennt, dass ein PBS sein Ansinnen bereits elegant abbildet.
Naja, grundsätzlich haben ZFS-Snapshots und -Replikation schon ihre Berechtigung. Wobei ich die Replikation auch nicht nutze, da ich, vzdump und mittlerweile für einige Maschinen auch noch Proxmox Backup Server für die eigentlichen Backups verwende.

Der Vorteil von ZFS-Snapshots ist, dass man innerhalb einer Sekunde zurückrollen kann. Ausserdem kann man ZFS Snapshots klonen und mounten, umd dann auf einzelne Dateien zugreifen oder die geklonte Disk als separate VM starten.

Die Vorteile der ZFS-Replikation sind, dass sie mit jedem ZFS-System funktioniert, Push oder Pull unterstützt und das alles auch auf langsamem „Spinning Rust“. Für den Proxmox Backup Server braucht man halt, nun ja, einen Proxmox Backup Server. ;)

Der Nachteil von ZFS-Snapshots ist, dass die Maschine nicht „aware“ ist was passiert. Sprich: Wenn du auf einen ZFS Snapshot zurückrollst, befindet sich das Betriebssystem in einem Zustand, als hättest du bei einer physischen Maschine einfach den Stecker gezogen. Bei mir hat das allerdings noch nie Probleme gemacht.
 
Last edited:
  • Like
Reactions: Johannes S
Klar. ZFS-snapshots haben auch ihre Daseinsberechtigung. Die Dinger lassen ja ein schnelles Rollback zu. Tools dafür bringt ZFS ja von Haus aus mit. Ich bin aber noch nie auf die Idee gekommen, diese irgendwohin zu replizieren.
Woher also der Wunsch, hier etwas Schwindliges rumscripten zu lassen?
 
Klar. ZFS-snapshots haben auch ihre Daseinsberechtigung. Die Dinger lassen ja ein schnelles Rollback zu. Tools dafür bringt ZFS ja von Haus aus mit. Ich bin aber noch nie auf die Idee gekommen, diese irgendwohin zu replizieren.
Woher also der Wunsch, hier etwas Schwindliges rumscripten zu lassen?
Nun, wenn du sie irgendwohin replizierst, hast du auch gleich ein Backup. Wenn du sie von irgendwo pullst, hast du sogar immutable Backups.

Aber ja, im Falle von Proxmox VE würde ich auch eher PBS oder zumindest regelmässige vzdumps empfehlen, für Firmen sowieso, nur schon wegen des offiziellen Supports.

Grundsätzlich ist aber eine Replikation der ZFS-Snapshots durchaus als Backup geeignet. Die Frage ist hier eher (wenn man diesen Weg gehen will), ob man nicht besser auf bewährte Lösungen zurückgreifen sollte, anstatt sich etwas zu vibecoden. ;)
 
Last edited:
Nun, wenn du sie irgendwohin replizierst, hast du auch gleich ein Backup. Wenn du sie von irgendwo pullst, hast du sogar immutable Backups.

Aber ja, im Falle von Proxmox VE würde ich auch eher PBS oder zumindest regelmässige vzdumps empfehlen, für Firmen sowieso, nur schon wegen des offiziellen Supports.

Grundsätzlich ist aber eine Replikation der ZFS-Snapshots, durchaus als Backup geeignet.
Natürlich kann ich KVM oder LXC ganz ohne PVE nutzen. ZFS bekomme ich auch zu Fuß geregelt.
Warum sollte ich aber das Rad zweimal erfinden bzw. von einer KI erfinden lassen?
Warum stelle ich meine KI-Ergüsse bzgl. heiklen Umgebungen dann in das Proxmoxforum?

P.S:
Ich habe z.B lange ein kleines, grundsolides Tool namens zbackup (http://zbackup.org/) verwendet. Inzwischen aber aus der Zeit gefallen. PBS kann alles in schick und effizenter.
Allerdings fehlen auch da Dinge, die Novell schon konnte.
So hätte ich z.B. bei der Einzeldateiwiederstellung mittels PBS gerne eine Liste der verfügbaren Versionen.
 
Last edited: