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.service

6) 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!)