I started this journey because I was working on my own web app. While developing my app, I wanted to be able to use it even when my PC was powered off. So I dug up an old laptop and loaded Fedora Server onto it. With the help of Podman, I could connect to the app from anywhere on the LAN and experiment with it. Adding automation to push the latest image to the server and having the server update itself, I quickly gained a liking for hosting apps locally. Eventually, I was using all of the laptop’s resources, so I found an old, beat-up Dell tower, cleaned it up, and installed RHEL.
This post isn’t a showcase of a perfect homelab — it’s a snapshot of where I am right now and what I’ve learned building it. Every choice here exists because something else broke, felt limiting, or taught me a better way to do things.
I use this homelab as a learning platform: for Linux system administration, containers, virtualization, networking, and the kinds of trade-offs you only really understand once you’re running services 24/7.
At the core of the lab is a single always-on server, a Dell XPS 8900 from 2016.
Specs:
Lessons learned:
The host OS is Red Hat Enterprise Linux (RHEL). I chose RHEL for a few reasons:
Lessons learned:
I separate concerns using containers for services and virtual machines for isolation-heavy workloads. This hybrid approach gives me flexibility without overloading one abstraction.
All containers run via Podman, not Docker. Rootless containers and tight systemd integration were the main selling points.
I added Pi-hole mainly to solve a small but constant annoyance: remembering and typing local IP addresses just to reach services. By running my own DNS, I could give services human-readable names instead.
Some workloads deserve stronger isolation or a full OS environment. For those, I use virtual machines.
Lesson learned: Grouping services into pods improves clarity and makes upgrades much safer.
I added a Minecraft server mostly for fun, but it quickly turned into a learning exercise. The server is resource-hungry enough that I need to suspend a few other services when it’s running.
Networking is intentionally explicit—no magic, no surprises.
I wanted each virtual machine to have its own dedicated IP address on my LAN. The solution was a network bridge, which sounds simple in hindsight—but took several broken network configs to fully understand.
Some containers (like Pi-hole) work better when they have their own IP address. To support this, I added a separate bridge for containers.
Future improvements I’m considering:
Building a homelab is never truly finished. It’s a living project, just like learning itself.
Go break something,
-Cameron