Authentik zelf hosten met Docker Compose voor SSO
Leer Authentik 2026.5 op Docker Compose draaien met de juiste env-waarden, akadmin-bootstrap en forward auth via Traefik voor al uw apps.
Eén aanmelding voor elke app die u host
Authentik is een zelfgehoste SSO-server (single sign-on): uw gebruikers melden zich één keer aan en elke app erachter accepteert die sessie, zonder om een eigen wachtwoord te vragen. De installatie bestaat uit een officieel Docker Compose-bestand en twee gegenereerde geheimen. Het meeste denkwerk begint daarna: een reverse proxy ernaartoe laten verwijzen en één bestaande app achter forward auth plaatsen.
Authentik wordt in dat Compose-bestand geleverd als drie services: een PostgreSQL-database, een server-proces en een worker-proces. De servercontainer voert ook de ingebouwde outpost uit. Dit is het onderdeel dat voor elke beschermde app antwoord geeft op de vraag: "is dit verzoek aangemeld?" Versie 2026.5 is de huidige release in juli 2026. Het project vereist een host met minimaal 2 CPU-cores en 2 GB RAM. Beschouw dit als het minimum. PostgreSQL en de worker gebruiken geheugen zodra de machine een dag actief is.
Wat u nodig hebt voordat u begint
U hebt Docker Engine met de Compose v2-plugin nodig. U kunt dit controleren met docker compose version. Als dit een foutmelding toont in plaats van een versienummer, installeert u de plugin voordat u verdergaat. De basis wordt behandeld in apps uitvoeren met Docker Compose op een VPS. U hebt ook een DNS A-record nodig dat naar de server verwijst, auth.example.com in de onderstaande voorbeelden. Authentik maakt de redirect-URL's namelijk op basis van de hostnaam die de browser heeft gebruikt.
Voer de stack uit als een gewone gebruiker in de groep docker, en niet als root. Lidmaatschap van die groep is op de host gelijkwaardig aan root. Ken het lidmaatschap daarom toe aan één deploy-account en aan niemand anders, zoals beschreven in gebruikersaccounts met minimale rechten op een VPS.
Installeren met het officiële Compose-bestand
sudo install -d -o "$USER" -g "$USER" /opt/authentik
cd /opt/authentik
wget https://docs.goauthentik.io/compose.yml
echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env
docker compose pull
docker compose up -ddocker compose ps moet drie containers weergeven. postgresql moet healthy rapporteren en server moet worker rapporteren. running moet worden gerapporteerd. Bij de eerste start worden de databasemigraties uitgevoerd. Wacht daarom een minuut voordat de webinterface reageert.
Beide gegenereerde waarden zijn belangrijk, maar om verschillende redenen. PG_PASS is het PostgreSQL-wachtwoord en heeft een harde limiet van 99 tekens. AUTHENTIK_SECRET_KEY ondertekent sessies en tokens. Als u deze waarde later wijzigt, worden alle gebruikers afgemeld en worden alle uitgegeven API-tokens ongeldig. Houd .env op modus 600 en bewaar een kopie op een veilige locatie. Een database die zonder de bijbehorende geheime sleutel is hersteld, is niet toegankelijk voor gebruikers.
Het Compose-bestand leest beide waarden met de vorm ${PG_PASS:?database password required}. Compose weigert daarom te starten als het bestand ontbreekt. Als u docker compose up -d vanuit de verkeerde map uitvoert, wordt required variable AUTHENTIK_SECRET_KEY is missing a value: secret key required weergegeven en stopt de uitvoering. Dit bericht wijst op een padprobleem, niet op een configuratieprobleem.
De omgevingswaarden die van belang zijn
Al het overige komt in hetzelfde bestand .env. Authentik vertaalt een dubbele underscore naar een geneste configuratiesleutel. AUTHENTIK_EMAIL__HOST stelt daarom email.host in. Een enkele underscore wordt zonder waarschuwing genegeerd. Dit is de meest voorkomende reden waarom een instelling niets lijkt te doen.
AUTHENTIK_BOOTSTRAP_PASSWORDstelt bij de eerste start het wachtwoord in van de ingebouwde gebruikerakadmin. U hoeft dit wachtwoord daardoor nooit in een openbaar webformulier in te voeren.AUTHENTIK_BOOTSTRAP_EMAILenAUTHENTIK_BOOTSTRAP_TOKENstellen op dezelfde manier het adres en een API-token van deze gebruiker in.COMPOSE_PORT_HTTPenCOMPOSE_PORT_HTTPSverplaatsen de gepubliceerde poorten van de standaardpoorten 9000 en 9443.AUTHENTIK_EMAIL__HOST,AUTHENTIK_EMAIL__PORT,AUTHENTIK_EMAIL__USERNAME,AUTHENTIK_EMAIL__PASSWORD,AUTHENTIK_EMAIL__USE_TLSenAUTHENTIK_EMAIL__FROMconfigureren uitgaande e-mail. Zonder deze waarden probeert Authentiklocalhostop poort 25 te gebruiken. Daardoor eindigen e-mails voor het opnieuw instellen van wachtwoorden met een verbindingsfout in het worker-logboek.AUTHENTIK_LOG_LEVEL=debugschakelt de gewenste details in wanneer een loginflow niet correct werkt. Stel deze waarde daarna weer in opinfo.AUTHENTIK_ERROR_REPORTING__ENABLEDis standaard ingesteld opfalse. Stel deze waarde alleen in optrueals u ermee instemt crashrapporten naar de leverancier te verzenden.
Dit zijn geheimen in een tekstbestand. Behandel deze directory daarom zoals elke andere opslaglocatie voor inloggegevens. Een wachtwoordmanager, zoals een zelfgehoste Vaultwarden-instantie, is een betere locatie voor de herstelkopie dan een notitie op uw laptop.
Eerste aanmelding en het beheerdersaccount
Open http://SERVER_IP:9000 in een browser. Authentik toont de eerste configuratiestroom en vraagt u een wachtwoord in te stellen voor de standaardgebruiker akadmin. Als u AUTHENTIK_BOOTSTRAP_PASSWORD al hebt ingesteld, is deze stap voltooid en gaat u rechtstreeks naar de aanmeldpagina.
Maak onder Directory en vervolgens Users een normale beheerdersgebruiker voor uzelf, voeg deze toe aan de groep authentik Admins en meld u aan met dat account. Laat akadmin achter als noodaccount met een lang wachtwoord dat u offline bewaart. Dagelijks werken met een gedeeld ingebouwd account maakt het auditlogboek onbruikbaar, omdat bij elke gebeurtenis akadmin staat en nergens wie de handeling heeft uitgevoerd.
Authentik achter uw reverse proxy plaatsen
Poort 9000 rechtstreeks op internet publiceren werkt, maar u wilt TLS (transport layer security) en een echte hostnaam. Als u de configuratie uit Traefik als reverse proxy voor meerdere Compose-apps al gebruikt, verbind Authentik dan met hetzelfde externe proxy-netwerk via een overridebestand. Maak docker-compose.override.yml naast compose.yml:
services:
server:
networks:
- default
- proxy
labels:
traefik.enable: "true"
traefik.docker.network: proxy
traefik.http.routers.authentik.rule: Host(`auth.example.com`)
traefik.http.routers.authentik.entrypoints: websecure
traefik.http.routers.authentik.tls.certresolver: le
traefik.http.services.authentik.loadbalancer.server.port: "9000"
networks:
proxy:
external: truePas dit toe met docker compose up -d. Compose voegt het overridebestand automatisch samen. De service server behoudt daardoor alles uit het officiële bestand en krijgt de labels erbij. Controleer dit met curl -I https://auth.example.com/if/user/. Deze moet antwoorden met HTTP/2 200. Een 404 page not found van Traefik betekent dat de container niet op het netwerk proxy staat. Traefik kan geen verkeer routeren naar een container die het niet kan bereiken.
Zodra de hostnaam werkt, bindt u de gepubliceerde poorten in het overridebestand aan 127.0.0.1. Zo is toegang uitsluitend via de proxy mogelijk.
Eén app beveiligen met forward auth
De proxyprovider van Authentik heeft drie modi. Als u de verkeerde kiest, kost dit u een uur. Proxy betekent dat de outpost zelf het verkeer doorstuurt naar de upstream-app. Forward auth (single application) betekent dat uw eigen reverse proxy het verkeer blijft doorsturen en Authentik alleen vraagt of de aanvraag is aangemeld. Forward auth (domain level) beveiligt elke app onder één hoofddomein met één provider, maar hiervoor zijn autorisatieregels per toepassing nodig. Als Traefik ervoor staat, hebt u forward auth (single application) nodig.
Open in de webinterface Applications en daarna Providers. Maak een Proxy Provider, kies de modus voor forward auth voor één toepassing en stel de externe host in op https://app.example.com. Maak een Application die naar deze provider verwijst. Open vervolgens Outposts, bewerk de authentik Embedded Outpost en voeg de nieuwe toepassing toe aan de geselecteerde toepassingen. De outpost antwoordt alleen voor toepassingen die eraan zijn toegewezen. Als u deze laatste stap overslaat, retourneert een correct geconfigureerde provider daarom nog steeds niets.
Definieer de middleware één keer op de Authentik-container en verwijs er vanuit elke beveiligde app naar:
traefik.http.middlewares.authentik.forwardauth.address: http://server:9000/outpost.goauthentik.io/auth/traefik
traefik.http.middlewares.authentik.forwardauth.trustForwardHeader: "true"
traefik.http.middlewares.authentik.forwardauth.authResponseHeaders: X-authentik-username,X-authentik-groups,X-authentik-email,X-authentik-name,X-authentik-uid,X-authentik-jwt,X-authentik-meta-jwks,X-authentik-meta-outpost,X-authentik-meta-provider,X-authentik-meta-app,X-authentik-meta-versionauthResponseHeaders is de lijst met headers die Traefik vanuit het antwoord van Authentik kopieert naar de aanvraag die het naar de upstream-app stuurt. Als u deze weglaat, blijft de app wel beveiligd, maar weet de app niet wie de gebruiker is. Alles wat X-authentik-username gebruikt voor automatisch aanmelden, blijft dan afgemeld.
De beveiligde app zelf heeft twee routers nodig, niet één:
labels:
traefik.enable: "true"
traefik.http.routers.myapp.rule: Host(`app.example.com`)
traefik.http.routers.myapp.entrypoints: websecure
traefik.http.routers.myapp.tls.certresolver: le
traefik.http.routers.myapp.middlewares: authentik@docker
traefik.http.routers.myapp-auth.rule: Host(`app.example.com`) && PathPrefix(`/outpost.goauthentik.io/`)
traefik.http.routers.myapp-auth.entrypoints: websecure
traefik.http.routers.myapp-auth.tls.certresolver: le
traefik.http.routers.myapp-auth.priority: "15"
traefik.http.routers.myapp-auth.service: authentikDe tweede router wordt vaak vergeten. Na het aanmelden stuurt Authentik de browser terug naar een pad onder /outpost.goauthentik.io/ op de hostnaam van de app, niet naar auth.example.com. Zonder een router die dit padprefix naar de Authentik-service stuurt, komt de aanvraag bij uw app terecht. Die retourneert 404 en het aanmelden wordt niet voltooid. De hogere priority zorgt ervoor dat de specifieke padregel voorrang krijgt op de algemene Host()-regel voor hetzelfde domein.
Test dit in een privébrowservenster. U moet naar auth.example.com worden doorgestuurd, u aanmelden en terugkeren naar de app. docker compose logs -f server aan de Authentik-zijde registreert per poging een autorisatiegebeurtenis. Daarmee kunt u controleren of de aanvraag Authentik überhaupt heeft bereikt.
De fouten die u daadwerkelijk zult tegenkomen
Een eindeloze omleidingslus tussen de applicatie en de aanmeldpagina. De externe host bij de provider komt niet overeen met de host die de browser gebruikt, meestal http:// bij de provider tegenover https:// in de adresbalk. De sessiecookie wordt dan voor een andere origin ingesteld, waardoor elke terugkeer eruitziet als een nieuw anoniem verzoek. Corrigeer de externe host en verwijder de cookies voor beide domeinen voordat u opnieuw test.
404 op /outpost.goauthentik.io/start. De outpost-router ontbreekt, of de prioriteit ervan is lager dan die van de catch-all-router voor die host.
De applicatie wordt geladen zonder ooit om een aanmelding te vragen. Het label middlewares verwijst naar middleware die niet bestaat. Traefik geeft daarvoor geen waarschuwing. Een typefout in authentik@docker betekent dus simpelweg dat er geen middleware wordt uitgevoerd. Open het Traefik-dashboard en controleer of de router de middleware vermeldt.
403 van Authentik na een geslaagde aanmelding. De gebruiker is geauthenticeerd, maar niet geautoriseerd. Aan de applicatie is een beleidskoppeling of groepsvereiste gekoppeld waaraan deze gebruiker niet voldoet. Het logboek Events in de beheerinterface vermeldt welk beleid de toegang heeft geweigerd.
Wanneer Keycloak beter past
Keycloak is het oudere project, wordt ondersteund door Red Hat en is de sterkere keuze voor traditioneel enterprise-identiteitsbeheer: uitgebreide SAML-federatie, het gelijktijdig doorsturen van aanmeldingen van meerdere externe identity providers en het exporteren en importeren van realms als gedocumenteerd migratiepad. De commerciële ondersteuning erachter is voor sommige organisaties op papier belangrijk. Daar staat tegenover dat Keycloak geen eigen proxy heeft. Een applicatie die geen OIDC (OpenID Connect) ondersteunt, beveiligen betekent daarom dat u daarnaast iets zoals oauth2-proxy moet uitvoeren. De ingebouwde proxy provider van Authentik biedt deze functionaliteit al en is geïntegreerd. Daarom kiezen de meeste self-hosters met een gemengde verzameling applicaties voor Authentik.
Back-ups en upgrades
Drie zaken maken een herstel mogelijk: de PostgreSQL-database, de directory ./data en .env.
cd /opt/authentik
docker compose exec -T postgresql pg_dump -U authentik authentik | gzip > authentik-$(date +%F).sql.gzBewaar die dump samen met .env. Alleen de dump is niet voldoende, omdat de geheime sleutel die sessie- en tokendata beveiligt, in .env staat.
Upgrades zijn een tagwijziging. Stel AUTHENTIK_TAG in .env in op de gewenste release en voer daarna docker compose pull uit, gevolgd door docker compose up -d. Lees eerst de release notes, omdat Authentik datumgebaseerde versies gebruikt en sommige releases migraties bevatten waarvoor u eerst vanaf de vorige release moet upgraden. Maak de datadabasedump vóór de pull en niet erna.
FAQ
Is Authentik gratis voor self-hosting?
De opensource-editie is gratis en bevat alles wat hierboven is beschreven: de proxyprovider, forward auth, OIDC (OpenID Connect), SAML en de flows-engine. Een betaalde enterprise-laag voegt ondersteuning en enkele enterprise-functies toe, maar voor dit alles is geen licentie nodig.
Heb ik Traefik nodig om Authentik te gebruiken?
Nee. Forward auth werkt met nginx via auth_request en met Caddy via forward_auth. Het patroon is in alle gevallen hetzelfde: de reverse proxy vraagt Authentik naar elke aanvraag en het padvoorvoegsel /outpost.goauthentik.io/ op de beveiligde hostnaam moet naar Authentik routeren in plaats van naar de app.
Waarom blijft mijn beveiligde app eindeloos tussen de aanmeldpagina en een foutmelding wisselen?
De externe host die in de proxyprovider is geconfigureerd, komt niet overeen met de URL die de browser gebruikt, meestal http tegenover https. De sessiecookie wordt voor de ene origin uitgegeven en op een andere gelezen. Daardoor ziet Authentik elke keer een anonieme aanvraag. Corrigeer de externe host en verwijder vervolgens de cookies voor beide hostnamen voordat u opnieuw test.
Hoeveel RAM heeft Authentik nodig?
Het gedocumenteerde minimum is 2 CPU-cores en 2 GB RAM vanaf juli 2026. Dit omvat PostgreSQL, de server en de worker samen. Op een systeem met 2 GB is de worker het eerste proces dat de kernel beëindigt bij geheugendruk. Het symptoom is dat achtergrondtaken en uitgaande e-mail stoppen terwijl de aanmeldpagina nog werkt. Geef het systeem 4 GB als dezelfde server ook de apps uitvoert die u beveiligt.