Selfhosted SSO med Authelia
Alternativ til Authentik — samme mål (ét login + 2FA for Forgejo, Jellyfin, n8n, Kanboard, Shaarli, WebDAV), men med et markant lettere setup.
- Én enkelt binær/container, ingen database eller cache-container nødvendig til et setup i denne størrelse.
- Mindre footprint, hurtigere opstart, mindre at holde opdateret.
- Trade-off: mindre poleret UI, og — vigtigst — en anden integrationsmodel, se nedenfor.
| Komponent | Rolle |
|---|---|
authelia |
Enkelt binary: portal, 2FA, forward-auth endpoint, (valgfrit) OIDC-provider |
users_database.yml |
Lokal filbaseret brugerdatabase (bcrypt-hashed passwords) |
| SQLite (indbygget) | Sessions og 2FA-registreringer — ingen separat DB-container |
Typisk idle-forbrug er under 100 MB RAM og minimal CPU — markant lettere end Authentiks 4 containere (server, worker, Postgres, Redis). Redis/Postgres er kun relevant, hvis man kører flere Authelia-instanser i HA, hvilket ikke er nødvendigt her.
Authelia virker udelukkende som forward-auth: reverse proxyen skal selv kalde Authelia som en sub-request (auth_request i nginx, ForwardAuth-middleware i Traefik, forward_auth i Caddy) og derefter selv proxye videre til appen. Authelia har, i modsætning til Authentik, ingen indbygget “outpost”, der kan agere som en selvstændig fuld reverse proxy for en enkelt app.
Konsekvens for dette setup: Synology DSM’s reverse proxy-GUI understøtter ikke auth_request. Authelia kræver derfor et ekstra reverse-proxy-lag (fx Traefik eller Caddy) foran de apps, der skal forward-auth-beskyttes — DSM kan ikke løse det alene, i modsætning til Authentik-sporet hvor DSM kan pege direkte pĂĄ en Authentik-outpost-container.
graph LR Internet -->|HTTPS 443| DSM[Synology Reverse Proxy] DSM -->|forgejo.4nton.dk| Forgejo[Forgejo] DSM -->|jellyfin.4nton.dk| Jellyfin[Jellyfin] DSM -->|shaarli/kanboard/dav .4nton.dk| Traefik[Traefik - forward-auth lag] Traefik -.auth check.-> Authelia[(Authelia)] Traefik -->|efter login| Shaarli Traefik -->|efter login| Kanboard Traefik -->|efter login| WebDAV Forgejo -.OIDC.-> Authelia Jellyfin -.OIDC.-> Authelia
sequenceDiagram participant Bruger participant Forgejo participant Authelia Bruger->>Forgejo: Ă…bner forgejo.4nton.dk Forgejo->>Bruger: Redirect til Authelia (authorize) Bruger->>Authelia: Login + 2FA Authelia->>Bruger: Redirect med authorization code Bruger->>Forgejo: Code Forgejo->>Authelia: Exchange code for token Authelia->>Forgejo: ID token + access token Forgejo->>Bruger: Logget ind
sequenceDiagram
participant Bruger
participant Traefik
participant Authelia
participant Shaarli
Bruger->>Traefik: GET shaarli.4nton.dk
Traefik->>Authelia: Sub-request: er bruger godkendt?
alt Ingen session
Authelia->>Traefik: 401
Traefik->>Bruger: Redirect til Authelia login
Bruger->>Authelia: Login + 2FA
Authelia->>Bruger: Session cookie sat
Bruger->>Traefik: Gentager original request
Traefik->>Authelia: Sub-request igen
end
Authelia->>Traefik: 200 OK + brugerheaders
Traefik->>Shaarli: Forward original request
Shaarli->>Bruger: Side vises
services:
authelia:
image: ghcr.io/authelia/authelia:4.38 # tjek nyeste stabile tag pĂĄ GitHub releases
restart: unless-stopped
volumes:
- ./config:/config
environment:
TZ: Europe/Copenhagen
ports:
- "9091:9091"
traefik:
image: docker.io/library/traefik:v3.1
restart: unless-stopped
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "8080:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
./config/configuration.yml (uddrag — minimum for et fil-baseret setup):
authentication_backend:
file:
path: /config/users_database.yml
access_control:
default_policy: deny
rules:
- domain: "*.4nton.dk"
policy: two_factor
session:
secret: ${SESSION_SECRET}
cookies:
- domain: 4nton.dk
authelia_url: https://auth.4nton.dk
storage:
local:
path: /config/db.sqlite3
notifier:
smtp:
address: smtp://<din-mailserver>:587
username: <bruger>
password: ${SMTP_PASSWORD}
sender: authelia@4nton.dk
Brugere og bcrypt-hashede passwords genereres med:
docker run --rm ghcr.io/authelia/authelia:4.38 authelia crypto hash generate argon2
…og indsættes manuelt i users_database.yml.
Tilføj under identity_providers.oidc i configuration.yml:
identity_providers:
oidc:
clients:
- client_id: forgejo
client_name: Forgejo
redirect_uris:
- https://forgejo.4nton.dk/user/oauth2/authentik/callback
scopes: ["openid", "profile", "email"]
Indsæt derefter client ID/secret i appens egen OIDC-konfiguration, ligesom beskrevet i Authentik-guiden.
Flyt disse apps til at køre bag Traefik i stedet for direkte bag DSM’s reverse proxy, med labels som:
labels:
- "traefik.http.middlewares.authelia.forwardauth.address=http://authelia:9091/api/verify?rd=https://auth.4nton.dk"
- "traefik.http.middlewares.authelia.forwardauth.trustForwardHeader=true"
- "traefik.http.middlewares.authelia.forwardauth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email"
- "traefik.http.routers.shaarli.rule=Host(`shaarli.4nton.dk`)"
- "traefik.http.routers.shaarli.middlewares=authelia@docker"
Peg til sidst DSM’s reverse proxy for disse subdomæner pĂĄ Traefiks port, i stedet for direkte pĂĄ apps’ene.
-
configuration.yml+.envmed unikke secrets, ikke committed til git - Pin Authelia- og Traefik-versionen (ikke
:latest) -
access_controlsat tiltwo_factorsom default policy - Native OIDC konfigureret for Forgejo, Jellyfin
- Traefik sat op som mellemlag for Shaarli, Kanboard, WebDAV
- DSM reverse proxy opdateret til at pege pĂĄ Traefik i stedet for direkte pĂĄ apps
- SMTP-notifier testet (bruges til password-reset/lockout-mails)