- Python 73.2%
- Shell 23.8%
- Dockerfile 2.3%
- Jinja 0.7%
|
|
||
|---|---|---|
| .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 | ||
| .trivyignore.yaml | ||
| .yamllint.yaml | ||
| AGENTS.md | ||
| ansible.cfg | ||
| PROJECT_SPEC.md | ||
| pyproject.toml | ||
| README.md | ||
| renovate.json | ||
| trivy.yaml | ||
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.