Pocket ID ist ein einfacher OIDC-Anbieter, der es Benutzern ermöglicht, sich mit ihren Passkeys bei Ihren Diensten zu authentifizieren.
Das Ziel von Pocket ID ist es, einfach und benutzerfreundlich zu sein. Es gibt andere selbst gehostete OIDC Anbieter wie Keycloak oder Authentik, aber diese sind oft zu komplex für einfache Anwendungsfälle.
Eine Besonderheit von Pocket ID ist, dass es nur die Passkey-Authentifizierung unterstützt, was bedeutet, dass du kein Passwort benötigen. Zum Beispiel kannst du jetzt einen physischen Yubikey verwenden, um dich einfach und sicher bei all deinen selbst gehosteten Diensten anzumelden.
1. Grundvoraussetzung
- Docker & Docker Compose v2 (Debian / Ubuntu)
- TRAEFIK V2 + 3 – REVERSE-PROXY MIT CROWDSEC IM STACK EINRICHTEN
2. Ordner anlegen
Zuerst legen wir uns passende Ordner-Strukturen an.
mkdir -p /opt/containers/pocket-id
3. Compse Datei anlegen
nano /opt/containers/pocket-id/compose.yml
Inhalt
services:
pocketid:
image: ghcr.io/pocket-id/pocket-id
container_name: pocket-id
restart: unless-stopped
env_file: .env
volumes:
- "./data:/app/backend/data"
labels:
- "traefik.enable=true"
- "traefik.http.routers.pocket-id.entrypoints=websecure"
- "traefik.http.routers.pocket-id.rule=Host(`pocket-id.deinedomain.de`)"
- "traefik.http.routers.pocket-id.tls=true"
- "traefik.http.routers.pocket-id.tls.certresolver=http_resolver"
- "traefik.http.routers.pocket-id.service=pocket-id"
- "traefik.http.services.pocket-id.loadbalancer.server.port=80"
- "traefik.docker.network=proxy"
- "traefik.http.routers.pocket-id.middlewares=default@file"
networks:
- proxy
networks:
proxy:
external: true
Code-Sprache: JavaScript (javascript)
Noch anzupassen:
- Eure Traefik URL pocket-id.deinedomain.de
3.1 .ENV Datei anlegen
nano /opt/containers/pocket-id/.env
Inhalt
# Bitte die Domain wie oben anpassen
PUBLIC_APP_URL=https://pocket-id.deinedomain.deCode-Sprache: PHP (php)
4. Pocket ID starten
Nun starten wir den Container mittels folgendem Befehl:
docker compose -f /opt/containers/pocket-id/compose.yml up -d
Der Container ist in wenigen Sekunden gebaut.
Ruft nun im Browser die gewählte Domain auf und dann solltet ihr folgendes sehen.

Für das erstellen des ersten Benutzers bzw. Passkeys geht ihr bitte auf folgende Seite
https://pocket-id.deinedomain.de/login/setup
Dort könnt ihr dann den ersten Benutzer anlegen

Folgt den Anweisungen und dann solltet ihr im Admin bereich laden.

Der Erstellung der OIDC Clients ist wirklich einfach, alle nötigen Infos findet ihr hier bei GitHub:
https://github.com/stonith404/pocket-id?tab=readme-ov-file#add-pocket-id-as-an-oidc-provider
5. Beispiel Config für Pingvin Share
Pingvin Share ist auch hier als Anleitung verfügbar und wurde von selben Entwickler programmiert wie Pocket-ID. Wir nehmen Pingvin Share mal als Beispiel für das OIDC Setup.
Bei Pocket-ID unter OIDC Clients klickt ihr auf Add Client, wählt einen Namen und füllt die Callback URLs aus.
Name: Pingvin Share
Callback URLs: https://<your-domain>/api/oauth/callback/oidc

