Proxmox Backup Server Setup: PBS Deployment Guide for Homelab#
If you’re running Proxmox VE in your homelab, backups are the one thing you shouldn’t cut corners on. Proxmox Backup Server (PBS) is purpose-built for PVE — it gives you incremental forever backups, deduplication, encryption, and a Web UI that integrates directly with your hypervisor. This guide walks through a production-ready PBS deployment from scratch.
Why PBS Instead of vzdump to NFS?#
The default vzdump + NFS approach works, but has drawbacks:
- Full backups every time — no incremental support, so daily backups eat terabytes fast
- No deduplication — five identical VMs store five copies of the same OS data
- No built-in verification — you don’t know if a backup is restorable until you need it
- No encryption at rest — if your NAS gets compromised, so do your VM images
PBS solves all of these with chunk-based deduplication, incremental backups that only transfer changed blocks, client-side encryption, and integrated verification tasks.
Deployment Options: LXC vs VM#
You can run PBS as either:
| Approach |
Pros |
Cons |
| LXC container |
Lower overhead, direct ZFS access |
Requires fuse3 or bind-mount; can’t host PBS on same node if it goes down |
| VM |
Portable, snapshots, live migration, dedicated kernel |
Slightly higher overhead; needs virtio-scsi + discard for thin disks |
| Dedicated hardware |
Best isolation, separate storage controller |
Overkill for most homelabs |
For a homelab, PBS in a VM is the sweet spot. You get snapshot capability, live migration between cluster nodes, and clean storage passthrough.
PBS in a VM#
1
2
3
4
5
6
7
8
9
10
|
# Create the VM (4 vCPU, 8 GB RAM, 200 GB thin disk)
qm create 200 --name pbs --memory 8192 --cores 4 --net0 virtio,bridge=vmbr0
qm set 200 --scsi0 local-lvm:200 --scsihw virtio-scsi-single
qm set 200 --boot order=scsi0
qm set 200 --ide2 media:iso/proxmox-backup-server-3.2-1.iso,media=cdrom
qm set 200 --vga std --agent 1
# Start and install
qm start 200
qm terminal 200
|
PBS in an LXC (alternative)#
1
2
3
4
5
6
7
8
|
pveam update
pveam download local proxmox-backup-server-3.2-1.tar.xz
pct create 200 local:vztmpl/proxmox-backup-server-3.2-1.tar.xz \
--storage local-lvm --rootfs 200 --memory 8192 --cores 4 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--unprivileged 1 --features fuse=1,nesting=1
pct start 200
|
Initial PBS Configuration#
After installation, access the Web UI at https://<pbs-ip>:8007. The default credentials are root@pam with the root password you set during install.
Create a Datastore#
1
2
3
4
5
6
|
# From the PBS shell or SSH
proxmox-backup-manager datastore create homelab-backups \
/backup/homelab \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 3
|
This creates a datastore with GFS retention: 7 daily, 4 weekly, 3 monthly backups. Adjust these based on your storage budget.
Add Storage#
1
2
3
4
5
6
7
8
|
# If using ZFS
zpool create backup mirror /dev/sda /dev/sdb
zfs create backup/pbs
proxmox-backup-manager datastore create homelab-backups /backup/homelab/zfs/homelab-backups
# Configure the datastore path
proxmox-backup-manager datastore update homelab-backups \
--path /backup/homelab
|
Create Backup User#
1
2
3
4
|
proxmox-backup-manager user create backup@pbs \
--password 'your-secure-password'
proxmox-backup-manager acl update /backup/homelab \
--auth-id backup@pbs --perm DatastoreBackup
|
Connect PVE to PBS#
On each Proxmox node, add PBS as a storage target:
1
2
3
4
5
6
|
pvesm add pbs pbs-homelab \
--server 10.0.20.35 \
--datastore homelab-backups \
--username backup@pbs \
--password 'your-secure-password' \
--fingerprint xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
|
Get the fingerprint from PBS Web UI → Administration → Fingerprint, or via:
1
|
proxmox-backup-manager cert info | grep Fingerprint
|
Backup Schedules#
Per-VM Backup Jobs#
1
2
3
4
5
6
7
8
9
10
|
# Daily backup at 02:00 for all VMs on node SRV1
pvesh create /cluster/backup \
--mode snapshot \
--starttime "02:00" \
--dow "mon,tue,wed,thu,fri,sat,sun" \
--compress zstd \
--prune-backups "keep-daily=7,keep-weekly=4,keep-monthly=3" \
--storage pbs-homelab \
--node SRV1 \
--all 1
|
Or via the Web UI: Datacenter → Backups → Add → schedule, storage, selection mode.
Critical VM vs Non-Critical Schedule#
1
2
3
4
5
6
7
8
9
10
|
# Critical VMs (daily + shorter retention)
# VM 100 (DC), VM 101 (DNS), VM 200 (PBS itself — backup to second datastore)
Backup ID range: 100-110
Schedule: daily 02:00
Retention: 14 daily, 8 weekly, 6 monthly
# Non-critical VMs (alternating days to spread load)
Backup ID range: 200-999
Schedule: daily 04:00
Retention: 7 daily, 4 weekly, 3 monthly
|
Systems: Create separate backup jobs for LXC containers:#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Datacenter → Backups → Add
- ID: 100-199 (VMs)
- Schedule: 02:00 daily
- Node: SRV1
- Storage: pbs-homelab
- Compression: ZSTD
- Mode: Snapshot
- ID: 200-299 (LXCs)
- Schedule: 03:00 daily
- Node: SRV1
- Storage: pbs-homelab
- Compression: ZSTD
- Mode: Snapshot
|
Encryption#
PBS supports client-side encryption so the backup server never sees plain data:
1
2
3
4
5
6
7
|
# Create encryption key on the PVE host
openssl enc -aes-256-cbc -k "your-passphrase" -P -md sha256 \
| grep key | awk '{print $3}' > /etc/pve/priv/storage/pbs-homelab.enc.key
chmod 600 /etc/pve/priv/storage/pbs-homelab.enc.key
# Update storage config to use encryption
pvesm set pbs-homelab --encryption-key /etc/pve/priv/storage/pbs-homelab.enc.key
|
Verify encryption is active:
1
2
|
pvesm status | grep pbs-homelab
# Look for the encrypted flag in the output
|
Remote Sync (Offsite Backups)#
PBS can sync datastores to a remote PBS instance for the 3-2-1 rule:
1
2
3
4
5
6
7
|
# On the primary PBS
proxmox-backup-manager sync-job create \
--datastore homelab-backups \
--remote [email protected]:offsite-backups \
--remote-datastore offsite-homelab \
--owner root@pam \
--schedule "daily 06:00"
|
Or if your remote is over the internet (via WireGuard, for example):
1
2
3
4
5
6
7
|
proxmox-backup-manager sync-job create \
--datastore homelab-backups \
--remote [email protected]:offsite-backups \
--remote-datastore offsite-homelab \
--owner root@pam \
--schedule "wed,sat 22:00" \
--transfer-last 2
|
The --transfer-last 2 limits sync to the last 2 backups to keep bandwidth manageable.
Verification and Restore Testing#
Backups you don’t test aren’t backups.
Automated Verification#
1
2
3
4
|
proxmox-backup-manager verify-job create \
--datastore homelab-backups \
--schedule "mon 03:00" \
--owner root@pam
|
One-Time Restore Test#
1
2
3
|
# Restore a VM to a test location (doesn't overwrite original)
pvesm extract --storage pbs-homelab backup/ct/100/2026-05-28T00:00:00Z/
# Or via PBS GUI: Datastore → backup → Restore → choose target node
|
Scripted Verification#
1
2
3
4
5
6
7
8
9
10
|
#!/bin/bash
# /usr/local/bin/pbs-verify-all.sh
# Run monthly: 0 8 1 * * /usr/local/bin/pbs-verify-all.sh
LAST_VERIFIED=$(proxmox-backup-manager verify-job list \
| grep -c "$(date +%Y-%m)")
if [ "$LAST_VERIFIED" -eq 0 ]; then
proxmox-backup-manager verify-job run homelab-verify
echo "Verification completed: $(date)" >> /var/log/pbs-verify.log
fi
|
Monitoring#
PBS exposes metrics via its API. Integrate with your monitoring stack:
1
2
3
4
5
|
# PBS API endpoint for backup status
curl -s -k \
-H "Authorization: PVEAPIToken=backup@pam!monitor=your-token" \
https://10.0.20.35:8007/api2/json/admin/datastore \
| jq '.data[] | {name: .store, used: .used, avail: .avail, status: .status}'
|
Or set up a simple email notification on backup failure:
1
2
3
|
# From PBS Web UI: Administration → Notification → Mail Forwarder
# SMTP server: mail.example.com:587, user/pass
# Notification events: Backup Failed, Verification Failed, Sync Failed
|
Disaster Recovery Checklist#
When the worst happens, have a plan:
Test at least one full recovery quarterly:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 1. On new hardware, install PVE
# 2. Add PBS storage
pvesm add pbs pbs-homelab \
--server 10.0.20.35 --datastore homelab-backups \
--username backup@pam --fingerprint F1:... --encryption-key /path/to/key
# 3. Restore critical VM first
qmrestore pbs-homelab:backup/vm/100/2026-05-28T00:00:00Z vzdump-qemu-100-2026_05_28-00_00_00.vma.zst \
--storage local-lvm
# 4. Start and verify
qm start 100
# Check services, DNS, network connectivity
|
PBS default settings work, but can be optimized for homelab hardware:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# Increase chunk size for large sequential workloads
proxmox-backup-manager datastore update homelab-backups \
--chunk-size 4MiB
# Tune upload concurrency
sed -i 's/^#datastore-max-workers: 3/datastore-max-workers: 6/' \
/etc/proxmox-backup/pbs.conf
sed -i 's/^#sync-max-workers: 1/sync-max-workers: 3/' \
/etc/proxmox-backup/pbs.conf
# Disable network file sync if running on local storage
# (already default, verify with:)
grep -c "sync-file-range" /etc/proxmox-backup/pbs.conf
|
Conclusion#
Proxmox Backup Server transforms your backup strategy from “hope they work” to “know they work.” The deduplication alone makes it worth it — my 3 TB of VM storage compresses to about 400 GB in PBS with daily incrementals. Combined with encryption, remote sync, and automated verification, you get enterprise-grade backup infrastructure without the enterprise price tag.
The key takeaways:
- PBS VM over LXC for portability and snapshots
- GFS retention keeps storage predictable
- Encryption is a one-time setup, worth doing from day one
- Test restores quarterly — the real test is recovery speed, not backup speed
- Remote sync completes the 3-2-1 strategy