Quick answer

HAOS ships as a qcow2 disk image rather than an ISO, so create an empty q35 VM with OVMF UEFI, download and validate the exact current release asset, then import /tmp/haos_ova-.qcow2 and attach it as scsi0 first in boot order. Enable Start at boot and the QEMU guest agent before onboarding on port 8123.

The rear panel of a black Minisforum N40 mini PC on a pine desk, showing its power, USB, HDMI, Ethernet and audio ports
Photo: Goovaeh8fot6yugh, Wikimedia Commons (CC0)
Contents

By LK Wood IV · Published 2026-05-31 · Updated 2026-10-10 · ~15 min read · St. Louis County, MO

Running Home Assistant on dedicated hardware (a Pi, an old NUC) made sense five years ago. If you already have a Proxmox homelab, there is no reason for a second machine.

Looking for a HAOS ISO for a Proxmox Home Assistant install? The short answer: HAOS has no ISO. You import a disk image instead, and the steps below show how.

If you don’t have a homelab yet and just want a dedicated box for Home Assistant, start with our best mini PC for Home Assistant guide and come back here to install it.

A HAOS VM on Proxmox gets the HAOS update path, Supervisor, and the official App store.

Home Assistant documents 2 vCPU and 2 GB RAM as the minimum for this VM route. Actual use depends on the integrations and Apps you add.

This guide installs Home Assistant OS as a Proxmox VM. That is the documented KVM/Proxmox method, and it gets you Supervisor and Apps. Home Assistant Container is also supported, but it has no Supervisor or Apps. This guide stays with HAOS in a VM.

Why VM, not LXC

The LXC vs VM decision applies here clearly. Home Assistant OS is a full operating system, not a service. It runs its own kernel, manages its own update cycle, and orchestrates multiple internal containers via Supervisor.

The official documentation provides a KVM/Proxmox VM image. It does not document HAOS as a Proxmox LXC installation.

If you want a container, use the official Home Assistant Container image in Docker, with the tradeoff that it has no Supervisor or Apps. Use the HAOS VM when you want the managed appliance experience covered here.

Is there a HAOS ISO for Proxmox?

No. Home Assistant does not publish an installer ISO for HAOS. The alternative installation page, read on 2026-10-10, offers VM images for VirtualBox (.vdi), KVM/Proxmox (.qcow2) and VMware (.ova). Its own VirtualBox steps say to leave the ISO field blank. The generic x86-64 page says HAOS has no integrated installer, and the only ISO it mentions is an Ubuntu live USB used to write the image to a disk.

The release assets confirm it. The GitHub API listed these x86-64 files for HAOS 18.3 on 2026-10-10, with no .iso among them:

FileUse
haos_ova-18.3.qcow2.xzKVM/Proxmox VM disk. This guide imports it.
haos_ova-18.3.ovaVMware
haos_ova-18.3.vdi.zipVirtualBox
haos_ova-18.3.vmdk.zip, haos_ova-18.3.vhdx.zipOther virtual disk formats
haos_generic-x86-64-18.3.img.xzGeneric x86-64 disk image for writing to a drive in a physical machine

That is why the VM wizard below uses “Do not use any media”. The disk arrives later through an import. Release numbers change, so use the version the download step resolves rather than 18.3.

Step 1: Download the HAOS disk image

Go to home-assistant.io/installation/alternative and download the KVM/Proxmox image. As of 2026 this is a .qcow2 file, a pre-built disk image for QEMU.

Or download directly to your Proxmox host:

# SSH into Proxmox host
set -euo pipefail
cd /tmp

