Skip to main content
RisingWave Console can federate console sign-in to your identity provider (IdP) so users authenticate with their existing corporate credentials instead of a local Console password. SSO is powered by a Dex identity broker that runs alongside Console — a sidecar container on Kubernetes, or a second service on Docker Compose. You enable it by deploying Console together with Dex, then register one or more connectors (SAML, LDAP / Active Directory, or OIDC) from the Console UI.

How it works

Console runs a Dex identity broker next to it and wires itself to Dex. The design avoids the usual SSO operational burden:
  • No separate Dex endpoint. Console reverse-proxies Dex under its own /dex path, so whatever exposes Console also serves Dex. You publish only the Console port — no separate Dex Service, Ingress path, or published port.
  • No operator-managed client secret. Console self-registers its OIDC client with Dex at boot and generates the client secret itself.
  • No certificate wrangling for users. Console reaches Dex’s gRPC admin port over the loopback (Docker network or pod loopback), secured by a self-signed certificate you generate once (Docker) or that an init container mints per pod (Kubernetes).
  • No forwarded-header configuration. Console derives both the OAuth redirect URI and the SSO state cookie’s Secure flag from the configured issuer URL, so SSO works correctly behind a TLS-terminating proxy without trusting X-Forwarded-* headers.
Connectors you add from the UI are pushed to Dex immediately over its admin API — no Dex or Console restart is required.

Requirements

  • A signed RisingWave license key. Console v0.7.x performs startup license verification and exits without RW_LICENSE_KEY / RW_LICENSE_KEY_PATH. See Manage license keys.
  • A stable host for the issuer. Set the Dex issuer to <scheme>://<host>/dex, where <host> is exactly the host (and port) browsers use to reach Console. Because Console serves Dex under its own /dex path, the issuer host must equal the Console host. Use HTTPS in production; the cookie Secure flag follows the issuer scheme.
  • A single Console instance. The self-register flow resets the OIDC client secret on every boot, so run exactly one replica. The Kubernetes manifest pins replicas: 1; the Docker Compose setup is single-instance by nature.

Choose a deployment method

Both methods use the same self-register + /dex-proxy design, so the Console configuration is identical; only the packaging differs.

Deploy with Docker Compose

This brings up Console (with bundled PostgreSQL) and a Dex container on one host. Only the Console port is published; Dex stays on the internal Compose network and is reached through Console’s /dex proxy. You need Docker with Compose v2, OpenSSL, and a signed RisingWave license token.

1. Create a working directory

2. Save your license token

3. Generate a certificate for Dex’s gRPC admin port

Console talks to Dex’s admin port over TLS. Generate a self-signed certificate whose subject alternative name is dex (the Compose service name Console connects to):

4. Create dex-config.yaml

dex-config.yaml

5. Create docker-compose.yaml

docker-compose.yaml

6. Set the issuer host and password

The files above are ready to run for local evaluation at http://localhost:8020. Before exposing Console to other machines:
  • Replace localhost:8020 with the host and port browsers will use, in both the issuer: in dex-config.yaml and RCONSOLE_SSO_DEX_ISSUERURL in docker-compose.yaml (they must be byte-identical). For production, front Console with a TLS proxy and use an https:// issuer.
  • Set a strong RCONSOLE_ROOT_PASSWORD.

7. Start the stack

The dex-init service chowns the Dex data volume so the non-root Dex can write its SQLite store (the Compose equivalent of Kubernetes fsGroup). Console waits for Dex to become healthy (depends_on), so it self-registers its OIDC client cleanly on the first boot.

8. Verify

Open http://localhost:8020 and sign in as root with the password from RCONSOLE_ROOT_PASSWORD (it defaults to root only if you leave that variable unset).

Deploy on Kubernetes

On Kubernetes, Dex runs as a sidecar container in the Console pod. The manifest below is the bundled-PostgreSQL (“pgbundle”) variant — convenient for testing, but its PostgreSQL metadata is not durable across pod rescheduling. For production, use an external PostgreSQL deployment and add the same Dex sidecar; see Install RisingWave Console for the external-PostgreSQL base.
Dex’s own state (signing keys, registered connectors) is stored in SQLite on the pod’s PVC and survives restarts. With the bundled-PostgreSQL image, the Console metadata is not on the PVC, so use external PostgreSQL for production.

