restore.sh aktualisiert

main
sebastian.serfling 2026-03-16 14:17:17 +00:00
parent 877661b729
commit 9da41592df
1 changed files with 16 additions and 36 deletions

View File

@ -15,19 +15,19 @@
# --rsync-target Rsync-Ziel auf Backup-Server z.B. /backup/incoming/TNP # --rsync-target Rsync-Ziel auf Backup-Server z.B. /backup/incoming/TNP
# --pbs-storage PVE-Storage-ID des PBS-Datastores z.B. pbs-tnp-invest-gmbh # --pbs-storage PVE-Storage-ID des PBS-Datastores z.B. pbs-tnp-invest-gmbh
# #
# KEYS beide werden per Rsync vom PBS-Server geholt (PBS_HOST aus pbs.conf): # 7z-Passwort wird per Rsync vom PBS-Server geholt (PBS_HOST aus pbs.conf):
# PBS Encrypt-Key: /root/Scripte/${DATASTORE}.keyfile → für qmrestore # 7z-Passwort: /root/Scripte/password_7z.txt → für 7z-Archiv
# 7z-Passwort: /root/Scripte/password_7z.txt → für 7z-Archiv # Format: "tnp-Invest-GmbH: Passwort123"
# Format: "tnp-Invest-GmbH: Passwort123" # PBS Encrypt-Key entfällt Entschlüsselung läuft über pvesm (Fingerprint in DB)
# #
# VM_IMAGE_DIR wird dynamisch aus dem PVE-Storage-Pfad ermittelt: # VM_IMAGE_DIR wird dynamisch aus dem PVE-Storage-Pfad ermittelt:
# pvesh get /storage/${RESTORE_PATH} → path → /mnt/HDD_5TB.1/images/${VM_ID} # pvesh get /storage/${RESTORE_PATH} → path → /mnt/HDD_5TB.1/images/${VM_ID}
# #
# ABLAUF: # ABLAUF:
# [0] Keys holen Keyfile + 7z-Passwort per Rsync vom PBS-Server # [0] 7z-Passwort holen password_7z.txt per Rsync vom PBS-Server
# [1] Space-Check Freier Platz auf restore-mount prüfen # [1] Space-Check Freier Platz auf restore-mount prüfen
# [2] VM-ID ermitteln Original aus Backup-Pfad, Restore-ID ab 1000 # [2] VM-ID ermitteln Original aus Backup-Pfad, Restore-ID ab 1000
# [3] qmrestore Direkt vom PBS-Storage mit --keyfile # [3] qmrestore Direkt vom PBS-Storage (kein --keyfile nötig)
# [4] VM_IMAGE_DIR Dynamisch aus PVE-Storage-Pfad ermitteln # [4] VM_IMAGE_DIR Dynamisch aus PVE-Storage-Pfad ermitteln
# [5] Images prüfen Abbruch wenn leer/nicht vorhanden # [5] Images prüfen Abbruch wenn leer/nicht vorhanden
# [6] VM vorbereiten unlock, cdrom/ide0 entfernen, alle Netzwerkkarten # [6] VM vorbereiten unlock, cdrom/ide0 entfernen, alle Netzwerkkarten
@ -183,46 +183,28 @@ trap 'STATUS="failed"
send_webhook "failed" "Abgebrochen in Zeile $LINENO $LOG_FILE"' ERR send_webhook "failed" "Abgebrochen in Zeile $LINENO $LOG_FILE"' ERR
# ═════════════════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════════════════
# [0/12] KEYS VOM PBS-SERVER HOLEN # [0/12] 7Z-PASSWORT VOM PBS-SERVER HOLEN
# PBS_HOST kommt aus pbs.conf. Beide Dateien werden lokal gecacht. # PBS_HOST kommt aus pbs.conf. Datei wird lokal gecacht.
# Bei mehreren VMs desselben Datastores nur einmal geholt. # Bei mehreren VMs desselben Datastores nur einmal geholt.
# #
# PBS Encrypt-Keyfile: /root/Scripte/${DATASTORE}.keyfile → qmrestore --keyfile # 7z-Passwort: /root/Scripte/password_7z.txt → 7z -p
# 7z-Passwort: /root/Scripte/password_7z.txt → 7z -p # Format: "tnp-Invest-GmbH: Passwort123"
# Format: "tnp-Invest-GmbH: Passwort123" #
# PBS Encrypt-Key entfällt Entschlüsselung läuft über den registrierten
# pvesm PBS-Storage (Fingerprint ist in bronze.backup.datastore.config hinterlegt
# und wurde von Windmill Step C beim pvesm add pbs eingetragen).
# ═════════════════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════════════════
echo "" echo ""
echo "==> [0/12] Keys vom PBS-Server holen ($PBS_HOST)..." echo "==> [0/12] 7z-Passwort vom PBS-Server holen ($PBS_HOST)..."
KEY_DIR="/opt/windmill-restore/keys" KEY_DIR="/opt/windmill-restore/keys"
mkdir -p "$KEY_DIR" mkdir -p "$KEY_DIR"
chmod 700 "$KEY_DIR" chmod 700 "$KEY_DIR"
# ── PBS Encrypt-Keyfile ───────────────────────────────────────────────────────
KEYFILE_LOCAL="${KEY_DIR}/${DATASTORE}.keyfile"
if [[ -f "$KEYFILE_LOCAL" && -s "$KEYFILE_LOCAL" ]]; then
echo " Keyfile bereits vorhanden: $KEYFILE_LOCAL"
else
echo " Hole Keyfile: root@${PBS_HOST}:/root/Scripte/${DATASTORE}.keyfile"
rsync -az \
-e "ssh -o StrictHostKeyChecking=no" \
"root@${PBS_HOST}:/root/Scripte/${DATASTORE}.keyfile" \
"$KEYFILE_LOCAL" \
2>&1
chmod 600 "$KEYFILE_LOCAL"
echo " Keyfile gespeichert ✓"
fi
[[ ! -f "$KEYFILE_LOCAL" || ! -s "$KEYFILE_LOCAL" ]] && {
echo "FEHLER: Keyfile fehlt oder leer für Datastore '$DATASTORE'" >&2
exit 1
}
# ── 7z-Passwort aus password_7z.txt ────────────────────────────────────────── # ── 7z-Passwort aus password_7z.txt ──────────────────────────────────────────
PW_FILE_LOCAL="${KEY_DIR}/password_7z.txt" PW_FILE_LOCAL="${KEY_DIR}/password_7z.txt"
if [[ ! -f "$PW_FILE_LOCAL" || ! -s "$PW_FILE_LOCAL" ]]; then if [[ ! -f "$PW_FILE_LOCAL" || ! -s "$PW_FILE_LOCAL" ]]; then
echo " Hole password_7z.txt: root@${PBS_HOST}:/root/Scripte/password_7z.txt" echo " Hole password_7z.txt: root@${PBS_HOST}:/root/Scripte/password_7z.txt"
rsync -az \ rsync -az \
-e "ssh -o StrictHostKeyChecking=no" \
"root@${PBS_HOST}:/root/Scripte/password_7z.txt" \ "root@${PBS_HOST}:/root/Scripte/password_7z.txt" \
"$PW_FILE_LOCAL" \ "$PW_FILE_LOCAL" \
2>&1 2>&1
@ -286,21 +268,19 @@ echo " Restore VM-ID: $VM_ID_RESTORED"
# ═════════════════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════════════════
# [3/12] QMRESTORE VOM PBS-STORAGE # [3/12] QMRESTORE VOM PBS-STORAGE
# --storage aus DB (restore_path), z.B. "5TB.1" # --storage aus DB (restore_path), z.B. "5TB.1"
# --keyfile lokal gecachtes Keyfile vom PBS-Server
# --unique 1 verhindert Konflikte mit bestehenden VM-Configs # --unique 1 verhindert Konflikte mit bestehenden VM-Configs
# Kein --keyfile nötig Entschlüsselung über registrierten pvesm PBS-Storage
# ═════════════════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════════════════
echo "" echo ""
echo "==> [3/12] qmrestore vom PBS-Storage..." echo "==> [3/12] qmrestore vom PBS-Storage..."
echo " Backup-Ref: $PVE_BACKUP_REF" echo " Backup-Ref: $PVE_BACKUP_REF"
echo " Storage: $RESTORE_PATH" echo " Storage: $RESTORE_PATH"
echo " Keyfile: $KEYFILE_LOCAL"
echo " VM-ID: $VM_ID_RESTORED" echo " VM-ID: $VM_ID_RESTORED"
RESTORE_START_INNER=$(date +%s) RESTORE_START_INNER=$(date +%s)
qmrestore "$PVE_BACKUP_REF" "$VM_ID_RESTORED" \ qmrestore "$PVE_BACKUP_REF" "$VM_ID_RESTORED" \
--storage "$RESTORE_PATH" \ --storage "$RESTORE_PATH" \
--keyfile "$KEYFILE_LOCAL" \
--unique 1 \ --unique 1 \
2>&1 2>&1