Keycloak auf dem Synology NAS installieren: SSO und zentrale Logins mit OIDC und SAML
Keycloak als Identity-Provider auf dem Synology NAS: Single Sign-On für Nextcloud, Gitea, Grafana und weitere Dienste über OIDC und SAML 2.0, mit PostgreSQL als Datenbank statt Dev-Mode.
Geprüft am 29.09.2026 · für keycloak 26.7.4
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Ohne zentrale Anmeldung pflegen Sie für jeden selbst gehosteten Dienst ein eigenes Konto. Keycloak ist ein Open-Source-Identity-Provider (IdP), der Single Sign-On (SSO) über OpenID Connect (OIDC) und SAML 2.0 bereitstellt. Diese Anleitung richtet Keycloak als Projekt im Container Manager mit PostgreSQL als Datenbank ein. Der Dev-Mode (start-dev) mit eingebetteter H2-Datenbank ist laut Hersteller nur für Tests gedacht und scheidet für den Betrieb aus.
Voraussetzungen
- Synology NAS mit DSM 7.2 oder neuer und installiertem Container Manager
- Mindestens 4 GB RAM im NAS (Keycloak laut Hersteller mindestens 750 MB, empfohlen 2 GB, dazu PostgreSQL)
- x86_64- oder ARM64-CPU (das Image ist für amd64 und arm64 verfügbar)
- Nginx Proxy Manager bereits auf dem NAS installiert und erreichbar (siehe Nginx Proxy Manager auf der Synology mit Container Manager einrichten)
- Öffentliche Domain mit TLS-Zertifikat (Let’s Encrypt über den Nginx Proxy Manager)
- SSH-Zugang zum NAS: nur für Log-Ausgaben und Datenbank-Backup nötig, die DSM-Oberfläche zeigt diese nicht vollständig
- Grundkenntnisse in Docker Compose
Schritt 1: Verzeichnisstruktur anlegen
Keycloak und PostgreSQL schreiben ihre Daten in getrennte Verzeichnisse unter /volume1/docker. Diese müssen vor dem ersten Start existieren.
Per SSH (als Administrator):
mkdir -p /volume1/docker/keycloak/data
mkdir -p /volume1/docker/keycloak/themes
mkdir -p /volume1/docker/keycloakdbAlternativ in der File Station: Öffnen Sie File Station → docker, erstellen Sie den Ordner keycloak mit den Unterordnern data und themes sowie den Ordner keycloakdb auf gleicher Ebene.
Verifizieren: Prüfen Sie per SSH oder File Station, dass alle drei Pfade existieren:
ls -la /volume1/docker/keycloak/
ls -la /volume1/docker/keycloakdb/Erwartetes Ergebnis: Die Verzeichnisse data, themes und keycloakdb sind vorhanden und leer.
Schritt 2: Compose-Projekt im Container Manager anlegen
Öffnen Sie im DSM Container Manager → Projekt → Erstellen. Vergeben Sie den Projektnamen keycloak, wählen Sie als Pfad /volume1/docker/keycloak und fügen Sie folgende compose.yaml ein. Ersetzen Sie die Passwörter und den Hostnamen:
services:
db:
image: postgres:17
container_name: keycloak-db
restart: unless-stopped
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloakuser
POSTGRES_PASSWORD: 'sicheres_db_passwort'
volumes:
- /volume1/docker/keycloakdb:/var/lib/postgresql/data
networks:
- keycloak-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U keycloakuser -d keycloak"]
interval: 10s
timeout: 5s
retries: 5
keycloak:
image: quay.io/keycloak/keycloak:26.7.4
container_name: keycloak
restart: unless-stopped
command: start
environment:
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://db:5432/keycloak
KC_DB_USERNAME: keycloakuser
KC_DB_PASSWORD: 'sicheres_db_passwort'
KC_BOOTSTRAP_ADMIN_USERNAME: admin
KC_BOOTSTRAP_ADMIN_PASSWORD: 'sicheres_admin_passwort'
KC_HOSTNAME: https://keycloak.ihre-domain.de
KC_HTTP_ENABLED: "true"
KC_PROXY_HEADERS: xforwarded
KC_HEALTH_ENABLED: "true"
ports:
- "8711:8080"
volumes:
- /volume1/docker/keycloak/data:/opt/keycloak/data
networks:
- keycloak-net
depends_on:
db:
condition: service_healthy
networks:
keycloak-net:
driver: bridgeDrei Hinweise zur Compose-Datei:
- Image: Das offizielle Image liegt auf
quay.io, nicht auf Docker Hub. Schreiben Sie die Version fest (hier26.7.4, Stand September 2026) und prüfen Sie vor Updates die Release Notes.:latestkann ungeplant eine neue Minor- oder Major-Version einspielen. - Sonderzeichen in Passwörtern: Compose wertet
$als Variablenreferenz aus. Verwenden Sie in Passwörtern kein$oder schreiben Sie es als$$. command: start: Ohne diesen Befehl bleibt Keycloak im Dev-Mode mit H2-Datenbank. Für den Betrieb iststartPflicht.
Verifizieren: Klicken Sie im Container Manager auf „Erstellen“. Beide Container (keycloak-db und keycloak) zeigen nach 30 bis 90 Sekunden den Status Läuft. Keycloak startet erst, wenn PostgreSQL den Healthcheck bestanden hat (depends_on mit condition: service_healthy). Prüfen Sie die Logs:
docker logs keycloak -fErwartete Ausgabe (letzte Zeilen):
Keycloak 26.7.4 on JVM (powered by Quarkus ...) started in ...
Listening on: http://0.0.0.0:8080. Management interface listening on http://0.0.0.0:9000.Beim ersten Start initialisiert Keycloak das Datenbankschema; das dauert bis zu 90 Sekunden.
Schritt 3: Nginx Proxy Manager konfigurieren
Port 8711 soll nicht direkt aus dem Internet erreichbar sein. Der Nginx Proxy Manager terminiert TLS und setzt die Forwarded-Header, ohne die Keycloak falsche Redirect-URLs erzeugt.
Öffnen Sie im Nginx Proxy Manager → Proxy Hosts → Add Proxy Host:
- Domain Names:
keycloak.ihre-domain.de - Scheme:
http - Forward Hostname / IP: die LAN-IP des NAS (nicht
localhost: im NPM-Container zeigtlocalhostauf den Container selbst) - Forward Port:
8711 - Websockets Support: aktiviert
Stellen Sie im Tab SSL ein Let’s-Encrypt-Zertifikat aus und aktivieren Sie „Force SSL“. Fügen Sie im Tab Advanced folgende Nginx-Konfiguration ein:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;Die größeren Puffer verhindern 502-Fehler: Keycloak sendet große Header (Token, Session-Cookies).
Verifizieren: Öffnen Sie https://keycloak.ihre-domain.de im Browser. Die Keycloak-Startseite mit dem Link zur Admin-Konsole erscheint, der Browser zeigt ein gültiges Zertifikat. Erscheint „HTTPS required“, fehlt KC_HTTP_ENABLED oder KC_PROXY_HEADERS, oder der Proxy Host ist noch nicht gespeichert.
Schritt 4: Admin-Konsole aufrufen und sichern
Rufen Sie https://keycloak.ihre-domain.de/admin auf und melden Sie sich mit den Werten aus KC_BOOTSTRAP_ADMIN_USERNAME und KC_BOOTSTRAP_ADMIN_PASSWORD an.
Das Bootstrap-Konto ist als temporäres Konto gedacht. Ersetzen Sie es sofort:
- Wechseln Sie oben links in den Realm master.
- Legen Sie unter Users → Add user einen neuen Benutzer an (z. B.
keycloak-admin). - Weisen Sie unter Role mapping die Rolle admin zu.
- Setzen Sie unter Credentials ein starkes Passwort.
- Melden Sie sich mit dem neuen Konto an und löschen Sie danach den Bootstrap-Benutzer unter Users → admin → Delete.
Entfernen Sie anschließend KC_BOOTSTRAP_ADMIN_USERNAME und KC_BOOTSTRAP_ADMIN_PASSWORD aus der Compose-Datei und starten Sie das Projekt neu. Sonst bleibt das Passwort im Klartext in der Konfiguration.
Verifizieren: Melden Sie sich mit dem neuen Admin-Konto an. Die Admin-Konsole lädt vollständig und zeigt links das Menü mit Realm settings, Clients, Users. Unter Users im Realm master fehlt der Benutzer admin.
Schritt 5: Eigenen Realm anlegen
Der Realm master dient nur der Verwaltung. Für Ihre Anwendungen legen Sie einen eigenen Realm an, z. B. homelab.
- Klicken Sie oben links auf die Realm-Auswahl und wählen Sie Create realm.
- Vergeben Sie einen Namen, z. B.
homelab, und klicken Sie Create. - Unter Realm settings → General passen Sie den Anzeigenamen an.
- Unter Realm settings → Login aktivieren Sie bei Bedarf Benutzerregistrierung, „Forgot password“ und E-Mail-Verifizierung.
- Legen Sie unter Users → Add user einen Test-Benutzer an und setzen Sie unter Credentials ein Passwort (Temporary auf „Off“).
Verifizieren: Öffnen Sie die OIDC-Discovery-URL des neuen Realms im Browser:
https://keycloak.ihre-domain.de/realms/homelab/.well-known/openid-configurationErwartetes Ergebnis: ein JSON-Dokument mit authorization_endpoint, token_endpoint und userinfo_endpoint, jeweils mit Ihrer HTTPS-Domain.
Schritt 6: OIDC-Test-Client anlegen und verifizieren
Ein Client steht in Keycloak für eine Anwendung, die sich über Keycloak anmeldet. Das Vorgehen ist für Nextcloud, Gitea und Grafana gleich.
- Wählen Sie Ihren Realm (z. B.
homelab) und öffnen Sie Clients → Create client. - Client type:
OpenID Connect - Client ID: z. B.
nextcloudodertest-client - Klicken Sie Next und aktivieren Sie Client authentication (vertraulicher Client mit Client Secret).
- Tragen Sie unter Valid redirect URIs die Callback-URL der Anwendung ein, z. B.
https://nextcloud.ihre-domain.de/apps/oidc_login/oidc. Für den Test reichthttps://ihre-app.example.com/*. - Speichern Sie den Client.
- Kopieren Sie im Tab Credentials das Client Secret für die Konfiguration der Anwendung.
Die Anwendung braucht folgende Werte:
| Parameter | Wert |
|---|---|
| Discovery URL | https://keycloak.ihre-domain.de/realms/homelab/.well-known/openid-configuration |
| Client ID | z. B. nextcloud |
| Client Secret | Aus dem Tab Credentials kopieren |
Verifizieren: Rufen Sie die Autorisierungs-URL im Browser auf (CLIENT_ID und REDIRECT_URI anpassen):
https://keycloak.ihre-domain.de/realms/homelab/protocol/openid-connect/auth?client_id=test-client&response_type=code&redirect_uri=https%3A%2F%2Fihre-app.example.com%2Fcallback&scope=openidErwartetes Ergebnis: Die Keycloak-Anmeldeseite erscheint. Nach der Anmeldung mit dem Test-Benutzer leitet Keycloak zur redirect_uri mit einem Parameter code weiter.
Schritt 7: SAML-Client für Enterprise-Anwendungen
SAML 2.0 brauchen Sie vor allem für Anwendungen wie Jira, Confluence oder Nextcloud mit SAML-Anmeldung. Authelia bietet keinen SAML-Provider, Authentik schon. Der Ablauf ähnelt dem OIDC-Client:
- Erstellen Sie unter Clients → Create client einen Client mit Client type: SAML.
- Tragen Sie als Client ID die Entity ID der Anwendung ein (meist eine URL, z. B.
https://jira.ihre-domain.de). - Setzen Sie Valid redirect URIs auf die ACS-URL (Assertion Consumer Service) der Anwendung.
- Hinterlegen Sie in der Anwendung die SAML-Metadaten-URL von Keycloak:
https://keycloak.ihre-domain.de/realms/homelab/protocol/saml/descriptorVerifizieren: Öffnen Sie die Metadaten-URL im Browser. Erwartetes Ergebnis: ein XML-Dokument mit dem Element <EntityDescriptor> und den SAML-Endpunkten des Realms.
Eckdaten auf einen Blick
| Parameter | Wert |
|---|---|
| Image | quay.io/keycloak/keycloak:26.7.4 |
| Registry | quay.io (nicht Docker Hub) |
| Port (Host→Container) | 8711:8080 |
| Datenbank | PostgreSQL 17 |
| Startbefehl Produktion | start (nicht start-dev) |
| RAM Minimum | 750 MB (empfohlen: 2 GB) |
| Architektur | amd64 + arm64 (multi-arch) |
| Admin-URL | https://keycloak.ihre-domain.de/admin |
| Umgebungsvariable | Zweck | Pflicht |
|---|---|---|
KC_DB | Datenbanktyp (postgres) | Ja |
KC_DB_URL | JDBC-Verbindungs-URL | Ja |
KC_DB_USERNAME | Datenbankbenutzer | Ja |
KC_DB_PASSWORD | Datenbankpasswort | Ja |
KC_BOOTSTRAP_ADMIN_USERNAME | Initialer Admin (ersetzt KEYCLOAK_ADMIN) | Erster Start |
KC_BOOTSTRAP_ADMIN_PASSWORD | Initiales Admin-Passwort | Erster Start |
KC_HOSTNAME | Öffentliche HTTPS-URL für Token/Redirects | Ja (Produktion) |
KC_HTTP_ENABLED | HTTP aktivieren (hinter Reverse Proxy) | Ja (hinter NPM) |
KC_PROXY_HEADERS | xforwarded, ersetzt das seit Version 26 entfernte KC_PROXY | Ja (hinter NPM) |
KC_HEALTH_ENABLED | Health-Endpunkt auf Port 9000 | Empfohlen |
Troubleshooting: typische Fehler
- „Database not available“, Keycloak startet nicht: PostgreSQL war beim Start von Keycloak noch nicht bereit. Prüfen Sie, ob der
healthcheckim Dienstdbunddepends_onmitcondition: service_healthygesetzt sind. - „Invalid parameter: redirect_uri“: Die Callback-URL der Anwendung steht nicht unter Valid redirect URIs des Clients. Betrifft der Fehler die Admin-Konsole, stimmt
KC_HOSTNAMEnicht exakt mit der aufgerufenen URL überein (vollständig mithttps://, ohne abschließenden Schrägstrich). - „HTTPS required“: Der Produktionsmodus verlangt HTTPS. Hinter einem Proxy, der TLS terminiert und intern HTTP weitergibt, sind
KC_HTTP_ENABLED=trueundKC_PROXY_HEADERS=xforwardedPflicht. - Admin-Konsole lädt nicht hinter dem Reverse Proxy:
KC_PROXY_HEADERSfehlt. Die OptionKC_PROXY(Werte wieedge) ist seit Keycloak 24 veraltet und in Version 26 entfernt. - Datenbankpasswort mit Sonderzeichen funktioniert nicht: siehe Hinweis 2 in Schritt 2.
- Zeitüberschreitung beim ersten Aufruf: Warten Sie in
docker logs keycloak -fauf die Meldung „started“ (30 bis 90 Sekunden). - Hoher RAM-Verbrauch, NAS reagiert langsam: Ohne Speicherlimit darf der Java-Heap bis 70 % des verfügbaren Speichers wachsen. Begrenzen Sie ihn in der Compose-Datei unter
environment, z. B. mitJAVA_OPTS_KC_HEAP: "-Xms512m -Xmx1024m". - Veraltete Umgebungsvariablen aus anderen Anleitungen:
KEYCLOAK_USER,KEYCLOAK_PASSWORD,DB_VENDOR,DB_ADDR,DB_DATABASEundPROXY_ADDRESS_FORWARDINGgehören zum alten WildFly-Image und wirken im aktuellen Image nicht.
Häufige Fragen
Was ist der Unterschied zu Authentik oder Authelia?
Authentik und Authelia sind schlanker und brauchen deutlich weniger RAM. Authelia beherrscht OIDC, aber kein SAML. Keycloak (Java/Quarkus) bietet SAML 2.0, feingranulares Realm- und Rollenmanagement sowie Anbindung an LDAP und Active Directory. Für OIDC-Anmeldung an Heimnetz-Diensten reicht oft Authentik oder Authelia, siehe Single Sign-On für den Self-Hosted-Stack: Authentik vs. Authelia.
Kann ich Keycloak ohne öffentliche Domain nur lokal betreiben?
Ja, mit Einschränkungen. KC_HOSTNAME kann eine lokale URL wie http://192.168.1.100:8711 sein. Für Anwendungen außerhalb des LANs oder solche, die eine Discovery-URL mit gültigem Zertifikat erwarten, brauchen Sie eine Domain mit TLS-Zertifikat.
Muss ich nach einem Keycloak-Update die Datenbank manuell migrieren?
Nein, das Schema migriert Keycloak beim Start automatisch. Sichern Sie vorher die Datenbank und lesen Sie die Release Notes.
Wie sichere ich die PostgreSQL-Datenbank regelmäßig?
Sichern Sie das Verzeichnis /volume1/docker/keycloakdb bei gestopptem Container oder erstellen Sie im laufenden Betrieb einen Dump:
docker exec keycloak-db pg_dump -U keycloakuser keycloak > /volume1/backup/keycloak-$(date +%Y%m%d).sqlAutomatisierung und Rotation beschreibt die Anleitung MySQL & PostgreSQL Backup automatisieren mit cron.
Wie viele Realms und Clients kann ich anlegen?
Keycloak setzt keine feste Grenze. Auf einem NAS mit 4 bis 8 GB RAM ist ein Realm mit 10 bis 50 Clients gut handhabbar; mehrere Realms sind vollständig voneinander getrennt.
Wie aktualisiere ich Keycloak auf eine neue Version?
Erstellen Sie ein Datenbank-Backup, ändern Sie den Image-Tag in der Compose-Datei und bauen Sie das Projekt im Container Manager neu, oder per SSH im Projektordner docker compose pull && docker compose up -d.
Fazit
Keycloak braucht mehr Konfiguration und RAM als Authentik oder Authelia. Dafür erhalten Sie SAML 2.0, getrennte Realms und LDAP-Anbindung. Für den Betrieb ist das Compose-Projekt mit PostgreSQL und command: start der richtige Weg.
Weiterführende Anleitungen und Quellen
- Single Sign-On für den Self-Hosted-Stack: Authentik vs. Authelia mit Traefik Forward-Auth: die schlankere SSO-Alternative
- Nginx Proxy Manager auf der Synology mit Container Manager einrichten: Reverse Proxy und TLS als Grundlage
- MySQL & PostgreSQL Backup automatisieren mit cron: die Keycloak-Datenbank regelmäßig sichern
- Apache Guacamole auf dem Synology NAS installieren: ein weiterer Dienst, der von zentralem SSO profitiert
Offizielle Quellen: Keycloak Running in a Container (keycloak.org/server/containers), Keycloak Getting Started with Docker (keycloak.org), Keycloak Configuring the database (keycloak.org/server/db), Keycloak Using a reverse proxy (keycloak.org/server/reverseproxy), GitHub Releases (github.com/keycloak/keycloak/releases).


