Only oidc_client_secret is actually sensitive — issuer_url and client_id are now plain env vars. Renamed oidc_client_secret to oidc_secret to pass abra lint. Updated README with accurate quickstart and OIDC setup. Entrypoint guards git commands for min image compatibility.
lichen
- Category: Apps
- Status: 0
- Image:
notplants/lichen-full - Healthcheck: Yes
- Backups: Yes
- Email: No
- Tests: No
- SSO: Yes (OIDC)
Basic usage
- Set up Docker Swarm and
abra - Deploy
coop-cloud/traefik abra app new lichenabra app config YOURAPPDOMAIN— setDOMAINto something that resolves to your Docker Swarm boxabra app secret generate YOURAPPDOMAIN --allabra app deploy YOURAPPDOMAIN
Auth providers
The AUTH_PROVIDERS env var controls which login methods are available (comma-separated). The default is file,atproto.
Valid providers: file (username/password), atproto (Bluesky), oidc (OpenID Connect).
Minimal image
A lighter image without atproto/git/shell support is available. Enable it by uncommenting the min overlay in your app config:
COMPOSE_FILE="$COMPOSE_FILE:compose.min.yml"
When using the minimal image, set AUTH_PROVIDERS=file (or file,oidc with OIDC).
SSO/OIDC
To enable OIDC login, uncomment the OIDC overlay and set your provider details in your app config:
COMPOSE_FILE="$COMPOSE_FILE:compose.oidc.yml"
OIDC_ISSUER_URL=https://keycloak.example.com/realms/myrealm
OIDC_CLIENT_ID=lichen
SECRET_OIDC_SECRET_VERSION=v1
Then insert the client secret:
abra app secret insert YOURAPPDOMAIN oidc_secret v1 YOUR_CLIENT_SECRET
Add oidc to your AUTH_PROVIDERS (e.g. AUTH_PROVIDERS=file,oidc) and redeploy.
TLS architecture (Caddy sidecar)
This recipe uses a Caddy sidecar for TLS instead of letting Traefik terminate TLS directly.
- Traefik receives TLS connections on port 443 and does TCP passthrough (no TLS termination) for traffic matching
DOMAINand*.DOMAIN, forwarding the raw TLS stream to Caddy. - Caddy terminates TLS using on-demand certificates — it automatically obtains a Let's Encrypt certificate for each subdomain the first time a connection arrives.
- Caddy reverse proxies the decrypted HTTP traffic to lichen on port 9000.
The first request to a new subdomain may take 10-30 seconds while Caddy obtains the TLS certificate. Subsequent requests are instant.
No changes to the Traefik recipe are needed — the TCP passthrough is configured entirely via deploy labels in this recipe's compose.yml.
Recipe maintained by @notplants