Secrets
Overview
openDesk derives the credentials of its components from MASTER_PASSWORD and provisions them as Kubernetes Secrets
through the opendesk-secrets release. Instead, a deployment can bring its own Secrets (existing secrets) and have
openDesk reference them.
The secrets are defined in the following files of
helmfile/environments/default/, each under its own root key:
secrets.yaml.gotmpl (secrets), database.yaml.gotmpl (databases), objectstores.yaml.gotmpl
(objectstores), cache.yaml.gotmpl (cache), smtp.yaml.gotmpl (smtp), ai.yaml.gotmpl (ai) and
sip.yaml.gotmpl (sip). Every secret there is documented inline; these comments are the source of the
list below, which is generated with dev/secrets-doc.py:
# Purpose: Redis access of Notes.
# Existing secret: `create: false` is supported.
# Rotation: TBD.
# Limitation: The password has to be URL-safe or percent-encoded.Structure of a secret
secrets:
minio:
rootPassword:
value: "..." # The secret itself, derived from MASTER_PASSWORD by default.
create: true # true: openDesk creates the Secret from `value`.
name: "minio-root-password" # Name of the Kubernetes Secret.
key: "root-password" # Key holding the secret within the Kubernetes Secret.
extraData: # Optional: further keys of the same Secret some consumers need.
root-user: "admin"Only simple secrets are supported: one key holding the secret string, plus optional further simple keys
(extraData, listed in the column “Special”). Structured content, e.g. JSON documents, is not supported as a
secret.
Bringing your own Secret
-
Create the Kubernetes Secret in the openDesk namespace before deploying, with the key named in
keyand the keys listed in the column “Special”, if any. -
Set
create: falseand pointnameandkeyto it in your environment’s values, e.g.:secrets: keycloak: adminPassword: create: false name: "my-keycloak-admin" key: "password"
For secrets with partial support, some consumers still read the literal value (see “Limitations”): set value
to the same string as your Secret as well, or the components end up with different credentials.
Status of all secrets
Legend
| Column | Status | Meaning |
|---|---|---|
| Existing secret | 🟢 | Supported: all consumers read the Secret. |
| Existing secret | 🟡 | Partially supported: some consumers still read the literal value, see “Limitations”. |
| Existing secret | 🔴 | Not supported: the secret has no Secret indirection. |
| Rotation | 🟢 | Rotation is possible. |
| Rotation | 🟡 | Rotation is possible, but requires more, e.g. a Pod restart, see “Limitations”. |
| Rotation | 🔴 | Rotation is not supported by openDesk. |
| Rotation | ⚪ | Rotation is not supported by the upstream component. |
| Rotation | TBD | Not determined yet. |
“Special” lists a key the consumer does not allow to change, further keys the Secret has to carry, or a
deviating structure.
List
135 secrets - existing secret: 99 🟢, 19 🟡, 17 🔴 - rotation: 1 🟢, 3 🟡, 2 🔴, 0 ⚪, 129 TBD.
| Root key | Path | Purpose | Existing secret | Rotation | Special | Limitations |
|---|---|---|---|---|---|---|
secrets | cassandra.rootPassword | Cassandra admin (Dovecot EE storage). | 🟢 | TBD | Fixed key: cassandra-password | |
secrets | oxAppSuite.adminPassword | OX App Suite master admin (OX Connector, migrations). | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | oxAppSuite.basicAuthPassword | OX App Suite internal basic auth. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.cookieHashSalt | OX App Suite cookie hash salt. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.hzGroupPassword | OX App Suite Hazelcast group (unused). | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.jolokiaPassword | OX App Suite Jolokia monitoring. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.migrationsMasterPassword | OX App Suite and Dovecot master login for migrations. | 🟡 | TBD | OX App Suite still renders value into its properties Secret. | |
secrets | oxAppSuite.oxguardMC | OX Guard master key. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.oxguardRC | OX Guard recovery key. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.restApiPassword | OX App Suite REST API (Dovecot, OX Guard). | 🟡 | TBD | OX App Suite still renders value into its properties Secret. | |
secrets | oxAppSuite.sessiondEncryptionKey | OX App Suite session encryption. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.shareCryptKey | OX App Suite share link encryption. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.synapseAsToken | OX App Suite Matrix appservice token. | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | oxConnector.provisioningApiPassword | OX Connector access to the Nubus provisioning API. | 🟡 | TBD | The Nubus consumer registration still embeds value. | |
secrets | postfix.opendeskSystemPassword | SMTP account for system mails (all components). | 🟡 | TBD | Extra key: OPENPROJECT_SMTP__PASSWORD | The extra key OPENPROJECT_SMTP__PASSWORD has to state the same password. OX App Suite still renders value into its configuration. |
secrets | nubus.masterpassword | Seed for further Nubus passwords. | 🔴 | TBD | Seed the other Nubus passwords are derived from, not a credential of its own. | |
secrets | nubus.ldapSecret | LDAP cn=admin (Nubus, migrations). | 🟢 | TBD | ||
secrets | nubus.ldapSearch.keycloak | LDAP bind user of Keycloak. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.nextcloud | LDAP bind user of Nextcloud. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.dovecot | LDAP bind user of Dovecot. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.ox | LDAP bind user of OX App Suite. | 🔴 | TBD | OX App Suite and Nubus take the literal value. | |
secrets | nubus.ldapSearch.postfix | LDAP bind user of Postfix. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.openproject | LDAP bind user of OpenProject. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.xwiki | LDAP bind user of XWiki. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.systemAccounts.administratorPassword | Nubus Administrator account. | 🔴 | TBD | The Nubus charts take the literal value. | |
secrets | nubus.portalConsumer.provisioningApiPassword | Nubus portal consumer of the provisioning API. | 🔴 | TBD | The consumer chart renders the registration document into the same Secret and skips it once the password is externalized (https://github.com/univention/univention-portal/pull/3, https://github.com/univention/provisioning-api/pull/3). | |
secrets | nubus.selfserviceConsumer.provisioningApiPassword | Nubus self-service consumer of the provisioning API. | 🔴 | TBD | The consumer chart renders the registration document into the same Secret and skips it once the password is externalized (https://github.com/univention/self-service-consumer/pull/2, https://github.com/univention/provisioning-api/pull/3). | |
secrets | nubus.provisioning.api.adminPassword | Nubus provisioning API admin. | 🟢 | TBD | ||
secrets | nubus.provisioning.api.natsPassword | Nubus provisioning API NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.api.prefillPassword | Nubus provisioning prefill API user. | 🟢 | TBD | ||
secrets | nubus.provisioning.api.udmTransformerPassword | Nubus provisioning UDM transformer API user. | 🟢 | TBD | ||
secrets | nubus.provisioning.dispatcherNatsPassword | Nubus provisioning dispatcher NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.prefillNatsPassword | Nubus provisioning prefill NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.udmListenerNatsPassword | Nubus provisioning UDM listener NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.udmTransformerNatsPassword | Nubus provisioning UDM transformer NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.synapse.apiPassword | Matrix provisioning consumer of the provisioning API. | 🔴 | TBD | The provisioning-connector chart renders the registration document into the same Secret and skips it once the password is externalized (opendesk-provisioning-connector!5, https://github.com/univention/provisioning-api/pull/3). | |
secrets | nats.natsAdminPassword | Nubus NATS admin. | 🟢 | TBD | ||
secrets | postgresql.postgresUser | Bundled PostgreSQL superuser. | 🟢 | 🟡 | PostgreSQL applies it only when initializing an empty data directory, so a rotation has to change it on the server (ALTER USER) as well. | |
secrets | mariadb.rootPassword | Bundled MariaDB root (OX App Suite, XWiki on MariaDB). | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | mariadb.openxchangeUser | MariaDB user of OX App Suite. | 🟢 | TBD | ||
secrets | minio.rootPassword | S3 admin of SeaweedFS (or legacy MinIO). | 🟢 | TBD | Extra key: root-user | |
secrets | keycloak.adminPassword | Keycloak admin (Keycloak, bootstrap, Guardian, Intercom Service). | 🟢 | TBD | ||
secrets | keycloak.clientSecret.dovecot | OIDC client of Dovecot. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.dovecotGrant | OIDC password grant client of Dovecot. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.intercom | OIDC client of the Intercom Service. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.matrix | OIDC client of Matrix (MAS). | 🟢 | TBD | ||
secrets | keycloak.clientSecret.ncoidc | OIDC client of Nextcloud. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.openproject | OIDC client of OpenProject. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.xwiki | OIDC client of XWiki. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.as8oidc | OIDC client of OX App Suite. | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | keycloak.clientSecret.notes | OIDC client of Notes. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.umcServer | OIDC client of the Nubus UMC server. | 🟢 | TBD | ||
secrets | nextcloud.adminPassword | Nextcloud admin (Nextcloud, OpenProject bootstrap). | 🟢 | TBD | ||
secrets | nextcloud.metricsToken | Nextcloud metrics exporter. | 🟢 | TBD | ||
secrets | nextcloud.statusPassword | Nextcloud status page (OpenProject bootstrap). | 🟢 | TBD | ||
secrets | openproject.adminPassword | OpenProject internal admin. | 🟢 | TBD | ||
secrets | openproject.apiAdminPassword | OpenProject API admin (OpenProject bootstrap). | 🟢 | TBD | Extra key: username | |
secrets | openproject.hocuspocusSecret | OpenProject collaborative editing (Hocuspocus). | 🟢 | 🟡 | Rotating it needs a restart of the OpenProject and Hocuspocus pods; only the short-lived collaborative editing tokens become invalid. | |
secrets | openproject.secretKeyBase | OpenProject cookies and signed links. | 🟢 | 🟡 | Rotating it invalidates all cookies and signed links, so users have to log in again. | |
secrets | openproject.databaseCipherKey | OpenProject encryption of stored credentials. | 🟢 | 🟢 | OpenProject currently only encrypts the LDAP bind password and SCM repository credentials with it. openDesk re-seeds its LDAP connection and SCM integration isn’t supported in the OpenProject container image used by openDesk. Opt-in via enabled: true until upstream https://community.openproject.org/projects/OP/work_packages/OP-20472/activity is fixed. | |
secrets | collabora.adminPassword | Collabora admin console. | 🟢 | TBD | Extra key: username | |
secrets | jitsi.jwtAppSecret | Jitsi JWT signing (Prosody, Keycloak adapter). | 🟢 | TBD | Fixed key: JWT_APP_SECRET | |
secrets | jitsi.jicofoAuthPassword | Jitsi Jicofo XMPP user. | 🟢 | TBD | Fixed key: JICOFO_AUTH_PASSWORD | |
secrets | jitsi.jvbAuthPassword | Jitsi videobridge XMPP user. | 🟢 | TBD | Fixed key: JVB_AUTH_PASSWORD; Extra key: JVB_AUTH_USER | |
secrets | jitsi.jibriXmppPassword | Jitsi Jibri XMPP user. | 🟢 | TBD | Fixed key: JIBRI_XMPP_PASSWORD; Extra key: JIBRI_XMPP_USER | |
secrets | jitsi.jibriRecorderPassword | Jitsi Jibri recorder user. | 🟢 | TBD | Fixed key: JIBRI_RECORDER_PASSWORD; Extra key: JIBRI_RECORDER_USER | |
secrets | jitsi.jigasiXmppPassword | Jitsi Jigasi XMPP user. | 🟢 | TBD | Fixed key: JIGASI_XMPP_PASSWORD; Extra key: JIGASI_XMPP_USER | |
secrets | centralnavigation.apiKey | Central navigation (portal, Nextcloud, OpenProject, XWiki, Intercom). | 🟢 | TBD | ||
secrets | dovecot.doveadm | Dovecot doveadm API (OX App Suite). | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | dovecot.sharedMailboxesMasterPassword | Dovecot master login for shared mailboxes. | 🟢 | TBD | ||
secrets | xwiki.superadminpassword | XWiki superadmin (debug only). | 🟢 | TBD | ||
secrets | intercom.secret | Intercom Service sessions. | 🟢 | TBD | ||
secrets | intercom.synapseAsToken | Intercom Service Matrix appservice token. | 🟢 | TBD | ||
secrets | elementSupervision.hsToken | Element Supervision appservice HS token (EE). | 🟢 | TBD | ||
secrets | elementSupervision.backupPassphrase | Element Supervision key backup (EE). | 🟢 | TBD | ||
secrets | elementSupervision.password | Element Supervision bot account (EE). | 🟢 | TBD | ||
secrets | elementSupervision.synapseAsToken | Element Supervision appservice AS token (EE). | 🟢 | TBD | ||
secrets | elementAuditbot.hsToken | Element Auditbot appservice HS token (EE). | 🟢 | TBD | ||
secrets | elementAuditbot.backupPassphrase | Element Auditbot key backup (EE). | 🟢 | TBD | ||
secrets | elementAuditbot.password | Element Auditbot bot account (EE). | 🟢 | TBD | ||
secrets | elementAuditbot.synapseAsToken | Element Auditbot appservice AS token (EE). | 🟢 | TBD | ||
secrets | matrixAuthenticationService.matrixToolsOIDCClientSecret | MAS client of the Matrix tools (EE). | 🟢 | TBD | ||
secrets | matrixAuthenticationService.encryptionSecret | MAS encryption of stored secrets. | 🟢 | TBD | ||
secrets | matrixAuthenticationService.synapseSharedSecret | MAS to Synapse. | 🟢 | TBD | ||
secrets | matrixAuthenticationService.privateKeyRSA | MAS token signing (RSA). | 🟢 | TBD | ||
secrets | matrixAuthenticationService.privateKeyECDSAPrime256v1 | MAS token signing (ECDSA). | 🟢 | TBD | ||
secrets | matrixAuthenticationService.guestModuleClientSecret | MAS client of the Synapse guest module. | 🟢 | TBD | ||
secrets | matrixAuthenticationService.provisioningClientSecret | MAS admin client of the provisioning connector. | 🟢 | TBD | ||
secrets | matrixRTC.livekitAuthSecret | MatrixRTC LiveKit API (SFU). | 🟢 | TBD | ||
secrets | synapse.workersReplicationSecret | Synapse worker replication (EE). | 🟢 | TBD | ||
secrets | synapse.formSecret | Synapse form signing (EE). | 🟢 | TBD | ||
secrets | synapse.macaroonSecretKey | Synapse macaroon signing. | 🟢 | TBD | ||
secrets | synapse.registrationSharedSecret | Synapse shared-secret registration. | 🟢 | TBD | ||
secrets | synapse.signingKey | Synapse homeserver signing key (federation identity). | 🟢 | 🔴 | Rotating it gives the homeserver a new identity. When upgrading an existing Synapse, copy its current signing key into the Secret first, or the homeserver gets a new identity. | |
secrets | synapse.s3EncryptionCustomerKey | Synapse media encryption in S3 (SSE-C, optional). | 🟢 | 🔴 | Rotating it makes all media encrypted with the previous key unreadable. | |
secrets | turn.sharedSecret | TURN credentials (Jitsi, Matrix). | 🟢 | TBD | ||
secrets | certificates.password | Keystore/truststore password (self-signed certificates). | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | notes.djangoSecretKey | Notes Django signing. | 🟢 | TBD | ||
secrets | notes.superuser | Notes superuser. | 🟢 | TBD | ||
secrets | notes.collaborationSecret | Notes collaboration server. | 🟢 | TBD | ||
databases | dovecotDictmap.password | Cassandra user of Dovecot dictmap (EE). | 🟢 | TBD | The Cassandra init script sets the password only when initializing an empty data volume. | |
databases | dovecotACL.password | Cassandra user of Dovecot ACL (EE). | 🟢 | TBD | The Cassandra init script sets the password only when initializing an empty data volume. | |
databases | keycloak.password | Database user of Keycloak. | 🟢 | TBD | ||
databases | keycloakExtension.password | Database user of the Keycloak extensions. | 🟢 | TBD | ||
databases | matrixAuthenticationService.password | Database user of MAS. | 🟢 | TBD | ||
databases | nextcloud.password | Database user of Nextcloud. | 🟢 | TBD | ||
databases | notes.password | Database user of Notes. | 🟢 | TBD | ||
databases | openproject.password | Database user of OpenProject. | 🟢 | TBD | ||
databases | oxAppSuite.password | Database user of OX App Suite (default: MariaDB root). | 🔴 | TBD | OX App Suite renders value into its configuration. | |
databases | oxAppSuite.readPassword | Read-only database user of OX App Suite. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
databases | oxConnector.password | Database user of the OX Connector. | 🟡 | TBD | The OX Connector chart still takes the password inside its database URL. | |
databases | synapse.password | Database user of Synapse. | 🟢 | TBD | ||
databases | umsAuthSession.password | Database user of the Nubus auth session. | 🟢 | TBD | ||
databases | umsGuardianManagementApi.password | Database user of the Nubus Guardian management API. | 🟢 | TBD | ||
databases | umsSelfservice.password | Database user of the Nubus self-service. | 🟢 | TBD | ||
databases | xwiki.password | Database user of XWiki. | 🟢 | TBD | ||
objectstores | dovecot.secretKey | S3 key of Dovecot (EE). | 🟢 | TBD | Extra key: username | |
objectstores | migrations.secretKey | S3 key of the migrations. | 🟢 | TBD | Extra key: username | |
objectstores | nextcloud.secretKey | S3 key of Nextcloud. | 🟢 | TBD | Extra key: username | |
objectstores | notes.secretKey | S3 key of Notes. | 🟢 | TBD | Extra key: username | |
objectstores | nubus.secretKey | S3 key of Nubus (portal). | 🟢 | TBD | Extra key: username | |
objectstores | openproject.secretKey | S3 key of OpenProject. | 🟢 | TBD | Extra key: username | |
objectstores | openxchange.secretKey | S3 key of OX App Suite. | 🟡 | TBD | Extra key: username | OX App Suite still renders value into its configuration. |
objectstores | synapse.secretKey | S3 key of Synapse media. | 🟢 | TBD | Extra key: username | |
cache | redis.password | Bundled Redis default user. | 🟢 | TBD | ||
cache | intercomService.password | Redis access of the Intercom Service. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). | |
cache | nextcloud.password | Redis access of Nextcloud. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). | |
cache | notes.password | Redis access of Notes. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). The password has to be URL-safe or percent-encoded. | |
cache | matrixRTC.password | Redis access of MatrixRTC. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). | |
cache | oxAppSuite.password | Redis access of OX App Suite. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
cache | synapse.password | Redis access of Synapse. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). | |
smtp | password | External SMTP relay (Postfix). | 🟢 | TBD | ||
smtp | dkim.key | DKIM signing key (dkimpy, optional). | 🟢 | TBD | secret.name/secret.key instead of create/name/key | |
ai | apiKey | External AI endpoint (Collabora, Notes). | 🟡 | TBD | Collabora still renders value into its configuration. | |
sip | jigasi.password | SIP account of Jigasi. | 🟢 | TBD | Fixed key: JIGASI_SIP_PASSWORD |
Out of scope
certificate.selfSignedOverrides.caCertificateincertificate.yaml.gotmpl: a certificate bundle (certificate, key, trust and key store) rather than a simple secret. It can reference an existing Secret through its ownsecret.name.