Post-configuration checklist¶
Use this checklist after the whole environment has started (docker compose up -d) to ensure each service is correctly wired and configured.
Keycloak¶
-
[ ] Client secrets — Confirm that the secrets in
.envmatch what is in the Keycloak realm. Pre-install writes the realm from the template usingJUPYTERHUB_CLIENT_SECRET,NEXTCLOUD_CLIENT_SECRET,SCS_MANAGER_CLIENT_SECRET, andKC_DIDMOS_CLIENT_SECRET. If the realm was imported before these were set, re-run the Keycloak pre-install script or update each client’s secret in Keycloak Admin (Clients → <client> → Credentials). -
[ ] Groups for JupyterHub and WissKI — The realm defines group
/wisski_admin(in00_custom_configs/keycloak/templates/realm/scs-realm.json.tpl). JupyterHub usesKC_USER_GROUPS(e.g.user) andKC_ADMIN_GROUPSfrom.envto decide who can log in and who is admin. Ensure users who should access JupyterHub are in the allowed group(s); put WissKI admin users inwisski_admin. -
[ ]
scs_usergroup — Ensure thescs_usergroup exists in Keycloak (Realm → Groups). Create it if missing. Users who should access SCS services (e.g. JupyterHub, SCS Manager) are typically assigned to this group; align withKC_USER_GROUPSif JupyterHub is configured to use it. -
[ ] GID / group mappings — The realm has a client scope “groups” with mappers for
groups(oidc-group-membership-mapper) andgids(user attributegid, multivalued). JupyterHub’sauth_state_groups_keyinjupyterhub/jupyterhub/jupyterhub_config.pyexpectsgroupsandgidsin the token. The JupyterHub Keycloak client does not include the “groups” scope in its default or optional client scopes in the realm template. For JupyterHub group-based access and spawner gids to work: - In Keycloak Admin: Realm → Clients → <JupyterHub client> → Client scopes → add the realm’s groups scope as default or optional.
-
If you use gids in the spawner, ensure the “groups” client scope (which includes the gids mapper) is assigned to the JupyterHub client so the token/userinfo contain
gids. -
[ ] User attribute
gid— If using gids for the JupyterHub spawner, set thegidattribute (or multiple values) on users in Keycloak: Users → <user> → Attributes.
SCS Manager¶
-
[ ] OpenID config — Pre-install writes
00_custom_configs/scs-manager-stack/openid/openid_connect.client.scs_sso.yml.tpltoscs-manager-stack/custom_configs/openid_connect.client.scs_sso.yml. Ensure this config is imported/synced into Drupal (e.g. config sync or install profile). Drupal OpenID behaviour is further tuned in00_custom_configs/scs-manager-stack/drupal/openid-connect.settings.php. -
[ ] Trusted hosts / proxy (SCS Manager) —
00_custom_configs/scs-manager-stack/drupal/reverse-proxy.settings.phpand envSCS_MANAGER_DRUPAL_TRUSTED_HOSTS/SCS_MANAGER_DRUPAL_PROXY_ADDRESSESmust match your deployment (include thereverse-proxyDocker network CIDR, e.g.172.20.0.0/16). -
[ ] WissKI reverse proxy — At
/admin/config/soda-scs-manager/settings→ WissKI: set Drupal reverse proxy addresses toautofor stacks behind Traefik (default on SCS). Existing Portainer stacks needDRUPAL_PROXY_ADDRESSES=autoand a wisski-base-image that runssync-reverse-proxy.sh, then recreate the Drupal container. Usenoneonly for standalone stacks without TLS edge (e.g. local dockerWissKI). -
[ ] WissKI / Portainer — Configure WissKI settings with the Portainer API token: endpoint (e.g.
1), create/read/update/delete stack API URLs (e.g.https://portainer.<DOMAIN>/api/stacks/...). See the main README for the exact routes. -
[ ] Docs and settings — Confirm SCS Manager settings at
/admin/config/soda-scs-manager/settings. If the product exposes a docs path, ensure the base URL or path is correct. -
[ ] SMTP config — Ensure SMTP (outgoing mail) is configured and working in Drupal (e.g. Configuration → System → Basic site settings → SMTP Authentication Support, or the mail system in use). If SMTP is not working, user registration will fail because verification or welcome emails cannot be sent.
Nextcloud mount sidecar¶
- [ ] Host rshared bind —
/var/lib/scs/nextcloud-mountsexists andfindmnt -o PROPAGATION --target /var/lib/scs/nextcloud-mountscontainsshared. Prefersystemctl enable --now scs-nextcloud-mounts.service(unit file under01_scripts/global/). See Nextcloud mount sidecar. - [ ] Sidecar healthy —
docker compose ps nextcloud-mounteris healthy; no host port for:5572. - [ ] Manager wiring —
scs-manager--drupalis onnextcloud-mounter-net, hasNEXTCLOUD_MOUNTER_RC_*/NEXTCLOUD_MOUNTS_ROOT, and binds mounts root →/mnt/nextcloud-mounts(rslave). Override lives in00_custom_configs/scs-manager-stack/docker/. - [ ] rc-API from Manager only —
scs-drush scs:nextcloud-status(orcurltohttp://nextcloud-mounter:5572/core/pid); WissKI containers cannot reach that host. - [ ] Secrets —
NEXTCLOUD_MOUNTER_RC_PASSset in.env(not empty); rotate by changing.envand recreating sidecar + Manager. - [ ] WissKI external mode — New stacks get
NEXTCLOUD_MOUNT_MODE=externalandNEXTCLOUD_USER_MOUNT_SOURCE=…/<owner>/<project-label>; legacy sync stacks re-deployed after migration.
Nextcloud¶
- [ ] Reverse proxy, MIME, and .well-known URLs — Custom nginx is copied from
00_custom_configs/scs-nextcloud-stack/reverse-proxy/nginx.confbystart.sh. It handles: .mjsfiles served withapplication/javascriptMIME type- X-Forwarded-* headers passed to PHP (fixes reverse proxy security warning)
.well-knownURLs for CalDAV, CardDAV, webfinger, nodeinfo (federation and discovery)
Post-install hook sets trusted_proxies, forwarded_for_headers, forwarded_host_headers, forwarded_proto_headers in Nextcloud config. For an existing install, run: 01_scripts/scs-nextcloud-stack/apply-nextcloud-proxy-and-region.bash.
If .well-known warnings persist after updating nginx config, restart the reverse proxy: docker compose restart nextcloud--nginx--edge.
-
[ ] Maintenance window — Post-install sets maintenance window (e.g. start hour 22, length 6). If the admin warning remains, set manually:
occ config:system:set maintenance_window_start --type integer --value=22andmaintenance_window_length --type integer --value=6. -
[ ] Default phone region — Set
NEXTCLOUD_NEXTCLOUD_DEFAULT_PHONE_REGIONin.env(e.g.DE) so the container and post-install hook can setdefault_phone_region. Or set inside the container:occ config:system:set default_phone_region --value=DE. -
[ ] MIME type migrations and database maintenance — If the admin panel reports "MIME-Type-Migrationen verfügbar" or database warnings (missing indices, columns, primary keys), run from repo root:
01_scripts/scs-nextcloud-stack/run-nextcloud-repair.bash. This script runs all maintenance tasks including expensive repairs, and can take a long time on large instances. -
[ ] MariaDB version — Nextcloud recommends MariaDB 10.6–11.4 for this version. If you see a warning about MariaDB 11.5+, it is informational; consider planning an upgrade or DB version alignment later.
-
[ ] Email — Configure the mail server either via environment variables (recommended) or admin UI:
- Via environment variables: Add
NEXTCLOUD_NEXTCLOUD_MAIL_*variables to.env(see email setup guide). Apply with01_scripts/scs-nextcloud-stack/configure-nextcloud-email.bashor restart Nextcloud container. Settings are applied automatically by post-installation hook for new installs. - Via admin UI: Settings → Administration → Basic settings → Email server. Set SMTP server, port, credentials. Use "Send email" button to test.
Email is required for user registration, password resets, and notifications.
-
[ ] AppAPI deployment daemon (optional) — If you want to install external apps (Ex-Apps) via AppAPI, register a default deployment daemon in Settings → Administration → AppAPI. This is only needed if you plan to use Nextcloud's external app ecosystem. Not required for core functionality.
-
[ ] Check logs — Visit Settings → Administration → Logging to review any warnings or errors. Address issues as they appear. Common items: missing indices (run repair script), caching warnings (ensure Redis is running), background job warnings (check cron is working).
-
[ ] Plugins — Post-install hooks install Social Login, configure Nextcloud, OnlyOffice, and Draw.io. Verify with
occ app:list(inside the Nextcloud container) thatsociallogin(and other expected apps) are enabled. If the hooks did not run, run them manually or install the apps via the Nextcloud UI. -
[ ] OpenID / Social Login — Configure the Social Login app with Keycloak:
- Discovery URL or issuer:
https://<KC_DOMAIN>/realms/<KC_REALM>(e.g.https://auth.scs.localhost/realms/main). - Client ID: same as the Nextcloud client in Keycloak (typically the value of
NEXTCLOUD_NEXTCLOUD_DOMAIN, e.g.http://drive.scs.localhostor the domain used as client ID in the realm). - Client secret: value of
NEXTCLOUD_CLIENT_SECRETfrom.env. -
Redirect URL: must match the Nextcloud domain (e.g.
https://<NEXTCLOUD_DOMAIN>/apps/sociallogin/oidc/callbackor as required by the app). -
[ ] OnlyOffice / Draw.io — If the post-install hooks ran, confirm in Nextcloud admin that OnlyOffice and Draw.io are configured. Otherwise document or perform manual configuration.
JupyterHub¶
-
[ ] Keycloak client — Client ID and secret come from env (
CLIENT_ID/JUPYTERHUB_CLIENT_ID,CLIENT_SECRET/JUPYTERHUB_CLIENT_SECRET). Callback and Keycloak URLs are set via env in the compose override. Ensure they match the Keycloak client’s redirect URIs and web origins. -
[ ] Groups and gids — Add the Keycloak “groups” scope to the JupyterHub client (see Keycloak section above) so
auth_state_groups_keyreceivesgroupsandgids. ConfirmKC_USER_GROUPSandKC_ADMIN_GROUPSin JupyterHub’s env match Keycloak group names (e.g.userfor allowed users, and the admin group name for admins).
OpenGDB¶
-
[ ] AuthProxy — OpenGDB AuthProxy (and any OIDC/Keycloak integration) is configured per deployment. List or verify any env or config that must be set after first start (e.g. allowed hosts, CORS, OIDC client).
-
[ ] Domain —
OPEN_GDB_DOMAINis used in the nginx template. Ensure trusted hosts and CORS (if applicable) match this domain.
Project website (scs-project-website-stack)¶
- [ ] DB and VCL — Pre-install creates the database and user and generates Varnish VCL from a template. If you run the pre-install manually: the script is in
01_scripts/scs-project-page/pre-install.bashand references00_custom_configs/scs-project-website/varnish/default.vcl.tpl, but the template file is at00_custom_configs/scs-project-page/varnish/default.vcl.tpl. Use the path underscs-project-pageif the script fails. Ensure the generated VCL and DB are in use after startup.
phpMyAdmin / DBMS (with Keycloak SSO)¶
- [ ] phpMyAdmin SSO — If using Keycloak SSO for phpMyAdmin, set in
.env: SCS_DBMS_CLIENT_SECRET— Must match the phpMyAdmin client in Keycloak (client ID:https://${SCS_DBMS_DOMAIN})SCS_DBMS_FORWARD_AUTH_SECRET— Random string for cookie signingSCS_DBMS_FORWARD_AUTH_ENCRYPTION_KEY— Exactly 32 characters (e.g. hex) for cookie encryptionCOMPOSE_FILEmust include00_custom_configs/phpmyadmin/docker/docker-compose.override.yml(seeexample-env) so signon config files are mounted-
Re-run Keycloak pre-install to add the phpMyAdmin client to the realm, or create the client manually with redirect URI
https://${SCS_DBMS_DOMAIN}/_oauth -
[ ] phpMyAdmin signon (per-user Keycloak credentials) — phpMyAdmin reads
preferred_usernameandmariadb_passwordfrom the Keycloak JWT. Users get a MariaDB account when they create an SQL component or when they are added to a project that has SQL databases; the password is synced to Keycloakmariadb_password. Project members can log into phpMyAdmin via SSO and access databases connected to their projects. -
[ ] phpMyAdmin configuration storage (pmadb) — To fix "Configuration storage … not OK", set
SCS_DBMS_PMA_PASSWORDin.env(any random string), run./start.shto create the phpmyadmin database and control user, then restart phpMyAdmin. See phpMyAdmin configuration storage. -
[ ] ERR_TOO_MANY_REDIRECTS — If you see this, the OAuth token exchange is failing. See DBMS SSO redirect loop: verify
SCS_DBMS_CLIENT_SECRETmatches Keycloak exactly, re-run Keycloak pre-install, or check redirect URI.
Other services¶
-
[ ] Portainer — On first visit, create the admin account. Create an access token for SCS Manager/WissKI. Add the GitHub Container Registry (ghcr.io) if you need to pull private images from the UI.
-
[ ] Traefik — Dashboard and Let’s Encrypt certificates are configured via labels and env. Document or verify
SCS_TRAEFIK_*(domain, email, basic auth username/hash) and any middleware ordering if relevant for your setup.