← All Guides
intermediate

Proxmox Backup Server: Setup and Restore

Install Proxmox Backup Server, wire it into Proxmox VE, and prove a restore actually works. Datastores, tokens, pruning, garbage collection, and the four ways to get your data back.

Budget Homelab ·
proxmoxhow-tobackup

Proxmox’s built-in vzdump backups work. That is worth saying up front, because this guide is not about replacing something broken. If you have already set up scheduled backups following the Proxmox snapshots and backups guide, you have real protection and you should keep it running until the replacement is proven.

What vzdump does not do is scale. Every run writes a full compressed copy of every guest, so retention is bought in whole multiples of your data. Proxmox Backup Server changes the economics: it stores deduplicated, incremental chunks, verifies them on a schedule, and can restore a single file out of a VM image without unpacking the whole thing. This guide covers the install, the wiring into Proxmox VE, and the half that most coverage skips, which is proving a restore. It assumes you already have a working hypervisor, per the Proxmox beginner guide and the post-install checklist, and it sits inside the wider plan laid out in homelab backup strategy. Everything running here is on the stack page.

Quick Answer: Setting Up Proxmox Backup Server

  1. Install PBS on separate hardware from the host it protects
  2. Create a datastore with proxmox-backup-manager datastore create
  3. Create a user and API token, grant it DatastoreBackup
  4. Copy the fingerprint from proxmox-backup-manager cert info
  5. Add PBS as storage in Proxmox VE with pvesm add pbs
  6. Schedule a backup job in Datacenter > Backup
  7. Schedule prune and garbage collection separately
  8. Schedule a verify job
  9. Restore a guest and boot it before you trust any of it

What PBS Actually Buys You Over vzdump

vzdumpProxmox Backup Server
Storage modelFull compressed archive per runDeduplicated chunks, incremental after the first
Cost of 30 dailies~30x compressed guest sizeRoughly one full plus 30 days of change
Backup windowGrows with guest size, every runFirst run is long, subsequent runs are short
Integrity checkingNone beyond the archive completingScheduled verify jobs re-read and checksum chunks
Single-file restoreUnpack the whole archiveFile-level browse straight out of the snapshot
Live restoreNoYes, VM boots while data streams in
Off-site copiesCopy files yourselfNative pull-based sync jobs between servers
Setup effortAlready installedA separate machine and about an hour

The deduplication line is the one that changes behaviour. Under vzdump, retention is a budget decision, and most homelabs settle at seven daily copies because that is what fits. Under PBS the marginal cost of another daily snapshot is the delta, so keeping a couple of months becomes reasonable on the same disk. That matters more than it sounds: the failures that actually hurt are the quiet ones, a database that corrupted three weeks ago or a config change nobody noticed, and seven days of retention does not reach them.

The verify jobs matter for a less obvious reason. A backup archive that silently rotted on disk looks exactly like a good one until the day you need it. Scheduled verification is the difference between finding out on a Tuesday afternoon and finding out during an outage.

Where to Run It

This is the decision that determines whether any of the rest is worth doing.

PBS needs to survive the failure it is protecting you from. A PBS VM running on the same Proxmox host, writing its datastore to the same pool as the guests it backs up, protects you against exactly one thing: deleting a file inside a VM. Disk failure, pool corruption, or the host dying takes the originals and the backups in one move, and it also takes the backup server you would need to run the restore.

Reasonable options, roughly in order of how well they hold up:

Hardware requirements are modest. PBS is not CPU-hungry, but it likes RAM for its chunk index and it strongly prefers the datastore on something other than a USB drive. 4GB of RAM and any SATA SSD or spinning disk with room to grow will run a homelab-sized datastore comfortably. If you are choosing disks, homelab storage options covers the trade-offs.

Step 1: Install Proxmox Backup Server

Two paths. The ISO is the clean one for dedicated hardware:

Download the PBS ISO from the Proxmox site, write it to a USB stick, and install it the same way you would install Proxmox VE. It is a Debian-based installer with the same disk and network prompts.

If you already have a Debian machine you would rather use, add the repository instead:

# Add the Proxmox release key
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg \
  -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg

# Add the no-subscription repository
echo "deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription" \
  > /etc/apt/sources.list.d/pbs-install-repo.list

apt update && apt install proxmox-backup-server

The pbs-no-subscription repository is the free one. It is the same software as the enterprise repository with a slightly less conservative release cadence, and it is what the vast majority of homelabs run.

Once installed, the web interface is on port 8007 over HTTPS:

https://192.168.1.50:8007

Log in as root@pam with the system root password. The certificate is self-signed, so your browser will complain. That is expected and the fingerprint step below is how Proxmox VE deals with it properly.

Step 2: Create a Datastore

A datastore is a directory where PBS writes chunks. Mount your backup disk first, then:

proxmox-backup-manager datastore create backups /mnt/backup-disk

Where backups is the datastore name and /mnt/backup-disk is a mounted filesystem with real capacity. Confirm it registered:

proxmox-backup-manager datastore list

Two things to get right here:

