1) Create the S3 bucket
I already had a Wasabi S3 account, so decided to do a daily backup of my self-hosted owncloud data. I created a new bucket simons-proxmox-backup-server and set up API access with access and secret keys.
2) Create the endpoint
Then I created an S3 Endpoint in proxmox-backup-server (pbs). I gave it the imaginative name of simons-proxmox-backup-server.


3) Create the datastore
Next I created a datastore to write the backup to. This is actually a local cache that gets written to the endpoint, and pbs automatically allocated 200GB to it. I chose /mnt/s3_wasabi_owncloud_cache. It seems plenty big enough so far, so I've just left it alone. I left garbage collection and prune schedules alone as daily.



4) Datastore permissions
I can't remember if the backup user existed originally or if I created it, but either way I gave it DatastoreAdmin permissions (needed for the backup job).

5) Create the backup job
On the Proxmox Virtal Environment (pve) box I then created the backup script to write the /mnt/owncloud data directory to the Wasabi bucket using the proxmox-backup-client command, run daily at 3am by a service on a timer.
#!/bin/bash
export PBS_PASSWORD='[REDACTED]'
proxmox-backup-client backup mnt_owncloud.pxar:/mnt/owncloud \
--repository backup@pbs@10.0.0.3:s3_asabi_owncloud/usr/local/bin/backup-mnt-owncloud.sh
[Unit]
Description=Backup /mnt/owncloud to PBS(wasabi)
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-mnt-owncloud.sh/etc/systemd/system/backup-mnt-owncloud.service
[Unit]
Description=Daily /mnt/owncloud backup to PBS(wasabi)
[Timer]
#OnCalendar=daily
OnCalendar=03:00
Persistent=true
[Install]
WantedBy=timers.target/etc/systemd/system/backup-mnt-owncloud.timer
Don't forget to enable the timer!
root@pve:# systemctl list-timers *owncloud*
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2025-11-04 03:00:00 GMT 13h Mon 2025-11-03 03:00:27 GMT 10h ago backup-mnt-owncloud.timer backup-mnt-owncloud.service6) Profit!
Now the /mnt/owncloud folder gets smart backed-up to the S3 wasabi-owncloud datastore every day at 3am.
root@pve:# journalctl -fu backup-mnt-owncloud.service
Nov 03 03:39:28 pve backup-mnt-owncloud.sh[951357]: processed 224.43 GiB in 39m, uploaded 60.779 MiB
Nov 03 03:40:28 pve backup-mnt-owncloud.sh[951357]: processed 228.948 GiB in 40m, uploaded 65.872 MiB
Nov 03 03:41:07 pve backup-mnt-owncloud.sh[951357]: mnt_owncloud.pxar: had to backup 73.827 MiB of 232.102 GiB (compressed 70.093 MiB) in 2439.25 s (average 30.992 KiB/s)
Nov 03 03:41:07 pve backup-mnt-owncloud.sh[951357]: mnt_owncloud.pxar: backup was done incrementally, reused 232.03 GiB (100.0%)
Nov 03 03:41:07 pve backup-mnt-owncloud.sh[951357]: Uploaded backup catalog (1.295 MiB)
Nov 03 03:41:07 pve backup-mnt-owncloud.sh[951357]: Duration: 2440.32s
Nov 03 03:41:07 pve backup-mnt-owncloud.sh[951357]: End Time: Mon Nov 3 03:41:07 2025
Nov 03 03:41:07 pve systemd[1]: backup-mnt-owncloud.service: Deactivated successfully.
Nov 03 03:41:07 pve systemd[1]: Finished backup-mnt-owncloud.service - Backup /mnt/owncloud to PBS(wasabi).
Nov 03 03:41:07 pve systemd[1]: backup-mnt-owncloud.service: Consumed 1h 10min 19.450s CPU time, 110.8G memory peak.systemd output from backup-mnt-owncloud.service
I set the verification schedule to once a month (watch those sneaky S3 charges!)