# Get the latest release metadata. curl exits nonzero on API or HTTP errors.
RELEASE_JSON=$(curl --fail --silent --show-error --location \
  https://api.github.com/repos/home-assistant/operating-system/releases/latest)
HAOS_VERSION=$(printf '%s\n' "$RELEASE_JSON" \
  | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p' \
  | head -n 1)

# Stop before downloading or importing if the API response has no release tag.
if [ -z "$HAOS_VERSION" ]; then
  echo "No HAOS release tag found; use the official download page instead." >&2
  exit 1
fi

HAOS_ASSET="haos_ova-${HAOS_VERSION}.qcow2.xz"
HAOS_URL="https://github.com/home-assistant/operating-system/releases/download/${HAOS_VERSION}/${HAOS_ASSET}"
curl --fail --show-error --location --output "$HAOS_ASSET" "$HAOS_URL"

# Reject a missing, empty, or corrupt archive before the VM import step.
test -s "$HAOS_ASSET"
xz --test "$HAOS_ASSET"
xz --decompress "$HAOS_ASSET"
test -s "${HAOS_ASSET%.xz}"

If this block stops, do not import a wildcard left in /tmp from an earlier attempt. Use the official download page, note the exact release filename, and confirm the downloaded .qcow2 is present before continuing.

Step 2: Create the VM in Proxmox

In the Proxmox web UI, click Create VM:

General tab:

  • Node: your Proxmox host
  • VM ID: choose a free ID (e.g., 200)
  • Name: home-assistant

OS tab:

  • Select “Do not use any media” (we’ll import the disk image instead of booting from ISO)

System tab:

  • Machine: q35
  • BIOS: OVMF (UEFI) — HAOS requires UEFI
  • For the UI route, check “Add EFI Disk” → storage: local-lvm (or your preferred storage), and uncheck Pre-Enroll keys.
  • Home Assistant requires a non-Secure-Boot OVMF image for this route. Proxmox’s pre-enrolled-keys option enables Secure Boot by default.
  • If you will use the shell alternative below, leave “Add EFI Disk” unchecked here.
  • QEMU Guest Agent: enabled — this matches Home Assistant’s official KVM example, which adds the guest-agent channel

Disks tab:

  • Delete the default disk that was created (we’ll import our own)

CPU tab:

  • Sockets: 1
  • Cores: 2 minimum; increase this only to meet the requirements of the Apps you run
  • Type: host — lets the VM use your CPU’s full instruction set

Memory tab:

  • 2048 MB minimum; increase it when the workload’s own requirements call for more

Network tab:

  • Bridge: vmbr0 (your main LAN bridge)
  • Model: VirtIO

Click Finish — do NOT start the VM yet. Open Options, set Start at boot to Yes, and confirm QEMU Guest Agent is enabled.

If you deliberately left “Add EFI Disk” unchecked in the wizard, you can now create the EFI variables disk from the Proxmox shell before the first boot:

qm set 200 --efidisk0 local-lvm:1,efitype=4m,pre-enrolled-keys=0

Replace 200 and local-lvm with this VM’s ID and storage. Run this only after Finish has created that VM. Do not run it if the wizard already created an EFI disk.

Proxmox documents STORAGE_ID:SIZE_IN_GiB for allocating the EFI variables volume and notes that the size value is ignored for this disk. pre-enrolled-keys=0 is the explicit no-pre-enrolled-keys state.

Step 3: Import the HAOS disk

SSH into Proxmox and import the downloaded image into the VM you just created. Replace 200 with your VM ID and local-lvm with your storage:

# Run this in the same shell used for the download so HAOS_VERSION is exact.
qm importdisk 200 "/tmp/haos_ova-${HAOS_VERSION}.qcow2" local-lvm

If you opened a new shell, replace ${HAOS_VERSION} with the exact release tag you downloaded. Do not use a wildcard when more than one HAOS image may be in /tmp.

qm importdisk is an alias for qm disk import, which takes <vmid> <source> <storage> and an optional --format of qcow2, raw or vmdk (Proxmox qm manual, read 2026-10-10).

Proxmox’s VM documentation also shows a one-step form that creates and attaches the disk in a single command. It uses STORAGE_ID:0 with the import-from parameter, for example qm set 9000 --scsi0 local-lvm:0,import-from=/path/to/image. If you use it, point it at the extracted .qcow2. Either way, you end with the disk on scsi0.

The importdisk route creates a new disk in the storage. Back in the Proxmox web UI:

  1. Go to the VM → Hardware
  2. You’ll see an “Unused Disk” entry — click it → Edit
  3. Set Bus/Device to SCSI (scsi0) — this matches Home Assistant’s official KVM example
  4. Enable Discard (for SSD/NVMe storage)
  5. Click Add

Now set the boot order:

  1. VM → Options → Boot Order
  2. Enable scsi0 and move it to position 1
  3. Disable any other boot devices

Step 4: First boot and initial setup

Start the VM and watch the boot sequence in the Proxmox web console. Initial setup can take longer while HAOS prepares the system and downloads updates; wait for the console to report that the instance is ready rather than using a fixed timer.

Find the IP address. HAOS uses DHCP by default. Check your router’s DHCP table for a device named homeassistant, or watch the console. HAOS prints its IP when fully booted.

Home Assistant’s onboarding guide (read 2026-10-10) says HAOS is usually at http://homeassistant.local/, with http://homeassistant.local:8123/ as the fallback. The first visit shows a “Preparing Home Assistant” page that downloads the latest version, which can take a while. With the guest agent running, qm guest cmd 200 network-get-interfaces on the Proxmox host lists the VM’s interfaces and addresses.

Open a browser to http://homeassistant-ip:8123. You’ll see the Home Assistant onboarding wizard:

  1. Create your account. Save the username and password somewhere safe, because the owner credentials cannot be recovered.
  2. Set your home location. This sets the time zone, unit system and currency.
  3. Choose your data-sharing setting. Sharing is off by default.
  4. HA will discover devices on your network automatically. Review them and add what’s yours.

On a fresh install you can also restore from a backup at this step, which the recovery table below uses.

After onboarding, go to Settings → System → Updates and apply any pending updates. HAOS manages its own OS updates separately from HA Core updates.

Step 5: USB device passthrough (Zigbee/Z-Wave)

If you have a Zigbee coordinator (Sonoff Zigbee 3.0 Dongle Plus, HUSBZB-1, Aeotec Z-Stick) or Z-Wave stick connected to your Proxmox host, pass it through to the HA VM.

Identify the device on the host:

lsusb

Find your coordinator in the list and note the vendor:product ID. That ID names the USB-serial chip inside the stick.

For example, 1a86:55d4 is the CH9102 bridge on the Sonoff Zigbee 3.0 Dongle Plus V2 (ZBDongle-E). The original Dongle Plus (ZBDongle-P) carries a Silicon Labs CP2102N and shows up as 10c4:ea60 (Zigbee2MQTT adapter docs). Use whichever your own lsusb prints.

Pass through in Proxmox:

  1. VM → Hardware → Add → USB Device
  2. If the device has a unique vendor/product ID, select Use USB vendor/product ID so a physical port move does not change the mapping
  3. If two attached devices share the same vendor/product ID, select the required host bus/port instead so Proxmox can distinguish them
  4. Click Add

Restart the VM, then configure the radio with the matching stack:

  • Zigbee with Zigbee2MQTT: set up an MQTT broker first. Then add https://github.com/zigbee2mqtt/hassio-zigbee2mqtt under Settings → Apps → App store → Repositories, as Zigbee2MQTT’s official Home Assistant repository requires, and install its stable App. In the Zigbee2MQTT configuration, use the coordinator’s persistent path under /dev/serial/by-id/.
  • Z-Wave: follow Home Assistant’s Z-Wave integration setup. It requires the Z-Wave adapter, a Z-Wave server (the Z-Wave JS App on HAOS), and the integration. Do not configure a Z-Wave stick in Zigbee2MQTT.

A path such as /dev/ttyACM0 or /dev/ttyUSB0 can change when USB devices enumerate in a different order.

Step 6: Configure external backups

HAOS has its own encrypted backup system. A backup stored only inside the VM is lost with that VM or its storage, so configure an external or off-site backup location before calling the installation finished.

NAS via SMB/CIFS:

  1. Home Assistant → Settings → System → Backups
  2. Configure a network backup location → SMB share on your NAS
  3. Enable automatic daily backups, Home Assistant’s documented recommendation
  4. Download the emergency kit and store it separately; it contains the key needed to restore encrypted backups

Add a second layer with scheduled Proxmox Backup Server or vzdump backups of the whole VM. A Proxmox snapshot is useful as a short-lived local rollback point before a change, but it is not an independent backup and does not protect against loss of the underlying storage.

Ready for recovery

Finish these checks before moving on to remote access:

CheckPassing stateWhy it matters
Restart behaviorStart at boot is Yes, the QEMU guest agent is enabled, and Proxmox shows agent-reported guest detailsHAOS returns after a Proxmox host reboot and Proxmox can coordinate guest state.
Home Assistant backupAutomatic daily backups go to an external or off-site locationThe application backup remains available if the VM storage fails.
Encryption materialThe emergency kit is downloaded and stored separatelyIt contains the key needed to decrypt the backup during recovery.
Whole-VM protectionPBS or vzdump runs on a schedule; snapshots are labeled temporary/localA VM backup and an HA backup cover different recovery needs; a local snapshot is not either one.
Restore routeOn a replacement HAOS install, choose restore during onboarding, verify the target has more free space than the source currently uses, select the backup, enter its key, and do not refresh while it restoresThis turns a stored backup into a documented recovery procedure.
USB identityUse vendor/product only when unique, bus/port for duplicate IDs, and the radio’s /dev/serial/by-id/... path inside Zigbee2MQTT or Z-Wave JSThe intended radio remains identifiable after a reboot or USB re-enumeration.

Step 7: Remote access

Nabu Casa (Home Assistant Cloud, becoming Home Assistant Link on December 2, 2026). The managed option was $6.50/month or $65/year in the US when checked October 2, 2026, excluding sales tax. It includes remote access and Google/Alexa integration and supports Home Assistant development.

Tailscale App. For free remote access through Tailscale, install the Tailscale App from the Home Assistant App store. After installing and authorizing, your HA instance gets a Tailscale IP. It is then reachable from anywhere on your tailnet. No port forwarding or external domain is required.

Install it: Settings → Apps → App store → search “Tailscale”

The Tailscale App handles the key exchange and keeps the tunnel running. Combined with your existing Tailscale homelab setup, HA is another device on your tailnet.

NGINX Proxy Manager. If you want a proper domain with HTTPS: add a proxy host in NPM pointing to the HA VM’s LAN IP on port 8123. Enable Let’s Encrypt. In HA’s configuration.yaml:

http:
  use_x_forwarded_for: true
  trusted_proxies:
    - 192.168.1.x  # NPM container's LAN IP

Increasing VM disk size

HAOS’s disk image presents a 32 GB virtual disk by default (Home Assistant’s alternative-install docs: “The default is 32 GB”, checked 2026-09-26). If you’re using Apps that store data (Frigate with video, Music Assistant with a library, or large recorder databases), you’ll need more. Frigate is the one that gets away from people — the Frigate NVR storage calculator turns camera count, resolution, codec, and retention into an actual figure before you size the disk.

Resize the virtual disk in Proxmox. The current command is qm disk resize; qm resize is an alias:

qm disk resize 200 scsi0 +32G

Reboot HAOS after increasing the virtual disk, then confirm the larger capacity under Settings → System → Repairs → System information before relying on the added space.

Resource expectations

The official 2 vCPU and 2 GB RAM figures are minimum allocations. They are not a promise about steady-state use. Start there for a small installation. Raise CPU, memory or disk only when the Apps and integrations you run need it.

An NVR, a large recorder database and a music library are separate workloads with their own requirements.

This guide does not claim a bare-metal performance percentage, a fixed update time, zero USB overhead, or a measured power difference: those depend on the host, storage, radio, and workload, and no matching hardware benchmark was run for this article. Use the Power & Cost Calculator with measurements from your own host if electricity cost is part of the decision.


Next steps

Sources

Frequently asked questions

Why use a VM instead of an LXC for Home Assistant?
Home Assistant OS (HAOS) is a full Linux distribution designed to be the entire OS on its target machine. It manages its own kernel, update cycle, and App containers. A Proxmox VM follows Home Assistant’s documented KVM/Proxmox route and keeps that environment isolated. Home Assistant Container is also a supported installation type, but it does not include Apps; Proxmox LXC is not a documented HAOS installation route.
Can I use a Zigbee or Z-Wave USB stick with Proxmox Home Assistant?
Yes — pass the USB device through to the VM. In Proxmox, go to the VM’s Hardware tab → Add → USB Device. Vendor/product ID survives a physical port move when that identity is unique. If two attached radios share the same vendor/product ID, map the required host bus/port instead. Inside HAOS, use the persistent /dev/serial/by-id path with the correct radio server: Zigbee2MQTT for Zigbee or Z-Wave JS for Z-Wave.
How do I back up Home Assistant on Proxmox?
Use two layers: automatic Home Assistant backups sent to an external or off-site location, plus scheduled Proxmox/PBS or vzdump backups of the whole VM. Download Home Assistant’s emergency kit and store it separately because it contains the key needed to restore encrypted backups. A Proxmox snapshot is a temporary local rollback point, not an independent backup.
What are the minimum VM resources for HAOS?
Home Assistant’s documented minimum for the KVM/Proxmox VM is 2 vCPUs and 2GB RAM, and the official VM image uses a 32GB virtual disk. Treat that as the starting allocation. Apps such as an NVR or a large media service can require more resources, so size those workloads from their own requirements.
Does this installation method support Home Assistant Supervisor and Apps?
Yes. The HAOS image includes Supervisor, Apps from the official App store, and Home Assistant OS updates through the UI. Home Assistant Container is a separate supported installation type and does not include Apps.

Sources and corrections

Last updated
Methodology
See our methodology for research and review standards.
Corrections
Spotted an error or a stale number? Email contact@techfuelhq.com. Confirmed corrections are recorded here with the date and change.

About the author

Written by Lowell K. Wood IV, who builds and runs TechFuelHQ from St. Louis, Missouri.