Keycloak SSO and OAuth2 Proxy Architecture on linuxserver.lan
All protected services use a consistent authentication pattern: Traefik routes traffic to an OAuth2 Proxy, which validates authentication with Keycloak before forwarding to the backend service.
_oauth2_proxy cookie (7 days)master (default realm used for all services)Each protected service has a corresponding Keycloak client:
--allowed-group flagKeycloak container must be accessible from:
keycloak-net: OAuth2 proxies connect here for token validationtraefik-net: External access via Traefikpostgres-net: Database connectivityAll 16 services protected by OAuth2 Proxy + Keycloak SSO:
| Service | Auth Proxy Container | URL | Keycloak Client |
|---|---|---|---|
| AList (File Manager) | alist-auth-proxy |
alist.ai-servicers.com | alist |
| ArangoDB (Graph DB) | arangodb-auth-proxy |
arangodb.ai-servicers.com | arangodb |
| Dashy (Dashboard) | dashy-auth-proxy |
dashy.ai-servicers.com | dashy |
| Dozzle (Docker Logs) | dozzle-auth-proxy |
dozzle.ai-servicers.com | dozzle |
| Draw.io (Diagrams) | drawio-auth-proxy |
drawio.ai-servicers.com | drawio |
| Grafana (Monitoring) | grafana-auth-proxy |
grafana.ai-servicers.com | grafana |
| Loki (Log Aggregation) | loki-auth-proxy |
loki.ai-servicers.com | loki |
| Microbin (Paste Service) | microbin-auth-proxy |
microbin.ai-servicers.com | microbin |
| Mongo Express (MongoDB UI) | mongo-express-auth-proxy |
mongo-express.ai-servicers.com | mongo-express |
| Netdata (System Metrics) | netdata-auth-proxy |
netdata.ai-servicers.com | netdata |
| Obsidian LiveSync | obsidian-auth-proxy |
obsidian.ai-servicers.com | obsidian |
| OpenMemory UI (Mem0) | openmemory-ui-auth-proxy |
openmemory.ai-servicers.com | openmemory |
| Portainer (Docker Mgmt) | portainer-auth-proxy |
portainer.ai-servicers.com | portainer |
| Qdrant (Vector DB) | qdrant-auth-proxy |
qdrant.ai-servicers.com | qdrant |
| Redis Commander | redis-commander-auth-proxy |
redis-commander.ai-servicers.com | redis-commander |
| Stirling PDF | stirling-pdf-auth-proxy |
stirling.ai-servicers.com | stirling-pdf |
Standard configuration template for new OAuth2 Proxy instances:
SKIP_OIDC_DISCOVERY=true because OAuth2 Proxy connects to Keycloak internally
via http://keycloak:8080, but the issuer URL in tokens is
https://keycloak.ai-servicers.com. This mismatch causes validation failures without the bypass.
openssl rand -base64 32 | tr -d '\n'$HOME/projects/secrets/{service}.env
Each OAuth2 Proxy container must be on three networks:
traefik-net: Receive traffic from Traefikkeycloak-net: Connect to Keycloak for token validation{service}-net: Connect to backend service (or observability-net, etc.)Step-by-step guide to protect a new service with OAuth2 Proxy and Keycloak SSO:
{service-name}https://{service}.ai-servicers.com/oauth2/callbackhttps://{service}.ai-servicers.comOAuth2 Proxy must use internal URLs for token validation but external URL for issuer:
COOKIE_DOMAINS=.ai-servicers.com (note leading dot)COOKIE_SECURE=true when using HTTPS/administrators membership--allowed-group from OAuth2 Proxy confighttps://keycloak.ai-servicers.com/realms/master/.well-known/openid-configurationhttps://{service}.ai-servicers.com/oauth2/callback$HOME/projects/secrets/{service}.env/home/administrator/projects/keycloak/$HOME/.claude/skills/keycloak-setup/