## Summary Fixes the Facebook crawler spider trap that's been generating infinite recursive URLs like `/how-to/tutorials/tutorials/how-to/explanation/...` for several days. **Root cause:** Quartz SPA mode + nginx `try_files` fallback to `index.html` meant any fabricated URL returned the root HTML shell with HTTP 200. Crawlers followed relative links from those fake URLs, creating infinite recursion. **Fix:** - Disable Quartz SPA mode (`enableSPA: false`) — all pages are now fully static HTML - Replace nginx SPA fallback with `=404` + Quartz's static `404.html` - Remove `robots.txt` exclusions (no longer needed) **Docs cleanup (Obsidian.nvim compat no longer needed):** - Delete hand-curated category index files (`tutorials.md`, `reference.md`, `how-to.md`, `explanation.md`) — Quartz auto-generates folder pages - Delete `postgresql-storage.md` (redirect stub) and `migrate-forgejo-from-brew.md` (stale history) - Drop `docs-check-index` and `docs-check-filenames` prek hooks - Rewrite `docs-check-links` to allow path-based wiki-links (`[[path/to/file]]`) and only error on true ambiguity - Add `ai-docs` doc tree listing to replace index files for AI context - Add natural cross-links from reference cards to fix orphan docs ## Deployment and Testing - [ ] Merge and let the build pipeline run - [ ] Verify docs.eblu.me serves pages correctly with full page loads - [ ] Verify non-existent URLs return 404 - [ ] Monitor crawler traffic — should drop to near zero for fabricated URLs Reviewed-on: #290
85 lines
3.2 KiB
Markdown
85 lines
3.2 KiB
Markdown
---
|
|
title: Authentik
|
|
modified: 2026-02-20
|
|
tags:
|
|
- service
|
|
- security
|
|
- oidc
|
|
---
|
|
|
|
# Authentik
|
|
|
|
OIDC identity provider for BlumeOps. Authentik is the **source of truth** for user identity — users are created and managed in Authentik, and services authenticate against it via OIDC.
|
|
|
|
## Quick Reference
|
|
|
|
| Property | Value |
|
|
|----------|-------|
|
|
| **URL** | https://authentik.ops.eblu.me |
|
|
| **Admin UI** | https://authentik.ops.eblu.me/if/admin/ |
|
|
| **Tailscale URL** | https://authentik.tail8d86e.ts.net |
|
|
| **Namespace** | `authentik` |
|
|
| **Cluster** | k3s (ringtail) |
|
|
| **Manifests** | `argocd/manifests/authentik/` |
|
|
| **Container build** | `containers/authentik/default.nix` |
|
|
|
|
## Architecture
|
|
|
|
Authentik runs on [[ringtail]]'s k3s cluster, isolated from the main services on indri's minikube. This means the IdP is independent of the minikube cluster lifecycle.
|
|
|
|
Three deployments:
|
|
- **server** — HTTP/HTTPS interface, handles OIDC flows
|
|
- **worker** — Background tasks, blueprint application
|
|
- **redis** — Caching, sessions, task queue
|
|
|
|
## Database
|
|
|
|
Uses the shared CNPG `blumeops-pg` cluster on [[indri]], accessed cross-cluster via `pg.ops.eblu.me:5432`. Database `authentik` with managed role.
|
|
|
|
## Blueprints
|
|
|
|
Authentik configuration is managed via Blueprints (YAML) stored as a ConfigMap mounted into the worker at `/blueprints/custom/`. Current blueprints:
|
|
|
|
- **`common.yaml`** — shared identity resources (`admins` group)
|
|
- **`mfa.yaml`** — MFA enforcement on the default authentication flow (`not_configured_action: configure`)
|
|
- **`grafana.yaml`** — Grafana OAuth2 provider, application, and policy binding
|
|
- **`forgejo.yaml`** — Forgejo OAuth2 provider, application, and policy binding
|
|
|
|
Group membership is included in the `profile` scope claim (Authentik built-in). Services use `--group-claim-name groups` to read it.
|
|
|
|
Blueprint file: `argocd/manifests/authentik/configmap-blueprint.yaml`
|
|
|
|
## OIDC Clients
|
|
|
|
| Client | Status |
|
|
|--------|--------|
|
|
| [[grafana]] | Active |
|
|
| [[forgejo]] | Active |
|
|
|
|
Future clients: [[argocd]], [[miniflux]], [[zot]]
|
|
|
|
## Secrets
|
|
|
|
Injected via [[external-secrets]] from the "Authentik (blumeops)" 1Password item (see [[create-authentik-secrets]] for setup).
|
|
|
|
| 1Password Field | Purpose |
|
|
|-----------------|---------|
|
|
| `secret-key` | Authentik secret key |
|
|
| `db-password` | PostgreSQL password |
|
|
| `grafana-client-secret` | OIDC client secret for Grafana |
|
|
| `forgejo-client-secret` | OIDC client secret for Forgejo |
|
|
| `api-token` | Authentik API token |
|
|
|
|
## Container Image
|
|
|
|
Nix-built via `dockerTools.buildLayeredImage`. The entrypoint wrapper symlinks built-in blueprint directories from the Nix store into `/blueprints/` at runtime, allowing custom blueprints to coexist with defaults. `AUTHENTIK_BLUEPRINTS_DIR=/blueprints` overrides the hardcoded Nix store path.
|
|
|
|
## Related
|
|
|
|
- [[federated-login]] - How authentication works across BlumeOps
|
|
- [[grafana]] - First OIDC client
|
|
- [[deploy-authentik]] - Deployment how-to
|
|
- [[migrate-grafana-to-authentik]] - Grafana SSO migration from Dex
|
|
- [[build-authentik-from-source]] - Nix-based container build
|
|
- [[mirror-authentik-build-deps]] - Supply chain mirrors for the build
|
|
- [[external-secrets]] - Secrets injection from 1Password
|