Backup Automation Scripts
Overview
Automated backup scripts for Proxmox VE. Schedule, manage, and verify backups automatically.
Basic Backup Script
Simple Backup
#!/bin/bash
# backup-vm.sh - Backup single VM
VMID=$1
STORAGE=${2:-local}
MODE=${3:-suspend}
# Check VM exists
qm list | grep -q "^$VMID " || { echo "VM $VMID not found"; exit 1; }
# Start backup
vzdump --mode $MODE --vmid $VMID --storage $STORAGE
echo "Backup complete for VM $VMID"Multi-VM Backup
#!/bin/bash
# backup-all.sh - Backup all VMs
STORAGE=local
LOG="/var/log/backup.log"
# Get running VMs
VM_LIST=$(qm list | grep running | awk '{print $1}')
for VMID in $VM_LIST; do
echo "[$(date)] Starting backup VM $VMID"
vzdump --mode suspend --vmid $VMID --storage $STORAGE 2>&1 | tee -a $LOG
sleep 30
done
echo "[$(date)] All backups complete" | tee -a $LOGBackup with Verification
Verify Backup
#!/bin/bash
# backup-verify.sh - Backup and verify
VMID=$1
STORAGE=local
# Create backup
echo "Creating backup..."
vzdump --mode suspend --vmid $VMID --storage $STORAGE
# Get latest backup
LATEST=$(pvesm list $STORAGE | grep vzdump.*$VMID | tail -1 | awk '{print $2}')
# Verify
if [ -n "$LATEST" ]; then
echo "Backup verified: $LATEST"
else
echo "ERROR: Backup verification failed"
exit 1
fiRetention Management
Clean Old Backups
#!/bin/bash
# cleanup-backups.sh - Remove old backups
STORAGE=local
RETENTION_DAYS=7
# Find old backups
OLD=$(pvesm list $STORAGE | grep vzdump | \
awk -v days=$RETENTION_DAYS \
'age($6) > days {print $2}')
for backup in $OLD; do
echo "Removing: $backup"
pvesm remove $STORAGE $backup
done
echo "Cleanup complete"Encrypted Backups
Encrypted Backup
#!/bin/bash
# backup-encrypted.sh - Encrypted backup
VMID=$1
STORAGE=local
PASSFILE="/root/backup.pass"
# Create encrypted backup
vzdump --mode suspend \
--vmid $VMID \
--storage $STORAGE \
--compress zstd \
--encryption $PASSFILE
echo "Encrypted backup complete"Restore Automation
Automated Restore
#!/bin/bash
# restore-vm.sh - Restore from backup
BACKUP_ID=$1
TARGET_VMID=$2
STORAGE=local
# Stop target if running
qm stop $TARGET_VMID --forceStop 1 2>/dev/null || true
# Restore
vzdump --restore $BACKUP_ID --vmid $TARGET_VMID
echo "Restore complete"Full Backup Solution
Complete Script
#!/bin/bash
# proxmox-backup.sh - Complete backup solution
set -euo pipefail
STORAGE="local"
RETENTION=7
LOG_FILE="/var/log/proxmox-backup.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a $LOG_FILE
}
# Get VMs to backup (running or all)
VM_LIST="${*:-$(qm list | grep running | awk '{print $1}')}"
for VMID in $VM_LIST; do
log "Backing up VM $VMID..."
# Create backup
vzdump --mode suspend \
--vmid $VMID \
--storage $STORAGE \
--compress zstd \
--mailto admin@example.com
log "VM $VMID backup complete"
done
# Cleanup old
log "Cleaning old backups..."
find /var/lib/vz/dump -name "vzdump*.tar.zst" -mtime +$RETENTION -delete
log "All backups complete"Keywords
backup automation restore retention scheduled