2026-02-20 07:06:56 -08:00
---
2026-02-20 08:22:19 -08:00
title: Deploy Authentik Identity Provider
2026-02-20 11:19:34 -08:00
status: active
2026-02-20 07:06:56 -08:00
modified: 2026-02-20
2026-02-20 09:01:11 -08:00
requires:
- build-authentik-container
- provision-authentik-database
- create-authentik-secrets
2026-02-20 11:19:34 -08:00
- migrate-grafana-to-authentik
2026-02-20 07:06:56 -08:00
tags:
- how-to
- authentik
- security
- oidc
---
2026-02-20 08:22:19 -08:00
# Deploy Authentik Identity Provider
2026-02-20 07:06:56 -08:00
2026-02-20 11:19:34 -08:00
Replace [[dex]] with [Authentik ](https://goauthentik.io/ ) as the SSO identity provider. Authentik is the **source of truth ** for user identity in BlumeOps. Users are created and managed in Authentik; services authenticate against it via OIDC. Forgejo federation is deferred to a future effort (existing `eblume` account has extensive automations that need careful migration).
2026-02-20 07:06:56 -08:00
2026-02-20 08:22:19 -08:00
## Architecture Decisions
2026-02-20 07:06:56 -08:00
| Decision | Choice | Rationale |
|----------|--------|-----------|
2026-02-20 11:19:34 -08:00
| **Identity model ** | Authentik is source of truth | Central user/group management, not Forgejo-upstream like Dex |
2026-02-20 08:22:19 -08:00
| **Cluster ** | [[ringtail]] (k3s) | IdP independent of main services cluster, same as Dex |
2026-02-20 11:02:36 -08:00
| **Database ** | CNPG `blumeops-pg` on [[indri]] | Cross-cluster via Caddy L4 (`pg.ops.eblu.me` ), no new operator needed |
2026-02-20 08:22:19 -08:00
| **Redis ** | Co-deployed in authentik namespace | Required for caching/sessions/task queue |
2026-02-20 07:06:56 -08:00
| **Containers ** | Nix-built (`dockerTools.buildLayeredImage` ) | Supply chain control, consistent with Dex/ntfy pattern |
| **Manifests ** | Kustomize (no Helm) | Consistent with all other BlumeOps services |
| **Networking ** | Tailscale Ingress + Caddy reverse proxy | Same pattern as Dex |
2026-02-20 11:19:34 -08:00
| **IaC ** | Authentik Blueprints (YAML in ConfigMap) | GitOps-native, config stored in repo |
2026-02-20 07:06:56 -08:00
2026-02-20 11:02:36 -08:00
## What Was Done
2026-02-20 07:06:56 -08:00
2026-02-20 11:02:36 -08:00
1. Built Nix container image (`v1.1.0-nix` ) — `pkgs.authentik` + `coreutils` + `bashInteractive`
2. Created 1Password item "Authentik (blumeops)" with secret key and DB credentials
3. Provisioned `authentik` database and CNPG managed role on `blumeops-pg`
4. Deployed to ringtail k3s: server, worker, Redis (3 deployments)
5. ExternalSecret pulls config from 1Password
6. Tailscale Ingress at `authentik.tail8d86e.ts.net`
7. Caddy reverse proxy at `authentik.ops.eblu.me`
2026-02-20 11:19:34 -08:00
8. Completed first-run wizard (admin account created)
2026-02-20 11:02:36 -08:00
## URLs
- **Admin:** https://authentik.ops.eblu.me/if/admin/
- **Tailscale:** https://authentik.tail8d86e.ts.net
2026-02-20 11:19:34 -08:00
## Future Work (not blocking this card)
2026-02-20 11:02:36 -08:00
2026-02-20 11:19:34 -08:00
- **Forgejo federation:** Make Forgejo an OIDC client of Authentik (deferred — needs careful `eblume` account migration)
2026-02-20 11:02:36 -08:00
- **Cross-cluster metrics:** Prometheus on indri scraping authentik on ringtail
- **Redis image:** Replace upstream `redis:7-alpine` with Nix-built container
2026-02-20 07:06:56 -08:00
## Related
2026-02-20 11:19:34 -08:00
- [[dex]] — Current IdP (to be replaced by [[migrate-grafana-to-authentik]])
2026-02-20 07:06:56 -08:00
- [[federated-login]] — How authentication works across BlumeOps
- [[adopt-oidc-provider]] — Dex deployment plan (completed)
2026-02-20 08:22:19 -08:00
- [[ringtail]] — Target cluster
- [[agent-change-process]] — C2 methodology used for this change