Skip to content

Proxmox Backup Server + Cloudflare R2

Published: December 23, 2025

Author: Khalil Imitik

pbs-os-r2.png

Proxmox Backup Server is a robust backup solution for Proxmox VE that enables scheduled backups of your virtual machines and containers. It serves as a critical component of your disaster recovery strategy, ensuring you can restore your infrastructure after hardware failures, data corruption, or accidental deletion

PBS divides each guest into small data chunks, naming each chunk using a hash of its contents. During backups, PBS compares these hashes to identify and skip duplicate data, storing only what’s new or changed.

Why this matters: Without deduplication, storage consumption grows rapidly.

For example, 10 VMs running the same OS (3.5 GB each) would require 35 GB without deduplication just for the operating system. But with deduplication feature, PBS stores the base OS once plus only the unique data per VM, saving approximately 31.5 GB. Actual savings depend on your deduplication ratio.

Deduplication through content-based chunking

For extra security beyond TLS connection, enable encryption only when your VMs or LXC containers hold sensitive data or operate in restricted environments. Adds a bit of overhead, but that’s a fair trade for peace of mind.

Every chunk is named by its SHA256 hash, making corruption instantly detectable. You can schedule verification jobs to periodically re-check all chunks, or enable “Verify New” to validate each backup right after creation. If something’s off, PBS flags it and the next backup naturally re-uploads the chunk

Restore entire VMs/containers, or skip the full restore and grab just the files you need. For VMs, use the file restore button in PVE to browse partitions Linux/Windows and download individual files

Yeahh! A lot of questions might come to mind, is it reliable? Is it fast enough for backups and restores?

Well, this feature landed in ver. 4.0 and still maturing, but it’s been rock solid for me so far. As for speed, I ran some tests against the Cloudflare endpoint, to calculate or at least evaluate performance (details in setup)

So… let’s dive in!

We’ll cover connectivity, configs, and a few considerations along the way

Head to your Cloudflare dashboard and navigate to Storage & Databases > R2 Object Storage > Overview. Create a new bucket for your backups.

Creation a bucket for backups

On the same R2 overview page, go to API Tokens and create a new account api token with “Admin read & write” permissions, Why? because PBS needs to list all buckets, and “Object Read & Write” with a single bucket scope won’t work, otherwise you’ll get a 400 error as status code, but still you can restrict access by allowing only your server’s IP. Save the credentials generated!

Create a api token for proxmox backups server

Now, switch to the PBS UI and link your S3 endpoint:

S3 endpoint in PBS

Then add a datastore and specify which bucket to use:

R2 datastore

Move into the prune options to define how long backups stick around. You can also manage this from PVE later

Prune Scheduling

To link PVE with PBS, add it as storage under Datacenter > Storage

PBS as Storage

Last but not least, add/adjust your backup job under Datacenter > Backup

Backup Job in PVE

Now that everything’s set up, let’s see how fast it actually runs. Here’s a quick benchmark against Cloudflare

Download
curl -o /dev/null https://speed.cloudflare.com/__down?bytes=100000000
Output
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 95.3M 0 95.3M 0 0 79.5M 0 --:--:-- 0:00:01 --:--:-- 79.6M
Upload
dd if=/dev/zero bs=1M count=100 2>&1 | curl -X POST -T - https://speed.cloudflare.com/__up -o /dev/null
Output
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 100M 0 0 0 100M 0 59.9M --:--:-- 0:00:01 --:--:-- 59.9M

And that’s it!

CC BY-NC-ND 4.0
Attribution required • Non-commercial • No derivatives