Provides OIDC/SAML single sign-on for all HomeLab services via Authentik.
Browser
│
▼
Traefik (443)
│ ForwardAuth middleware → authentik-server:9000
│
├── auth.DOMAIN → Authentik UI (login, admin, user portal)
├── grafana.DOMAIN → Grafana (OIDC)
├── git.DOMAIN → Gitea (OIDC)
├── outline.DOMAIN → Outline (OIDC)
└── portainer.DOMAIN → Portainer (OIDC)
Internal:
authentik-server ─┐
├── postgresql:5432
authentik-worker ─┘
└── redis:6379
| Service | Image | Port | Purpose |
|---|---|---|---|
| authentik-server | ghcr.io/goauthentik/server:2024.8.3 |
9000/9443 | Web UI + API + OIDC endpoints |
| authentik-worker | ghcr.io/goauthentik/server:2024.8.3 |
— | Background tasks (email, notifications) |
| postgresql | postgres:16-alpine |
5432 (internal) | Authentik database |
| redis | redis:7-alpine |
6379 (internal) | Session cache + task queue |
- Base stack running (
stacks/base/— Traefik + proxy network) - Domain with DNS pointing to your server
- Ports 80 + 443 open
# 1. Copy and fill environment variables
cp .env.example .env
nano .env # Fill ALL values marked REQUIRED
# 2. Generate secrets
export AUTHENTIK_SECRET_KEY=$(openssl rand -base64 32)
export AUTHENTIK_POSTGRES_PASSWORD=$(openssl rand -hex 16)
export AUTHENTIK_REDIS_PASSWORD=$(openssl rand -hex 16)
export AUTHENTIK_BOOTSTRAP_TOKEN=$(openssl rand -hex 32)
# Update .env with generated values
sed -i "s|^AUTHENTIK_SECRET_KEY=.*|AUTHENTIK_SECRET_KEY=$AUTHENTIK_SECRET_KEY|" .env
sed -i "s|^AUTHENTIK_POSTGRES_PASSWORD=.*|AUTHENTIK_POSTGRES_PASSWORD=$AUTHENTIK_POSTGRES_PASSWORD|" .env
sed -i "s|^AUTHENTIK_REDIS_PASSWORD=.*|AUTHENTIK_REDIS_PASSWORD=$AUTHENTIK_REDIS_PASSWORD|" .env
sed -i "s|^AUTHENTIK_BOOTSTRAP_TOKEN=.*|AUTHENTIK_BOOTSTRAP_TOKEN=$AUTHENTIK_BOOTSTRAP_TOKEN|" .env
# 3. Start the stack
docker compose up -d
# 4. Wait for healthy (takes ~60s on first run)
docker compose ps
# 5. Create OIDC providers for all services
../../scripts/setup-authentik.sh| Variable | Required | Description |
|---|---|---|
AUTHENTIK_SECRET_KEY |
YES | Random secret — openssl rand -base64 32 |
AUTHENTIK_POSTGRES_PASSWORD |
YES | PostgreSQL password |
AUTHENTIK_REDIS_PASSWORD |
YES | Redis password |
AUTHENTIK_BOOTSTRAP_EMAIL |
YES | Initial admin email |
AUTHENTIK_BOOTSTRAP_PASSWORD |
YES | Initial admin password |
AUTHENTIK_BOOTSTRAP_TOKEN |
YES | API token for setup script |
AUTHENTIK_DOMAIN |
YES | e.g. auth.yourdomain.com |
Run ../../scripts/setup-authentik.sh — it automatically creates providers and writes credentials to .env.
Services with native OIDC support: Grafana, Gitea, Outline, Nextcloud, Portainer.
Add to any service's Traefik labels:
traefik.http.routers.<name>.middlewares: authentik@fileAuthentik will intercept unauthenticated requests and redirect to the login page at https://auth.DOMAIN.
# All containers healthy
docker compose ps
# Authentik API responding
curl -sf https://auth.DOMAIN/-/health/ready/ && echo OK
# Check admin UI accessible
curl -sf https://auth.DOMAIN/if/admin/ -o /dev/null && echo OKIf ghcr.io is inaccessible, edit docker-compose.yml and uncomment the CN mirror lines:
# image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/goauthentik/server:2024.8.3| Symptom | Fix |
|---|---|
| Container exits immediately | Check AUTHENTIK_SECRET_KEY is set and non-empty |
| DB connection refused | Wait 30s for PostgreSQL to initialize; check AUTHENTIK_POSTGRES_PASSWORD matches |
| OIDC redirect mismatch | Ensure redirect_uris in Authentik provider matches exact callback URL |
| ForwardAuth loop | Ensure authentik outpost URL uses internal hostname authentik-server:9000 not public domain |
ghcr.io pull timeout |
Switch to CN mirror in docker-compose.yml |