Docker-Compose-Stack für Authentik mit PostgreSQL, Traefik-Anbindung und einem eingeschränkten Docker-Socket-Proxy für die automatische Verwaltung von Outposts.
authentik-server: Weboberfläche und APIauthentik-worker: Hintergrundaufgaben, Blueprints und Outpost-Verwaltungauthentik-database: PostgreSQL 16authentik-socket-proxy: eingeschränkter Zugriff des Workers auf die Docker-API
Der Server hängt sowohl im internen authentik-Netz als auch im vorhandenen externen Traefik-Netz. Datenbank und Socket-Proxy sind ausschließlich über interne Netze erreichbar. Der Docker-Socket wird nicht direkt in den Authentik-Worker eingebunden.
- Linux-Server mit Docker Engine
- Docker Compose v2 (
docker compose) - OpenSSL
- ein bereits vorhandenes externes Docker-Netzwerk für Traefik, standardmäßig
proxy - Traefik mit aktiviertem Docker- und File-Provider
- mindestens 2 CPU-Kerne und 2 GB RAM
Repository klonen, in das Verzeichnis wechseln und den Installer starten:
git clone https://github.com/happylippo/authentik-stack.git
cd authentik-stack
chmod +x first_install.sh
./first_install.shDas Skript fragt Domain, Authentik-Hostname, Version, Datenbanknamen, Benutzer, Traefik-Netzwerk, Certificate-Resolver, Trusted-Proxy-Adressen und die Server-IP im Proxy-Netz ab. Es erzeugt automatisch:
- ein zufälliges PostgreSQL-Passwort,
- einen zufälligen Authentik-Secret-Key,
- die nicht versionierte
.env, - die benötigten Datenverzeichnisse.
Eine vorhandene .env wird nur nach Rückfrage ersetzt und vorher mit UTC-Zeitstempel gesichert. Das Skript prüft außerdem das externe Traefik-Netzwerk und führt docker compose config --quiet aus.
Danach den Stack starten:
docker compose pull
docker compose up -d
docker compose psDie Ersteinrichtung muss mit abschließendem Schrägstrich aufgerufen werden:
https://authentik.example.com/if/flow/initial-setup/
Alternativ kann die Beispieldatei kopiert und vollständig bearbeitet werden:
cp .env.example .env
chmod 600 .envMindestens ABSOLUTE_PATH, PG_PASS, AUTHENTIK_SECRET_KEY, Domain, Authentik-Hostname, Trusted Proxies sowie die Adressen im externen Traefik-Netz müssen stimmen. Die statischen Container-Adressen müssen innerhalb der jeweils konfigurierten Subnetze liegen und dürfen nicht bereits vergeben sein.
AUTHENTIK_LISTEN__TRUSTED_PROXY_CIDRS darf ausschließlich die tatsächlichen Adressen beziehungsweise CIDRs des Reverse-Proxys enthalten. Verwende nicht pauschal 0.0.0.0/0 oder ::/0.
config/html.middleware.authentik.yml ist eine Vorlage zum Kopieren in den Traefik-Stack. Sie gehört nicht in Authentiks Datenverzeichnis.
Beispiel, wenn Traefiks File-Provider data/traefik/dynamic/ überwacht:
cp config/html.middleware.authentik.yml /pfad/zum/traefik-stack/data/traefik/dynamic/html.middleware.authentik.ymlTraefik und authentik-server müssen dasselbe externe Docker-Netzwerk verwenden. Danach kann ein Router mit der Middleware geschützt werden:
labels:
traefik.http.routers.meine-app.middlewares: authentik@fileBei einer Single-Application-Forward-Auth muss zusätzlich ein höher priorisierter Router mit der Regel PathPrefix(\/outpost.goauthentik.io/`)` auf Authentik zeigen. Authentik kann die erforderlichen Router bei korrekt konfiguriertem eingebettetem Outpost über Docker-Labels verwalten. Wird das manuell erledigt, darf dieser Pfad selbst nicht wieder durch die Authentik-Middleware geschützt werden.
labels:
traefik.enable: "true"
traefik.http.routers.traefik-dashboard.entrypoints: websecure
traefik.http.routers.traefik-dashboard.middlewares: authentik@file
traefik.http.routers.traefik-dashboard.rule: ${SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST:-HOST(`traefik.yourdomain.com`)}
traefik.http.routers.traefik-dashboard.service: api@internal
traefik.http.routers.traefik-dashboard.tls: "true"
traefik.http.routers.traefik-dashboard.tls.certresolver: ${SERVICES_TRAEFIK_LABELS_TRAEFIK_CERTRESOLVER:-cloudflare_resolver}
traefik.http.routers.traefik-dashboard.tls.domains[0].main: ${TRAEFIK_CERT_DOMAIN}
traefik.http.routers.traefik-dashboard.tls.domains[0].sans: ${TRAEFIK_CERT_WILDCARD}
traefik.http.routers.traefik-dashboard-authentik-outpost.entrypoints: websecure
traefik.http.routers.traefik-dashboard-authentik-outpost.rule: "${SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST:-Host(`traefik.yourdomain.com`)} && PathPrefix(`/outpost.goauthentik.io/`)">
traefik.http.routers.traefik-dashboard-authentik-outpost.priority: "100"
traefik.http.routers.traefik-dashboard-authentik-outpost.service: authentik@docker
traefik.http.routers.traefik-dashboard-authentik-outpost.tls: "true"
traefik.http.routers.traefik-dashboard-authentik-outpost.tls.certresolver: ${SERVICES_TRAEFIK_LABELS_TRAEFIK_CERTRESOLVER:-cloudflare_resolver}
traefik.http.routers.traefik-dashboard-authentik-outpost.tls.domains[0].main: ${TRAEFIK_CERT_DOMAIN}
traefik.http.routers.traefik-dashboard-authentik-outpost.tls.domains[0].sans: ${TRAEFIK_CERT_WILDCARD}Die Vorlage nutzt intern:
http://authentik-server:9000/outpost.goauthentik.io/auth/traefik
Der Name ist im gemeinsamen Docker-Netz auflösbar; der Umweg über die öffentliche URL wird dadurch vermieden.
Der Worker erreicht die Docker-API über:
tcp://authentik-socket-proxy:2375
Der versionierte Blueprint blueprints/socket-proxy.yaml legt dafür in Authentik die Docker-Service-Verbindung Local Docker connection mit derselben internen Adresse an.
Der Port wird nicht auf dem Host veröffentlicht. Der Proxy erlaubt die für Outposts benötigten Container- und Image-Abfragen sowie Start-/Stop-Aktionen. Schreibender Docker-API-Zugriff bleibt grundsätzlich sicherheitsrelevant. Wenn keine automatische Outpost-Verwaltung benötigt wird, können Socket-Proxy, DOCKER_HOST, das authentik-socket-Netz und die entsprechende depends_on-Abhängigkeit entfernt werden; Outposts müssen dann manuell verwaltet werden.
Status und Logs anzeigen:
docker compose ps
docker compose logs -f authentik-server authentik-workerAktualisieren innerhalb des gewählten Release-Zweigs:
docker compose pull
docker compose up -dVor Versionswechseln sollte mindestens die PostgreSQL-Datenbank gesichert werden. Zusätzlich sind data/, certs/, custom-templates/, blueprints/ und die .env relevant. Die .env enthält Geheimnisse und darf nicht ins Repository aufgenommen werden.
Konfiguration prüfen:
docker compose config --quietWenn Traefik authentik-server nicht erreicht, kontrolliere:
docker network inspect proxy
docker inspect authentik-serverWenn Outposts nicht automatisch erstellt werden, prüfe Worker und Socket-Proxy:
docker compose logs authentik-worker authentik-socket-proxyBei Not Found während der Ersteinrichtung zuerst sicherstellen, dass die URL exakt mit /if/flow/initial-setup/ endet.
.envmit Modus600schützen und nie committen.- Den Port
2375des Socket-Proxys niemals veröffentlichen. - PostgreSQL nicht an ein öffentliches oder gemeinsames Proxy-Netz hängen.
- Vor Updates Datenbank-Backups erstellen und Restore regelmäßig testen.
- Authentik- und PostgreSQL-Versionen bewusst aktualisieren; keine unkontrollierten
latest-Tags für diese Dienste verwenden.