---
# nocheck: seaweedfs-required β object storage not implemented for this role
# nocheck: dynamic-flag
# nocheck: logout
logout:
enabled: false
shared: false
# nocheck: dynamic-flag cluster-wide LDAP federation keys on inventory groups[]; host-scoped group_names is cross-host cache-poisoned for this destructive flag
ldap:
bond: 1
enabled: "{{ (groups['svc-db-openldap'] | default([]) | length) > 0 }}"
shared: "{{ (groups['svc-db-openldap'] | default([]) | length) > 0 }}"
connection_pooling: false
sync:
period:
changes: 900
full: 86400
dashboard:
bond: 1
enabled: "{{ 'web-app-dashboard' in group_names }}"
shared: "{{ 'web-app-dashboard' in group_names }}"
iframe: false
matomo:
bond: 1
enabled: "{{ 'web-app-matomo' in group_names }}"
shared: "{{ 'web-app-matomo' in group_names }}"
email:
bond: 1
enabled: "{{ MAIL_PROVIDER in group_names }}"
shared: "{{ MAIL_PROVIDER in group_names }}"
javascript:
bond: 1
enabled: "{{ 'web-svc-logout' in group_names }}"
shared: "{{ 'web-svc-logout' in group_names }}"
# nocheck: playwright-service-flag β self-provider
keycloak:
healthcheck:
flavor: http_status
path: health/ready
port_key: management
# nocheck: healthcheck-timing-override the management endpoint answers from the JVM, which does not reply inside the 5s default while the realm is still importing
timeout: 15s
retries: 5
modes:
compose:
enabled: true
swarm:
enabled: true
bond: 1
enabled: true # nocheck: dynamic-flag
shared: true
provides: sso
image: quay.io/keycloak/keycloak
version: "26.8.2"
name: keycloak
min_storage: 468MB
cpus: "2.0"
mem_reservation: 2g
mem_limit: 4g
pids_limit: 1024
realm:
import_enabled: true
totp_enabled: true
users:
emails_verified: true
scopes:
nextcloud: nextcloud
moodle: moodle
accounts:
bootstrap:
username: administrator
system:
username: "{{ SOFTWARE_NAME | replace('.', '_') | lower }}"
admin:
allowed_networks: []
ports:
local:
http: 8032
internal:
http: 8080
management: 9000
proxy:
service_key: keycloak
run_after:
- web-app-matomo
- web-app-stalwart
- web-app-mailu
lifecycle: beta
# Exception: sso-proxy sidecar; upstream artefact names (oauth2-proxy image, oauth2-proxy-keycloak.cfg) stay literal, project identifiers use the sso_proxy namespace
# nocheck: dynamic-flag β per-consumer fan-out
# nocheck: playwright-service-flag β sidecar shape, no probe-able surface flag
sso_proxy:
image: quay.io/oauth2-proxy/oauth2-proxy
version: "v7.15.6"
min_storage: 220MB
configuration_file: oauth2-proxy-keycloak.cfg
ports:
internal:
http: 4180
cpus: "0.25"
mem_reservation: "64m"
mem_limit: "128m"
pids_limit: 256
# nocheck: playwright-service-flag β DB engine, covered by role-local integration tests
postgres:
bond: 1
enabled: true # nocheck: dynamic-flag
shared: "{{ 'svc-db-postgres' in group_names }}"
# nocheck: playwright-service-flag β css consumer, no Playwright surface (provider: web-svc-css)
css:
bond: 1
enabled: "{{ 'web-svc-css' in group_names }}"
shared: "{{ 'web-svc-css' in group_names }}"
# nocheck: dynamic-flag
# nocheck: playwright-service-flag β captcha backend, infrastructural
recaptcha:
enabled: "{{ RECAPTCHA_ENABLED | bool }}"
prometheus:
bond: 1
enabled: "{{ 'web-app-prometheus' in group_names }}"
shared: "{{ 'web-app-prometheus' in group_names }}"
# nocheck: playwright-service-flag
# nocheck: variants-coverage β sso-variant-tor requires the onion on in every variant, so the false polarity has no variant left to live in
tor:
bond: 0.5
enabled: "{{ 'svc-net-tor' in group_names }}"
shared: true # nocheck: dynamic-flag