Building a 4-Node Proxmox Cluster on HP EliteDesk Mini PCs

How to assemble a production-grade Proxmox VE 9 cluster from four HP EliteDesk 705 G4 mini PCs — hardware selection, quorum strategy, firewall, and the gotchas that cost a Saturday.

When I decided to build a proper homelab, the calculus was simple: enough compute for a real Proxmox cluster, several AI inference containers, and an electricity bill I could ignore. The answer was HP EliteDesk 705 G4 mini PCs — four of them, acquired refurbished for around $120 each.

This is the guide I wish existed when I started.


Cluster Architecture

Gigabit Switch10.25.144.0/24 <rect x="30" y="140" width="140" height="120" rx="8" fill="#1f2937" stroke="#27272a" stroke-width="1.5"/> <text x="100" y="162" text-anchor="middle" fill="#f4f4f5" font-size="11" font-family="monospace" font-weight="bold">pvelab01</text> <text x="100" y="178" text-anchor="middle" fill="#14b8a6" font-size="10" font-family="monospace">10.25.144.70</text> <text x="100" y="196" text-anchor="middle" fill="#71717a" font-size="10" font-family="monospace">Ryzen 5 2400G · 16GB</text> <text x="100" y="214" text-anchor="middle" fill="#a1a1aa" font-size="9" font-family="monospace">CT 100,107</text> <line x1="100" y1="64" x2="100" y2="140" stroke="#374151" stroke-width="1.5" stroke-dasharray="4,3"/> <rect x="200" y="140" width="140" height="120" rx="8" fill="#1f2937" stroke="#27272a" stroke-width="1.5"/> <text x="270" y="162" text-anchor="middle" fill="#f4f4f5" font-size="11" font-family="monospace" font-weight="bold">pvelab02</text> <text x="270" y="178" text-anchor="middle" fill="#14b8a6" font-size="10" font-family="monospace">10.25.144.71</text> <text x="270" y="196" text-anchor="middle" fill="#71717a" font-size="10" font-family="monospace">Ryzen 5 2400G · 8GB</text> <text x="270" y="214" text-anchor="middle" fill="#a1a1aa" font-size="9" font-family="monospace">CT 101,105</text> <line x1="270" y1="64" x2="270" y2="140" stroke="#374151" stroke-width="1.5" stroke-dasharray="4,3"/> <rect x="370" y="140" width="140" height="120" rx="8" fill="#1f2937" stroke="#27272a" stroke-width="1.5"/> <text x="440" y="162" text-anchor="middle" fill="#f4f4f5" font-size="11" font-family="monospace" font-weight="bold">pvelab03</text> <text x="440" y="178" text-anchor="middle" fill="#14b8a6" font-size="10" font-family="monospace">10.25.144.72</text> <text x="440" y="196" text-anchor="middle" fill="#71717a" font-size="10" font-family="monospace">Ryzen 5 2400G · 8GB</text> <text x="440" y="214" text-anchor="middle" fill="#a1a1aa" font-size="9" font-family="monospace">CT 102-104,106</text> <line x1="440" y1="64" x2="440" y2="140" stroke="#374151" stroke-width="1.5" stroke-dasharray="4,3"/> <rect x="540" y="140" width="140" height="120" rx="8" fill="#1f2937" stroke="#27272a" stroke-width="1.5"/> <text x="610" y="162" text-anchor="middle" fill="#f4f4f5" font-size="11" font-family="monospace" font-weight="bold">pvelab04</text> <text x="610" y="178" text-anchor="middle" fill="#14b8a6" font-size="10" font-family="monospace">10.25.144.73</text> <text x="610" y="196" text-anchor="middle" fill="#71717a" font-size="10" font-family="monospace">Ryzen 5 2400G · 16GB</text> <text x="610" y="214" text-anchor="middle" fill="#a1a1aa" font-size="9" font-family="monospace">CT 108 + Tailscale</text> <line x1="610" y1="64" x2="610" y2="140" stroke="#374151" stroke-width="1.5" stroke-dasharray="4,3"/> Corosync cluster ring (UDP 5404-5405)

Hardware: why EliteDesk G4

The HP EliteDesk 705 G4 packs an AMD Ryzen 5 Pro 2400G (4c/8t, 65W TDP) in a 1-litre form factor. At idle: 12–18W per node. Four nodes at full bore: ~200W — one 20A circuit, one modest UPS.

Spec Value Notes
CPU Ryzen 5 Pro 2400G 4c/8t, Vega 11 iGPU (CPU inference only)
RAM 2× SO-DIMM DDR4 Expandable to 32 GB
Storage M.2 2280 NVMe 256 GB fitted; SATA bay optional
Networking 1× Gigabit Intel i219-V Wired only — WiFi ignored
Price ~$120 refurbished HP Certified Refurbished on eBay/Amazon
No GPU inference