1. Save the manifest

Save the following as risingwave-console-sso.yaml. It creates the namespace, service account, RBAC, license Secret, Dex ConfigMap, a NodePort Service, and a single-replica StatefulSet whose pod runs the Console container, the Dex sidecar, and an init container that mints the per-pod gRPC certificate.
risingwave-console-sso.yaml

2. Edit before applying

  • License: replace license.jwt: <your-signed-license-token> in the risingwave-console-license Secret.
  • Issuer host: replace console.example.com with your Console’s external host in both places (they must be byte-identical):
    • issuer: in the risingwave-console-dex ConfigMap
    • RCONSOLE_SSO_DEX_ISSUERURL in the StatefulSet
  • Root password (optional): the default login is root / root. To change it, add a RCONSOLE_ROOT_PASSWORD env var to the console container.
replicas: 1 is load-bearing. The self-register flow resets the Dex OIDC client secret on every boot; with more than one replica each pod would overwrite the others’ secret, causing random 401s on SSO login.

3. Expose Console over HTTPS

The manifest exposes Console on NodePort 30020. Add an Ingress (or other TLS-terminating front end) that serves Console at your issuer host over HTTPS. No forwarded-header trust configuration is needed.

4. Apply and verify

On the very first boot, the console can start before the Dex sidecar’s gRPC port is ready and log SSO Dex unreachable followed by SSO login disabled this boot. The console does not retry self-registration within that boot, so SSO login stays disabled until the next restart. If you see this, restart the console once Dex is up:
After the restart the log shows SSO self-registered OIDC client and SSO is ready. (The Docker Compose setup avoids this race with depends_on.)

SSO configuration reference

Both deployment methods set the RCONSOLE_SSO_DEX_* variables for you. You normally edit only the issuer host. The full set is documented here for custom deployments.

Register a connector

After Console is running, sign in as root and add a connector for your IdP. Connectors are pushed to Dex immediately; no restart is needed.
  1. In the sidebar, open SSO Connectors. Before you add anything, the page shows an empty state.
    RisingWave Console SSO Connectors page showing the empty state before any connectors are added
  2. Click Add connector and fill in the form:
    • Connector id: a stable identifier, for example okta-prod. This is used internally and cannot be changed later.
    • Type: SAML 2.0, LDAP / Active Directory, or OIDC.
    • Display name: the label shown on the sign-in button, for example Okta (Production).
    • Configuration (JSON): connector-specific settings passed to Dex. Selecting a type pre-fills a template with the keys that connector expects; fill in the values.
    Add SSO connector dialog with connector id, type, display name, and JSON configuration fields
  3. Click Create connector.
Each configured connector appears in the list, where you can edit or delete it.
SSO Connectors list showing a SAML and an LDAP / Active Directory connector with edit and delete actions

Connector configuration

The configuration field holds connector-specific JSON that Dex validates on save. Selecting a type pre-fills the keys that connector expects. For connectors that verify an IdP or directory server certificate, use the Load CA certificate button to fill the inline CA field from a PEM file. Console uses Dex’s inline CA form (caData for SAML, rootCAData for LDAP) rather than a filesystem path, because a path would point inside the Dex container.
Use Load CA certificate to fill caData with the base64-encoded PEM of the IdP’s signing CA. SAML requires it unless signature validation is disabled (dev and test only).

Sign in with SSO

Once SSO is enabled — Console is deployed alongside Dex, Dex is reachable, and Console has registered its OIDC client — the login page shows a Sign in with SSO button alongside the local username and password fields. Users click it to authenticate through your IdP. Register at least one IdP connector before pointing users at SSO, so the button leads to a real identity provider rather than only Dex’s built-in local login.
RisingWave Console login page showing the Sign in with SSO button below the username and password fields
The local root account and any local users you create continue to work, so you retain an administrative path even if the IdP is unavailable.

Troubleshooting