I recently finished revamping my homelab, and I’m very excited about it. For the past 6+ months my “homelab” consisted of an old laptop running Linux and a bunch of docker containers. This worked surprisingly well, but increasingly I found myself wanted to spin up test envrionments of multiple machines. That old laptop didn’t have the power to support those kinds of labs, and I didn’t have a good set of tooling for creating, configuring, and backing up these VM or container stacks.

Because of this, I purchased a Dell T7600 on Facebook Marketplace. The T7600 is a workstation form-factor machine with dual Xeons and 5 hot-swappable hard drive bays. I went with Proxmox for my hypervisor because it provides native ZFS support in the kernel, excellent tools for managing VMs and LXC containers for lab scenarios, and everything else can be handled from the command line as on any other Linux distro.

To learn Proxmox, I went through Learn Linux TV’s Proxmox Course , and I highly recommend it. The Proxmox datacenter and permission model can be counterintuitive at times, and this course provides an excellent overview on how Proxmox works and how to set up common Proxmox configurations.

I also used this transition as an opportunity to work some new technologies into my setup such as the Nix package manager and a more advanced ZFS setup. My final technology stack includes:

  • An Ansible playbook to bootstrap the server beyond the default Proxmox install.
  • Proxmox for managing VMs and persistent LXC containers. I currently have a test database server and a code deployment server as well as several test VMs running.
  • A ZFS mirror for important data with automatic snapshots provided through Sanoid.
  • The Nix package manager to install many of the cli utilities I use interactively. Installing packages with Nix allows me to keep the base Debian install close to default while also providing stable and up-to-date tooling.
  • 30+ Docker Compose stacks for various services I self-host.
  • Portainer with Git-Ops for container orchestration. When I push a change in one of my compose files, Portainer automatically re-deploys the container stack with the new code.
  • Cloudflared containers to tunnel and control access to my various containers. This allows me to enforce different access policies to different self-hosted apps. It also keeps each compose stack isolated and portable between machines.