The Vega 11 iGPU has BIOS-locked 512 MB shared VRAM — too small for any practical model. These nodes are CPU inference only. ROCm installation was attempted and failed on Ubuntu 24.04 (package unavailable, installer 404). Real GPU upgrade would require a discrete AMD card in a PCIe riser setup — beyond scope here.


Task 1: Prepare your hardware

1Acquire four EliteDesk 705 G4 units1–3 days

Search eBay, Amazon Warehouse, or HP’s Certified Refurbished store for “HP EliteDesk 705 G4 mini”. Target the G4 revision (Ryzen 2400G). Avoid G3 (older A-series APU) and G5 (higher cost, similar performance for this workload).

Check each listing for:

  • RAM installed (8 or 16 GB)
  • NVMe included or add-on needed
  • AC adapter included (65W barrel jack)
2Expand RAM on nodes 1 and 410 min each

Nodes 1 and 4 serve as your primary management hosts and should have 16 GB for headroom. The G4 takes two DDR4-2400 SO-DIMMs. Remove the bottom panel (two screws), slide out the existing DIMM(s), install 2×8 GB.

Nodes 2 and 3 at 8 GB is workable for now — sufficient for Ollama 7B models and monitoring containers.

3Install NVMe drives5 min each

Each node needs an M.2 2280 NVMe SSD. 256 GB is adequate for the Proxmox OS plus local container storage. 512 GB gives comfortable room for more containers or snapshot storage.

Brands that consistently work in this form factor: Samsung 970 Evo, WD Blue SN570, Kingston NV2.


Task 2: Install Proxmox VE on each node

1Download Proxmox VE 9 ISO and write to USB5 min

Download from proxmox.com/downloads. Write to USB with:

Write Proxmox ISO to USB

dd bs=1M conv=fdatasync if=proxmox-ve_9.2-1.iso of=/dev/sdX status=progress

Replace /dev/sdX with your USB device (confirm with lsblk first).

2Install on each node — assign static IPs during setup20 min each

Boot from USB. The installer prompts for:

  • Country/keyboard/timezone — set once
  • Disk — select your NVMe; defaults are fine
  • Network — this is critical: set the static IP here matching your plan
Set IPs correctly before clustering

Changing a node’s management IP after cluster formation requires editing Corosync config. It’s painful. Assign your final IPs during installation — do not use DHCP.

Use this IP plan:

Node Hostname IP
Node 1 pvelab01 10.25.144.70
Node 2 pvelab02 10.25.144.71
Node 3 pvelab03 10.25.144.72
Node 4 pvelab04 10.25.144.73
3Switch to the no-subscription repository on all nodes5 min each

Proxmox ships configured for the enterprise repository, which requires a paid subscription. Switch to the free no-subscription repo before running updates:

pvelab01 — switch repos and update

sed -i 's/^deb/#deb/' /etc/apt/sources.list.d/pve-enterprise.list
echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" \
> /etc/apt/sources.list.d/pve-no-subscription.list
apt update && apt dist-upgrade -y

Repeat on all four nodes before proceeding.


Task 3: Form the cluster

1Create the cluster on node 12 min

SSH to pvelab01 and run:

pvelab01 — create cluster

pvecm create myofficelab
pvecm status

You should see Quorum information with Nodes: 1.

2Join nodes 2, 3, and 45 min

On each remaining node, run the join command pointing at node 1’s IP:

pvelab02 / 03 / 04 — join cluster

pvecm add 10.25.144.70

You’ll be prompted for root@pvelab01’s password. After joining, verify on any node:

Verify cluster membership

pvecm status
pvecm nodes

All four nodes should show online and quorum votes should total 4.

3Verify in the web UI2 min

Open https://10.25.144.73:8006 in your browser (bypass the self-signed cert warning). Log in as root. The left sidebar should show all four nodes under your cluster name.

