Sscribnet.io
Field Guide

Proxmox Backup Server, End to End

Real backups, with the proof restore most guides skip — a PBS VM, a passed-through datastore drive, fleet-wide nightly jobs, and a restore you actually boot.

Field guide~15 min readIntermediate
The short version: Most backup guides end where the job turns green. This one ends where a restored VM boots to a login prompt with its network cable pulled. Along the way: PBS as a small VM, the datastore on a whole passed-through drive so the drive alone is your recovery kit, a scoped token (with the privilege-separation trap disarmed), retention owned by the datastore, and scheduled verification — built and proven on a live three-node home cluster.
The problem

Why PBS, when Proxmox already has backups?

Proxmox VE's built-in vzdump is fine, in the way a spare tire is fine: it will get you home once, and you would not want to drive on it for a year. Each vzdump backup is a full archive of a VM's disks. Ten VMs backed up nightly is ten full copies a night, kept on a file share, pruned by whatever script or discipline you remembered to set up. Restores work, but nothing verifies the archives are still readable, nothing deduplicates between them, and the folder of .tar.zst files quietly becomes the least understood critical system in the lab.

PBS replaces the archive pile with a chunk store. Every backup is broken into content-addressed chunks; identical chunks — across snapshots, across VMs, across months — are stored exactly once. On top of that you get:

The VMware analogy, if that's your home turf: vzdump is exporting OVFs to a file share on a cron job. PBS is a proper backup appliance with a deduplicated repository and catalog — closer to what you'd expect from a Veeam repository than from a script.

Honest caveat, stated up front: a single PBS with a single datastore drive is a single copy of your backups. It protects you from VM corruption, bad updates, accidental deletion, and host trouble. It does not protect you from the drive dying or the building having a very bad day. The offsite leg (in our build, an S3 target) is a separate, deliberate piece of work — this guide flags exactly where it plugs in, and the checklist at the end does not let you call the job done without a plan for it.
The design

The two architecture decisions that matter

Everything else in the build is mechanics. Two decisions shape the whole design, and both were made for the same reason: portability of the backups themselves.

Decision 1: PBS runs as a VM, sized small

Backup infrastructure feels like it deserves its own appliance. Resist that. PBS is not CPU-hungry; its work is hashing, compressing, and moving chunks. A VM with 2 vCPU, 4 GB RAM, and a 32 GB system disk handles a home fleet comfortably, and making it a VM means the backup server is itself just another workload the cluster can snapshot and move. Give it a generic CPU type — we standardize roaming VMs on x86-64-v2-AES (think of it as the EVC baseline of the cluster) — so the VM can start on any host, including in a disaster, on whatever hardware survived.

Decision 2: the datastore lives on a whole drive, passed through to the VM

The tempting design is a big virtual disk on shared storage. Don't. Instead, take a large external USB drive (5 TB in our build) and pass it through whole to the PBS VM, then let PBS partition and format it itself.

Why whole-device passthrough wins:

Inside PBS, create the datastore via Storage/Disks → Directory → Create: Directory on the passed-through device (that step partitions, formats ext4, and mounts it), then add it as a datastore of type Local — not Removable. Removable is for drive rotation workflows; a fixed backup drive is a fixture, and the type should say so.

Footgun: know what your datastore drive actually is. Many large external drives are SMR (shingled) spinning disks — fine for write-mostly backup workloads, slow under random rewrite pressure. That is one reason garbage collection in the schedule section runs weekly, not daily: GC is exactly the kind of rewrite-heavy work SMR drives hate. Match your maintenance cadence to the physics of the disk.
Trade-off, honestly: passing a USB device through is a manual qm set step on the host in most setups (including Terraform-driven ones — the common providers have no USB block), and it's tied to that host's USB bus. A USB 2.0 port caps you around 35 MB/s; bulk restores will notice. A USB 3 port is worth the re-cable, and the datastore doesn't care which bus it arrived on.
The build

Build it, patch it, then let it serve

Order matters here. A new machine joins the fleet patched — before it does any work. The sequence below is the one we ran; steps 3–5 are where most casual installs quietly go wrong.

  1. Get the ISO, and let the checksum be the gate. Download the official PBS installer ISO and verify its SHA256 against Proxmox's published sum before it goes anywhere near a host. If a download mirror or a TLS warning makes you suspicious mid-download, the checksum is still the whole decision: match, proceed; mismatch, delete and fetch again from somewhere else. Never "install it and see."
  2. Create the VM. However you provision — GUI or infrastructure-as-code — the shape is the design section's: 2 vCPU on a generic baseline, 4 GB RAM, 32 GB system disk, installer ISO attached, start-at-boot enabled.
  3. Run the installer wizard. Static IP on your infrastructure subnet (example: 192.0.2.24/24), your LAN gateway as gateway and DNS, a hostname like pbs.home.arpa, timezone set correctly — backup schedules and log timestamps are nonsense without it — and the root password straight into your password manager. Not into a notes file. Not into chat.
  4. Swap the repository and update, before anything else. A fresh PBS install points at the enterprise repository, which will not serve updates without a subscription. Switch to the no-subscription repository (GUI → Repositories), refresh, and apply all updates. If a new kernel arrives, reboot now — the machine serves nothing yet, so this reboot is free. This "patch before it serves" step is the one people skip because the box "isn't doing anything yet." That's exactly why it's free. Take it.
  5. Detach the installer ISO. Boot order will bite you if you don't: a machine that reboots into its installer after the first power event is a classic. Eject the media in the VM config and confirm the boot order prefers the installed disk.
  6. Pass through the datastore drive and create the datastore, per the design section. Verify from inside PBS: the disk shows with the right capacity and healthy SMART status, and the datastore exists at its mount point.

