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?
 
  • Like
Reactions: UdoB and proxuser77