Speichert euch die Client ID and das Secret und wechselt in eure Pingvin Share Instanz und ruft folgende Seite auf:
Admin/Configuration/Social Login
https://pingvinshare.deinedomain.de/admin/config/oauth
Dort Scrollt ihr ganz runter bis OpenID Connect und aktiviert dieses. Füllt nun dort folgende Felder aus:
OpenID Connect Discovery URI: https://pocket-id.deinedomain.de/.well-known/openid-configuration
OpenID Connect username claim: preferred_username
OpenID Connect Client ID: Habt ihr unter OIDC Clients in Pocket ID erstellt
OpenID Connect Client secret: Habt ihr unter OIDC Clients in Pocket ID erstellt

Wichtig ist das der Benutzername vom Pocket-ID OIDC Client und dem Pingvin-Share identisch sind.
Nun als letzes geht ihr in Pingvin Share auf die Account Einstellunge (/account)
Und aktiviert den Social Login

Nun solltet ihr euch mit Pocket-ID einloggen können.

Quellen:
https://stonith404.github.io/pingvin-share/introduction
https://github.com/stonith404/pocket-id
https://pocket-id.org/docs/client-examples

In der Zwischenzeit gibt es eie neue Version von Pocket-ID und zudem wird zwingend ein ENCRYPTION_KEY in der Datei .env vorausgesetzt. Entsprechend sind docker-compse.yml und .env anzupassen.
in docker-compose.yml:
image: pocketid/pocket-id:v2 # or ghcr.io/pocket-id/pocket-id:v2
dann mit openssl rand -base64 32 einen KEY generieren (hier nur ein Beispiel, bitte neu generieren!) und in .env eintragen:
ENCRYPTION_KEY=IFVh6BEF4iRwLOs+HhcsHp1MlGjSKat7rcRyuFXSW1Y=
Gemäss Kommentar in der Originaldatei auf https://github.com/pocket-id/pocket-id/tree/main wäre es sogar besser, für den KEY eine separate Datei zu erstellen und den Wert dort zu speichern. Dafür musst du in docker-compose.yml unter “volumes” die Datei angeben und in den Container verknüpfen, nämlich so (beachte es ist nur ein Bindestrich “-“, der aber hier als — ersetzt wird):
volumes:
– “./data:/app/data”
– “./pocket-keyfile:/app/pocket-keyfile”
und dann in .env wie folgt:
# ENCRYPTION_KEY=……………………..
ENCRYPTION_KEY_FILE=/app/pocket-keyfile
Nach einem Neustart des Containers solltest du so die neue Version haben.
Achtung!!
Wenn du schon länger mit Pocket-ID gearbeitet hast, unbedingt vorher ein Backup der Datenbank machen (als Standard unter./data gespeichert) oder alle Passkeys und Benutzer vorher exportieren und nachher wieder importieren.
Hat jemand das Problem das im PocketID Audit log nur die internen IPs des Reverseproxys gelisted werden und nicht die korrekten? (Installation ist relativ identisch zum Traefik setup von hier)
Neues Image:ghcr.io/pocket-id/pocket-id
Cooles Tool. Ich habe es mal mit Memos und Linkding probiert. Klasse…
Hallo, ich habe da wohl einen Knoten im Kopf. Bei mir läuft die Aktivierung in Pingvin auf einen Timeout. Ich kann die Anmeldung nicht aktivieren. Dein Hinweis “Wichtig ist das der Benutzername vom Pocket-ID OIDC Client und dem Pingvin-Share identisch sind”
habe ich nicht verstanden. Im OIDC Client gibt es kein Benutzername. Welche müssen den überein stimmen. Danke für ein Aufklärung. Gruß Andreas.
Top Anleitung und ein wirklich starkes Tool. Hat sofort auf Anhieb funktioniert mit deiner Anleitung,
Ich werde mich jetzt an der Integration in weitere Dienste versuchen.
Vielleicht können wir hier auch eine kleine Sammlung aufbauen mit Services, die hier bereitgestellt wurden?
Sollte ich einen Dienst ans Laufen bekommen, werde ich mich auf jeden Fall melden.