- HCL 66.9%
- Python 19.9%
- Shell 13.2%
| apps | ||
| argocd | ||
| docs | ||
| forgejo | ||
| k8s | ||
| kanidm | ||
| plans | ||
| scripts | ||
| vault | ||
| .gitignore | ||
| AGENTS.md | ||
| CONTEXT.md | ||
| README.md | ||
| Taskfile.yaml | ||
IaC Repo
Terraform/OpenTofu managed infrastructure for animeteamspeak lab.
Structure
apps/- central app catalogueapps/catalog.yamldriving all systemskanidm/- Kanidm groups and OAuth2 clientsmodules/dev_groups/- per-app capability groupsgroup-<app>-<capability>
vault/- Vault platform configmodules/app_secrets/- per-app policies and KV paths (VSO read path, ADR-0004)
k8s/- Kubernetes resources via Terraformmodules/tenant/- namespace/RBAC scaffolding per app
forgejo/- Forgejo org/repo/team managementmodules/app/- org, repos, and ADR-0007 capability teams per app
argocd/- Argo CD AppProject RBAC (ADR-0007), live per-app projectsmodules/app_roles/- catalog → per-app AppProject-role input shape (T6)argocd_projectper app; roles bind capability groups viaroles[].groups
scripts/- validation helpers (e.g.validate-argocd-rbac.sh, run astask validate-argocd-rbac)
Accessing Argo CD
The argocd/ root uses the argoproj-labs/argocd provider against
argocd.animeteamspeak.moe. Authenticate as a Kanidm service account:
# RFC 8693 exchange: SA API token -> id_token for the argocd client
export ARGOCD_AUTH_TOKEN="$(kanidm/scripts/kanidm-login.py --client argocd --api-token "$SA_TOKEN")"
The provider reads ARGOCD_AUTH_TOKEN (or var.argocd_auth_token).
Naming convention
Per-app capability groups: group-<app>-<capability> where capability ∈
viewer, contributor, developer, maintainer, live-debugging,
generated-secret-manager, manual-secret-manager, k8s-secret-viewer (ADR-0006).
Hyphen separators keep the group names DNS-1123-safe (k8s object-name
validity), so the same string serves as the kanidm group name, the RoleBinding
subject, and the k8s Role name. <app>-root is a derived nested group
(ADR-0007), not a flat entry.
org per app, dynamic Forgejo group mapping enabled. hello from testpr