Backups Done Right: Proxmox Backup Server, Schedules, Retention, and Restore Drills

Everyone has backups until they need to restore. Then they discover: the backup never completed, the retention deleted what they needed, or worse — they’ve never actually tested a restore.

Proxmox Backup Server (PBS) is excellent backup software. Deduplication, incremental forever, encryption, verification. But software doesn’t matter if your process is broken.

A backup exists only after a successful restore test. Everything else is hope.

Why Proxmox Backup Server

PBS is purpose-built for Proxmox VE:

  • Incremental forever: Only changed blocks transfer after first backup
  • Deduplication: Identical data stored once, even across VMs
  • Encryption: Client-side encryption, PBS never sees plaintext
  • Verification: Built-in integrity checking
  • Pruning: Automatic retention policies

Compared to vzdump-to-NFS:

  • 10x less storage for typical workloads (dedup)
  • 5x faster backups (incremental)
  • Actual verification (not just “file exists”)

Installing PBS

PBS should run on separate hardware. If your Proxmox host dies, your backups shouldn’t die with it.

Terminal window
# Download PBS ISO from proxmox.com
# Install on dedicated hardware or VM (on different host)
# After install, configure network
nano /etc/network/interfaces
# Update repositories (same as PVE)
mv /etc/apt/sources.list.d/pbs-enterprise.list /etc/apt/sources.list.d/pbs-enterprise.list.disabled
echo "deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription" > /etc/apt/sources.list.d/pbs-no-subscription.list
apt update && apt full-upgrade -y

Access web UI at https://<pbs-ip>:8007

PBS as VM on Proxmox

Acceptable for homelab, not ideal:

Terminal window
# Create VM for PBS
qm create 999 --name pbs --memory 4096 --cores 2 \
--net0 virtio,bridge=vmbr0 \
--scsi0 local-zfs:32 \
--cdrom local:iso/proxmox-backup-server.iso

Critical: Store PBS VM on different storage than what you’re backing up. If your main storage fails, PBS VM should survive.

Storage Configuration

Datastore Setup

PBS organizes backups into datastores:

Terminal window
# Create datastore directory
mkdir -p /backup/datastore1
# Via web UI: Administration → Storage/Disks → Directory → Create: Datastore
# Or via CLI
proxmox-backup-manager datastore create store1 /backup/datastore1

Storage Sizing

Deduplication means storage math is different:

Without dedup: 10 VMs × 100GB × 30 backups = 30TB
With dedup: 10 VMs × 100GB × 30 backups ≈ 500GB - 2TB

Actual ratio depends on:

  • How similar VMs are (templates = high dedup)
  • How much data changes between backups
  • How many retention points

Start with 2x your VM total size, monitor, adjust.

Connecting Proxmox VE to PBS

Add PBS to Proxmox

On Proxmox VE:

Terminal window
# Add PBS storage
pvesm add pbs pbs-store \
--server 10.0.0.50 \
--datastore store1 \
--username backup@pbs \
--password \
--fingerprint <fingerprint>

Get fingerprint from PBS:

Terminal window
# On PBS
proxmox-backup-manager cert info | grep Fingerprint

Or via Web UI: Datacenter → Storage → Add → Proxmox Backup Server

Create Backup User

On PBS, create dedicated backup user:

Terminal window
# Create user
proxmox-backup-manager user create backup@pbs
# Create API token (more secure than password)
proxmox-backup-manager user generate-token backup@pbs automation
# Grant permissions
proxmox-backup-manager acl update / Datastore.Backup --auth-id backup@pbs

Use API token in Proxmox connection.

Backup Jobs

Manual Backup

Terminal window
# Backup single VM
vzdump 100 --storage pbs-store --mode snapshot
# Backup multiple VMs
vzdump 100 101 102 --storage pbs-store --mode snapshot

Scheduled Backups

Via Web UI: Datacenter → Backup → Add

Storage: pbs-store
Schedule: 01:00 (daily at 1 AM)
Selection mode: Include all (or specific VMs)
Mode: Snapshot
Compression: ZSTD

Or via CLI:

Terminal window
# Create backup job
pvesh create /cluster/backup --storage pbs-store --schedule "0 1 * * *" --all 1 --mode snapshot --compress zstd

Backup Modes

ModeDescriptionDowntimeConsistency
SnapshotAtomic snapshot, VM keeps runningNoneGood
SuspendPause VM, backup, resumeSecondsBetter
StopShutdown, backup, startMinutesBest

Recommendation: Use snapshot mode. If you need perfect consistency, use application-level tools (database dumps, etc.) before backup.

Retention Policies

Retention determines how many backups to keep. PBS supports GFS (Grandfather-Father-Son):

Keep last: 3 # Always keep last 3 backups
Keep hourly: 24 # Keep 24 hourly backups
Keep daily: 7 # Keep 7 daily backups
Keep weekly: 4 # Keep 4 weekly backups
Keep monthly: 6 # Keep 6 monthly backups
Keep yearly: 2 # Keep 2 yearly backups

This gives you:

  • Recent: Multiple restore points
  • Medium-term: Daily granularity
  • Long-term: Monthly/yearly for compliance