If you build with Terraform, two pitfalls we paid for so you don't have to:

Footgun (Terraform): a green terraform plan does not prove your endpoint or credentials work. For a from-scratch VM create, the provider may never dial the API until apply — so a plan can pass cleanly against a placeholder example endpoint and fail only at apply time. Read your variable file values explicitly at plan review. Examples in public modules are documentation-range placeholders precisely so they cannot work by accident.
Footgun (Terraform): commit each module's .terraform.lock.hcl after its first successful init. Otherwise the next machine — or the next you, in six months — resolves a different provider version than the one the build was proven with.
The wiring

Wire the cluster to PBS (and the token trap)

PBS and the PVE cluster meet through a dedicated backup user and an API token on the PBS side. Least privilege is the design: this identity should be able to write backups to one datastore and do essentially nothing else.

  1. On PBS, create a user (example: backup@pbs) and an API token under it (example token name: pve).
  2. Grant the DatastoreBackup role on your datastore to the user — and then, separately, to the token.
  3. Store the token secret in your password manager at creation time. PBS shows it once. If you lose it, you delete and reissue the token; there is no "show it again."
  4. On the PVE side, add PBS as cluster storage (type: Proxmox Backup Server) using the PBS address, the datastore name, and the token credentials. The fingerprint check PVE prompts for is real: compare it against the fingerprint shown in the PBS dashboard before accepting.
  5. Confirm the new storage appears on every node. Backups are a cluster-wide resource, not a per-host arrangement.

Step 2 deserves its own spotlight, because it is the single most likely place this whole build fails:

Footgun — privilege separation: a PBS API token with privilege separation enabled does not inherit the user's permissions. It has only the grants made to the token itself. Grant DatastoreBackup to the user alone and everything looks correct in the GUI — until PVE tries to add the storage and fails with a flat 500 Can't find datastore, which sounds like a typo hunt and is nothing of the kind. The fix is one more grant: the same role, on the same datastore, to the token. Keep both grants deliberately: the user is your human seat on PBS; the token is the machine principal the cluster actually authenticates as.

And the standing security notes, because a backup server is a high-value target wearing a helpful name tag:

The schedule

Jobs, retention, and verification

This section is short because PBS makes it short — provided you put each responsibility in the one place that owns it.

The backup job lives on the PVE side: one scheduled job, all VMs, nightly (ours runs at 01:00), targeting the PBS storage, snapshot mode (guests keep running; no shutdown windows to negotiate). Mode matters: snapshot mode with a running guest is a crash-consistent-plus-agent story — for databases with strong opinions, that's a conversation to have per-workload, but for a home fleet it's the sane default.

Retention lives on the datastore, not on the job. Set the job's own retention to blank and let the datastore's prune job govern:

Tip — the disappearing backup that wasn't: after your first backup, the per-VM Backup tab in the PVE GUI may appear empty. The tab's storage dropdown defaults to a local storage; your snapshot is safe on PBS the whole time. Switch the dropdown to the PBS storage, or look at the datastore's Content view in PBS itself. Panic is not a troubleshooting step.
Tip — read the datastore, not the vibes: the PBS dashboard's datastore view shows real usage, dedup ratio, and per-snapshot state. A week in, look at the actual dedup factor: it's the most honest measure of whether chunking is doing for you what this whole section promised.
The proof

The proof: back it up, restore it, boot it with the cable pulled

Everything before this section is setup. This section is the guide.

The proof backup

Pick a real VM — ideally something small but genuinely configured, not a throwaway. Trigger a manual backup from PVE to the PBS storage and watch it land in the datastore's Content view with the right size and a clean finish. That proves the write path, the token, the network, and the datastore in one motion.

The proof restore

Now restore that snapshot to a scratch VMID — a new, unused ID, never over the original — with one critical twist:

Restore it with the network disconnected. Before first boot, set the restored VM's network device to disconnected (or don't attach one). A restored VM is a clone with the original's identity: same IP configuration, same hostname, possibly the same agent tokens, service enrollments, and credentials. Booting it connected creates a doppelganger on your network — two machines answering to one name, agents double-reporting, services double-polling. Boot it cabled-off, get to the login prompt, and you have proven the only thing you needed to prove: this backup becomes a working machine. Then shut it down and delete it.

Login prompt reached = restore verified. That sentence is the entire quality bar, and it's the one most backup projects never actually clear.

Close the loop

The dangerous checklist

Or, in one line: your backups don't count because the job is green. They count because you restored one, on purpose, while nothing was on fire.

Build notes: PBS 4.2, Proxmox VE 9.x, three-node home cluster, datastore on a 5 TB external USB drive. Schedules and retention figures are the starting point used in this build, not commandments — size yours to your fleet and your paranoia. The offsite leg (S3) is deliberately out of scope for this guide; it gets its own build, and its own proof restore, next. Hostnames, addresses, and identifiers from the original build are omitted; every setting and schedule above is reproduced as built.