Omegion

Proxmox Homelab: Backing Up VMs to a NAS

Introduction

The previous post got me a Terraform-managed VM running Docker and Portainer. Great, except it exists in exactly one place: the local disk of one Proxmox host. If that disk dies, the VM, Portainer, and every stack in it go with it. This post is getting backups off that box and onto a NAS I already have on the LAN.

Prerequisites

  1. The Proxmox host from the previous post.
  2. A NAS on the same LAN that can export an NFS share.

Creating the NFS Share on the NAS

On the NAS, I created a shared folder for this specifically - /volume1/proxmox-backup - and exported it over NFS restricted to the Proxmox host’s IP only, 192.168.1.70/32, not the whole LAN. Same principle as restricting NetworkPolicy egress on the Talos cluster: nothing else on the network has a reason to write into this share, so nothing else gets a route to it.

Adding the NAS as Proxmox Storage

Datacenter > Storage > Add > NFS in the Proxmox UI, pointed at the export, with content type set to “VZDump backup file” (not disk images - this share is backups only). That writes an entry into /etc/pve/storage.cfg:

text
nfs: nas-backup
        export /volume1/proxmox-backup
        path /mnt/pve/nas-backup
        server 192.168.1.30
        content backup
        prune-backups keep-last=7

prune-backups keep-last=7 caps it at the last 7 backups per guest - Proxmox deletes older ones itself on each new backup, so the NAS share doesn’t grow unbounded.

Scheduling Backups

Datacenter > Backup > Add: target the portainer VM, storage nas-backup, mode snapshot (backs up a running VM without stopping it, using a live snapshot), compression zstd, schedule 02:00 daily. Mode matters here specifically because this VM is meant to stay up - stop or suspend mode would take Portainer and everything behind it down for the duration of every backup.

Running One Manually

Didn’t want to wait until 2am to find out if this actually works:

shell
❯ vzdump 100 --storage nas-backup --mode snapshot --compress zstd
INFO: starting new backup job: vzdump 100 --storage nas-backup --mode snapshot --compress zstd
INFO: Starting Backup of VM 100 (qemu)
INFO: status = running
INFO: backup mode: snapshot
INFO: creating vzdump archive '/mnt/pve/nas-backup/dump/vzdump-qemu-100-2025_11_14-02_03_11.vma.zst'
INFO: Finished Backup of VM 100 (00:01:47)
INFO: Backup job finished successfully

And confirmed the file actually landed on the NAS, not just in Proxmox’s view of the mount:

shell
❯ ssh nas 'ls -la /volume1/proxmox-backup/dump/'
-rw-r--r-- 1 root root 3812048291 Nov 14 02:05 vzdump-qemu-100-2025_11_14-02_03_11.vma.zst

Conclusion

The VM now has off-box backups on a schedule, capped at 7 generations, and I’ve confirmed manually that a backup actually reaches the NAS rather than trusting the UI’s green checkmark. It’s still all on the same LAN, though - if I want to check on Portainer, or hit an app running behind it, from anywhere other than my home network, none of that is reachable yet. Next post: exposing it over Tailscale.