Backups that actually restore
Proxmox Backup Server takes daily deduplicated snapshots of every VM and container, stored on a separate NAS, with tiered retention.
What made me start
I had been adding services and VMs to Proxmox for a while before I started to think that if this thing got corrupted or went down, all of that work was gone and I would be starting from the beginning again. That is when I knew I had to figure out a backup solution.
The first thing I worked out was not which software to use, it was where the data would go. Do I even have the space for this. The NAS was the obvious answer since that is what it is built for, so the real question became whether Proxmox could back up to a network share at all. It can, and Proxmox ships its own backup server that works hand in hand with it, so not having to rely on a third party for it was a nice relief.
The setup
Proxmox Backup Server runs as its own VM, with its datastore pointed at a share on the NAS. I put it on hardware I already had rather than waiting until I found a separate box for it. A daily job snapshots every VM and container. Retention keeps the last three, plus a daily for a week and a weekly for a month. Because the backup server deduplicates at the chunk level, a daily full backup costs very little extra space.
The week of red tasks
The Proxmox task log started showing entries in red. I ignored them for a couple of days figuring I would come back to it, which is the part I would do differently. When I finally sat down and read them, the pattern was obvious. They were all landing at the time I had set the nightly backup to run.
My first instinct was that I had configured the job wrong, so I retuned the backup settings a couple of times. That turned out to not be my issue. Once I stopped guessing and actually read the output from the failed runs, it was clear the backup data was never reaching the NAS at all. The backup service runs as a specific low-numbered user ID, and the NAS was remapping that ID at the share, so the backup server could not write its own chunk files. It was a permissions problem on the storage side, not a Proxmox problem.
The fix was a chain of small things: create a matching user and group with that exact ID on the NAS, add an access control entry on the share, set the share to map all users to the admin identity, set the service's file-creation mask, and repair the permissions on the files that had already been written wrong. I also forced the older NFS version, because the newer one made the remapping worse.
The whole thing took about a week, and most of that was not troubleshooting. It was waiting. I would change one thing, then wait until the next night's run to find out whether it helped. If you are setting this up yourself, that is the part to get right before anything else: make sure the backup server has the access it needs on the storage device to write files unattended.
Making it survive updates
That worked, but it was sitting on hand-edited system files on the NAS, and a firmware update does not treat those as protected configuration. An update can put the old settings back, which makes sense, that is always a possibility any time a patch gets rolled out. I could have written myself a note to redo it after every update, but then I have to remember, and I would only find out I forgot once the backups had already been failing for a while.
So I looked into automating it and found I could run a script at boot through the NAS's own task scheduler. It checks whether the user, the group, and the access control entry are there, and recreates them if they are not. It is idempotent, so running it when nothing is wrong does nothing.
# Runs at boot via the NAS task scheduler. Idempotent by design: # it checks first and only acts when something is missing. TARGET_UID=34 # the ID the backup service runs as TARGET_USER=pbsbackup SHARE_PATH=/volume1/<backup-share> # Recreate the group only if the ID is not already mapped to it if ! getent group "$TARGET_USER" | awk -F: -v g="$TARGET_UID" '{exit !($3==g)}'; then groupadd -g "$TARGET_UID" -o "$TARGET_USER" logger -t pbs-uid-fix "Recreated group" fi # Recreate the user only if the ID is not already mapped to it if ! getent passwd "$TARGET_USER" | awk -F: -v u="$TARGET_UID" '{exit !($3==u)}'; then useradd -u "$TARGET_UID" -g "$TARGET_UID" -o -M -s /sbin/nologin "$TARGET_USER" logger -t pbs-uid-fix "Recreated user" fi # Reapplying the ACL is harmless if nothing changed synoacltool -add "$SHARE_PATH" "user:${TARGET_USER}:allow:rwxpdDaARWc--:fd--"
It has since been through a real firmware update and reboot. I did not take the scheduler's word for it either. I forced a backup afterward and watched it finish clean. A green status only proves the share mounts. Writing a chunk is what proves the identity mapping is correct.