Put the datastore on its own mount, not on the root filesystem. A datastore that fills the root partition takes the backup server down with it, and a full backup server fails silently in the direction you least want.

Make sure the mount happens at boot. If the disk is mounted by hand and the machine reboots, PBS will happily recreate the datastore directory on the root filesystem and start writing there. Put it in /etc/fstab with the UUID, and check it survives a reboot before you trust the schedule.

Step 3: Create a User and API Token

Do not point Proxmox VE at PBS using the root account. Create a dedicated user, generate a token for it, and grant that token only what it needs:

# Create the user
proxmox-backup-manager user create backup@pbs --password 'choose-something-long'

# Generate an API token for that user
proxmox-backup-manager user generate-token backup@pbs pve

The token generation command prints a token ID and a secret once. Copy the secret now. There is no way to display it again and the only remedy is to delete the token and generate a new one.

Grant the token permission on the datastore:

proxmox-backup-manager acl update /datastore/backups DatastoreBackup \
  --auth-id 'backup@pbs!pve'

DatastoreBackup lets the token create and read its own backups. It deliberately does not include DatastoreAdmin, so a compromised hypervisor cannot use this token to delete your backup history. That distinction is the entire reason for using a token instead of root, and it is the same reasoning as the least-privilege approach in the homelab security guide.

Step 4: Record the Fingerprint

Proxmox VE needs to trust the PBS certificate. On the PBS machine:

proxmox-backup-manager cert info | grep -i fingerprint

Copy the whole colon-separated hex string. You will paste it into Proxmox VE in the next step.

Step 5: Add PBS as Storage in Proxmox VE

On the Proxmox VE host, either use the UI at Datacenter > Storage > Add > Proxmox Backup Server, or the command line:

pvesm add pbs pbs-backups \
  --server 192.168.1.50 \
  --datastore backups \
  --username 'backup@pbs!pve' \
  --password 'the-token-secret-from-step-3' \
  --fingerprint 'AA:BB:CC:...' \
  --content backup

Here pbs-backups is the storage ID as it will appear in Proxmox VE, and 192.168.1.50 is the PBS address on your network. Note the username format: it is the auth ID, user and token name joined with !, not just the username.

Verify the connection:

pvesm status

The new storage should appear as active. If it does not, the fingerprint or the token secret is wrong, and the PVE task log will say which.

Optional: client-side encryption

If the datastore lives anywhere you do not fully control, or you plan to sync it off-site, enable encryption when you add the storage. Proxmox VE encrypts chunks before they leave the hypervisor, so PBS stores data it cannot read.

The warning is not boilerplate. If you lose the encryption key, the backups are gone. There is no recovery mechanism. Export a copy the moment you create it:

proxmox-backup-client key paper-key --output-format text

Then store that copy somewhere that is not the homelab. The natural instinct is to put it in your self-hosted password manager, which is also one of the things you are backing up, and that circular dependency is exactly how people discover they cannot restore.

Step 6: Schedule the Backup Job

In the Proxmox VE UI, Datacenter > Backup > Add:

Snapshot mode backs up a running guest without stopping it. For databases, that means the backup captures the on-disk state at that instant, which most modern databases recover from cleanly on next start, but a proper dump alongside the image is still the safer answer for anything you actually care about.

Run it once by hand with Run now and watch the task log. The first run is a full transfer and will take a while. Subsequent runs are incremental and typically finish in a small fraction of the time.

To get failures in front of you rather than buried in a task log, wire the notification target up properly, covered in homelab email notifications.

Step 7: Prune and Garbage Collection

This is the step people configure halfway and then wonder why the disk keeps filling.

Prune decides which snapshots to keep. Garbage collection reclaims the disk space. They are separate jobs on separate schedules and configuring only the first accomplishes nothing on disk.

Set retention on the datastore:

proxmox-backup-manager prune-job create prune-backups \
  --store backups \
  --schedule 'daily' \
  --keep-daily 14 \
  --keep-weekly 6 \
  --keep-monthly 6

That keeps two weeks of dailies, six weeks of weeklies, and six months of monthlies. Because of deduplication this costs far less than the equivalent under vzdump.

Then schedule garbage collection, which walks the chunk store, marks anything no longer referenced by a surviving snapshot, and deletes it after a 24-hour grace period:

proxmox-backup-manager garbage-collection start backups

For the recurring schedule, set it in the UI under Datastore > backups > Prune & GC, or in /etc/proxmox-backup/datastore.cfg. Weekly is fine for most homelabs. It is I/O heavy, so put it somewhere it will not collide with the backup window.

The 24-hour grace period is deliberate: it prevents GC from deleting a chunk that a backup job running right now is about to reference. Do not try to work around it.

Step 8: Verification

A verify job re-reads chunks and checks them against their stored checksums. Without one, the first full read of your backup data happens during a restore, which is the worst possible time to discover bit rot.

Create one in the UI under Datastore > backups > Verify Jobs, or:

proxmox-backup-manager verify-job create verify-backups \
  --store backups \
  --schedule 'sat 03:00' \
  --ignore-verified true \
  --outdated-after 30

