This repository includes all of the configuration and documentation for my home lab cluster.
This cluster consists of 4 Intel Nucs running Talos Linux with a Synology NAS for large data. More information about this repository and cluster is available at https://infrastructure.btkostner.io.
Features
- Talos Linux cluster with NVMe as a boot drive and SSD for data
- Argo CD autopilot for cluster bootstrapping
- Cilium as a kube proxy replacement and sidecar-less networking
- Rook Ceph for stateful replicated storage for all nodes
- Velero for offsite cluster backup
Media services
- Dispatcharr runs in the
medianamespace at https://dispatcharr.btkostner.network through the internal gateway. Its all-in-one container stores application data, PostgreSQL, and recordings on a 10Giceph-safe-blockvolume mounted at/data. External traffic and DNS from the pod are routed through Mullvad WireGuard by a Gluetun native sidecar with its firewall kill switch enabled; Dispatcharr starts only after Gluetun is healthy. HTTP ingress on port9191and in-cluster pod/service traffic (10.244.0.0/16,10.96.0.0/12) are allowed outside the tunnel. To refresh thegluetun-credentialsitem in 1Password, generate a Mullvad WireGuard configuration for an active account and device, then copyInterface.PrivateKeyintoprivate-keyandInterface.Addressintoaddressesin that same configuration. IfInterface.Addresscontains multiple CIDR values, enter them comma-separated. Thedispatcharr-vpnExternalSecret maps these fields to Gluetun’sWIREGUARD_PRIVATE_KEYandWIREGUARD_ADDRESSESenvironment variables. Create the first admin account in the web interface, then add M3U and EPG sources. In-cluster clients can usehttp://dispatcharr.media.svc.cluster.local. Argo CD discoverscluster/media/dispatcharr/kustomization.yamlafter it is pushed tomain.
Developer tools
- kagent
0.10.6is installed in thedevelopernamespace at https://kagent.btkostner.network. This release supports Kubernetes1.36; kagent1.0requires Kubernetes1.37and is a separate upgrade/migration boundary, not a drop-in update. The controller and any agents it manages are limited todeveloper. No agents, tasks, or schedules are created by this installation. - The OpenAI provider reads its API key from the
passwordfield of the 1Password itemInfrastructure/kagent; the default model isgpt-4.1-mini. Its Kubernetes tools are cluster-wide but read-only, and do not expose Secrets. The tool server has no Kubernetes write permissions or cluster-admin access. - kagent uses a durable three-instance CloudNativePG database in
developer, backed byceph-safe-block. Its in-cluster PostgreSQL endpoint iskagent-database-rw.developer.svc.cluster.local:5432(database/userkagent); CNPG creates thekagent-database-appSecret containing the connection URI.