A battle-tested guide for running Home Assistant as a production-grade VM on Proxmox, with hardware passthrough, automated snapshots, and zero-downtime backup.
Why Proxmox + HA?
Home Assistant can run on a Raspberry Pi, a Docker container, or directly on bare metal. But for a production smart home β the kind that controls lighting, HVAC, shutters, and security β you need:
- Snapshots β roll back before you break things (and you will break things)
- Resource flexibility β give HA 2 cores and 4 GB today, resize tomorrow without reinstall
- Separation of concerns β keep HA off your Docker host, keep databases off your HA box
- Hardware passthrough β pass Zigbee/Z-Wave/Thread dongles straight to the VM
- Proxmox Backup Server β full VM backups without HA downtime
Option A: VM (Recommended)
A full Virtual Machine. Supports USB passthrough for dongles, full ACL isolation, and live migration across Proxmox nodes.
Create the VM
# Download the HAOS image
wget https://github.com/home-assistant/operating-system/releases/download/14.2/haos_ova-14.2.qcow2.xz
xz -d haos_ova-14.2.qcow2.xz
# Import to Proxmox storage (change local-zfs to your storage)
qm create 1000 --name "ha" --cores 2 --memory 4096 --net0 virtio,bridge=vmbr0
qm importdisk 1000 haos_ova-14.2.qcow2 local-zfs
qm set 1000 --scsihw virtio-scsi-pci --scsi0 local-zfs:vm-1000-disk-0
qm set 1000 --boot order=scsi0
qm set 1000 --machine q35
qm set 1000 --ostype l26
USB Passthrough (Zigbee/ZWave)
# Find your dongle
lsusb
# Bus 001 Device 005: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
# Pass it to the VM
qm set 1000 --usb0 host=10c4:ea60
Performance Tuning
qm set 1000 --balloon 1
qm set 1000 --cpu host --numa 1
qm set 1000 --agent 1 # QEMU-GA for graceful shutdown
--cpu host gives HA access to hardware acceleration flags. Without it, addon containers can't use AVX/AVX2 and some ML-based integrations will fail silently.Option B: LXC (Lightweight, No USB Passthrough)
For setups where Zigbee/ZWave runs on a dedicated coordinator (e.g., SLZB-06 over the network). Less overhead but no USB passthrough β if you need a local dongle, go VM.
pct create 2000 local:vztmpl/ubuntu-24.04-standard_24.04-2_amd64.tar.zst \
--cores 2 --memory 2048 --swap 1024 \
--net0 name=eth0,bridge=vmbr0,firewall=1 \
--rootfs local-zfs:16 \
--ostype ubuntu
# Install HA Core inside the LXC
pct enter 2000
apt install docker.io docker-compose-plugin
mkdir -p /opt/ha && cd /opt/ha
# docker-compose.yml for HA Core
cat > docker-compose.yml << 'EOF'
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: ha
volumes:
- ./config:/config
network_mode: host
restart: unless-stopped
environment:
- TZ=Asia/Ho_Chi_Minh
EOF
docker compose up -d
Backup Strategy (Critical)
This alone justifies the Proxmox approach.
Automated Snapshots
# Schedule: daily snapshot, keep 7
pvesh create /nodes/proxmox/qemu/1000/snapshot \
--snapname daily-$(date +%Y%m%d) --vmstate 0
# Cleanup old ones (>7 days)
for snap in $(pvesh get /nodes/proxmox/qemu/1000/snapshot | jq -r '.[].name'); do
date_part=$(echo $snap | grep -oP '\d{8}')
[ -z "$date_part" ] && continue
if [ $(date -d "$date_part" +%s) -lt $(date -d '7 days ago' +%s) ]; then
pvesh delete /nodes/proxmox/qemu/1000/snapshot/$snap
fi
done
Proxmox Backup Server (PBS)
# Add PBS datastore
pvesm set pbs1 --datastore ha_backups --content backup
# Run backup
vzdump 1000 --storage pbs1 --mode snapshot --compress zstd --remove 0
Key: --mode snapshot requires no downtime. HA keeps running, PBS reads the ZFS snapshot atomically.
HA Internal Backup
Go to Settings β System β Backups in HA. Set:
- Location:
/config/backups - Keep: 5 local backups
- Automatically: daily at 03:00
Production Networking
Don't put HA on the default VLAN with your security cameras.
| VLAN | Purpose | Access |
|---|---|---|
| 10 | IoT β trusted (lights, thermostats) | HA access β |
| 20 | IoT β untrusted (TVs, cameras) | HA outbound only |
| 30 | Management (Proxmox, router) | HA admin access |
| 99 | Guest | Blocked |
MikroTik rule example:
/interface vlan add interface=bridge name=vlan10-iot-trusted vlan-id=10
/ip firewall filter add chain=forward src-address=192.168.10.0/24 \
dst-address=192.168.20.0/24 action=accept comment="HA controls IoT"
/ip firewall filter add chain=forward src-address=192.168.20.0/24 \
dst-address=192.168.10.0/24 action=drop comment="Block IoT β HA"
Zigbee2MQTT + Matter
Zigbee2MQTT (Recommended)
# zigbee2mqtt config.yaml
data_path: /config/zigbee2mqtt
serial:
port: /dev/ttyUSB0
adapter: ezsp
mqtt:
server: mqtt://core-mosquitto:1883
user: mqtt_user
password: !secret mqtt_password
advanced:
homeassistant_discovery_topic: homeassistant
homeassistant_status_topic: homeassistant/status
Matter via HA
Make sure the VM has host-model CPU and 2 GB+ RAM. Matter needs Thread, which needs a Thread Border Router (HomePod Mini, Apple TV, or Pi with OpenThread). HA 2026.1+ has native Matter support β no extra container needed.
Cost (VN Context)
| Component | Estimated Cost |
|---|---|
| Proxmox host (reuse existing server/NUC) | 0 β 8M VND |
| Zigbee Coordinator (SLZB-06 or Sonoff) | 500k β 1.5M |
| SSD for VM (240 GB) | 500k β 1M |
| Total one-time | ~1-10M VND |
| vs. HA Green (official hardware) | 4.4M |
| vs. Raspberry Pi 5 | 1.5-2.5M |
If you already run Proxmox for other services, the marginal cost is literally zero.
The Bottom Line
Running HA on Proxmox gives you three superpowers:
- Snapshots before every config change β saved me dozens of times
- Live migration β zero-downtime hardware maintenance
- Resource isolation β a runaway addon won't crash your NVR or Plex
Skip the Raspberry Pi for production. Go VM.
Have questions? Found a bug in this guide? Reach out β I maintain this setup across multiple sites and update it with every HA release.