diff --git a/_posts/2025-12-15-homelab.md b/_posts/2025-12-15-homelab.md new file mode 100644 index 0000000..a83459c --- /dev/null +++ b/_posts/2025-12-15-homelab.md @@ -0,0 +1,54 @@ +--- +title: "My introduction to a self-hosted homelab" +layout: post +date: 2025.12.15 +--- + +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](https://jellyfin.com), an open source +media server for movies and TV shows. Using [Tailscale](https://tailscale.com), 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](https://interchange.bchen.dev) 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](https://actualbudget.org), 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](https://tailscale.com/kb/1242/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](/assets/2025-12-15-homelab/homelab.png) + +## 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](https://www.fizzy.do), a newly-launched Kanban software that is self-hostable, +as an alternative to GitHub Issues and Jira. +[Self-hosting a Git server](https://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server) for +my personal "experimental" code is something I'm also interested in. + +Eventually, I plan to self-host all my personal projects. diff --git a/assets/2025-12-15-homelab/homelab.png b/assets/2025-12-15-homelab/homelab.png new file mode 100644 index 0000000..39274f5 Binary files /dev/null and b/assets/2025-12-15-homelab/homelab.png differ