Authentik SSO installeren met Docker Compose
Beheer uw inloggegevens centraal met Authentik. Leer hoe u de Docker Compose configuratie opzet, de akadmin bootstrap uitvoert en forward auth via Traefik correct instelt.
Eén login voor elke applicatie die u host
Authentik is een self-hosted SSO-server (single sign-on): uw gebruikers loggen één keer in en elke applicatie erachter accepteert die sessie in plaats van om een eigen wachtwoord te vragen. De installatie bestaat uit een officieel Docker Compose-bestand en twee gegenereerde secrets. Het deel dat echt denkwerk vereist komt daarna: een reverse proxy naar de server laten wijzen en een bestaande applicatie achter forward auth plaatsen.
Authentik wordt geleverd als drie services in dat Compose-bestand: een PostgreSQL-database, een server-proces en een worker-proces. De servercontainer draait ook de embedded outpost; dit is de component die voor elke beveiligde applicatie beantwoordt of een verzoek is aangemeld. Versie 2026.8.5 is de huidige release per 25 oktober 2026. Deze werd op 21 oktober 2026 gepubliceerd als de nieuwste patch van de 2026.8-serie, die op 18 augustus begon met 2026.8.0. Deze versie vervangt 2026.8.4 van 14 oktober als de standaard image-tag in het officiële Compose-bestand. Het project vereist een host met minimaal 2 CPU-cores en 2 GB RAM. Beschouw dit als het absolute minimum. PostgreSQL en de worker verbruiken geheugen zodra de server een dag draait.
Wat u nodig heeft voordat u begint
U heeft Docker Engine met de Compose v2-plugin nodig. U kunt dit controleren met docker compose version. Als dit een foutmelding geeft in plaats van een versie, installeer dan de plugin voordat u verdergaat; de basis wordt behandeld in applicaties draaien met Docker Compose op een VPS. U heeft ook een DNS A-record nodig dat naar de server wijst, auth.example.com in de onderstaande voorbeelden, omdat Authentik zijn redirect-URL's opbouwt op basis van de hostnaam die de browser heeft gebruikt.
Draai de stack als een gewone gebruiker in de docker-groep in plaats van als root. Het lidmaatschap van die groep staat gelijk aan root-toegang op de host, dus verleen dit aan slechts één deploy-account en aan niemand anders, zoals beschreven in gebruikersaccounts met minimale rechten op een VPS.
Installatie 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 hoort drie containers weer te geven die allemaal actief zijn, waarbij postgresql de status healthy rapporteert zodra de controle is geslaagd. De eerste start voert de database-migraties uit, dus geef het een minuut de tijd voordat de webinterface reageert.
Beide gegenereerde waarden zijn om verschillende redenen van belang. PG_PASS is het PostgreSQL-wachtwoord. De installatiedocumentatie van Authentik stelt dat wachtwoorden langer dan 99 tekens niet worden ondersteund, dus houd elk wachtwoord dat u zelf kiest daaronder; het gegenereerde wachtwoord is aanzienlijk korter. AUTHENTIK_SECRET_KEY is de sleutel die Authentik gebruikt om cookies te ondertekenen. De configuratiedocumentatie stelt dat het wijzigen hiervan actieve sessies ongeldig maakt, dus een nieuwe sleutel logt later elke aangemelde gebruiker uit. Houd .env op modus 600 en bewaar een kopie op een veilige plek bij uw back-ups, zodat een herstelactie wordt uitgevoerd met dezelfde sleutel als voorheen.
Het Compose-bestand markeert beide waarden als vereist met de ${VAR:?message}-vorm: ${PG_PASS:?database password required} bij de PostgreSQL-service en ${AUTHENTIK_SECRET_KEY:?secret key required} bij de server en worker. Dit betekent dat Compose weigert te starten wanneer het bestand ontbreekt. Het uitvoeren van docker compose up -d vanuit de verkeerde map print een regel zoals required variable AUTHENTIK_SECRET_KEY is missing a value: secret key required en stopt. Dat bericht duidt op een padprobleem, niet op een configuratiefout.
De relevante omgevingsvariabelen
Al het overige wordt in hetzelfde .env-bestand geplaatst. Authentik vertaalt een dubbele underscore naar een geneste configuratiesleutel, waardoor AUTHENTIK_EMAIL__HOST de waarde email.host instelt. Een enkele underscore leidt niet tot de geneste sleutel; dit is de meest voorkomende reden waarom een instelling geen effect lijkt te hebben.
AUTHENTIK_BOOTSTRAP_PASSWORDstelt bij de eerste start het wachtwoord in voor de ingebouwdeakadmin-gebruiker, zodat u dit nooit in een openbaar webformulier hoeft in te voeren.AUTHENTIK_BOOTSTRAP_EMAILenAUTHENTIK_BOOTSTRAP_TOKENstellen op dezelfde wijze het e-mailadres en een API-token voor deze gebruiker in.COMPOSE_PORT_HTTPenCOMPOSE_PORT_HTTPSwijzigen de gepubliceerde poorten van de standaardwaarden 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 instellingen probeert Authentik verbinding te maken vialocalhostop poort 25, waardoor e-mails voor wachtwoordherstel in het worker-logboek verschijnen als een verbindingsfout.AUTHENTIK_LOG_LEVEL=debugactiveert de gedetailleerde logboekregistratie die u nodig heeft wanneer een inlogproces niet naar behoren werkt. Zet deze waarde daarna weer terug opinfo.AUTHENTIK_ERROR_REPORTING__ENABLEDstaat standaard opfalse. Zet deze alleen optrueals u akkoord gaat met het verzenden van crashrapporten naar de ontwikkelaars.
Dit zijn geheimen in een plat tekstbestand; behandel de map daarom zoals u elke andere opslagplaats voor inloggegevens behandelt. Een wachtwoordbeheerder, zoals een zelfgehoste Vaultwarden-instantie, is een betere plek voor een reservekopie dan een notitie op uw laptop.
Eerste login en het beheerdersaccount
Open http://SERVER_IP:9000 in een browser. Authentik toont het initiële installatieproces en vraagt u een wachtwoord in te stellen voor de standaard akadmin-gebruiker. Als u AUTHENTIK_BOOTSTRAP_PASSWORD al heeft ingesteld, is die stap voltooid en gaat u direct naar de inlogpagina.
Maak een normale beheerdersgebruiker voor uzelf aan onder Directory en vervolgens Users, voeg deze toe aan de authentik Admins-groep en log in met dat account. Laat akadmin staan als een noodaccount (break-glass) met een lang wachtwoord dat offline is opgeslagen. Als een verbroken proces of fase u ooit buitensluit, print docker compose run --rm server create_recovery_key 10 akadmin, uitgevoerd vanuit /opt/authentik, een link waarmee u direct als akadmin inlogt. Iedereen die die link bezit, heeft dezelfde toegang, dus behandel deze als een wachtwoord. Dagelijks werk onder een gedeeld ingebouwd account vernietigt het auditlogboek, omdat elk evenement akadmin vermeldt en niets aangeeft wie de actie uitvoerde. Dat argument geldt ook stroomafwaarts van Authentik: iets als een self-hosted OneCLI-harness dat elke persoon een eigen agent geeft laat alleen een leesbaar spoor achter als de identiteit die daar aankomt toebehoort aan één mens in plaats van aan een login die het hele team deelt.
Authentik achter uw reverse proxy plaatsen
Het publiceren van poort 9000 naar het internet werkt, maar u wilt TLS (transport layer security) en een echte hostnaam. Als u de configuratie uit Traefik als reverse proxy voor meerdere Compose-applicaties al gebruikt, voeg Authentik dan toe aan hetzelfde externe proxy-netwerk met een override-bestand. Maak docker-compose.override.yml aan 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 de override automatisch samen, waardoor de server-service alle instellingen uit het officiële bestand behoudt en de labels erbij krijgt. Controleer dit met curl -I https://auth.example.com/if/user/, wat HTTP/2 200 zou moeten teruggeven. Een 404 page not found van Traefik betekent dat er geen router overeenkwam met het verzoek. Controleer of de labels de container hebben bereikt, of de Host()-regel exact overeenkomt met de hostnaam en of het verzoek is binnengekomen op het HTTPS-entrypoint waar de router op luistert.
Zodra de hostnaam werkt, bindt u de gepubliceerde poorten aan 127.0.0.1 in de override, zodat de enige toegangsweg via de proxy verloopt.
Beveilig één applicatie met forward auth
De proxy-provider van Authentik kent drie modi; het kiezen van de verkeerde modus kost u onnodig tijd. Proxy betekent dat de outpost zelf het verkeer doorstuurt naar de upstream-applicatie. Forward auth (single application) betekent dat uw eigen reverse proxy het verkeer afhandelt en enkel aan Authentik vraagt of de gebruiker is ingelogd. Forward auth (domain level) beveiligt elke applicatie onder één hoofddomein met één provider, ten koste van autorisatieregels per applicatie. Met Traefik als front-end is forward auth (single application) de juiste keuze. Als u een concrete applicatie zoekt om mee te oefenen, is een zelfgehoste AFFiNE-werkruimte een goede eerste kandidaat, aangezien dit het type interne tool is dat u alleen vanaf uw eigen apparaten bereikbaar wilt hebben. Bij een team-tool is het nut nog groter: plaats een zelfgehoste Chatwoot-supportdesk achter dezelfde provider, zodat iedereen die de inbox beheert één keer per dag inlogt in plaats van nog een gedeeld wachtwoord te gebruiken.
Open in de webinterface Applications en vervolgens Providers, maak een Proxy Provider aan, kies de modus forward auth single application en stel de external host in op https://app.example.com. Maak een Application aan die naar die provider verwijst. Open daarna Outposts, bewerk de authentik Embedded Outpost en voeg de nieuwe applicatie toe aan de geselecteerde applicaties. De outpost reageert alleen voor applicaties die aan hem zijn toegewezen; het overslaan van deze laatste stap is de reden waarom een correct geconfigureerde provider toch geen resultaat geeft.
Definieer de middleware één keer op de Authentik-container en verwijs er vanuit elke beveiligde applicatie 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-entitlements,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 kopieert van het antwoord van Authentik naar het verzoek dat het upstream verstuurt. Laat u dit weg, dan is de applicatie nog steeds beveiligd, maar weet deze nooit wie de gebruiker is. Hierdoor blijft software die X-authentik-username uitleest voor automatische aanmelding uitgelogd. Dit gat is het meest zichtbaar bij een applicatie die een eigen inlogprocedure heeft, zoals een zelfgehoste openGym workout tracker met passkey-login, waarbij de headers het verschil maken tussen één of twee keer inloggen voor dezelfde pagina.
De beveiligde applicatie 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 is het onderdeel dat vaak wordt vergeten. Na een aanmelding stuurt Authentik de browser terug naar een pad onder /outpost.goauthentik.io/ op de hostnaam van de applicatie, niet op auth.example.com. Zonder een router die dit padvoorvoegsel naar de Authentik-service stuurt, komt het verzoek aan bij uw applicatie, die een 404-foutmelding geeft, waardoor de aanmelding nooit wordt voltooid. De hogere priority zorgt ervoor dat de specifieke padregel voorrang krijgt op de algemene Host()-regel op hetzelfde domein.
Test dit in een privévenster van uw browser. U hoort te worden doorgestuurd naar auth.example.com, in te loggen en terug te keren naar de applicatie. docker compose logs -f server aan de kant van Authentik toont per poging een autorisatiegebeurtenis, waarmee u kunt zien of het verzoek Authentik überhaupt heeft bereikt.
De fouten die u daadwerkelijk zult tegenkomen
Eindeloze redirect-loop tussen de applicatie en de inlogpagina. De externe host op de provider komt niet overeen met wat de browser gebruikt, meestal http:// in de provider tegenover https:// in de adresbalk. De sessie-cookie wordt dan ingesteld voor een andere origin, waardoor elke terugkeer eruitziet als een nieuw anoniem verzoek. Corrigeer de externe host en verwijder cookies voor beide domeinen voordat u opnieuw test.
404 bij /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 laadt zonder ooit om een login te vragen. Het label middlewares verwijst naar een middleware die niet bestaat. Traefik geeft hier geen waarschuwing over, dus een typefout in authentik@docker betekent simpelweg dat er geen middleware wordt uitgevoerd. Open het Traefik-dashboard en controleer of de router de middleware vermeldt.
403 vanuit Authentik na een succesvolle login. De gebruiker is geauthenticeerd maar niet geautoriseerd: de applicatie heeft een policy-binding of een groepsvereiste waaraan deze gebruiker niet voldoet. Het Events-logboek in de beheerinterface vermeldt de policy die de toegang heeft geweigerd.
Wanneer Keycloak de betere keuze is
Keycloak is het oudere project, ondersteund door Red Hat, en is de sterkere keuze voor klassieke enterprise-identiteitsbeheer: uitgebreide SAML-federatie, het koppelen van aanmeldingen van meerdere externe identiteitsaanbieders tegelijk, en het exporteren en importeren van realms als een gedocumenteerd migratiepad. Commerciële ondersteuning is voor sommige organisaties op papier van belang. Het nadeel is dat Keycloak geen eigen proxy heeft. Om een applicatie te beveiligen die noch OIDC (OpenID Connect), noch SAML spreekt, moet u daarom software zoals oauth2-proxy ernaast draaien. De ingebouwde proxy-provider van Authentik is dat onderdeel, reeds geïntegreerd, en dat is de reden waarom de meeste self-hosters met een gevarieerd aanbod aan applicaties hiervoor kiezen.
Back-ups en upgrades
Drie zaken maken een herstel mogelijk: de PostgreSQL-database, de ./data-map en .env.
cd /opt/authentik
docker compose exec -T postgresql pg_dump -U authentik authentik | gzip > authentik-$(date +%F).sql.gzBewaar die dump en .env samen. De dump bevat geen kopie van AUTHENTIK_SECRET_KEY, en herstellen met een andere sleutel maakt elke actieve sessie ongeldig. Het behouden van de oorspronkelijke sleutel zorgt er dus voor dat de herstelde server functioneert zoals voorheen.
Upgrades zijn een wijziging van de tag. Stel AUTHENTIK_TAG in .env in op de gewenste release en voer vervolgens docker compose pull gevolgd door docker compose up -d uit. Als u AUTHENTIK_TAG nooit heeft ingesteld, komt de versie uit de standaardwaarde die in compose.yml zelf is geschreven. Het downloaden van een nieuwere kopie van dat bestand is dan de upgrade, en dat is de route die de officiële upgradedocumentatie beschrijft. Lees eerst de release notes. Authentik gebruikt datumgebaseerde versies en per oktober 2026 stelt de documentatie dat upgrades de volgorde van major releases moeten volgen: ga naar de nieuwste patch van de serie die u draait en doorloop vervolgens elke latere serie op volgorde zonder er een over te slaan. Authentik ondersteunt geen downgrades, dus maak de database-dump vóór de pull, niet erna.
FAQ
Is Authentik gratis zelf te hosten?
De open source-editie is gratis en dekt alles wat hierboven staat: de proxy provider, forward auth, OIDC (OpenID Connect), SAML en de flows engine. Een betaalde enterprise-laag voegt ondersteuning en enkele zakelijke functies toe, maar voor de hier besproken onderdelen is geen licentie vereist.
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 elk geval hetzelfde: de reverse proxy vraagt Authentik om informatie over elk verzoek, en het pad-voorvoegsel /outpost.goauthentik.io/ op de beveiligde hostnaam moet worden gerouteerd naar Authentik in plaats van naar de applicatie.
Waarom blijft mijn beveiligde applicatie tussen de inlogpagina en een foutmelding springen?
De externe host die is geconfigureerd in de proxy provider komt niet overeen met de URL die de browser gebruikt, meestal http tegenover https. Het sessie-cookie wordt uitgegeven voor de ene origin en gelezen op de andere, waardoor Authentik bij elk verzoek een anonieme gebruiker ziet. Corrigeer de externe host en wis 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 per oktober 2026, inclusief PostgreSQL, de server en de worker gezamenlijk. Op een systeem met 2 GB kan geheugendruk de OOM-killer van de kernel activeren, die het proces beëindigt met de hoogste 'badness score': grofweg het aandeel van het toegestane geheugen dat het gebruikt, plus de oom_score_adj. Wanneer dit de worker betreft, is het symptoom dat achtergrondtaken en uitgaande e-mail stoppen, terwijl de inlogpagina nog wel werkt. Wijs 4 GB toe als op dezelfde server ook de applicaties draaien die u beveiligt.