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
- The Proxmox host from the previous post.
- 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:
nfs: nas-backup
export /volume1/proxmox-backup
path /mnt/pve/nas-backup
server 192.168.1.30
content backup
prune-backups keep-last=7prune-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:
❯ 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 successfullyAnd confirmed the file actually landed on the NAS, not just in Proxmox’s view of the mount:
❯ 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.zstConclusion
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.