findlab-gitops
The GitOps repository that declares the entire state of my homelab Kubernetes cluster. A single Talos OS node runs every workload, managed through ArgoCD's app-of-apps pattern. One root Helm chart generates all child Application CRs. Push to main and ArgoCD picks up the change within minutes. No kubectl apply allowed.
The cluster hosts a private Docker registry, a MongoDB instance, a Discord bot, an Enshrouded game server, and this website. All of it defined in YAML, all of it version-controlled.
Features
- App-of-apps pattern: A single root Helm chart in
root-app/templates out every ArgoCD Application CR. Adding a new service means adding one template file and aworkloads/directory. - Zero-trust internet exposure: A Cloudflare Tunnel provides inbound access without any public IP or port forwarding. The
cloudflaredpod makes outbound-only connections to Cloudflare's edge. - Automated TLS: cert-manager issues Let's Encrypt certificates via DNS-01 challenges against the Cloudflare API. Reflector mirrors TLS secrets across namespaces so each workload gets its cert without duplication.
- GitOps-safe secrets: Every secret is sealed with
kubeseal --scope cluster-widebefore entering the repo. Plaintext never touches Git. - Nightly PV backups: A privileged CronJob detects the USB backup drive by stable device ID, mounts it, and rsyncs all persistent volumes with hardlink-based snapshots. 30-day retention. Gracefully skips if the drive is disconnected.
- Self-healing and pruning: All applications auto-sync with
selfHealandpruneenabled. Manual cluster changes get reverted. Deleted manifests get cleaned up. PVCs are excluded from pruning to prevent data loss.
Stack
| Component | Technology |
|---|---|
| OS | Talos OS v1.7.5 |
| Kubernetes | v1.30.1 (single node) |
| GitOps | ArgoCD v3.3.0 |
| CNI | Cilium 1.16.1 |
| Secret management | Sealed Secrets v0.35.0 (kubeseal) |
| TLS automation | cert-manager + Let's Encrypt (DNS-01) |
| Ingress | Cilium IngressClass (LAN) + Cloudflare Tunnel (internet) |
| Storage | Rancher local-path-provisioner |