My introduction to a self-hosted homelab

This project was a result of really good timing, as well as the right tools coming together.

Motivations

The self-hosting experiment started with Jellyfin, an open source media server for movies and TV shows. Using Tailscale, I connected my Jellyfin instance into my own personal tailnet. I originally used AWS, but moved to Hetzner after realizing additional block storage was half the price (!!!) there.

Meanwhile, I had built a tiny monitoring service for Interchange to notify me if the server went down. Putting this up on a PaaS (I used Heroku originally) ran me the same amount as a dedicated Hetzner server which could run many other things at once. This was not something that needed 24/7 uptime, either.

Finally, I was also using Actual, a budgeting app, originally hosted on PikaPods. At some point, I realized that putting all of these services (Jellyfin, Actual, Interchange monitoring) on one server would be a dream come true for my wallet.

My setup

For those unfamiliar with Tailscale, it’s a private mesh VPN that uses peer-to-peer instead of a centralized server. This means that if I connect my server to my own private network (a “tailnet”), I can access it from my other devices via a static Tailscale-assigned IP address.

Tailscale has some handy additional features which made it suitable for my personal setup. Using Tailscale Serve, I could take any service mapped to a port number and make that accessible by directly typing in a hostname.

One particular quirk of Tailscale is that you can connect a Docker container as its own individual device, and the default Tailscale device limit is generous. Therefore, I decided to run each service as its own Docker Compose instance. This way, I had separate hostnames for each service, but in reality they were all running on the same bare metal.

Screenshot of my different services running as Tailscale instances

Takeaways and further experimentation

In the interest of automation, I’m currently experimenting with a GitHub Actions continuous deployment pipeline which would let me push configuration changes directly from GitHub. It uses Tailscale and plain old SSH.

I really, really hope to self-host more of what I use in the future. I’m interested in Fizzy, a newly-launched Kanban software that is self-hostable, as an alternative to GitHub Issues and Jira. Self-hosting a Git server for my personal “experimental” code is something I’m also interested in.

Eventually, I plan to self-host all my personal projects.