The infrastructure, written down.
Notes I kept while building and rebuilding a self-hosted cluster. They are runbooks rather than articles — written to be followed at a terminal, including the parts that only matter once you have already hit them.
A Kubernetes cluster on bare-metal VMs, with kubeadm
From a fresh Ubuntu VM to a working single control-plane cluster: static networking, containerd, the kernel modules nobody mentions until it fails, kubeadm init, Flannel, Helm and the dashboard.
kubeadmcontainerdFlannelHelmUbuntuA highly available control plane behind HAProxy
Three control-plane nodes behind one TCP load balancer, so losing a node loses nothing. The whole trick is that the API server is fronted at layer 4, not layer 7.
HAProxyHAkube-apiserverTCPDeploying a NestJS API to Kubernetes with Ingress, TLS and MetalLB
A multi-stage image, a Deployment and Service, then the three pieces that turn a NodePort into something you would actually put a domain in front of: NGINX Ingress, cert-manager and MetalLB.
NestJSIngresscert-managerMetalLBHelmPublishing a Next.js app through a Cloudflare Tunnel
Serving a self-hosted app on a real domain without opening a single inbound port — and the resolver quirk that made it look broken when it was not.
CloudflarecloudflaredNext.jssystemd