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 onderdeel dat echt aandacht vereist komt daarna: het configureren van een reverse proxy en het plaatsen van een bestaande applicatie achter forward auth.
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, het onderdeel dat voor elke beveiligde applicatie beantwoordt of een verzoek is aangemeld. Versie 2026.8.3 is de huidige release per oktober 2026. Deze werd op 17 september 2026 gepubliceerd als de nieuwste patch van de 2026.8-serie, die op 18 augustus begon met 2026.8.0, en het officiële Compose-bestand gebruikt dit nu als de standaard image-tag. Het project vereist een host met ten minste 2 CPU-cores en 2 GB RAM. Beschouw dit als het absolute minimum. PostgreSQL en de worker verbruiken geheugen zodra de server een dag actief is.
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, waarbij postgresql de status healthy rapporteert en server en worker de status running rapporteren. De eerste start voert de databasemigraties 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 en heeft een harde limiet van 99 tekens. AUTHENTIK_SECRET_KEY ondertekent sessies en tokens; het wijzigen hiervan zorgt er later voor dat elke gebruiker wordt uitgelogd en dat elk uitgegeven API-token ongeldig wordt. Houd .env op modus 600 en bewaar een kopie op een veilige plek, omdat een database die wordt hersteld zonder de bijbehorende geheime sleutel een database is waar niemand op kan inloggen.
Het Compose-bestand leest beide waarden met de ${PG_PASS:?database password required}-vorm, wat betekent dat Compose weigert te starten wanneer het bestand ontbreekt. Het uitvoeren van docker compose up -d vanuit de verkeerde map resulteert in de melding required variable AUTHENTIK_SECRET_KEY is missing a value: secret key required en stopt het proces. Die melding duidt op een padprobleem, niet op een configuratieprobleem.
De relevante omgevingsvariabelen
Alle overige instellingen plaatst u in hetzelfde .env-bestand. Authentik vertaalt een dubbele underscore naar een geneste configuratiesleutel; zo stelt AUTHENTIK_EMAIL__HOST de waarde email.host in. Een enkele underscore wordt zonder waarschuwing genegeerd, wat de meest voorkomende reden is waarom een instelling geen effect lijkt te hebben.
AUTHENTIK_BOOTSTRAP_PASSWORDstelt het wachtwoord in voor de ingebouwdeakadmin-gebruiker bij de eerste start, 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 Authentiklocalhostop poort 25, waardoor e-mails voor wachtwoordherstel in het logboek van de worker als verbindingsfout verschijnen.AUTHENTIK_LOG_LEVEL=debugactiveert de gedetailleerde logboekregistratie die u nodig heeft wanneer een inlogproces niet naar behoren werkt. Zet deze na afloop 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 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 aanmelding en het beheerdersaccount
Open http://SERVER_IP:9000 in een browser. Authentik toont de initiële configuratieprocedure en vraagt u om 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 door naar de aanmeldpagina.
Maak een normaal beheerdersaccount voor uzelf aan onder Directory en vervolgens Users, voeg dit toe aan de authentik Admins-groep en meld u aan met dat account. Laat akadmin achter als een 'break-glass'-account met een lang wachtwoord dat offline wordt bewaard. Dagelijks werk onder een gedeeld ingebouwd account maakt het auditlogboek onbruikbaar, omdat bij elk evenement akadmin staat en niet wie de actie heeft uitgevoerd. Dat argument geldt ook voor systemen achter Authentik: iets als een zelfgehoste OneCLI-omgeving die elke persoon een eigen agent geeft laat alleen een leesbaar spoor achter als de identiteit die daar aankomt toebehoort aan één persoon in plaats van aan een aanmelding 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 gebruiken. Als u de configuratie van 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 de container zich niet op het proxy-netwerk bevindt en dat Traefik geen verkeer kan routeren naar een container die het niet kan bereiken.
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-identiteitstaken: uitgebreide SAML-federatie, het koppelen van aanmeldingen van meerdere externe identiteitsproviders tegelijk, en het exporteren en importeren van realms als gedocumenteerd migratiepad. Commerciële ondersteuning is voor sommige organisaties op papier van belang. Het nadeel is dat Keycloak geen eigen proxy heeft; het beveiligen van een applicatie die geen OIDC (OpenID Connect) ondersteunt, betekent dat u bijvoorbeeld oauth2-proxy ernaast moet draaien. De ingebouwde proxy-provider van Authentik is dat onderdeel, reeds geïntegreerd, wat de reden is dat de meeste self-hosters met een gevarieerde verzameling applicaties hiervoor kiezen.
Backups en upgrades
Drie zaken maken een restore mogelijk: de PostgreSQL-database, de map ./data en .env.
cd /opt/authentik
docker compose exec -T postgresql pg_dump -U authentik authentik | gzip > authentik-$(date +%F).sql.gzSla die dump en .env samen op. De dump alleen is onvoldoende, omdat de geheime sleutel die sessie- en tokendata beveiligt in .env staat.
Upgrades zijn een wijziging van de tag. Stel AUTHENTIK_TAG in .env in op de gewenste release en voer vervolgens docker compose pull uit, gevolgd door docker compose up -d. 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; dit is de methode die de officiële upgrade-documentatie beschrijft. Lees eerst de release notes. Authentik gebruikt datums als versienummers. Sinds oktober 2026 vermeldt de documentatie dat upgrades de volgorde van major releases moeten volgen: stap over naar de laatste patch van de serie die u draait en doorloop daarna elke volgende serie in 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 om 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 enterprise-functies toe, maar voor de hier beschreven zaken 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 naar Authentik verwijzen in plaats van naar de applicatie.
Waarom blijft mijn beveiligde applicatie tussen de inlogpagina en een foutmelding springen?
De externe host die in de proxy provider is geconfigureerd, komt niet overeen met de URL die de browser gebruikt; dit gebeurt meestal door 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 verwijder 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 samen. Op een systeem met 2 GB RAM is de worker het eerste proces dat door de kernel wordt beëindigd bij geheugendruk; het symptoom hiervan is dat achtergrondtaken en uitgaande e-mail stoppen, terwijl de inlogpagina nog wel werkt. Reserveer 4 GB als op dezelfde server ook de applicaties draaien die u beveiligt.