The final fold. authentik was the last app on the transitional seed layer — this folds its ak-pg CNPG backend into the existing dedicated authentik KS and, since it's the last holdout, fully retires kubernetes/seed/.
The fold
git mv the 5 CNPG manifests seed/authentik/ → apps/authentik/ (no PVCs — all state is in ak-pg).
Delete seed-authentik.yaml + the now-empty seed/authentik/.
Seed-layer retirement (kubernetes/seed/ is now empty)
git mv seed/RECOVERY.md → kubernetes/RECOVERY.md (sibling to the MIGRATION-* docs); fix its stale seed-authentik reconcile example → authentik.
e2e-test.sh: drop the last seed-* check.
bootstrap.sh: rewrite the obsolete seed-<app> gating comment (app KSes now own their CNPG DBs directly) + de-seed the wait labels (the one-shot seed Jobs are long gone).
opentofu/object_storage.tf: fix the ObjectStore path comment (seed/* → apps/*).
Safe transfer + verified restorability
All 5 seed/authentik objects carry prune: disabled (#407), so deleting seed-authentik skips them in GC and authentik adopts them in place. No CNPG/app restart. Restore-test passed first: ak-pg restored cleanly (25 users, 368 tables, 1225 MB) via the corrected #404 recipe, clean no-leak teardown.
Verified: build has Cluster/ak-pg + exactly 5 prune-protected; bash -n bootstrap+e2e OK; kubernetes/seed/ fully removed; no stale seed file-paths remain.
Post-merge check
seed-authentik gone; authentik KS Ready; ak-pg adopted (owner→authentik) with RESTARTS=0; nothing pruned. This completes the seed→apps migration for all 7 apps.
**The final fold.** authentik was the last app on the transitional `seed` layer — this folds its `ak-pg` CNPG backend into the existing dedicated `authentik` KS and, since it's the last holdout, **fully retires `kubernetes/seed/`.**
### The fold
- `git mv` the 5 CNPG manifests `seed/authentik/` → `apps/authentik/` (no PVCs — all state is in `ak-pg`).
- `authentik` KS: drop `dependsOn: seed-authentik`, add `infrastructure-cnpg-barman`, add CNPG Cluster `healthCheckExprs`.
- Delete `seed-authentik.yaml` + the now-empty `seed/authentik/`.
### Seed-layer retirement (`kubernetes/seed/` is now empty)
- `git mv seed/RECOVERY.md → kubernetes/RECOVERY.md` (sibling to the MIGRATION-* docs); fix its stale `seed-authentik` reconcile example → `authentik`.
- `e2e-test.sh`: drop the last `seed-*` check.
- `bootstrap.sh`: rewrite the obsolete `seed-<app>` gating comment (app KSes now own their CNPG DBs directly) + de-`seed` the wait labels (the one-shot seed Jobs are long gone).
- `opentofu/object_storage.tf`: fix the ObjectStore path comment (`seed/*` → `apps/*`).
### Safe transfer + verified restorability
All 5 `seed/authentik` objects carry `prune: disabled` (#407), so deleting `seed-authentik` skips them in GC and `authentik` adopts them in place. No CNPG/app restart. **Restore-test passed first**: `ak-pg` restored cleanly (25 users, 368 tables, 1225 MB) via the corrected #404 recipe, clean no-leak teardown.
**Verified:** build has `Cluster/ak-pg` + exactly 5 prune-protected; `bash -n` bootstrap+e2e OK; `kubernetes/seed/` fully removed; no stale seed file-paths remain.
### Post-merge check
`seed-authentik` gone; `authentik` KS Ready; `ak-pg` adopted (owner→`authentik`) with `RESTARTS=0`; nothing pruned. **This completes the seed→apps migration for all 7 apps.**
The last app in the seed->apps migration. Folds authentik's ak-pg CNPG backend
into the existing dedicated authentik KS and, since authentik was the final
holdout, fully retires kubernetes/seed/.
- git mv seed/authentik/{cluster,objectstore,scheduled-backup,barman-creds-
externalsecret,hetzner-creds-externalsecret}.yaml -> apps/authentik/, add to
apps/authentik/kustomization.yaml (authentik has no data PVCs — all state is
in ak-pg).
- authentik KS: drop 'dependsOn: seed-authentik', add
'dependsOn: infrastructure-cnpg-barman', add the CNPG Cluster healthCheckExprs.
- Delete clusters/homelab/seed-authentik.yaml and the now-empty seed/authentik/.
Seed-layer retirement cleanup (kubernetes/seed/ is now empty):
- git mv seed/RECOVERY.md -> kubernetes/RECOVERY.md (sibling to the MIGRATION-*
docs); fix its stale 'flux reconcile kustomization seed-authentik' example to
'authentik'.
- e2e-test.sh: drop the last seed-* readiness check (seed-authentik).
- bootstrap.sh: rewrite the obsolete 'per-app seed-<app> KSes' gating comment to
reflect that app KSes now own their CNPG DBs directly, and de-'seed' the
wait-description labels (the one-shot rsync/pg_restore seed Jobs are long gone).
- opentofu/object_storage.tf: fix the CNPG ObjectStore path comment
(kubernetes/seed/* -> kubernetes/apps/*).
Safe ownership transfer (nothing pruned): all 5 seed/authentik objects carry
prune: disabled (from stage 1 #407), so deleting seed-authentik skips them in GC
and the authentik KS adopts them in place. No CNPG restart, no app restart.
Restore-test passed first: ak-pg backup restored cleanly (25 users, 368 tables,
1225 MB) using the corrected RECOVERY.md recipe, with a clean no-leak teardown.
Verified: kubectl kustomize apps/authentik builds with Cluster/ak-pg + exactly
5 prune-protected; bash -n bootstrap.sh + e2e-test.sh OK; kubernetes/seed/ fully
removed; no stale seed file-path references remain.
Left intentionally: barman/hetzner ExternalSecrets still read OpenBao keys under
seed/authentik/... (vault paths, not repo paths).
Co-Authored-By: Claude Bot <claude-bot@renner.uno>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
🤖Automated review — model CLI default (complexity: complex), commit 91f5baf66142ea0c79e2ad83c67755c842386151.
Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.
Summary
This PR folds the last remaining seed-<app> Kustomization (seed-authentik) into the dedicated authentik KS, retiring kubernetes/seed/ entirely. It's a mechanical git mv of 5 CNPG manifests plus dependency/health-check wiring and doc/script cleanup, and it follows the exact same pattern already used successfully for the other 6 apps (immich, paperless, audiobookshelf, music-assistant, influxdb, woodpecker — confirmed by their existing clusters/homelab/*.yaml comments). I verified the checkout after the change: kubernetes/seed/ no longer exists, all 5 moved objects carry kustomize.toolkit.fluxcd.io/prune: disabled (so deleting seed-authentik can't GC them), no other Flux Kustomization or script still references seed-authentik or kubernetes/seed, and the new authentik.yaml KS (dependsOn/healthCheckExprs) is byte-for-byte structurally identical to the already-live immich.yaml KS. No blocking issues found.
🟡 Suggestions
kubernetes/RECOVERY.md:138 — the fix from seed-authentik → authentik in the flux reconcile kustomization authentik --with-source example is correct and necessary (the old target no longer exists after this PR), but it's a good example of how easy this kind of doc drift is: worth a quick sanity pass over the rest of RECOVERY.md's per-cluster tables (im-pg/pprl-pg rows) next time either of those KSes gets touched, since they'll eventually need the same treatment if not already done.
Tests
No automated tests exist for this kind of Flux/GitOps manifest change (consistent with the rest of the repo), and none would be expected here. The PR body states a restore-test was performed against the live cluster (ak-pg restored cleanly, clean teardown) and that bash -n was run on bootstrap.sh/e2e-test.sh — I couldn't re-run either the cluster restore-test or bash -n myself in this sandboxed review (shell execution for scripts was blocked), but I read both scripts' changed sections directly and the edits are simple label/comment text changes with correct quoting and no altered control flow, so I have no reason to doubt the syntax claim.
Recommendation
Looks reasonable — no blocking issues; comment above is optional.
🤖 **Automated review** — model `CLI default` (complexity: complex), commit `91f5baf66142ea0c79e2ad83c67755c842386151`.
> Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review.
---
## Summary
This PR folds the last remaining `seed-<app>` Kustomization (`seed-authentik`) into the dedicated `authentik` KS, retiring `kubernetes/seed/` entirely. It's a mechanical `git mv` of 5 CNPG manifests plus dependency/health-check wiring and doc/script cleanup, and it follows the exact same pattern already used successfully for the other 6 apps (immich, paperless, audiobookshelf, music-assistant, influxdb, woodpecker — confirmed by their existing `clusters/homelab/*.yaml` comments). I verified the checkout after the change: `kubernetes/seed/` no longer exists, all 5 moved objects carry `kustomize.toolkit.fluxcd.io/prune: disabled` (so deleting `seed-authentik` can't GC them), no other Flux Kustomization or script still references `seed-authentik` or `kubernetes/seed`, and the new `authentik.yaml` KS (`dependsOn`/`healthCheckExprs`) is byte-for-byte structurally identical to the already-live `immich.yaml` KS. No blocking issues found.
## 🟡 Suggestions
- `kubernetes/RECOVERY.md:138` — the fix from `seed-authentik` → `authentik` in the `flux reconcile kustomization authentik --with-source` example is correct and necessary (the old target no longer exists after this PR), but it's a good example of how easy this kind of doc drift is: worth a quick sanity pass over the rest of `RECOVERY.md`'s per-cluster tables (`im-pg`/`pprl-pg` rows) next time either of those KSes gets touched, since they'll eventually need the same treatment if not already done.
## Tests
No automated tests exist for this kind of Flux/GitOps manifest change (consistent with the rest of the repo), and none would be expected here. The PR body states a restore-test was performed against the live cluster (`ak-pg` restored cleanly, clean teardown) and that `bash -n` was run on `bootstrap.sh`/`e2e-test.sh` — I couldn't re-run either the cluster restore-test or `bash -n` myself in this sandboxed review (shell execution for scripts was blocked), but I read both scripts' changed sections directly and the edits are simple label/comment text changes with correct quoting and no altered control flow, so I have no reason to doubt the syntax claim.
## Recommendation
Looks reasonable — no blocking issues; comment above is optional.
<!-- pr-review:sha=91f5baf66142ea0c79e2ad83c67755c842386151 -->
Did the sanity pass you suggested rather than defer it — RECOVERY.md is already drift-free. The ak-pg/im-pg/pprl-pg table rows are all cluster/namespace/ObjectStore/barman-S3 facts (im-pg in ns immich, store im-pg-store, s3://renner-uno-k8s-cnpg/im-pg, DB immich) — none of which the seed→apps file move changes, so they stay correct. The other cluster.yaml mentions are relative ("edit the cluster.yaml"), not path-scoped, and the seed-word hits at lines 42-45 are the historical note about the removed one-shot seed Jobs. So line 138 (fixed here) was the only actual stale reference. Merging as-is.
Did the sanity pass you suggested rather than defer it — RECOVERY.md is already drift-free. The `ak-pg`/`im-pg`/`pprl-pg` table rows are all cluster/namespace/ObjectStore/barman-S3 facts (`im-pg` in ns `immich`, store `im-pg-store`, `s3://renner-uno-k8s-cnpg/im-pg`, DB `immich`) — none of which the seed→apps file move changes, so they stay correct. The other `cluster.yaml` mentions are relative ("edit the cluster.yaml"), not path-scoped, and the `seed`-word hits at lines 42-45 are the historical note about the removed one-shot seed Jobs. So line 138 (fixed here) was the only actual stale reference. Merging as-is.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The final fold. authentik was the last app on the transitional
seedlayer — this folds itsak-pgCNPG backend into the existing dedicatedauthentikKS and, since it's the last holdout, fully retireskubernetes/seed/.The fold
git mvthe 5 CNPG manifestsseed/authentik/→apps/authentik/(no PVCs — all state is inak-pg).authentikKS: dropdependsOn: seed-authentik, addinfrastructure-cnpg-barman, add CNPG ClusterhealthCheckExprs.seed-authentik.yaml+ the now-emptyseed/authentik/.Seed-layer retirement (
kubernetes/seed/is now empty)git mv seed/RECOVERY.md → kubernetes/RECOVERY.md(sibling to the MIGRATION-* docs); fix its staleseed-authentikreconcile example →authentik.e2e-test.sh: drop the lastseed-*check.bootstrap.sh: rewrite the obsoleteseed-<app>gating comment (app KSes now own their CNPG DBs directly) + de-seedthe wait labels (the one-shot seed Jobs are long gone).opentofu/object_storage.tf: fix the ObjectStore path comment (seed/*→apps/*).Safe transfer + verified restorability
All 5
seed/authentikobjects carryprune: disabled(#407), so deletingseed-authentikskips them in GC andauthentikadopts them in place. No CNPG/app restart. Restore-test passed first:ak-pgrestored cleanly (25 users, 368 tables, 1225 MB) via the corrected #404 recipe, clean no-leak teardown.Verified: build has
Cluster/ak-pg+ exactly 5 prune-protected;bash -nbootstrap+e2e OK;kubernetes/seed/fully removed; no stale seed file-paths remain.Post-merge check
seed-authentikgone;authentikKS Ready;ak-pgadopted (owner→authentik) withRESTARTS=0; nothing pruned. This completes the seed→apps migration for all 7 apps.The last app in the seed->apps migration. Folds authentik's ak-pg CNPG backend into the existing dedicated authentik KS and, since authentik was the final holdout, fully retires kubernetes/seed/. - git mv seed/authentik/{cluster,objectstore,scheduled-backup,barman-creds- externalsecret,hetzner-creds-externalsecret}.yaml -> apps/authentik/, add to apps/authentik/kustomization.yaml (authentik has no data PVCs — all state is in ak-pg). - authentik KS: drop 'dependsOn: seed-authentik', add 'dependsOn: infrastructure-cnpg-barman', add the CNPG Cluster healthCheckExprs. - Delete clusters/homelab/seed-authentik.yaml and the now-empty seed/authentik/. Seed-layer retirement cleanup (kubernetes/seed/ is now empty): - git mv seed/RECOVERY.md -> kubernetes/RECOVERY.md (sibling to the MIGRATION-* docs); fix its stale 'flux reconcile kustomization seed-authentik' example to 'authentik'. - e2e-test.sh: drop the last seed-* readiness check (seed-authentik). - bootstrap.sh: rewrite the obsolete 'per-app seed-<app> KSes' gating comment to reflect that app KSes now own their CNPG DBs directly, and de-'seed' the wait-description labels (the one-shot rsync/pg_restore seed Jobs are long gone). - opentofu/object_storage.tf: fix the CNPG ObjectStore path comment (kubernetes/seed/* -> kubernetes/apps/*). Safe ownership transfer (nothing pruned): all 5 seed/authentik objects carry prune: disabled (from stage 1 #407), so deleting seed-authentik skips them in GC and the authentik KS adopts them in place. No CNPG restart, no app restart. Restore-test passed first: ak-pg backup restored cleanly (25 users, 368 tables, 1225 MB) using the corrected RECOVERY.md recipe, with a clean no-leak teardown. Verified: kubectl kustomize apps/authentik builds with Cluster/ak-pg + exactly 5 prune-protected; bash -n bootstrap.sh + e2e-test.sh OK; kubernetes/seed/ fully removed; no stale seed file-path references remain. Left intentionally: barman/hetzner ExternalSecrets still read OpenBao keys under seed/authentik/... (vault paths, not repo paths). Co-Authored-By: Claude Bot <claude-bot@renner.uno> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>🤖 Automated review — model
CLI default(complexity: complex), commit91f5baf66142ea0c79e2ad83c67755c842386151.Summary
This PR folds the last remaining
seed-<app>Kustomization (seed-authentik) into the dedicatedauthentikKS, retiringkubernetes/seed/entirely. It's a mechanicalgit mvof 5 CNPG manifests plus dependency/health-check wiring and doc/script cleanup, and it follows the exact same pattern already used successfully for the other 6 apps (immich, paperless, audiobookshelf, music-assistant, influxdb, woodpecker — confirmed by their existingclusters/homelab/*.yamlcomments). I verified the checkout after the change:kubernetes/seed/no longer exists, all 5 moved objects carrykustomize.toolkit.fluxcd.io/prune: disabled(so deletingseed-authentikcan't GC them), no other Flux Kustomization or script still referencesseed-authentikorkubernetes/seed, and the newauthentik.yamlKS (dependsOn/healthCheckExprs) is byte-for-byte structurally identical to the already-liveimmich.yamlKS. No blocking issues found.🟡 Suggestions
kubernetes/RECOVERY.md:138— the fix fromseed-authentik→authentikin theflux reconcile kustomization authentik --with-sourceexample is correct and necessary (the old target no longer exists after this PR), but it's a good example of how easy this kind of doc drift is: worth a quick sanity pass over the rest ofRECOVERY.md's per-cluster tables (im-pg/pprl-pgrows) next time either of those KSes gets touched, since they'll eventually need the same treatment if not already done.Tests
No automated tests exist for this kind of Flux/GitOps manifest change (consistent with the rest of the repo), and none would be expected here. The PR body states a restore-test was performed against the live cluster (
ak-pgrestored cleanly, clean teardown) and thatbash -nwas run onbootstrap.sh/e2e-test.sh— I couldn't re-run either the cluster restore-test orbash -nmyself in this sandboxed review (shell execution for scripts was blocked), but I read both scripts' changed sections directly and the edits are simple label/comment text changes with correct quoting and no altered control flow, so I have no reason to doubt the syntax claim.Recommendation
Looks reasonable — no blocking issues; comment above is optional.
Did the sanity pass you suggested rather than defer it — RECOVERY.md is already drift-free. The
ak-pg/im-pg/pprl-pgtable rows are all cluster/namespace/ObjectStore/barman-S3 facts (im-pgin nsimmich, storeim-pg-store,s3://renner-uno-k8s-cnpg/im-pg, DBimmich) — none of which the seed→apps file move changes, so they stay correct. The othercluster.yamlmentions are relative ("edit the cluster.yaml"), not path-scoped, and theseed-word hits at lines 42-45 are the historical note about the removed one-shot seed Jobs. So line 138 (fixed here) was the only actual stale reference. Merging as-is.