DiyMediaServer

My Hardware

The hardware powering my homelab: servers, networking gear, and everything in between.

A running inventory of what I actually run in my lab, no wishlist items, no gear I quietly retired two years ago. This is the fleet as it stands today.

Proxmox Cluster

Three consumer-grade boxes form the cluster. All three run 12th/13th-gen Intel i5 chips, which means every node has a QuickSync-capable iGPU. That’s what powers Jellyfin hardware transcoding in an unprivileged LXC. None of them can do ECC. These are all consumer chipsets and consumer boards.

pve-01

ComponentModelNotes
MotherboardASRock Z690 Pro RSATX 4U Rack Mounted
CPUIntel Core i5-12600K12th gen, QuickSync iGPU
RAM64GB DDR4-24004× 16GB Crucial Ballistix Sport LT, all four slots full
Boot DriveWD_BLACK SN770 2TB NVMe
Storage6× 1TB SATA SSDZFS raidz1 pool (5.4TB) holding the backup server’s datastore
SpareMicron 1TB NVMeInstalled, unpartitioned, nothing planned for it
HBA8-port SAS/SATA HBAPassed through to the TrueNAS VM (why you need an HBA)

This node carries the network-critical guests: the OPNsense router VM, the primary Proxmox Backup Server VM, and the TrueNAS VM below. With all four DIMM slots occupied by a matched 16GB kit, the only way to add memory here is to replace the whole set.

pve-02

ComponentModelNotes
SystemAce Vision VS-DM660ISmall-form-factor desktop, sits on top of the rack
MotherboardASRock B660M-STX/TPMMini-STX: 2 SATA ports, no PCIe slots
CPUIntel Core i5-1350013th gen: 14 cores (6P+8E) / 20 threads, the widest CPU in the fleet
RAM64GB DDR4-32002× 32GB Kingston SODIMM, both slots full, and 64GB is the board’s hard maximum
Boot DriveSamsung 980 1TB NVMeAlso holds all guest disks; runs at 55°C, the hottest disk in the lab
Storage2× 1TB SATA SSDOne is passed whole to the *arr VM as download scratch; the other sits idle

The most expansion-constrained box in the fleet, and the only one that’s out of road in every direction. Mini-STX means no PCIe at all, both SATA ports are already used, and the single free M.2 slot is its only growth path for storage. Memory is worse: the board tops out at 64GB across two slots and both are full, so there is no upgrade short of replacing the machine. Mini-STX also takes laptop SODIMMs rather than the desktop UDIMMs the other two nodes use, which means memory can’t be shuffled between this box and the rest of the fleet in either direction.

Despite all that it’s the least stressed node in the lab. It carries the biggest paper overcommit, the guests on it are allocated more RAM than the box physically has, and still sits at roughly a third of memory used with essentially no swap in play. Nothing on it is pinned, so the VMs balloon down when they’re idle, and unlike the other two nodes it runs no ZFS pool, so there’s no ARC cache competing with the guests for what’s left. It earns its keep running the app VMs and most of the LXCs.

pve-03

ComponentModelNotes
MotherboardASUS PRIME B760-PLUS D4ATX 4U Rack Mounted
CPUIntel Core i5-1250012th gen, QuickSync iGPU
RAM64GB DDR4-32004× 16GB Samsung, replaced July 2026, see below
Boot DriveWD SN810 1TB NVMe
StorageMicron 1TB + Samsung 980 1TB NVMeZFS mirror (928GB), second backup-server datastore
HBALSI SAS3008 (9300-8i class)Passed through to the storage VM below

This node also runs the second Proxmox Backup Server, which pulls the primary’s datastore nightly, so the backups no longer live on one node.

The memory here was replaced in July 2026. The previous set was a mismatched pair of 8GB G.Skill and 16GB Kingston sticks, 48GB total, downclocked to 2133 MT/s. It was diagnosed silently flipping bits, corrupting two chunks in the backup mirror three days apart. Two things made that failure nasty: the RAM is non-ECC, so there is no error reporting at all and a clean system journal proves nothing, and ZFS can’t save you from it either. The bytes were already wrong when ZFS checksummed them, so the pool reported zero checksum errors while faithfully storing the corruption. A matched 64GB kit went in and the nightly backup verify job is now the standing detector.

Bulk Storage: PowderKeg

The media pool: six drives, individually formatted XFS and merged into one ~95TB volume with mergerfs, served to the LAN over NFS and SMB. It runs as a VM with the HBA passed straight through, so the drives belong to the guest rather than the host.

DriveCapacityNotes
2× Seagate Barracuda (ST24000DM001)24TB eachThe newest pair, replaced the smaller drives from the original build
2× WD White Label (WD140EDGZ)14TB eachShucked from WD Elements externals
2× Seagate Exos X16 (ST14000NM001G)14TB eachEnterprise drives, quiet enough for the rack

No RAID, no parity: mergerfs keeps whole files per disk, so a dead drive loses only that drive’s files, and the media is all re-acquirable. The irreplaceable data lives on the fast pool instead.

Fast Storage: TreasureChest

A TrueNAS SCALE VM with its own HBA passthrough: 8× Samsung 860 EVO 500GB SSDs in a single raidz2 vdev: 3.6TB raw, two drives’ worth of parity. This is where the irreplaceable data lives: the family photo library, exported over NFS, snapshotted daily and synced offsite weekly.

Networking

DeviceModelRole
RouterOPNsense (virtualized)Runs as a VM on pve-01 no dedicated router box
Switch16-port 1GbE unmanagedCarries the bulk of the fleet
Switch8-port 2.5GbE + 10GbE SFP+ unmanagedThe faster segment
Access Points4× TP-Link DecoMeshed Wi-Fi coverage

Both switches are unmanaged, so the network is flat, no VLANs. Replacing them with managed switches is the next planned upgrade.

Expansion Headroom

Worth knowing before planning any storage change: these are vendor specs; the OS reports something different (Linux claims eight SATA ports on all three nodes, including the one that physically has two).

NodeM.2 freeSATA freePCIe slotsDIMM slots free
pve-011 of 32 of 83× x16 (one holds the HBA), 2× x10 of 4 (64GB of a 128GB max)
pve-021 of 20 of 2none0 of 2 (64GB of a 64GB max)
pve-030 of 34 of 42× x16 (one holds the HBA), 2× x10 of 4 (64GB)

Every node is out of memory slots, so any RAM increase anywhere in the fleet means throwing away working DIMMs, and on pve-02 not even that helps, since it’s already at the board’s ceiling. pve-03 can’t take another NVMe without evicting one either, which is why the second backup datastore mirrors the two idle drives that were already in it rather than a new stick.

Rack & Power

ItemDetails
RackSelf-built 16U wooden rack. Everything mounts in it except pve-02, which sits on top
UPSNone (yet), utility power here is stable enough that I’ve accepted the risk