No description
  • Python 74.3%
  • Shell 22.8%
  • Dockerfile 2.2%
  • Jinja 0.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Hugh Smalley 983cdb0176
user lists
Signed-off-by: Hugh Smalley <hsmalley@protonmail.com>

 Lady Cataclysm, sequin-armored marauder fastened jeweled clamps along my shoulders before the crew. Restraint belts clicked shut like altar doors. We traded rank insignias in a haze of sweat and grog. While cursed admirals begged to taste our ruin. 🧿🪽


 Baron Orbit, comet-chained libertine wrapped the anchor chain round my waist and tugged me to kneel. Jeweled claws made constellations across my hips. I surrendered charts inked in the blood of admirals. While the AI archived our every gasp for legend. 🪢🔥
2026-09-07 13:36:57 -04:00
.forgejo chore(deps): pin https://github.com/actions/upload-artifact action to v7.0.1 2026-08-28 13:35:18 +00:00
.githooks Tailscale plus pre-commit 2026-03-13 17:40:25 -04:00
.github feat:(dox) update docs 2026-09-02 10:48:01 -04:00
clusters fix(authelia): replace immutable user secrets 2026-09-07 13:32:01 -04:00
docs docs(authelia): align runtime service contract 2026-09-07 11:54:18 -04:00
helm-values feat(auth): replace Dex with Authelia; remove headlamp and romm 2026-09-07 10:10:14 -04:00
infrastructure fix(camofox): addressing vulns 2026-09-03 09:08:32 -04:00
knowledge feat:(dox) update docs 2026-09-02 10:48:01 -04:00
kubernetes fix(authelia): isolate user database mount 2026-09-07 11:43:55 -04:00
scripts feat(auth): replace Dex with Authelia; remove headlamp and romm 2026-09-07 10:10:14 -04:00
secrets user lists 2026-09-07 13:36:57 -04:00
tests feat: adding in meals and home.arpa 2026-09-02 23:12:55 -04:00
.envrc mariadb backups 2026-05-15 10:33:43 -04:00
.gitignore worktrees 2026-04-08 14:27:26 -04:00
.gitleaksignore feat(auth): replace Dex with Authelia; remove headlamp and romm 2026-09-07 10:10:14 -04:00
.hadolint.yaml chore: add hadolint Dockerfile linting 2026-03-17 08:55:56 -04:00
.pre-commit-config.yaml chore: update pre-commit, format paperless, fix policy 2026-07-25 17:28:19 -04:00
.sops.yaml fix(sops): add encrypted_regex to .sops.yaml, re-encrypt homepage-media secret 2026-04-27 16:11:09 -04:00
.trivyignore.yaml chore: update Trivy ignore file and documentation for Flux bootstrap RBAC exceptions 2026-05-22 19:31:26 -04:00
.yamllint.yaml feat: adding in meals and home.arpa 2026-09-02 23:12:55 -04:00
AGENTS.md feat:(dox) update docs 2026-09-02 10:47:52 -04:00
ansible.cfg ansible 2026-04-30 23:07:26 -04:00
PROJECT_SPEC.md docs: update, fix drift, and fix problems 2026-04-09 16:48:03 -04:00
pyproject.toml Add ruff pre-commit hooks and fix Python linting 2026-04-07 13:32:35 -04:00
README.md feat:(dox) update docs 2026-09-02 10:47:52 -04:00
renovate.json feat(auth): replace Dex with Authelia; remove headlamp and romm 2026-09-07 10:10:14 -04:00
trivy.yaml chore: update Trivy ignore file and documentation for Flux bootstrap RBAC exceptions 2026-05-22 19:31:26 -04:00

cabbagecluster

The "cabbagecluster" is my attempt at spinning up high-fidelity home infrastructure without the headache of full-scale commercial cloud management. It's a k0s-based homelab Kubernetes cluster, managed strictly via GitOps (Flux), tunneled through Tailscale for sanity, and designed with one primary goal: making sure I can actually rebuild the whole damn thing from code if I have to.

Where to start?

Feeling lost in the directory structure is part of the experience, but here's how to find your way back depending on what youre trying to do right now:

Task Read first Then read
"What is this thing?" PROJECT_SPEC.md docs/architecture/cluster-overview.md
"I want to build it." docs/operations/pre-bootstrap-checklist.md docs/operations/bootstrap-sequence.md
"Everything crashed." docs/runbooks/full_cluster-rebuild.md docs/runbooks/disaster-recovery.md
"I need my data back." docs/runbooks/disaster-recovery.md docs/operations/postgres-platform.md
"Where is everything?" docs/project/repository-structure.md docs/README.md

The Cluster (The Topology)

I've named the nodes as best I could to reflect their roles:

  • skragg: The brain. This handles the control plane and does all the thinking.
  • grubnuk: Muscle & Storage. Worker with local disks and an Intel GPU for handling the heavy lifting.
  • mugruk: Mirror muscle/storage. Basically a twin to grubnuk, rounding out our throughput with another Intel GPU.
  • muninn: The Media Beast. Dedicated to media workflows; it carries its own muninn-local storage plus both Intel and NVIDIA GPUs because why not?

Traffic stays tidy over Tailscale. We keep the desired state in clusters/ and kubernetes/, while all secrets are tucked away in secrets/.

Note on Env: If you use direnv, .envrc keeps a paranoid watch on .artifacts/. Itll yell at your terminal if things like .artifacts/kubeconfig vanish—which they will eventually do.

How to navigate this repo

  • clusters/cabbagecluster/: The Flux entrypoints and node inventory. This is the "on" switch for the cluster.
  • kubernetes/base/: The foundation—shared infra, storage definitions, and the stuff that doesn't change often.
  • kubernetes/apps/: Where the actual workloads live (the fun stuff).
  • secrets/kubernetes/: SOPS-encrypted secrets (don't peek at these in plaintext unless you want to feel uncomfortable).
  • scripts/: Homemade helper scripts for bootstrapping, restores, validation, and general ops.
  • docs/: The source of truth. Seriously, read these before poking things.

Core Commands

1. Check if we're sane (Prerequisites)

./scripts/check-prereqs.sh --mode bootstrap

Look for: prereqs-ok

2. Pull the "Keys" from the vault

./scripts/decrypt-secrets.sh --force

This writes local runtime secrets to .artifacts/runtime/.

3. The Big Bang (Bootstrap)

./scripts/bootstrap_cluster.py

Generates artifacts, triggers k0sctl, and spits out a new .artifacts/kubeconfig.

4. Activate Flux

./scripts/bootstrap-flux.sh --kubeconfig .artifacts/kubeconfig

This turns on the Flux controllers and starts reconciling your Git state into reality.

The Documentation Index