diff --git a/stacks/k8s-portal/modules/k8s-portal/files/src/routes/architecture/+page.svelte b/stacks/k8s-portal/modules/k8s-portal/files/src/routes/architecture/+page.svelte index 2790f074..cd1393ab 100644 --- a/stacks/k8s-portal/modules/k8s-portal/files/src/routes/architecture/+page.svelte +++ b/stacks/k8s-portal/modules/k8s-portal/files/src/routes/architecture/+page.svelte @@ -59,6 +59,74 @@ Proxmox (Dell R730) └── ... (70+ more)
Changes go through git: branch → PR → review → merge → CI applies automatically.
+ +Terraform state is committed to git as SOPS-encrypted JSON. Secrets live in HashiCorp Vault.
++Authentication & Authorization +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +User → Authentik SSO (OIDC) → Vault Token + │ + ┌──────────────┼──────────────┐ + ▼ ▼ ▼ + KV Secrets Transit Keys K8s Creds + (per-stack) (per-stack) (deployer) + +State Encryption Flow +━━━━━━━━━━━━━━━━━━━━ +.tfstate ──SOPS──▶ .tfstate.enc ──git──▶ repo + │ + encrypted with: + ├── Vault Transit key (per-stack) + └── age keys (admin DR fallback) + +Access Control +━━━━━━━━━━━━━━ +Admin: vault-admin policy → all transit keys +User: sops-user-* policy → own stack keys only +Fallback: age key on disk → admin only (no users)+
+Internet → Cloudflare (CDN + WAF) + │ + ▼ + Cloudflared tunnel + │ + ▼ + Traefik (3 replicas) + ├── CrowdSec bouncer (rate limit, bot block) + ├── Authentik forward-auth (SSO for protected apps) + └── TLS termination + │ + ▼ + K8s Service → Pod(s) + │ + ├── NFS volume (app data) + └── iSCSI volume (databases)+
+git push + │ + ├──▶ GitHub Actions (build Docker image, push to DockerHub) + │ │ + │ ▼ + │ POST Woodpecker API (trigger deploy) + │ │ + │ ▼ + │ Woodpecker (kubectl set image, Slack notify) + │ + └──▶ Woodpecker (terragrunt apply — infra changes) + │ + ▼ + Kubernetes API → rolling update+