Jordan Brown

Principal Software Engineer

← Back

My Self-Hosted Setup

I can read this blog post to you thanks to AI.

What I’m Trying to Do

There are two main things I’m optimizing for with my homelab:

Hardware

I’m running everything on a fleet of Lenovo M93P SFF boxes. Each has 12GB of RAM and a standard SSD. I got them cheap from an office clearance sale and bulked up the RAM separately. They’re not flashy, but they’re quiet, power-efficient, and good enough for most stuff I want to run.

Making Backups Easy

There are lots of ways to do this, but I went with Proxmox mainly because it makes decoupling services from physical hardware really straightforward. With Proxmox, I can take full VM snapshots and restore them to any other node as long as there’s enough disk space.

I only use KVM (no LXC) to avoid issues with host-level dependencies—especially around kernel modules. I also use LVM thin pools, which lets me over-allocate disk space and keep things flexible. I’ve enabled “Discard” on my storage to reduce snapshot size, which has saved me a surprising amount of space.

Backup Strategy: "3-2-1" (Sort of)

For local backups, I have a separate NFS server with two drives: a small SSD and a 2.5” spinning disk in a USB caddy. The SSD is the primary, and the HDD is a nightly rsync mirror handled by a cron job. This gives me two local copies on separate physical disks.

Off-site backups are trickier. I only have a 20Mb/s upload speed, so daily syncs aren’t really viable. Instead, every Tuesday morning, a cron job pushes Monday’s backup to a Hetzner Storage Box. Why Hetzner?

Before uploading, I encrypt everything with GPG symmetric encryption—just in case.

DNS and DHCP

I run AdGuard Home on a Raspberry Pi 3 running DietPi, but I’ve disabled the ad-blocking. DNS-level ad blocking tends to break mobile apps, and since we mostly use desktops with uBlock Origin anyway, I figured it's not worth the hassle.

Power Outage Recovery

There was a stretch of a couple months where a local substation caught fire, and I had multiple random power outages. That’s when I realized my homelab wouldn’t come back online automatically if I wasn’t around.

To fix that, I did two things:

  1. Enabled the BIOS setting that automatically powers machines back on after a power loss. (I forget the exact name of the setting, but most BIOSes have it.)
  2. Wrote a simple script on the Raspberry Pi that sends periodic Wake-on-LAN packets using etherwake. It runs every 5 minutes for machines that are supposed to be always-on.

Probably overkill, but having both gives me peace of mind when I’m not home.

Remote Access

For remote access, I just use the OpenVPN server built into my router. I tried running WireGuard on another box, but it wasn’t as reliable—especially in edge cases where machines didn’t boot properly after a power failure. So OpenVPN it is.

Wrapping Up

This setup isn’t elegant or efficient in the traditional sense, but it does what I want. Each service is in its own box (or VM), I can back them up easily, and restoring things is quick and low-stress.

By favoring simplicity over cleverness, I’ve built something that’s fun to tinker with and mostly just works. It's definitely more of a duct-tape approach than a best-practice one, but it’s resilient, cheap, and forgiving when I mess something up—which, let’s be honest, happens a lot.