The brief
I wanted to stop running things on raw Docker. My own infrastructure should get the same care as customer infrastructure, and the homelab is where I figure things out before they reach clients.
What I built
A Kubernetes cluster sized for my rack, with the platform pieces you would expect in production.
- GitLab CE self-hosted, handling both source control and CI/CD.
- ArgoCD as the GitOps controller. The cluster ends up being whatever the repo says it should be.
- Helm for application packaging.
- Traefik as the ingress controller, with cert-manager issuing certificates automatically.
- MetalLB for L2 load balancing on the LAN, since there is no managed load balancer in a homelab.
The previous version of this portfolio and its staging environment ran on this cluster. The stack was both a learning exercise and the thing keeping the lights on.
Why it mattered
This was the first-generation cluster. It started small and grew into a full GitOps platform. The lessons from running it (etcd quorum behaviour under restarts, ArgoCD sync loops when manifests are inconsistent, Traefik config edge cases) showed up in real form at customers later. The platform was eventually retired and replaced by a six-node Talos Kubernetes cluster running Cilium, Gateway API and ArgoCD. The upgrade was a deliberate architectural step. Talos removes the mutable OS layer entirely, and the new cluster is provisioned from Terraform with no SSH access to nodes. I am keeping this case study as a record of the first-generation era.