--ignore-verified skips snapshots already verified, and --outdated-after 30 re-verifies them anyway once the previous check is 30 days old. That combination keeps the job from re-reading the entire datastore every week while still ensuring nothing goes unchecked indefinitely.

Restoring: The Half That Matters

Four restore paths, in ascending order of how much has gone wrong.

Single file out of a guest

Someone deleted a config file. You do not need the whole VM.

In Proxmox VE, go to the PBS storage, open the Backups list, select a snapshot, and click File Restore. PBS mounts the image and gives you a browsable tree; download the file you need and close it. For LXC containers this works directly. For VMs, PBS spins up a small temporary helper VM to read the filesystem, which takes a few extra seconds and is otherwise invisible.

This capability alone justifies the setup for most people. Under vzdump the same request means unpacking a 200GB archive to retrieve 4KB.

Full guest restore

Select the snapshot, click Restore, and choose a target VM ID and storage.

Restore to a new VM ID rather than overwriting the broken original. Restoring over the top destroys the evidence of what went wrong, and if the backup turns out to be older than you thought, you have now lost both copies. Restore alongside, confirm it boots, then delete the broken one.

From the command line:

qmrestore pbs-backups:backup/vm/101/2026-09-15T02:30:00Z 999

For containers, pct restore takes the same shape.

Live restore

VM restores in PBS offer a Live restore checkbox. The VM boots almost immediately and data streams in from the backup in the background, so a service comes back in seconds instead of after a multi-hundred-gigabyte copy.

Performance is degraded until the transfer finishes and the restore must not be interrupted, so it is a tool for getting a service back now, not a replacement for a normal restore. It is VM-only; LXC containers do not support it.

The host itself is gone

This is where separate hardware pays for itself. Reinstall Proxmox VE, re-add the PBS storage with the same server address, datastore, token and fingerprint from Steps 3 to 5, and every snapshot is there to restore from.

Which means the credentials from Step 3 are part of your disaster recovery plan and need to live somewhere reachable when the homelab is down. The full drill, including the order to bring things back in, is in homelab disaster recovery.

Actually do this

Pick a real guest. Restore it to a spare VM ID. Boot it on an isolated bridge with no network access so it cannot fight with the original over an IP address, log in, and confirm the data is genuinely there and recent.

Until that happens you do not have backups, you have an assumption with a green checkmark next to it. Do it once now, and once more after any significant change to the storage layout.

Off-Site Copies

Backups on a second machine in the same house survive disk failure. They do not survive theft, fire, or flood, which is the “1” in 3-2-1.

PBS handles this natively with sync jobs, which are pull-based: the remote server reaches out and pulls snapshots from the source. That direction matters, because a compromised primary cannot reach out and delete the off-site copy.

Add the source under Configuration > Remotes on the destination PBS (address, auth ID, fingerprint), then create a sync job targeting a local datastore. If you already have a second PBS somewhere, this is the cleanest option available.

If a second PBS is not realistic, the alternative is to back up the datastore itself to object storage with a file-level tool. That works because PBS chunks are ordinary files, but the restore path is longer: you pull the datastore back down before you can restore anything out of it. If that is the route you take, the Duplicati setup guide covers one way to get files off-site, and the trade-offs between approaches are in homelab backup strategy.

Troubleshooting

SymptomLikely causeFix
Storage shows inactive in pvesm statusFingerprint mismatch or wrong token secretRe-run proxmox-backup-manager cert info, regenerate the token if unsure
permission denied on backupToken lacks DatastoreBackup on the datastoreRe-run the acl update from Step 3, check the user!token format
Datastore filling despite prune runningGarbage collection not scheduledSchedule GC; prune alone never frees space
First backup extremely slowExpected, it is a full transferLet it finish; check incremental runs before worrying
Datastore vanished after rebootBackup disk not mounted at bootAdd the UUID to /etc/fstab, verify across a reboot
Verify job reporting failed chunksGenuine corruption on the datastore diskCheck SMART, restore from the off-site copy, replace the disk
GC never reclaims recently pruned data24-hour grace period has not elapsedWait and re-run; this is by design

What PBS Does Not Solve

The Budget Case

PBS is free, including the no-subscription repository and every feature described here. The only real cost is a machine to run it on and a disk to fill.

The honest comparison is against a paid cloud backup service. For the amount of data a typical homelab holds, cloud backup runs somewhere in the range of a few dollars a month indefinitely, and restores are bounded by your download speed. A second-hand mini PC and a large disk is a one-time cost, restores run at LAN speed, and the deduplication means retention stops being a budget line at all.

The version that actually holds up is both: PBS on separate local hardware for fast, deep-retention restores, plus one off-site copy for the failure that takes out the building. That is a working 3-2-1 for the cost of hardware you may already have sitting unused, which is the same argument this site makes about most of the stack. If PBS is your first serious backup target, the wider plan it fits into is in homelab backup strategy, and the guest-level basics it builds on are in Proxmox snapshots and backups.