https://10.25.144.73:8006▾ myofficelab<text x="24" y="78" fill="#a1a1aa" font-size="10" font-family="monospace">🟢 pvelab01</text><text x="24" y="96" fill="#a1a1aa" font-size="10" font-family="monospace">🟢 pvelab02</text><text x="24" y="114" fill="#a1a1aa" font-size="10" font-family="monospace">🟢 pvelab03</text><text x="24" y="132" fill="#a1a1aa" font-size="10" font-family="monospace">🟢 pvelab04</text>Cluster: myofficelabNodes: 4 | Quorum: OK | Version: pve-manager/9.2 <rect x="170" y="100" width="100" height="60" rx="6" fill="#1f2937" stroke="#27272a" stroke-width="1"/> <text x="220" y="122" text-anchor="middle" fill="#6b7280" font-size="9" font-family="monospace">CPU Usage</text> <text x="220" y="146" text-anchor="middle" fill="#14b8a6" font-size="18" font-family="monospace" font-weight="bold">12%</text> <rect x="290" y="100" width="100" height="60" rx="6" fill="#1f2937" stroke="#27272a" stroke-width="1"/> <text x="340" y="122" text-anchor="middle" fill="#6b7280" font-size="9" font-family="monospace">RAM Used</text> <text x="340" y="146" text-anchor="middle" fill="#14b8a6" font-size="18" font-family="monospace" font-weight="bold">9.2 GB</text> <rect x="410" y="100" width="100" height="60" rx="6" fill="#1f2937" stroke="#27272a" stroke-width="1"/> <text x="460" y="122" text-anchor="middle" fill="#6b7280" font-size="9" font-family="monospace">Storage</text> <text x="460" y="146" text-anchor="middle" fill="#14b8a6" font-size="18" font-family="monospace" font-weight="bold">324 GB</text>

Task 4: Configure the firewall

1Enable the cluster firewall with DROP input policy5 min

In the Proxmox web UI: Datacenter → Firewall → Options → Firewall: Yes. Set input policy to DROP.

Then add rules via Datacenter → Firewall → Add:

Direction Action Source Proto Ports Purpose
in ACCEPT 10.25.144.0/24 any any Full LAN access
in ACCEPT 192.168.1.0/24 tcp 8006,22 Home network: web UI + SSH
Warning

Enable the firewall after adding your allow rules, or you’ll lock yourself out. The UI applies rules immediately on save.


Understanding quorum in a 4-node cluster

Corosync requires a majority of nodes to agree before the cluster operates. In a 4-node cluster, quorum is 3.

✓ 3 of 4 online — quorum OK✗ 2 of 4 online — quorum lost<circle cx="60" cy="90" r="28" fill="#14b8a615" stroke="#14b8a6" stroke-width="2"/><text x="60" y="95" text-anchor="middle" fill="#14b8a6" font-size="10" font-family="monospace">node1</text><circle cx="150" cy="90" r="28" fill="#14b8a615" stroke="#14b8a6" stroke-width="2"/><text x="150" y="95" text-anchor="middle" fill="#14b8a6" font-size="10" font-family="monospace">node2</text><circle cx="240" cy="90" r="28" fill="#14b8a615" stroke="#14b8a6" stroke-width="2"/><text x="240" y="95" text-anchor="middle" fill="#14b8a6" font-size="10" font-family="monospace">node3</text>node4offline<circle cx="410" cy="90" r="28" fill="#14b8a615" stroke="#14b8a6" stroke-width="2"/><text x="410" y="95" text-anchor="middle" fill="#14b8a6" font-size="10" font-family="monospace">node1</text><circle cx="500" cy="90" r="28" fill="#14b8a615" stroke="#14b8a6" stroke-width="2"/><text x="500" y="95" text-anchor="middle" fill="#14b8a6" font-size="10" font-family="monospace">node2</text><circle cx="590" cy="90" r="28" fill="#ef444415" stroke="#ef4444" stroke-width="2" stroke-dasharray="4,3"/><text x="590" y="95" text-anchor="middle" fill="#ef4444" font-size="10" font-family="monospace">node3</text><text x="590" y="110" text-anchor="middle" fill="#ef4444" font-size="8" font-family="monospace">offline</text><circle cx="680" cy="90" r="28" fill="#ef444415" stroke="#ef4444" stroke-width="2" stroke-dasharray="4,3"/><text x="680" y="95" text-anchor="middle" fill="#ef4444" font-size="10" font-family="monospace">node4</text><text x="680" y="110" text-anchor="middle" fill="#ef4444" font-size="8" font-family="monospace">offline</text>Cluster operational — VMs run, changes allowedCluster frozen — no changes, no live migration

If you need to take two nodes offline simultaneously (hardware maintenance), set expected votes first:

Temporarily reduce quorum expectation

pvecm expected 2
# do your maintenance
pvecm expected 4   # restore after nodes rejoin
Never run pvecm expected 1

Setting expected votes to 1 disables split-brain protection entirely. Use expected 2 for 4-node maintenance, never 1.


What’s next

With the cluster running, the next step is deploying LXC containers. The first workload: a 3-node Ollama CPU inference cluster with Open WebUI load balancing across all three nodes.

The HP EliteDesk 705 G4 links in this post are Amazon affiliate links. I earn a small commission if you purchase through them.