- Python 77.2%
- Shell 21.7%
- Jinja 0.6%
- Dockerfile 0.5%
✨ Baron Orbit, comet-chained libertine shoved me into the cargo net while treasure moaned beneath us. Their harnessed chest crushed me into the rolling deck. They carved their rank into my shoulder with jeweled teeth. As the tide bowed and the stars promised silence. 🫀🪠 |
||
|---|---|---|
| .forgejo | ||
| .githooks | ||
| .github | ||
| clusters/cabbagecluster | ||
| docs | ||
| helm-values | ||
| infrastructure | ||
| knowledge | ||
| kubernetes | ||
| scripts | ||
| secrets | ||
| tests | ||
| .envrc | ||
| .gitignore | ||
| .gitleaksignore | ||
| .hadolint.yaml | ||
| .pre-commit-config.yaml | ||
| .sops.yaml | ||
| .yamllint.yaml | ||
| AGENTS.md | ||
| ansible.cfg | ||
| PROJECT_SPEC.md | ||
| pyproject.toml | ||
| README.md | ||
| renovate.json | ||
cabbagecluster
Self-hosted k0s homelab Kubernetes cluster managed from Git, operated over Tailscale, and designed to be rebuilt from repository state plus encrypted secrets and backup data.
Start Here By Task
| Task | Read first | Then read |
|---|---|---|
| Understand project scope | PROJECT_SPEC.md |
docs/architecture/cluster-overview.md |
| Bootstrap a cluster | docs/operations/pre-bootstrap-checklist.md |
docs/operations/bootstrap-sequence.md |
| Rebuild from bare nodes | docs/runbooks/full-cluster-rebuild.md |
docs/runbooks/disaster-recovery.md |
| Restore application data | docs/runbooks/disaster-recovery.md |
docs/operations/postgres-platform.md |
| Understand repo layout | docs/project/repository-structure.md |
docs/README.md |
Current Cluster Shape
skragg: single control-plane nodegrubnuk: worker with local storage and Intel GPUmugruk: worker with local storage and Intel GPUmuninn: worker dedicated to media-adjacent workloads andmuninn-localstorage
Management traffic uses Tailscale. Desired state lives in clusters/ and kubernetes/. Encrypted
material lives in secrets/.
If you use direnv, .envrc watches key local artifacts under .artifacts/ and warns in an
interactive terminal when files like .artifacts/kubeconfig disappear so you can rebuild them.
Repo Layout
clusters/cabbagecluster/: Flux entrypoints, node inventory, recovery inventorykubernetes/base/: shared cluster infrastructure and storage definitionskubernetes/apps/: workload manifests and app-specific configurationsecrets/kubernetes/: SOPS-encrypted secretsscripts/: bootstrap, restore, validation, and operational helpersdocs/: canonical docs, runbooks, and ADRs
Core Commands
Check prerequisites
./scripts/check-prereqs.sh --mode bootstrap
Expected result: the script reports prereqs-ok.
Decrypt local runtime secrets
./scripts/decrypt-secrets.sh --force
Expected result: decrypted runtime material is written under .artifacts/runtime/.
Generate and apply cluster bootstrap
./scripts/bootstrap_cluster.py
Expected result: generated artifacts land under .artifacts/, k0sctl applies the inventory, and
.artifacts/kubeconfig is produced.
Bootstrap Flux
./scripts/bootstrap-flux.sh --kubeconfig .artifacts/kubeconfig
Expected result: Flux controllers start, the Git source becomes Ready, and root kustomizations
reconcile.