Homelab, rebuilt — Epilog: Writing in the Portal and publishing twice
After ten parts about rebuilding the homelab, there is one more thing I want to write about: how I wrote this series.
After ten parts about rebuilding the homelab, there is one more thing I want to write about: how I wrote this series.
Why did I spend so much time rebuilding a homelab that was still mostly working? Newer software was one reason, but it was not the main one. I wanted the next upgrade, security fix or half-finished idea to be easier than this one. Future Vincent had already inherited enough jobs from past Vincent!
I first set up monitoring for my homelab about five years ago. It could still draw graphs and send alerts, but the stack had become old together with the cluster it watched. Five years is a long time in software. Some of the components were almost ready for their own retirement post!
Part VII ended with a working Frigate beta. Four cameras were streaming and recording, the storage projection made sense and the container ran with a small, documented security exception. That proved the design. It did not prove that I could point my family at it, because the browser had no proper sign-in yet, and it did not prove that the recorder would still be recording next week.
Home surveillance was the first application I deployed in the homelab. I wrote about it in my original homelab post and again in a post of its own: cameras locked behind the firewall with no way to phone home, FFmpeg runners saving footage to the NAS in five-minute chunks, and later a small Node.js relay so that Home Portal could show a live feed. It worked for years, and I was quite proud of it.
At the end of Part V, the next job was to bring Baby Tracker into the new cluster. However, simply moving the existing application was not enough. It was still running on React 16 with an old Create React App build, so I would have ended up with a new Kubernetes cluster running the same old application. That was exactly the kind of like-for-like upgrade I wanted to avoid in Part I.
A stateless blog was a safe first test. PostgreSQL was different. If I broke it, rebuilding the container would not bring the data back.
After building the K3s control plane, I needed to find out whether the rest of the platform actually worked. I could have moved several applications at once and spent days wondering which layer was broken. Instead, I chose the simplest workload I had: this blog.
K3s itself was not new to me. For my old cluster, I followed Jeff Geerling’s Raspberry Pi cluster guide and customized the K3s Ansible playbooks it recommended. That got me running quickly, but over time my version of the setup and the system it created became harder to reason about.
In Part I, I decided to rebuild the homelab with Amp. However, before I trusted it with Kubernetes, I wanted a much safer place to start: this blog.