A Kubernetes homelab on one Mac with Rancher, K3s and Lima
This Kubernetes homelab runs on one Mac: Rancher manages K3s clusters for management, beta and prod, and each cluster is a Lima VM on Apple's Virtualization framework. The map below shows every service in the setup, grouped by layer and by cluster.
Until mid-October, everything behind the GodfreyLabs products ran on one Kubernetes cluster inside Docker Desktop on the same Mac: databases, sign-in, object storage, schedulers, the backends of every site. The plan for leaving was written before the build, in Off Docker Desktop, without stopping anything. Over four days the whole stack moved to the Lima VMs.
The products moved one at a time. elevatedaily.io went first, then eightballsports.com, then paiddaily.io and sagedaily.io, and last the shared platform that all of them depend on. Each product ran in only one place at a time. When the last piece left, Docker Desktop was switched off.
What the management, beta and prod clusters do
The management cluster is the hub. Rancher runs there and manages all three clusters through one UI and one API, with Keycloak for sign-in. Argo CD runs there too. It syncs beta from the beta branch and prod from main, so a merge to either branch starts a deploy to that cluster. Images build on Argo Workflows with BuildKit and go into a private registry. Prometheus, Grafana, Loki and Tempo collect what the other two clusters send. OpenBao holds the secrets. The backup store and Backstage live on the hub as well.
Beta and prod stay lean. They run the products and the data the products need, plus small agents that ship metrics and logs up to the hub. Tools that only an operator looks at stay off the clusters that serve traffic.
Two design decisions apply to every cluster: where the backups are stored, and how the sites reach the internet.
Every cluster backs up into one store, and that store keeps its data in a folder on the Mac itself, outside every VM. If a VM is lost, its backups are still on the Mac.
The sites are published through Cloudflare Tunnel, which dials out from the Mac, so the Mac opens no inbound ports. Cloudflare Access sits in front of the operator surfaces.
Services by layer
The map groups every service by the job it does:
- Foundation: the Lima VMs, K3s, Rancher and Fleet, Traefik for ingress, cert-manager for certificates.
- Delivery: Argo CD for GitOps, Argo Workflows and BuildKit for image builds, a private registry to hold the images.
- Observability: a Prometheus hub with agents on beta and prod, Alertmanager, Grafana, Loki for logs, Grafana Alloy to collect them, Tempo and the OpenTelemetry Operator for traces, Pyrra for SLOs, Blackbox probes that check the sites from outside, and OpenCost to show where the resources go.
- Security and identity: Keycloak, OpenBao with External Secrets, Kyverno policies, Falco for runtime alerts, Trivy scans, Cloudflare Tunnel and Access.
- Data: Postgres on CloudNativePG, Neo4j, Redis, MinIO, and SeaweedFS as the backup store.
- Backup and recovery: Velero every night with Kopia, Rancher Backup, and K3s control-plane snapshots.
- Operations: one shared Airflow scheduler with a worker per product, Backstage as the catalog, Reloader to restart pods when their config changes, and System Upgrade Controller for K3s upgrades.
Backups and the restore drill
Velero backs up the clusters every night, with Kopia moving the data. Rancher Backup saves Rancher's own state, and K3s takes snapshots of its control plane. All of these backups go to the SeaweedFS store on the management cluster, which writes to a folder on the Mac outside the VMs. A Rancher restore was tested on a throwaway VM, and Rancher came back in under a minute.
What the homelab costs
The setup added no new spend. Every piece is open source and runs on hardware that was already owned. The costs are memory and disk on one machine, and the time it takes to learn how the pieces fit together.
Hover any service on the map for a short summary and a link to its resource page. Some of those pages are still being written.
