Skip to content

onedr0p-style migration: talos + bootstrap (just + minijinja + vals) - #877

Merged
Aviator-Coding merged 2 commits into
mainfrom
feat/talos-just-migration
May 31, 2026
Merged

onedr0p-style migration: talos + bootstrap (just + minijinja + vals)#877
Aviator-Coding merged 2 commits into
mainfrom
feat/talos-just-migration

Conversation

@Aviator-Coding

@Aviator-Coding Aviator-Coding commented May 31, 2026

Copy link
Copy Markdown
Owner

Complete migration to onedr0p/home-ops-style structure: root .justfile with mod modules, minijinja-cli + vals templates (secrets from 1Password via ref+op://), helmfile-based bootstrap, and full SOPS removal.

talos (feat(talos), chore(talos))

  • .justfile (mod talos) + talos/mod.just with render-config, apply-node, upgrade-node/-k8s, reboot/shutdown/reset
  • talos/machineconfig.yaml.j2 + nodes/talos-{1,2,3}.yaml.j2 + schematic.yaml.j2
  • Secrets in 1Password `Home-Lab/talos` via `vals`
  • Removed talhelper, legacy `clusterconfig/`, all Windows temp-file workarounds → process substitution
  • Verified: renders byte-identical to live config for all 3 nodes; `talosctl validate` passes

bootstrap (feat(bootstrap), chore(bootstrap))

  • `bootstrap/mod.just` stages: nodes → k8s → kubeconfig → base → apps
  • `bootstrap/helmfile/`: DRY `default.yaml` + `release.yaml.gotmpl` derives chart URL/version from OCIRepository files — no version duplication
  • `bootstrap/kustomize/apps/`: replaces `resources.yaml.j2`; `kustomize build | vals eval | kubectl apply`
  • Removed legacy `helmfile.d/`, `resources.yaml.j2`, `.taskfiles/bootstrap`, `.taskfiles/talos`

secrets (chore(secrets))

  • Removed SOPS/age entirely — no more `*.sops.yaml` files, `.sops.yaml` config, or age key
  • `cluster-secrets` Secret now via ExternalSecret pulling `SECRET_DOMAIN` from 1Password `cluster` item
  • `onepassword-secret` created at bootstrap only (annotated `prune: disabled`)
  • Removed `sops` + `age` from `.mise.toml` and `Taskfile.yaml`

kubernetes (chore(kubernetes))

  • Added `mod kube "kubernetes"` to root `.justfile`
  • Synced `kubernetes/mod.just` with upstream: fixed module self-reference bug, added `restore` recipe, unified `sync resource`, `[script]` recipes, `debug-node` with trap, `[arg]` validation

🤖 Generated with Claude Code

Aviator-Coding and others added 2 commits May 31, 2026 13:23
Stage 1 of migrating to onedr0p's minimalistic structure: a just +
minijinja-cli + vals render path for talos/, alongside the existing
talhelper setup (kept as a fallback until bootstrap is migrated).

- .justfile with `mod talos`; talos/mod.just recipes (render-config,
  apply-node, upgrade-node/-k8s, reboot/shutdown/reset, download-image)
- talos/machineconfig.yaml.j2 + nodes/talos-{1,2,3}.yaml.j2 +
  schematic.yaml.j2; secrets injected from 1Password (Home-Lab/talos)
  via ref+op:// resolved by vals
- tooling: just, minijinja, vals, gum in .mise.toml; .minijinja.toml;
  gitignored .secrets.env (+ .example)
- recipes use temp files (not <() process substitution) for Windows
  git-bash compatibility with native binaries

Verified: renders byte-identical to the live talhelper-generated config
for all 3 nodes, passes talosctl validate, and a live --dry-run on
talos-3 shows only cosmetic document ordering (no functional change).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…sword

Stage 2 of the onedr0p migration. Reconciles the committed bootstrap
scaffolding with Stage 1 (talos) and wires it end-to-end.

- .justfile: register `mod bootstrap`
- bootstrap/mod.just: `talos` stage iterates node names from talos/nodes/*.yaml.j2
  and calls `just --yes talos apply-node <name> --insecure` (was passing IPs,
  incompatible with Stage 1's name->IP map); `crds` stage filters CRDs with yq
- bootstrap/resources.yaml.j2: op://kubernetes/* -> ref+op://Home-Lab/*,
  namespace external-secrets -> security, stringData -> data (byte-exact base64),
  drop redundant cloudflare secret (ESO seeds it post-bootstrap)
- bootstrap/helmfile.d/00-crds.yaml: drop `postRenderer: bash` (Helm 4 rejects it;
  CRD filtering moved into the recipe)
- docs: add bootstrap/AGENTS.md + update CLAUDE.md Bootstrap Operations

Secrets migrated to 1Password Home-Lab (1password, sops items) from the live
cluster. Validated offline: helmfile template (108 app resources, 145 CRDs),
kustomize namespaces, vals round-trip byte-matches live. Live bootstrap is
DR-only and was not run.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Aviator-Coding
Aviator-Coding merged commit 49a742c into main May 31, 2026
1 check passed
@Aviator-Coding
Aviator-Coding deleted the feat/talos-just-migration branch May 31, 2026 20:14
Aviator-Coding added a commit that referenced this pull request Aug 24, 2026
…1427)

The actions-runner ServiceAccount requests os:operator (least-privilege,
#1395) but allowedRoles only permitted os:admin since #877, so the
credential could not be reissued and CI broke when the old admin-era
cert expired. Add os:operator; os:admin stays for existing/manual use.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant