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:
-
Compartmentalisation: I like keeping services isolated from one another. It means I can back up or restore just one service without affecting others. The trade-off is that I now have to manage multiple OS installs, which is definitely more overhead—but it makes tinkering easier and rollback less scary.
-
Reliable and portable backups: I wanted a dead-simple backup approach. Something that can be cloned and restored anywhere with minimal fuss. So I'm avoiding incremental backups, even though they’re more efficient. I prefer full, self-contained snapshots that are easy to move around and restore on any Proxmox node.
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?
- SSH support: You can
rsync
directly using SSH keys, which makes scripting a breeze. - Snapshots: You can take snapshots of your entire storage box, and the only way to mess with them is through the web UI. It's not truly immutable, but close enough for my needs.
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:
- 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.)
- 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.