I've always enjoyed figuring out how things work and then finding a way to make them work a little better.
That eventually led me to building a small home lab. It's not a massive rack of enterprise hardware, and I'm not trying to run a data center in my house. It's primarily a place to experiment with Linux, Docker, home automation, networking, self-hosted services, and whatever technology I happen to be interested in at the moment.
This page is a running record of how I've put it together and what I'm currently using.
The Hardware
The heart of my current setup is a Raspberry Pi 4 Model B.
It's a surprisingly capable little computer for running lightweight services, especially when paired with Docker. Rather than dedicating the Pi to a single application, I use containers so that individual services can be installed, updated, restarted, and managed independently.
The Pi is connected to my home network over Ethernet. I originally experimented with Wi-Fi, but Ethernet makes much more sense for a server that I expect to be available continuously.
I also have a 2 TB external hard drive connected over USB. The drive
is formatted as ext4 and mounted at
/media/ssd. I use it for persistent data that I don't
want tied to the lifetime of an individual container.
Ubuntu Linux
The Raspberry Pi runs Ubuntu Server.
I prefer using a conventional Linux environment for this kind of experimentation because it gives me direct access to the operating system and networking stack while still allowing me to keep individual applications isolated in containers.
The basic philosophy:
Linux underneath, Docker in the middle, applications on top.
That gives me a lot of flexibility without turning the operating system itself into a collection of application-specific configuration files.
Docker and Portainer
Docker is what makes the whole setup practical.
Instead of installing every application directly onto Ubuntu, I can run services as containers. Each service gets its own environment, configuration, ports, and persistent storage.
I use Portainer to make managing those containers easier.
For me, Portainer is particularly useful when I'm experimenting. It's much easier to see what is running, inspect logs, restart a container, or update a stack without having to remember every Docker command.
I generally organize related services into Docker stacks rather than treating the machine as one giant application.
Home Assistant
One of the main reasons I built the home lab was to run Home Assistant.
Home Assistant gives me a central place to bring together many of the smart devices around my house.
My smart-home ecosystem includes devices from several manufacturers, so interoperability is important. Some devices are connected directly through Home Assistant integrations, while others are exposed through platforms such as Google Home or Matter.
I'm particularly interested in having Home Assistant handle the automation and coordination rather than having every manufacturer-specific app operate independently.
Some of the things I'm working toward
My goal isn't simply to be able to turn lights on and off from my phone. I'd like the house to respond intelligently to what's happening.
- Detecting when someone arrives home
- Handling lights and other Matter devices
- Integrating smart thermostats
- Monitoring whether the garage door has been left open
- Using camera information for useful presence or person detection
- Bringing smart-home devices from different manufacturers into one interface
- Using automations to reduce the number of things I have to remember to do manually
The fun part is figuring out which pieces actually work well together.
Networking
The network has turned out to be just as important as the server itself.
Smart-home devices don't always behave particularly well when they're separated from the devices trying to discover or control them. I've run into this particularly with devices using the 2.4 GHz wireless network while the Raspberry Pi or other computers were connected over 5 GHz Wi-Fi.
Moving the Raspberry Pi to Ethernet eliminated one variable and made the server considerably more predictable.
I'm also gradually trying to keep the network organized so that smart-home devices, computers, servers, and other equipment can communicate where they need to without creating unnecessary complexity.
Cloudflare and Nginx Proxy Manager
I also wanted to be able to access some of my services through hostnames rather than remembering IP addresses and ports.
For example, Home Assistant is available internally on its normal port, but I also wanted a hostname such as:
I use Cloudflare together with Nginx Proxy Manager to handle the public-facing side of that setup.
The general arrangement is:
↓
Cloudflare
↓
Nginx Proxy Manager
↓
Home Lab Service
That gives me a consistent way to handle HTTPS and hostnames while keeping the individual applications relatively unaware of the infrastructure in front of them.
Getting reverse proxies, trusted proxies, authentication, and HTTPS to all behave correctly is one of those jobs that seems simple until something returns a mysterious HTTP 400 error.
It's also exactly the kind of problem I enjoy figuring out.
Experimenting With AI
The home lab has also become a place for experimenting with local AI.
I've played with locally hosted models and tools, including running models through Ollama and experimenting with coding-oriented models.
One of the attractions of local AI is that it gives me another interesting systems problem to solve. There's the model itself, but also the hardware, memory requirements, networking, APIs, applications consuming the model, and the question of which workloads actually make sense to run locally.
I'm particularly interested in using local models as development tools rather than treating them simply as chatbots.
What I've Learned
The biggest lesson from building a home lab is that the individual technologies are usually the easy part.
The interesting problems happen between them.
A Docker container might work perfectly by itself. Home Assistant might work perfectly by itself. Cloudflare might work perfectly by itself.
Then you put them together and discover that DNS, networking, authentication, certificates, ports, discovery protocols, or permissions have opinions of their own.
That's where the learning happens.
I've also found that a small amount of infrastructure can teach many of the same concepts that appear in much larger environments:
- Linux administration
- Containers
- Networking
- DNS
- Reverse proxies
- TLS/HTTPS
- Authentication
- Persistent storage
- Service discovery
- APIs
- Automation
- Monitoring and troubleshooting
A Raspberry Pi sitting on a shelf isn't an enterprise data center, but it can still be a remarkably good laboratory.
What's Next
The home lab is intentionally unfinished.
That's part of the point.
I'm likely to keep adding services, changing the network, trying different approaches to Home Assistant, experimenting with local AI, and occasionally breaking something badly enough that I have to figure out why.
I'll update this page as the setup changes and document some of the more interesting projects separately.
For me, the home lab isn't really about collecting hardware.
It's about having a place where I can build something, break something, figure out why it broke, and learn something in the process.