A side quest migration from mixed Home Assistant hosts to x86_64 Proxmox nodes, with private site access, static infrastructure roles, and Zigbee coordinator continuity.
Two Home Assistant deployments were moved into the same operating model: Home Assistant OS as a Proxmox VM, Tailscale as a separate site-access container, and Zigbee coordinators passed through to the Home Assistant VMs.
x86_64 Proxmox node
├── LXC: Tailscale site router
└── VM: Home Assistant OS
└── USB passthrough: Zigbee coordinator
The home deployment started as a Windows laptop running Home Assistant through Oracle VirtualBox. The shop deployment started as a Raspberry Pi. Both worked, but neither was the operating pattern I wanted to keep extending.
The migration goal was not to build an enterprise lab. The goal was to make the automation stack easier to recover, easier to reach remotely, and less dependent on fragile host-specific installs.
Hardware model details are intentionally omitted. The specific boxes are not the useful part of the work, and publishing model-level infrastructure details exposes more than it explains.
The home site moved from the Windows laptop and Oracle VirtualBox arrangement to a Proxmox-backed Home Assistant OS VM. The Zigbee coordinator was moved to the new host and passed through to the VM.
The shop site moved from a Raspberry Pi to a second Proxmox-backed Home Assistant OS VM. This cutover was staged more carefully because the Pi was the active production controller.
Tailscale became the private access layer for each site, but the useful design choice was keeping it separate from Home Assistant itself.
Proxmox host:
break-glass management path
Tailscale LXC:
subnet routing
optional exit-node behavior
Home Assistant VM:
automation platform only
During setup, routing issues reinforced the importance of giving the site-router container a stable LAN identity. A subnet router that loses its local address can look like a Tailscale problem even when the root cause is local network state.
Exact addresses are omitted, but the role pattern is preserved:
router / gateway
Proxmox host
Tailscale container
Home Assistant VM
Each infrastructure role gets a predictable address. That makes recovery, routing, and troubleshooting easier, especially when working remotely.
For the staged cutover, the new Home Assistant VM was configured before it was allowed onto the network. That avoided collision with the still-running production host.
Both migrations included moving a Zigbee coordinator from the old host to the new Proxmox-backed Home Assistant VM.
The important object is the coordinator and the restored Home Assistant state, not the old host. Once the coordinator was attached to the restored VM, devices began reporting without being re-paired.
USB serial identity was checked on the Proxmox host before passthrough. The VM then received the coordinator through Proxmox USB passthrough, and Home Assistant resumed control through the restored Zigbee integration.
Snapshots were used as temporary rollback points during staging and cutover. They were not treated as backups.
Useful checkpoints:
- clean VM before first boot
- static addressing staged
- updated VM before final restore
- post-cutover with Zigbee reporting
After the migration is stable, old staging snapshots should be removed to reduce thin-provisioning exposure.
Tailscale should not depend on Home Assistant when Home Assistant is the thing being migrated, restored, or debugged.
Predictable addresses for the Proxmox host, Tailscale container, and Home Assistant VM made staged migration and remote recovery cleaner.
When modifying a Proxmox VM network definition, preserving the existing MAC matters if reservations or rules depend on it.
A powered-off VM can still auto-start later. During staging, the VM needed to be stopped, have auto-start disabled, and have its virtual network link disconnected.
Moving the coordinator and restoring the Home Assistant backup preserved the Zigbee network. Re-pairing devices was not required.
This was not a flashy build, but it had enough real engineering content to preserve: host migration, backup and restore discipline, Tailscale routing, static addressing, USB passthrough, staged cutover, and Zigbee continuity.
It is exactly the kind of side quest that seems small until it has to be done again from memory.
GitHub: github.com/novovictus
Contact: contact@ninja-neer.net