Proxmox

Proxmox VE is the hypervisor at the base of my homelab. It runs on a mini PC and hosts three virtual machines: OPNsense, a Docker host, and Home Assistant OS.

About this page. The hardware and settings below were read from the running system. Addresses, MAC addresses, and serial numbers are left out on purpose.

Role
Hypervisor for the homelab
Version
Proxmox VE 8.4, on Debian 12 with the Proxmox 6.8 kernel
Cluster
Single node
Runs on
A mini PC
Processor
Intel N100, 4 cores and 4 threads
Memory
16 GB (15.4 GiB usable)
Storage
One 512 GB SATA M.2 SSD
Network
Two Ethernet ports in use; Wi-Fi unused
Boot
UEFI, with Secure Boot off
License
No subscription; the no-subscription repository is used
Resources

A small box carrying three always-on guests.

All three virtual machines start automatically when the host boots. Their combined allocation shows how much the mini PC is being asked to do:

Virtual machineIDvCPUsMemoryDisk
OPNsense10042 GiB32 GiB
Docker Host10148 GiB64 GiB
Home Assistant OS10224 GiB32 GiB
Allocated10 of 4 cores14 of 15.4 GiB128 GiB
  • Processor. The guests have 10 virtual CPUs between them on 4 physical cores. That works because the guests rarely all peak at the same time.
  • Memory. Memory is not overcommitted. The guests are given 14 GiB, which leaves about 1.4 GiB for Proxmox itself, so there is little room to add another guest without shrinking one. The Docker host is the obvious one to shrink: its containers use only about 1.6 GiB of its 8 GiB (see its page).
  • Disk. The 128 GiB of virtual disks sits on thin-provisioned storage, so it only takes up the space each guest has actually written.
Storage

Two storage pools on one SSD.

The installer’s default layout splits the SSD into two pools:

PoolTypeSizeHolds
local-lvmLVM-thin349 GiBVirtual machine disks
localDirectory94 GiBInstaller ISO images, templates, and backups

The virtual disks use the VirtIO SCSI single controller with a dedicated I/O thread per disk, and TRIM (discard) is enabled on the OPNsense and Home Assistant disks so that freed space returns to the thin pool.

There is one SSD and no redundancy. That is fine for a homelab as long as the important data is backed up somewhere else, which is covered under next steps.

Networking

Two ports, two bridges, one firewall between them.

Each physical Ethernet port is attached to its own Linux bridge, and the virtual machines connect to the bridges rather than to the ports directly:

Physical portBridgeConnected to
enp1s0vmbr0The Proxmox host’s management address, the first OPNsense interface, the Docker host, and Home Assistant OS
enp2s0vmbr1The second OPNsense interface only. The host has no address on this bridge.

OPNsense is the only guest on both bridges, so it sits between the two physical ports, and traffic between the two networks has to pass through it. All virtual network cards use the VirtIO driver, and the OPNsense cards have multiqueue enabled for throughput. Proxmox’s own firewall is switched on, and it is also enabled on the Home Assistant guest’s network card.

Adding the second bridge

  1. Open the node in the web interface, then System > Network.
  2. Click Create and choose Linux Bridge. Name it vmbr1, set Bridge ports to the second port (enp2s0), and leave the IP address blank so that the host has no address on it.
  3. Click Apply Configuration. Then attach the second virtual network card of the OPNsense VM to vmbr1 in its hardware settings.
VM settings

Choices shared by the three guests.

  • Start at boot. Every guest starts automatically, so the lab comes back on its own after a power cut. Set it under the VM’s Options > Start at boot.
  • CPU type. The guests use the portable x86-64-v2-AES model rather than passing the host CPU through. It keeps hardware AES acceleration and makes it easier to move a guest to a different processor later.
  • Fixed memory for the firewall. Memory ballooning is turned off for OPNsense, so its memory never shrinks under pressure from the other guests.
  • Firmware. Home Assistant OS uses UEFI (OVMF) on the q35 machine type with its own EFI disk. The other two guests use the default BIOS.
  • USB passthrough. One USB device from the host is passed through to each of the Docker host and Home Assistant OS, so those guests can talk to the hardware directly.
Installation

Installing Proxmox VE on the mini PC.

  1. Download the installer. Get the Proxmox VE 8.4 ISO from proxmox.com and write it to a USB stick with a tool such as balenaEtcher.
  2. Boot from the stick. Open the mini PC’s boot menu, choose the USB stick in UEFI mode, and pick Install Proxmox VE (Graphical).
  3. Choose the target disk. Select the SSD and keep the default options. The installer creates a root volume and turns the rest of the disk into a thin-provisioned pool, which is where the two storage pools above come from.
  4. Set the basics. Enter the country, time zone, and keyboard layout, then the root password and an email address for system notices.
  5. Configure the management network. Choose the first Ethernet port, and enter a hostname, a fixed address, the gateway, and a DNS server. The installer builds vmbr0 on that port for you.
  6. Finish and sign in. Install, remove the USB stick, and reboot. Then browse to the host’s address on port 8006 and sign in as root with the Linux PAM realm.

Next come the update repositories, described below, and the second bridge from the networking section.

Repositories and updates

Staying current without a subscription.

A fresh install points at the paid enterprise repositories, which return errors without a subscription key. This host uses the free no-subscription repository instead, alongside the standard Debian 12 repositories for updates and security fixes.

  1. Open the node, then Updates > Repositories.
  2. Select the pve-enterprise entry (and the Ceph enterprise entry, if present) and click Disable.
  3. Click Add, choose No-Subscription, and add it.
  4. Go back to Updates, click Refresh, then Upgrade. Reboot afterward if the kernel changed.

The no-subscription repository is not intended for production systems, because its packages get less testing than the enterprise ones. For a homelab that trade is reasonable, and it is worth taking a snapshot or backup of the important guests before a large upgrade.

Next steps

Where the setup could be stronger.

  • Scheduled backups. No backup job exists yet, and everything sits on one SSD, so a failed disk would lose every guest. A scheduled backup to a second disk or another machine is the first improvement.
  • Memory headroom. The guests are allocated 14 of about 15.4 GiB. The Docker host’s containers use about 1.6 GiB of its 8 GiB, so trimming that guest is the easiest way to make room for another one.
  • Tidy the installer media. The Docker host and Home Assistant guests still have their installer ISOs attached. Detaching them, and removing the CD-ROM entry from the Docker host’s boot order, is a small clean-up.
Virtual machines

Three guests, one page each.

  1. OPNsenseAn open-source firewall and routing platform.
  2. Docker HostA virtual machine for running containers.
  3. Home Assistant OSThe appliance operating system for Home Assistant.