Configure Retention on Proxmox

In backup job configuration:

Terminal window
# Edit backup job
pvesh set /cluster/backup/<jobid> --prune-backups keep-last=3,keep-daily=7,keep-weekly=4,keep-monthly=6

Prune Schedule on PBS

PBS runs pruning automatically. Check/configure:

Terminal window
# On PBS
proxmox-backup-manager prune-job list
proxmox-backup-manager prune-job create store1 --schedule "daily"

Verification

Backups without verification are hopes, not backups.

Automatic Verification

PBS can verify backups automatically:

Terminal window
# On PBS - create verification job
proxmox-backup-manager verify-job create store1 \
--schedule "weekly" \
--outdated-after 7

This reads all backup chunks and verifies checksums. Catches:

  • Bit rot
  • Storage corruption
  • Incomplete backups

Manual Verification

Terminal window
# Verify specific backup
proxmox-backup-client verify <backup-id>
# Verify all backups in datastore
proxmox-backup-manager verify store1

Restore Testing

Verification proves data integrity. Restore testing proves you can actually recover.

Schedule Regular Restore Tests

Monthly restore drill:

  1. Pick a random VM backup
  2. Restore to temporary VM
  3. Boot it, verify it works
  4. Delete temporary VM
  5. Document the test
Terminal window
# Restore to new VM
qmrestore pbs-store:backup/vm/100/2025-01-08T01:00:00Z 900 --storage local-zfs
# Boot and verify
qm start 900
# After verification
qm stop 900
qm destroy 900

Restore Test Checklist

Date: 2025-01-08
Backup tested: vm/100/2025-01-08T01:00:00Z
Original VM: web-server (100)
Restored as: test-restore (900)
[ ] Restore completed without errors
[ ] VM boots successfully
[ ] Services start (nginx, database, etc.)
[ ] Application responds (curl localhost)
[ ] Data integrity (sample data check)
[ ] Time to restore: 5 minutes
Tested by: Admin
Result: PASS

Encryption

For off-site backups, enable encryption:

Generate Key

Terminal window
# On Proxmox
proxmox-backup-client key create /etc/pve/priv/backup-key.enc
# Protect the key!
cp /etc/pve/priv/backup-key.enc /secure/location/

Configure Encrypted Backups

Terminal window
# Add PBS storage with encryption
pvesm add pbs pbs-encrypted \
--server 10.0.0.50 \
--datastore store1 \
--username backup@pbs \
--encryption-key /etc/pve/priv/backup-key.enc \
--fingerprint <fingerprint>

Critical: If you lose the encryption key, backups are unrecoverable. Store key securely, separately from backups.

Monitoring Backups

Check Backup Status

On Proxmox:

Terminal window
# List recent backups
pvesh get /nodes/pve1/storage/pbs-store/content
# Check backup job status
pvesh get /cluster/backup

On PBS:

Terminal window
# Datastore status
proxmox-backup-manager datastore list
# Recent backup tasks
proxmox-backup-manager task list

Alerting

Configure email alerts on PBS:

Terminal window
# Set notification email
proxmox-backup-manager acl update / --notify admin@example.com

Key alerts:

  • Backup job failures
  • Verification failures
  • Datastore space warnings
  • Pruning issues

Disaster Scenarios

Scenario: VM Accidentally Deleted

Terminal window
# List available backups
pvesh get /nodes/pve1/storage/pbs-store/content --vmid 100
# Restore
qmrestore pbs-store:backup/vm/100/2025-01-08T01:00:00Z 100

Recovery time: Minutes.

Scenario: Proxmox Host Failed

Terminal window
# On new/rebuilt host, add PBS storage
pvesm add pbs pbs-store ...
# List available backups
pvesh get /nodes/pve2/storage/pbs-store/content
# Restore all VMs
pvesh get /nodes/pve2/storage/pbs-store/content --output-format json | \
jq -r '.[] | "\(.volid) \(.vmid)"' | \
while read volid vmid; do
qmrestore "$volid" "$vmid"
done

Recovery time: Hours (depends on VM count and size).

Scenario: PBS Server Lost

This is why you need off-site copies:

Terminal window
# If you have replication to second PBS
# Use backup PBS as primary
# If no replication... restore from:
# - Off-site tape/cloud
# - Secondary backup system
# - Old-school vzdump files

Off-Site Backups

PBS-to-PBS replication:

Terminal window
# On source PBS, create sync job
proxmox-backup-manager sync-job create remote-sync \
--store store1 \
--remote pbs-remote \
--remote-store offsite \
--schedule "daily"

This syncs deduplicated data to remote PBS. Only changed chunks transfer.

The Lesson

A backup exists only after a successful restore test.

Having backup software running is step one. Having backups completing is step two. But the backup doesn’t exist until you’ve proven you can restore from it.

The process:

  1. Configure: PBS, jobs, retention
  2. Automate: Scheduled backups, verification
  3. Test: Monthly restore drills
  4. Document: What was tested, what was the result
  5. Improve: Fix issues found during tests

The companies that recover from disasters aren’t the ones with the best backup software. They’re the ones who practiced recovery before they needed it.