From eba1467366d2af59cf5a8703b9902f556763e7cf Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Wed, 28 Oct 2026 14:48:23 +0100 Subject: [PATCH 01/15] feat(docs): first draft --- docs/antora.yml | 7 + docs/modules/ROOT/nav.adoc | 13 + docs/modules/ROOT/pages/getting-started.adoc | 51 ++++ docs/modules/ROOT/pages/index.adoc | 26 ++ .../pages/installation/authentication.adoc | 30 +++ .../ROOT/pages/installation/database.adoc | 23 ++ .../modules/ROOT/pages/installation/helm.adoc | 68 +++++ .../ROOT/pages/installation/monitoring.adoc | 10 + .../modules/ROOT/pages/modules/bookmarks.adoc | 30 +++ docs/modules/ROOT/pages/modules/storage.adoc | 54 ++++ docs/modules/ROOT/pages/modules/trino.adoc | 45 ++++ .../reference/environment-variables.adoc | 243 ++++++++++++++++++ 12 files changed, 600 insertions(+) create mode 100644 docs/antora.yml create mode 100644 docs/modules/ROOT/nav.adoc create mode 100644 docs/modules/ROOT/pages/getting-started.adoc create mode 100644 docs/modules/ROOT/pages/index.adoc create mode 100644 docs/modules/ROOT/pages/installation/authentication.adoc create mode 100644 docs/modules/ROOT/pages/installation/database.adoc create mode 100644 docs/modules/ROOT/pages/installation/helm.adoc create mode 100644 docs/modules/ROOT/pages/installation/monitoring.adoc create mode 100644 docs/modules/ROOT/pages/modules/bookmarks.adoc create mode 100644 docs/modules/ROOT/pages/modules/storage.adoc create mode 100644 docs/modules/ROOT/pages/modules/trino.adoc create mode 100644 docs/modules/ROOT/pages/reference/environment-variables.adoc diff --git a/docs/antora.yml b/docs/antora.yml new file mode 100644 index 00000000..84234108 --- /dev/null +++ b/docs/antora.yml @@ -0,0 +1,7 @@ +--- +name: cockpit +title: Stackable Cockpit +# Only the main branch is published, so there is a single version (like stackablectl). +version: 'nightly' +nav: + - modules/ROOT/nav.adoc diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc new file mode 100644 index 00000000..b1e17b16 --- /dev/null +++ b/docs/modules/ROOT/nav.adoc @@ -0,0 +1,13 @@ +* xref:index.adoc[] +* xref:getting-started.adoc[] +* Installation +** xref:installation/helm.adoc[] +** xref:installation/database.adoc[] +** xref:installation/authentication.adoc[] +** xref:installation/monitoring.adoc[] +* Modules +** xref:modules/trino.adoc[] +** xref:modules/storage.adoc[] +** xref:modules/bookmarks.adoc[] +* Reference +** xref:reference/environment-variables.adoc[] diff --git a/docs/modules/ROOT/pages/getting-started.adoc b/docs/modules/ROOT/pages/getting-started.adoc new file mode 100644 index 00000000..d7b52ca1 --- /dev/null +++ b/docs/modules/ROOT/pages/getting-started.adoc @@ -0,0 +1,51 @@ += Getting started +:description: Install Stackable Cockpit on Kubernetes with Helm, connect it to an OIDC provider, PostgreSQL and Trino, and run your first SQL query. + +This guide installs Cockpit with Helm and runs a first Trino query. +You need an existing PostgreSQL database, an OIDC client for Cockpit and a Trino cluster. + +// TODO: Replace the local chart path once the chart is published. + +Create a Secret with the database password and the OIDC client secret: + +[source,console] +---- +$ kubectl create secret generic cockpit \ + --from-literal=database-password='' \ + --from-literal=oidc-client-secret='' +---- + +Create a values file `cockpit-values.yaml`: + +[source,yaml] +---- +origin: https://cockpit.example.com # <1> +auth: + baseUrl: https://cockpit.example.com + oidc: + discoveryUrl: https://keycloak.example.com/realms/sdp/.well-known/openid-configuration + clientId: cockpit + clientSecret: + secretKeyRef: + name: cockpit +database: + host: postgresql + password: + secretKeyRef: + name: cockpit +trino: + url: https://trino-coordinator:8443 + tls: + secretClass: tls # <2> +---- +<1> The URL users open in the browser. It must use HTTPS, see xref:installation/helm.adoc#_ingress_and_reverse_proxy[Ingress and reverse proxy]. +<2> The SecretClass that provides the CA certificate of Trino. + +Install the chart: + +[source,console] +---- +$ helm install cockpit ./deploy/helm/cockpit --values cockpit-values.yaml +---- + +Open the URL in a browser, log in, select *Trino* in the sidebar and run a query such as `SELECT * FROM system.runtime.nodes`. diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc new file mode 100644 index 00000000..48a13a47 --- /dev/null +++ b/docs/modules/ROOT/pages/index.adoc @@ -0,0 +1,26 @@ += Stackable Cockpit +:description: Stackable Cockpit is a web UI for the Stackable Data Platform with a Trino SQL editor, an S3 storage browser and a dashboard with bookmarks. +:github: https://github.com/stackabletech/cockpit/ + +[.link-bar] +* {github}[GitHub {external-link-icon}^] + +Stackable Cockpit is a web UI for the Stackable Data Platform (SDP). +Users log in once through OpenID Connect (OIDC) and work with the platform's services from a single place. + +== Getting started + +Follow the xref:getting-started.adoc[] guide to install Cockpit with Helm and run your first Trino query. + +== Modules + +Cockpit consists of modules, and more are added over time: + +* xref:modules/trino.adoc[Trino]: a SQL editor with code completion and a schema browser. +* xref:modules/storage.adoc[Storage]: a file browser for S3-compatible object storage. +* xref:modules/bookmarks.adoc[Bookmarks]: links to frequently used tools on the dashboard. + +== Architecture + +Cockpit is a Node.js server that connects to Trino and S3 on behalf of the logged-in user. +It stores users, sessions, bookmarks and storage connections in PostgreSQL. diff --git a/docs/modules/ROOT/pages/installation/authentication.adoc b/docs/modules/ROOT/pages/installation/authentication.adoc new file mode 100644 index 00000000..efff77ee --- /dev/null +++ b/docs/modules/ROOT/pages/installation/authentication.adoc @@ -0,0 +1,30 @@ += Authentication +:description: Configure login to Stackable Cockpit with any OpenID Connect provider, such as Keycloak, including callback URL, scopes and session secret. + +Users log in to Cockpit through an OpenID Connect (OIDC) provider, for example Keycloak. +Register a confidential client for Cockpit with the redirect URI `/api/auth/oauth2/callback/oidc`. + +[source,yaml] +---- +auth: + baseUrl: https://cockpit.example.com # <1> + oidc: + discoveryUrl: https://keycloak.example.com/realms/sdp/.well-known/openid-configuration + clientId: cockpit + clientSecret: + secretKeyRef: + name: cockpit + key: oidc-client-secret + extraScopes: [] # <2> +sessionSecret: + secretKeyRef: + name: "" # <3> +---- +<1> The URL users open in the browser. +<2> Scopes requested in addition to `openid`, `profile` and `email`. +<3> The secret that signs session cookies. The chart generates one if empty. + +The OIDC claim that becomes the Trino user is configured in the xref:modules/trino.adoc#_user_identity[Trino module]. + +WARNING: With `auth.oidc.enabled: false`, Cockpit has no login and all visitors share one anonymous user. +Use this only for local testing. diff --git a/docs/modules/ROOT/pages/installation/database.adoc b/docs/modules/ROOT/pages/installation/database.adoc new file mode 100644 index 00000000..37bbb887 --- /dev/null +++ b/docs/modules/ROOT/pages/installation/database.adoc @@ -0,0 +1,23 @@ += Database +:description: Connect Stackable Cockpit to PostgreSQL, which stores users, sessions, bookmarks and storage connections, and configure TLS for the connection. + +Cockpit requires a PostgreSQL database for users, sessions, bookmarks and storage connections. +It creates and migrates its tables on startup. + +[source,yaml] +---- +database: + host: postgresql + port: 5432 + name: cockpit + user: cockpit + password: + secretKeyRef: + name: cockpit + key: database-password + tls: + mode: verify-full # <1> + secretClass: tls # <2> +---- +<1> `verify-full` (default), `require` (encrypt without verification) or `disable`. +<2> Provides the CA certificate of PostgreSQL. Alternatively set `caCert` to a mounted file. Both require `verify-full`. diff --git a/docs/modules/ROOT/pages/installation/helm.adoc b/docs/modules/ROOT/pages/installation/helm.adoc new file mode 100644 index 00000000..00596114 --- /dev/null +++ b/docs/modules/ROOT/pages/installation/helm.adoc @@ -0,0 +1,68 @@ += Helm chart +:description: Install Stackable Cockpit with its Helm chart and configure ingress, reverse proxy headers, CA certificates and the scratch volume. + +The Helm chart in `deploy/helm/cockpit` deploys Cockpit. +It does not deploy PostgreSQL, the OIDC provider or Trino. +The chart README lists all values. + +// TODO: Link the chart README and Helm repository once published. + +== Ingress and reverse proxy + +IMPORTANT: Cockpit must be served over HTTPS, because session cookies and credentials such as S3 keys pass through the browser connection. +Cockpit itself serves plain HTTP, so terminate TLS at the Ingress or reverse proxy and use `https://` URLs for `origin` and `auth.baseUrl`. + +The chart creates a ClusterIP Service on port 3000 and can create an Ingress with the `ingress` values. +Set `origin` to the URL users open in the browser. +Behind a reverse proxy, also set the forwarded headers Cockpit trusts: + +[source,yaml] +---- +origin: https://cockpit.example.com +proxy: + protocolHeader: x-forwarded-proto + hostHeader: x-forwarded-host +---- + +== CA certificates + +For backends with a private CA, set either a SecretClass or the path of a mounted CA file: + +[source,yaml] +---- +trino: + tls: + secretClass: tls # <1> +database: + tls: + caCert: /stackable/database-ca/ca.crt # <2> +extraVolumes: + - name: database-ca + secret: + secretName: database-ca +extraVolumeMounts: + - name: database-ca + mountPath: /stackable/database-ca + readOnly: true +---- +<1> The Secret Operator mounts the CA certificate of the SecretClass. +<2> A CA file mounted from a Secret. + +The same options exist under `storage.tls` for S3 endpoints. + +== Additional environment variables + +To set xref:reference/environment-variables.adoc[environment variables] directly, use `extraEnv` or `extraEnvFrom`: + +[source,yaml] +---- +extraEnv: + - name: LOG_LEVEL + value: debug +---- + +== Replicas + +Cockpit keeps running queries in memory, so keep `replicaCount` at `1`. + +// TODO: Remove once query state is shared between replicas. diff --git a/docs/modules/ROOT/pages/installation/monitoring.adoc b/docs/modules/ROOT/pages/installation/monitoring.adoc new file mode 100644 index 00000000..f368df55 --- /dev/null +++ b/docs/modules/ROOT/pages/installation/monitoring.adoc @@ -0,0 +1,10 @@ += Monitoring +:description: Stackable Cockpit exposes Prometheus metrics at /metrics and a health endpoint at /healthz, and writes structured JSON logs. + +Cockpit exposes Prometheus metrics at `/metrics` on port 3000, without authentication. +They include HTTP request durations, Trino query counts and storage operation metrics. + +The chart's liveness, readiness and startup probes use `/healthz`. + +Cockpit writes JSON logs to stdout. +Set the log level with `logging.level`; the default is `info`. diff --git a/docs/modules/ROOT/pages/modules/bookmarks.adoc b/docs/modules/ROOT/pages/modules/bookmarks.adoc new file mode 100644 index 00000000..7d6c4988 --- /dev/null +++ b/docs/modules/ROOT/pages/modules/bookmarks.adoc @@ -0,0 +1,30 @@ += Bookmarks +:description: The dashboard of Stackable Cockpit shows bookmarks to the web UIs of the platform's services, set up by each user or globally by the administrator. + +The dashboard and the sidebar show bookmarks to frequently used tools, such as the web UIs of the platform's services. +Each user can add up to 25 bookmarks of their own. +Pinned bookmarks appear under _Favourites_ at the top of the sidebar. + +== Global bookmarks + +Global bookmarks are shown to every user, before their own bookmarks. +Users cannot change them. + +[source,yaml] +---- +features: + bookmarks: + global: + - productId: superset # <1> + name: Dashboards # <2> + url: https://superset.example.com # <3> + environment: prod # <4> + pinned: true # <5> +---- +<1> One of `trino`, `superset`, `airflow`, `nifi`, `druid`, `opensearch`, `hdfs`, `hbase`, `spark` or `custom`. It selects the icon; unknown values are shown as `custom`. +<2> Up to 40 characters. +<3> An HTTP or HTTPS URL. +<4> Optional. A label shown on the bookmark, up to 100 characters. +<5> Optional. Shows the bookmark under _Favourites_. Defaults to `false`. + +Cockpit does not start if an entry is invalid. diff --git a/docs/modules/ROOT/pages/modules/storage.adoc b/docs/modules/ROOT/pages/modules/storage.adoc new file mode 100644 index 00000000..fd057e61 --- /dev/null +++ b/docs/modules/ROOT/pages/modules/storage.adoc @@ -0,0 +1,54 @@ += Storage +:description: The storage module of Stackable Cockpit is a file browser for S3-compatible object storage with previews, uploads, downloads and file editing. + +The storage module is a file browser for S3-compatible object storage. +Users browse buckets, upload and download files, preview common formats such as CSV, Parquet, images, PDFs and archives, and edit text files. + +The module is disabled by default: + +[source,yaml] +---- +features: + storage: + enabled: true +storage: + encryptionKey: + secretKeyRef: + name: cockpit + key: storage-encryption-key # <1> + tls: + secretClass: tls # <2> +---- +<1> A 64-character hex string, for example from `openssl rand -hex 32`. +<2> Optional. Provides the CA certificate of the S3 endpoints. Alternatively set `caCert` to a mounted file. + +Each user adds their own S3 connections in the UI. +Cockpit stores them in the database, with the credentials encrypted by the encryption key. +If the key changes or is lost, the stored credentials can no longer be read. + +The CA certificate in `storage.tls` replaces the system trust store, so endpoints with publicly trusted certificates fail while it is set. + +== File operations + +Cut, copy, paste, rename and drag-and-drop move are disabled by default, because they can cause many S3 requests: + +[source,yaml] +---- +features: + storage: + transfer: true +---- + +== Limits + +Preview sizes, upload and transfer concurrency, the archive cache and the download history retention are set under `storage`, see the xref:reference/environment-variables.adoc#_storage[reference]: + +[source,yaml] +---- +storage: + filePreviewRows: 500 + maxEditableFileSize: 10485760 # <1> +config: + bodySizeLimit: 12M +---- +<1> `config.bodySizeLimit` must be at least this large, otherwise saving large files fails. diff --git a/docs/modules/ROOT/pages/modules/trino.adoc b/docs/modules/ROOT/pages/modules/trino.adoc new file mode 100644 index 00000000..c0e9679a --- /dev/null +++ b/docs/modules/ROOT/pages/modules/trino.adoc @@ -0,0 +1,45 @@ += Trino +:description: The Trino module of Stackable Cockpit is a SQL editor with code completion and a schema browser that runs queries as the logged-in user. + +The Trino module is a SQL editor for xref:home:trino:index.adoc[Trino] with syntax highlighting, code completion and a schema browser. + +== Connection + +Set `trino.url` to connect all users to one Trino cluster: + +[source,yaml] +---- +trino: + url: https://trino-coordinator:8443 # <1> + publicUrl: https://trino.example.com # <2> + auth: + type: basic # <3> + username: cockpit + password: + secretKeyRef: + name: cockpit + key: trino-auth-password + tls: + secretClass: tls # <4> +---- +<1> The coordinator as Cockpit reaches it. +<2> Optional. The URL for links to the Trino web UI, defaults to `url`. +<3> `none` (default) or `basic`. +<4> Provides the CA certificate of Trino. Alternatively set `caCert` to a mounted file, or `insecure: true` to skip verification. + +Without `trino.url`, each user enters a connection in the UI. +These connections are kept in memory and are lost when Cockpit restarts. + +== User identity + +Cockpit sends queries with the logged-in user as `X-Trino-User`, so Trino applies its access control to that user. +The user is taken from the OIDC claim `trino.userImpersonation.userClaim` (default `preferred_username`), and updated on every login. +If the claim is missing, Cockpit uses `preferred_username`, then the email address. +With basic authentication, Trino must allow the Cockpit user to impersonate other users. + +Set `trino.userImpersonation.enabled: false` to run all queries as `trino.auth.username` instead. + +== Settings + +* `features.trino.completion.enabled` turns code completion on or off (default `true`). +* `trino.queryTtl` sets how long, in seconds, finished queries of an unused editor tab are kept (default `1800`). diff --git a/docs/modules/ROOT/pages/reference/environment-variables.adoc b/docs/modules/ROOT/pages/reference/environment-variables.adoc new file mode 100644 index 00000000..9480b5b8 --- /dev/null +++ b/docs/modules/ROOT/pages/reference/environment-variables.adoc @@ -0,0 +1,243 @@ += Environment variables +:description: Reference of all environment variables that configure Stackable Cockpit, with their defaults, grouped by server, authentication, Trino and storage. + +The Helm chart sets these variables from its values. +Set them directly only when you run Cockpit without the chart. +Cockpit does not start if a value is invalid, and the error names every invalid variable. + +// TODO: Generate this page from the code so it cannot drift. + +== Server + +[cols="2,1,3"] +|=== +|Variable |Default |Description + +|`ORIGIN` +| +|The URL users open in the browser. Requests from other origins are rejected. + +|`PROTOCOL_HEADER`, `HOST_HEADER` +| +|Forwarded headers trusted behind a reverse proxy, for example `x-forwarded-proto` and `x-forwarded-host`. + +|`BODY_SIZE_LIMIT` +|`6M` +|Maximum request body size. + +|`LOG_LEVEL` +|`info` +|`trace`, `debug`, `info`, `warn` or `error`. +|=== + +== Database + +[cols="2,1,3"] +|=== +|Variable |Default |Description + +|`DATABASE_HOST` +|`localhost` +|PostgreSQL host. + +|`DATABASE_PORT` +|`31432` +|PostgreSQL port. + +|`DATABASE_NAME` +|`cockpit` +|Database name. + +|`DATABASE_USER` +|`cockpit` +|Database user. + +|`DATABASE_PASSWORD` +| +|Database password. Required. + +|`DATABASE_TLS_MODE` +|`verify-full` in production, otherwise `disable` +|`verify-full`, `require` or `disable`. + +|`DATABASE_TLS_CA_CERT` +| +|Path to the CA certificate of PostgreSQL. Requires `verify-full`. +|=== + +== Authentication + +[cols="2,1,3"] +|=== +|Variable |Default |Description + +|`STACKABLE_COCKPIT_BASE_URL` +| +|The URL users open in the browser, used for the OIDC callback. + +|`STACKABLE_COCKPIT_SESSION_SECRET` +| +|Secret that signs session cookies. + +|`STACKABLE_COCKPIT_OIDC_DISCOVERY_URL` +| +|The `.well-known/openid-configuration` URL of the OIDC provider. Login is disabled unless this, the client ID and the client secret are set. + +|`STACKABLE_COCKPIT_OIDC_CLIENT_ID` +| +|OIDC client ID. + +|`STACKABLE_COCKPIT_OIDC_CLIENT_SECRET` +| +|OIDC client secret. + +|`STACKABLE_COCKPIT_OIDC_EXTRA_SCOPES` +| +|Scopes requested in addition to `openid`, `profile` and `email`, separated by commas or spaces. +|=== + +== Trino + +[cols="2,1,3"] +|=== +|Variable |Default |Description + +|`STACKABLE_COCKPIT_TRINO_URL` +| +|Trino coordinator URL for all users. Without it, users enter a connection in the UI. + +|`STACKABLE_COCKPIT_TRINO_PUBLIC_URL` +|`STACKABLE_COCKPIT_TRINO_URL` +|URL for links to the Trino web UI. + +|`STACKABLE_COCKPIT_TRINO_AUTH_TYPE` +|`none` +|`none` or `basic`. + +|`STACKABLE_COCKPIT_TRINO_AUTH_USERNAME` +| +|User for basic authentication. + +|`STACKABLE_COCKPIT_TRINO_AUTH_PASSWORD` +| +|Password for basic authentication. + +|`STACKABLE_COCKPIT_TRINO_TLS_CA_CERT` +| +|Path to the CA certificate of Trino. + +|`STACKABLE_COCKPIT_TRINO_TLS_INSECURE` +|`false` +|Skip TLS certificate verification. + +|`STACKABLE_COCKPIT_TRINO_USER_IMPERSONATION` +|`true` +|Send queries as the logged-in user. + +|`STACKABLE_COCKPIT_TRINO_USER_CLAIM` +|`preferred_username` +|OIDC claim used as the Trino user. + +|`STACKABLE_COCKPIT_COMPLETION_ENABLED` +|`true` +|SQL code completion. + +|`STACKABLE_COCKPIT_QUERY_TTL` +|`1800` +|Seconds that finished queries of an unused editor tab are kept. +|=== + +== Storage + +[cols="2,1,3"] +|=== +|Variable |Default |Description + +|`STACKABLE_COCKPIT_STORAGE_BROWSER_ENABLED` +|`false` +|Enables the storage module. + +|`STORAGE_ENCRYPTION_KEY` +| +|64-character hex key that encrypts stored S3 credentials. Required when the storage module is enabled. + +|`STACKABLE_COCKPIT_STORAGE_TLS_CA_CERT` +| +|Path to the CA certificate of the S3 endpoints. Replaces the system trust store. + +|`PUBLIC_STACKABLE_COCKPIT_STORAGE_TRANSFER_ENABLED` +|`false` +|Cut, copy, paste, rename and drag-and-drop move. + +|`PUBLIC_STACKABLE_COCKPIT_PAGE_SIZES` +|`25,50,100` +|Page sizes of paginated lists. + +|`PUBLIC_STACKABLE_COCKPIT_DEFAULT_PAGE_SIZE` +|Smallest page size +|Default page size. Must be one of the page sizes. + +|`PUBLIC_STACKABLE_COCKPIT_MAX_RECENT_FILES` +|`15` +|Recently visited locations kept in the browser. + +|`PUBLIC_STACKABLE_COCKPIT_UPLOAD_CONCURRENCY` +|`3` +|Parallel requests during uploads. + +|`PUBLIC_STACKABLE_COCKPIT_MAX_EDITABLE_FILE_SIZE` +|`5242880` +|Largest file in bytes that can be edited. `BODY_SIZE_LIMIT` must be at least this large. + +|`STACKABLE_COCKPIT_TEXT_PREVIEW_BYTES` +|`262144` +|Bytes fetched for text, TSV and JSON previews. + +|`STACKABLE_COCKPIT_IMAGE_PREVIEW_BYTES` +|`5242880` +|Bytes fetched for image previews. + +|`STACKABLE_COCKPIT_PDF_PREVIEW_BYTES` +|`26214400` +|Bytes fetched for PDF previews. + +|`STACKABLE_COCKPIT_FILE_PREVIEW_ROWS` +|`250` +|Rows in tabular previews. + +|`STACKABLE_COCKPIT_FILE_PREVIEW_COLUMNS` +|`50` +|Columns in tabular previews. + +|`STACKABLE_COCKPIT_PARQUET_PREVIEW_DISALLOWED_COMPRESSION_TYPES` +|`gzip-no_offset` +|Parquet codecs that are not previewed. The suffix `-no_offset` blocks only files without an offset index. + +|`STACKABLE_COCKPIT_ARCHIVE_PREVIEW_MAX_MB` +|`100` +|Largest archive in MB that is previewed. + +|`STACKABLE_COCKPIT_ARCHIVE_CACHE_MAX_MB` +|`512` +|Size in MB of the archive cache in `/tmp`. At least twice the archive preview limit. + +|`STACKABLE_COCKPIT_STORAGE_TRANSFER_CONCURRENCY` +|`8` +|Objects copied in parallel within one copy, move or rename. + +|`STACKABLE_COCKPIT_DOWNLOAD_HISTORY_RETENTION_DAYS` +|`30` +|Days the download history is kept, from 1 to 3650. +|=== + +== Bookmarks + +[cols="2,1,3"] +|=== +|Variable |Default |Description + +|`STACKABLE_COCKPIT_GLOBAL_BOOKMARKS` +| +|JSON array of bookmarks shown to every user, see xref:modules/bookmarks.adoc#_global_bookmarks[Global bookmarks]. +Example: `[{"productId":"superset","name":"Dashboards","url":"https://superset.example.com"}]`. +|=== From 6d08dfdd6ce7d6b6fc1e068bc1a0f0e97dd587c0 Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Mon, 2 Nov 2026 11:41:14 +0100 Subject: [PATCH 02/15] docs: Version the docs with the SDP like the operators Cockpit is released together with the SDP, so the docs become the 'cockpit' module of the 'home' component instead of a component of their own. The release scripts set the version on release branches. --- docs/antora.yml | 11 +++++------ docs/modules/ROOT/nav.adoc | 13 ------------- .../{ROOT => cockpit}/pages/getting-started.adoc | 0 docs/modules/{ROOT => cockpit}/pages/index.adoc | 0 .../pages/installation/authentication.adoc | 0 .../pages/installation/database.adoc | 0 .../{ROOT => cockpit}/pages/installation/helm.adoc | 0 .../pages/installation/monitoring.adoc | 0 .../{ROOT => cockpit}/pages/modules/bookmarks.adoc | 0 .../{ROOT => cockpit}/pages/modules/storage.adoc | 0 .../{ROOT => cockpit}/pages/modules/trino.adoc | 2 +- .../pages/reference/environment-variables.adoc | 0 docs/modules/cockpit/partials/nav.adoc | 12 ++++++++++++ 13 files changed, 18 insertions(+), 20 deletions(-) delete mode 100644 docs/modules/ROOT/nav.adoc rename docs/modules/{ROOT => cockpit}/pages/getting-started.adoc (100%) rename docs/modules/{ROOT => cockpit}/pages/index.adoc (100%) rename docs/modules/{ROOT => cockpit}/pages/installation/authentication.adoc (100%) rename docs/modules/{ROOT => cockpit}/pages/installation/database.adoc (100%) rename docs/modules/{ROOT => cockpit}/pages/installation/helm.adoc (100%) rename docs/modules/{ROOT => cockpit}/pages/installation/monitoring.adoc (100%) rename docs/modules/{ROOT => cockpit}/pages/modules/bookmarks.adoc (100%) rename docs/modules/{ROOT => cockpit}/pages/modules/storage.adoc (100%) rename docs/modules/{ROOT => cockpit}/pages/modules/trino.adoc (92%) rename docs/modules/{ROOT => cockpit}/pages/reference/environment-variables.adoc (100%) create mode 100644 docs/modules/cockpit/partials/nav.adoc diff --git a/docs/antora.yml b/docs/antora.yml index 84234108..5c1d73fb 100644 --- a/docs/antora.yml +++ b/docs/antora.yml @@ -1,7 +1,6 @@ --- -name: cockpit -title: Stackable Cockpit -# Only the main branch is published, so there is a single version (like stackablectl). -version: 'nightly' -nav: - - modules/ROOT/nav.adoc +# Cockpit is a module of the 'home' component, like the operators. +# The release scripts set the version to YY.M and prerelease to false on release branches. +name: home +version: "nightly" +prerelease: true diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc deleted file mode 100644 index b1e17b16..00000000 --- a/docs/modules/ROOT/nav.adoc +++ /dev/null @@ -1,13 +0,0 @@ -* xref:index.adoc[] -* xref:getting-started.adoc[] -* Installation -** xref:installation/helm.adoc[] -** xref:installation/database.adoc[] -** xref:installation/authentication.adoc[] -** xref:installation/monitoring.adoc[] -* Modules -** xref:modules/trino.adoc[] -** xref:modules/storage.adoc[] -** xref:modules/bookmarks.adoc[] -* Reference -** xref:reference/environment-variables.adoc[] diff --git a/docs/modules/ROOT/pages/getting-started.adoc b/docs/modules/cockpit/pages/getting-started.adoc similarity index 100% rename from docs/modules/ROOT/pages/getting-started.adoc rename to docs/modules/cockpit/pages/getting-started.adoc diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/cockpit/pages/index.adoc similarity index 100% rename from docs/modules/ROOT/pages/index.adoc rename to docs/modules/cockpit/pages/index.adoc diff --git a/docs/modules/ROOT/pages/installation/authentication.adoc b/docs/modules/cockpit/pages/installation/authentication.adoc similarity index 100% rename from docs/modules/ROOT/pages/installation/authentication.adoc rename to docs/modules/cockpit/pages/installation/authentication.adoc diff --git a/docs/modules/ROOT/pages/installation/database.adoc b/docs/modules/cockpit/pages/installation/database.adoc similarity index 100% rename from docs/modules/ROOT/pages/installation/database.adoc rename to docs/modules/cockpit/pages/installation/database.adoc diff --git a/docs/modules/ROOT/pages/installation/helm.adoc b/docs/modules/cockpit/pages/installation/helm.adoc similarity index 100% rename from docs/modules/ROOT/pages/installation/helm.adoc rename to docs/modules/cockpit/pages/installation/helm.adoc diff --git a/docs/modules/ROOT/pages/installation/monitoring.adoc b/docs/modules/cockpit/pages/installation/monitoring.adoc similarity index 100% rename from docs/modules/ROOT/pages/installation/monitoring.adoc rename to docs/modules/cockpit/pages/installation/monitoring.adoc diff --git a/docs/modules/ROOT/pages/modules/bookmarks.adoc b/docs/modules/cockpit/pages/modules/bookmarks.adoc similarity index 100% rename from docs/modules/ROOT/pages/modules/bookmarks.adoc rename to docs/modules/cockpit/pages/modules/bookmarks.adoc diff --git a/docs/modules/ROOT/pages/modules/storage.adoc b/docs/modules/cockpit/pages/modules/storage.adoc similarity index 100% rename from docs/modules/ROOT/pages/modules/storage.adoc rename to docs/modules/cockpit/pages/modules/storage.adoc diff --git a/docs/modules/ROOT/pages/modules/trino.adoc b/docs/modules/cockpit/pages/modules/trino.adoc similarity index 92% rename from docs/modules/ROOT/pages/modules/trino.adoc rename to docs/modules/cockpit/pages/modules/trino.adoc index c0e9679a..dae6351c 100644 --- a/docs/modules/ROOT/pages/modules/trino.adoc +++ b/docs/modules/cockpit/pages/modules/trino.adoc @@ -1,7 +1,7 @@ = Trino :description: The Trino module of Stackable Cockpit is a SQL editor with code completion and a schema browser that runs queries as the logged-in user. -The Trino module is a SQL editor for xref:home:trino:index.adoc[Trino] with syntax highlighting, code completion and a schema browser. +The Trino module is a SQL editor for xref:trino:index.adoc[Trino] with syntax highlighting, code completion and a schema browser. == Connection diff --git a/docs/modules/ROOT/pages/reference/environment-variables.adoc b/docs/modules/cockpit/pages/reference/environment-variables.adoc similarity index 100% rename from docs/modules/ROOT/pages/reference/environment-variables.adoc rename to docs/modules/cockpit/pages/reference/environment-variables.adoc diff --git a/docs/modules/cockpit/partials/nav.adoc b/docs/modules/cockpit/partials/nav.adoc new file mode 100644 index 00000000..dc41859b --- /dev/null +++ b/docs/modules/cockpit/partials/nav.adoc @@ -0,0 +1,12 @@ +* xref:cockpit:getting-started.adoc[] +* Installation +** xref:cockpit:installation/helm.adoc[] +** xref:cockpit:installation/database.adoc[] +** xref:cockpit:installation/authentication.adoc[] +** xref:cockpit:installation/monitoring.adoc[] +* Modules +** xref:cockpit:modules/trino.adoc[] +** xref:cockpit:modules/storage.adoc[] +** xref:cockpit:modules/bookmarks.adoc[] +* Reference +** xref:cockpit:reference/environment-variables.adoc[] From daccaeab51d5c31f7d421b891649e12b5d437387 Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Mon, 2 Nov 2026 13:04:40 +0100 Subject: [PATCH 03/15] docs: Install the published Helm chart --- docs/modules/cockpit/pages/getting-started.adoc | 4 ++-- docs/modules/cockpit/pages/installation/helm.adoc | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/modules/cockpit/pages/getting-started.adoc b/docs/modules/cockpit/pages/getting-started.adoc index d7b52ca1..e45e1152 100644 --- a/docs/modules/cockpit/pages/getting-started.adoc +++ b/docs/modules/cockpit/pages/getting-started.adoc @@ -43,9 +43,9 @@ trino: Install the chart: -[source,console] +[source,console,subs="attributes"] ---- -$ helm install cockpit ./deploy/helm/cockpit --values cockpit-values.yaml +$ helm install cockpit oci://oci.stackable.tech/sdp-charts/cockpit --version {stackable-operator-version} --values cockpit-values.yaml ---- Open the URL in a browser, log in, select *Trino* in the sidebar and run a query such as `SELECT * FROM system.runtime.nodes`. diff --git a/docs/modules/cockpit/pages/installation/helm.adoc b/docs/modules/cockpit/pages/installation/helm.adoc index 00596114..e5c4affc 100644 --- a/docs/modules/cockpit/pages/installation/helm.adoc +++ b/docs/modules/cockpit/pages/installation/helm.adoc @@ -1,11 +1,15 @@ = Helm chart :description: Install Stackable Cockpit with its Helm chart and configure ingress, reverse proxy headers, CA certificates and the scratch volume. -The Helm chart in `deploy/helm/cockpit` deploys Cockpit. +The Helm chart deploys Cockpit. It does not deploy PostgreSQL, the OIDC provider or Trino. -The chart README lists all values. +The chart is published to `oci.stackable.tech/sdp-charts/cockpit`. +The https://github.com/stackabletech/cockpit/blob/{stackable-operator-branch}/deploy/helm/cockpit/README.md[chart README{external-link-icon}^] lists all values. -// TODO: Link the chart README and Helm repository once published. +[source,console,subs="attributes"] +---- +$ helm install cockpit oci://oci.stackable.tech/sdp-charts/cockpit --version {stackable-operator-version} --values cockpit-values.yaml +---- == Ingress and reverse proxy From 51be4e39e384b2038b54b6df4f241a8f940d08bd Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Mon, 2 Nov 2026 13:08:32 +0100 Subject: [PATCH 04/15] style(docs): Use single quotes in antora.yml --- docs/antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/antora.yml b/docs/antora.yml index 5c1d73fb..8bafce5c 100644 --- a/docs/antora.yml +++ b/docs/antora.yml @@ -2,5 +2,5 @@ # Cockpit is a module of the 'home' component, like the operators. # The release scripts set the version to YY.M and prerelease to false on release branches. name: home -version: "nightly" +version: 'nightly' prerelease: true From d3c507350e2915910bedadc7b8a93540389f7a81 Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Mon, 2 Nov 2026 14:58:54 +0100 Subject: [PATCH 05/15] docs: Fix bookmark key and database TLS in getting started --- docs/modules/cockpit/pages/getting-started.adoc | 9 +++++---- docs/modules/cockpit/pages/modules/bookmarks.adoc | 15 +++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/modules/cockpit/pages/getting-started.adoc b/docs/modules/cockpit/pages/getting-started.adoc index e45e1152..d3c656a2 100644 --- a/docs/modules/cockpit/pages/getting-started.adoc +++ b/docs/modules/cockpit/pages/getting-started.adoc @@ -4,8 +4,6 @@ This guide installs Cockpit with Helm and runs a first Trino query. You need an existing PostgreSQL database, an OIDC client for Cockpit and a Trino cluster. -// TODO: Replace the local chart path once the chart is published. - Create a Secret with the database password and the OIDC client secret: [source,console] @@ -33,13 +31,16 @@ database: password: secretKeyRef: name: cockpit + tls: + secretClass: tls # <2> trino: url: https://trino-coordinator:8443 tls: - secretClass: tls # <2> + secretClass: tls # <3> ---- <1> The URL users open in the browser. It must use HTTPS, see xref:installation/helm.adoc#_ingress_and_reverse_proxy[Ingress and reverse proxy]. -<2> The SecretClass that provides the CA certificate of Trino. +<2> The SecretClass that provides the CA certificate of PostgreSQL. Cockpit verifies the certificate by default, see xref:installation/database.adoc[]. +<3> The SecretClass that provides the CA certificate of Trino. Install the chart: diff --git a/docs/modules/cockpit/pages/modules/bookmarks.adoc b/docs/modules/cockpit/pages/modules/bookmarks.adoc index 7d6c4988..5849446b 100644 --- a/docs/modules/cockpit/pages/modules/bookmarks.adoc +++ b/docs/modules/cockpit/pages/modules/bookmarks.adoc @@ -12,14 +12,13 @@ Users cannot change them. [source,yaml] ---- -features: - bookmarks: - global: - - productId: superset # <1> - name: Dashboards # <2> - url: https://superset.example.com # <3> - environment: prod # <4> - pinned: true # <5> +bookmarks: + global: + - productId: superset # <1> + name: Dashboards # <2> + url: https://superset.example.com # <3> + environment: prod # <4> + pinned: true # <5> ---- <1> One of `trino`, `superset`, `airflow`, `nifi`, `druid`, `opensearch`, `hdfs`, `hbase`, `spark` or `custom`. It selects the icon; unknown values are shown as `custom`. <2> Up to 40 characters. From 5b0e502dddbf55e0bb6d8ec5c551fa455f431566 Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Mon, 2 Nov 2026 15:00:32 +0100 Subject: [PATCH 06/15] docs: Add the OIDC redirect URI to getting started --- docs/modules/cockpit/pages/getting-started.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/modules/cockpit/pages/getting-started.adoc b/docs/modules/cockpit/pages/getting-started.adoc index d3c656a2..5c637447 100644 --- a/docs/modules/cockpit/pages/getting-started.adoc +++ b/docs/modules/cockpit/pages/getting-started.adoc @@ -3,6 +3,7 @@ This guide installs Cockpit with Helm and runs a first Trino query. You need an existing PostgreSQL database, an OIDC client for Cockpit and a Trino cluster. +Register the OIDC client with the redirect URI `https://cockpit.example.com/api/auth/oauth2/callback/oidc`, see xref:installation/authentication.adoc[]. Create a Secret with the database password and the OIDC client secret: From 5e418262a4d02b1c5c088dc8e558b8c4214d97b0 Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Mon, 2 Nov 2026 15:04:16 +0100 Subject: [PATCH 07/15] docs: Address review findings --- docs/modules/cockpit/pages/index.adoc | 2 +- .../pages/installation/authentication.adoc | 3 ++- docs/modules/cockpit/pages/installation/helm.adoc | 15 ++++++++++++++- .../pages/reference/environment-variables.adoc | 8 ++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/docs/modules/cockpit/pages/index.adoc b/docs/modules/cockpit/pages/index.adoc index 48a13a47..01ee96cb 100644 --- a/docs/modules/cockpit/pages/index.adoc +++ b/docs/modules/cockpit/pages/index.adoc @@ -22,5 +22,5 @@ Cockpit consists of modules, and more are added over time: == Architecture -Cockpit is a Node.js server that connects to Trino and S3 on behalf of the logged-in user. +Cockpit is a Node.js server that connects to Trino as the logged-in user and to S3 with the connections each user configures. It stores users, sessions, bookmarks and storage connections in PostgreSQL. diff --git a/docs/modules/cockpit/pages/installation/authentication.adoc b/docs/modules/cockpit/pages/installation/authentication.adoc index efff77ee..3bda95cb 100644 --- a/docs/modules/cockpit/pages/installation/authentication.adoc +++ b/docs/modules/cockpit/pages/installation/authentication.adoc @@ -22,7 +22,8 @@ sessionSecret: ---- <1> The URL users open in the browser. <2> Scopes requested in addition to `openid`, `profile` and `email`. -<3> The secret that signs session cookies. The chart generates one if empty. +<3> The secret that signs session cookies. The chart generates one if empty and keeps it across `helm upgrade`. +Set it explicitly when deploying with `helm template` or Argo CD, which cannot read the existing Secret, otherwise every deployment logs out all users. The OIDC claim that becomes the Trino user is configured in the xref:modules/trino.adoc#_user_identity[Trino module]. diff --git a/docs/modules/cockpit/pages/installation/helm.adoc b/docs/modules/cockpit/pages/installation/helm.adoc index e5c4affc..67254ee6 100644 --- a/docs/modules/cockpit/pages/installation/helm.adoc +++ b/docs/modules/cockpit/pages/installation/helm.adoc @@ -65,8 +65,21 @@ extraEnv: value: debug ---- +== Scratch volume + +The chart mounts an emptyDir at `/tmp` for the archive preview cache. +Keep `tmp.sizeLimit` above `storage.archiveCacheMaxMb`, otherwise the kubelet evicts the pod when the cache fills up: + +[source,yaml] +---- +tmp: + sizeLimit: 1Gi +storage: + archiveCacheMaxMb: 512 +---- + == Replicas Cockpit keeps running queries in memory, so keep `replicaCount` at `1`. -// TODO: Remove once query state is shared between replicas. +// TODO: Remove once query state is shared between replicas, see https://github.com/stackabletech/cockpit/issues/310. diff --git a/docs/modules/cockpit/pages/reference/environment-variables.adoc b/docs/modules/cockpit/pages/reference/environment-variables.adoc index 9480b5b8..b1bf9406 100644 --- a/docs/modules/cockpit/pages/reference/environment-variables.adoc +++ b/docs/modules/cockpit/pages/reference/environment-variables.adoc @@ -13,6 +13,14 @@ Cockpit does not start if a value is invalid, and the error names every invalid |=== |Variable |Default |Description +|`NODE_ENV` +|`production` +|Set in the image. Other values switch to development defaults, such as no database TLS and `trace` logging. + +|`PORT` +|`3000` +|HTTP port Cockpit listens on. + |`ORIGIN` | |The URL users open in the browser. Requests from other origins are rejected. From 5e1e5dffcaa5eccbf46f76dd2efab2557d53e4fd Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Tue, 3 Nov 2026 08:41:53 +0100 Subject: [PATCH 08/15] docs: Document startup validation, logging variables and global bookmark rules --- docs/modules/cockpit/pages/modules/bookmarks.adoc | 4 ++-- docs/modules/cockpit/pages/modules/trino.adoc | 2 +- .../pages/reference/environment-variables.adoc | 12 ++++++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/modules/cockpit/pages/modules/bookmarks.adoc b/docs/modules/cockpit/pages/modules/bookmarks.adoc index 5849446b..906fd3f1 100644 --- a/docs/modules/cockpit/pages/modules/bookmarks.adoc +++ b/docs/modules/cockpit/pages/modules/bookmarks.adoc @@ -22,8 +22,8 @@ bookmarks: ---- <1> One of `trino`, `superset`, `airflow`, `nifi`, `druid`, `opensearch`, `hdfs`, `hbase`, `spark` or `custom`. It selects the icon; unknown values are shown as `custom`. <2> Up to 40 characters. -<3> An HTTP or HTTPS URL. +<3> An HTTP or HTTPS URL without a user name or password. Every user can see it in the page source, so it must not contain a token or other secret either. <4> Optional. A label shown on the bookmark, up to 100 characters. <5> Optional. Shows the bookmark under _Favourites_. Defaults to `false`. -Cockpit does not start if an entry is invalid. +`bookmarks.global` must be a YAML list. diff --git a/docs/modules/cockpit/pages/modules/trino.adoc b/docs/modules/cockpit/pages/modules/trino.adoc index dae6351c..b56bf26b 100644 --- a/docs/modules/cockpit/pages/modules/trino.adoc +++ b/docs/modules/cockpit/pages/modules/trino.adoc @@ -24,7 +24,7 @@ trino: ---- <1> The coordinator as Cockpit reaches it. <2> Optional. The URL for links to the Trino web UI, defaults to `url`. -<3> `none` (default) or `basic`. +<3> `none` (default) or `basic`. Cockpit does not start with `basic` and no username or password. <4> Provides the CA certificate of Trino. Alternatively set `caCert` to a mounted file, or `insecure: true` to skip verification. Without `trino.url`, each user enters a connection in the UI. diff --git a/docs/modules/cockpit/pages/reference/environment-variables.adoc b/docs/modules/cockpit/pages/reference/environment-variables.adoc index b1bf9406..c1c3c819 100644 --- a/docs/modules/cockpit/pages/reference/environment-variables.adoc +++ b/docs/modules/cockpit/pages/reference/environment-variables.adoc @@ -36,6 +36,14 @@ Cockpit does not start if a value is invalid, and the error names every invalid |`LOG_LEVEL` |`info` |`trace`, `debug`, `info`, `warn` or `error`. + +|`LOG_PRETTY` +|`false` in production, otherwise `true` +|Human-readable instead of JSON logs on stdout. + +|`LOG_JSON_FILE` +| +|Path of a file that also receives the JSON logs, for example for a log collector. |=== == Database @@ -89,7 +97,7 @@ Cockpit does not start if a value is invalid, and the error names every invalid |`STACKABLE_COCKPIT_OIDC_DISCOVERY_URL` | -|The `.well-known/openid-configuration` URL of the OIDC provider. Login is disabled unless this, the client ID and the client secret are set. +|The `.well-known/openid-configuration` URL of the OIDC provider. Set this, the client ID and the client secret, or none of them. Without them, login is disabled; with only some, Cockpit does not start. |`STACKABLE_COCKPIT_OIDC_CLIENT_ID` | @@ -120,7 +128,7 @@ Cockpit does not start if a value is invalid, and the error names every invalid |`STACKABLE_COCKPIT_TRINO_AUTH_TYPE` |`none` -|`none` or `basic`. +|`none` or `basic`. With `basic` and `STACKABLE_COCKPIT_TRINO_URL`, the username and password are required. |`STACKABLE_COCKPIT_TRINO_AUTH_USERNAME` | From 9968d84ef98b04dfebe5f78a5b29a83e1b517f0b Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Tue, 3 Nov 2026 16:54:12 +0100 Subject: [PATCH 09/15] docs(trino): Document how Trino errors are shown --- docs/modules/cockpit/pages/modules/trino.adoc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/modules/cockpit/pages/modules/trino.adoc b/docs/modules/cockpit/pages/modules/trino.adoc index b56bf26b..c6b88f8c 100644 --- a/docs/modules/cockpit/pages/modules/trino.adoc +++ b/docs/modules/cockpit/pages/modules/trino.adoc @@ -39,6 +39,12 @@ With basic authentication, Trino must allow the Cockpit user to impersonate othe Set `trino.userImpersonation.enabled: false` to run all queries as `trino.auth.username` instead. +== Errors + +Users see the Trino error message only for errors in their own query, such as a syntax error or a missing table. +For server-side errors, Cockpit shows a generic message, because the Trino message can contain hostnames or storage paths. +The full message is logged as a warning with the Trino query ID. + == Settings * `features.trino.completion.enabled` turns code completion on or off (default `true`). From d878b8e4eb378643cb06170d83a3d85ac61884d3 Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Tue, 3 Nov 2026 16:54:12 +0100 Subject: [PATCH 10/15] docs(helm): Document that Cockpit must be served at the root path --- docs/modules/cockpit/pages/installation/helm.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/modules/cockpit/pages/installation/helm.adoc b/docs/modules/cockpit/pages/installation/helm.adoc index 67254ee6..e1d1b39e 100644 --- a/docs/modules/cockpit/pages/installation/helm.adoc +++ b/docs/modules/cockpit/pages/installation/helm.adoc @@ -17,6 +17,10 @@ IMPORTANT: Cockpit must be served over HTTPS, because session cookies and creden Cockpit itself serves plain HTTP, so terminate TLS at the Ingress or reverse proxy and use `https://` URLs for `origin` and `auth.baseUrl`. The chart creates a ClusterIP Service on port 3000 and can create an Ingress with the `ingress` values. + +Cockpit must be served at the root path `/` of its host, for example `https://cockpit.example.com/`. +Other base paths such as `https://example.com/cockpit/` are not supported, so do not route a path prefix to Cockpit or rewrite paths in the Ingress or reverse proxy. + Set `origin` to the URL users open in the browser. Behind a reverse proxy, also set the forwarded headers Cockpit trusts: From 5feb5f8ae701033937b92ee6527b0d2e115dd136 Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Wed, 4 Nov 2026 11:52:57 +0100 Subject: [PATCH 11/15] docs: Name the generated session Secret and list all prerequisites Getting started also needs the Secret Operator for the SecretClasses and an Ingress or reverse proxy that serves Cockpit over HTTPS. --- docs/modules/cockpit/pages/getting-started.adoc | 2 +- docs/modules/cockpit/pages/installation/authentication.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/cockpit/pages/getting-started.adoc b/docs/modules/cockpit/pages/getting-started.adoc index 5c637447..8ad991a5 100644 --- a/docs/modules/cockpit/pages/getting-started.adoc +++ b/docs/modules/cockpit/pages/getting-started.adoc @@ -2,7 +2,7 @@ :description: Install Stackable Cockpit on Kubernetes with Helm, connect it to an OIDC provider, PostgreSQL and Trino, and run your first SQL query. This guide installs Cockpit with Helm and runs a first Trino query. -You need an existing PostgreSQL database, an OIDC client for Cockpit and a Trino cluster. +You need an existing PostgreSQL database, an OIDC client for Cockpit, a Trino cluster, the Stackable Secret Operator and an Ingress or reverse proxy that serves `https://cockpit.example.com`. Register the OIDC client with the redirect URI `https://cockpit.example.com/api/auth/oauth2/callback/oidc`, see xref:installation/authentication.adoc[]. Create a Secret with the database password and the OIDC client secret: diff --git a/docs/modules/cockpit/pages/installation/authentication.adoc b/docs/modules/cockpit/pages/installation/authentication.adoc index 3bda95cb..94ba18da 100644 --- a/docs/modules/cockpit/pages/installation/authentication.adoc +++ b/docs/modules/cockpit/pages/installation/authentication.adoc @@ -22,7 +22,7 @@ sessionSecret: ---- <1> The URL users open in the browser. <2> Scopes requested in addition to `openid`, `profile` and `email`. -<3> The secret that signs session cookies. The chart generates one if empty and keeps it across `helm upgrade`. +<3> The secret that signs session cookies. If empty, the chart generates a Secret (`cockpit-session` for the release `cockpit`) and keeps it across `helm upgrade`. Set it explicitly when deploying with `helm template` or Argo CD, which cannot read the existing Secret, otherwise every deployment logs out all users. The OIDC claim that becomes the Trino user is configured in the xref:modules/trino.adoc#_user_identity[Trino module]. From 6e046e8b558504144ebd296768b644fd7b9d00bc Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Mon, 9 Nov 2026 12:39:30 +0100 Subject: [PATCH 12/15] docs: Fix the OIDC redirect URI and Trino URL in examples better-auth 1.7 serves the generic OAuth callback at /api/auth/callback/oidc. The Trino TLS certificate from the Secret Operator covers the headless role group Service, not trino-coordinator. --- docs/modules/cockpit/pages/getting-started.adoc | 4 ++-- docs/modules/cockpit/pages/installation/authentication.adoc | 2 +- docs/modules/cockpit/pages/modules/trino.adoc | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/modules/cockpit/pages/getting-started.adoc b/docs/modules/cockpit/pages/getting-started.adoc index 8ad991a5..1efb6455 100644 --- a/docs/modules/cockpit/pages/getting-started.adoc +++ b/docs/modules/cockpit/pages/getting-started.adoc @@ -3,7 +3,7 @@ This guide installs Cockpit with Helm and runs a first Trino query. You need an existing PostgreSQL database, an OIDC client for Cockpit, a Trino cluster, the Stackable Secret Operator and an Ingress or reverse proxy that serves `https://cockpit.example.com`. -Register the OIDC client with the redirect URI `https://cockpit.example.com/api/auth/oauth2/callback/oidc`, see xref:installation/authentication.adoc[]. +Register the OIDC client with the redirect URI `https://cockpit.example.com/api/auth/callback/oidc`, see xref:installation/authentication.adoc[]. Create a Secret with the database password and the OIDC client secret: @@ -35,7 +35,7 @@ database: tls: secretClass: tls # <2> trino: - url: https://trino-coordinator:8443 + url: https://trino-coordinator-default-headless:8443 tls: secretClass: tls # <3> ---- diff --git a/docs/modules/cockpit/pages/installation/authentication.adoc b/docs/modules/cockpit/pages/installation/authentication.adoc index 94ba18da..c127166f 100644 --- a/docs/modules/cockpit/pages/installation/authentication.adoc +++ b/docs/modules/cockpit/pages/installation/authentication.adoc @@ -2,7 +2,7 @@ :description: Configure login to Stackable Cockpit with any OpenID Connect provider, such as Keycloak, including callback URL, scopes and session secret. Users log in to Cockpit through an OpenID Connect (OIDC) provider, for example Keycloak. -Register a confidential client for Cockpit with the redirect URI `/api/auth/oauth2/callback/oidc`. +Register a confidential client for Cockpit with the redirect URI `/api/auth/callback/oidc`. [source,yaml] ---- diff --git a/docs/modules/cockpit/pages/modules/trino.adoc b/docs/modules/cockpit/pages/modules/trino.adoc index c6b88f8c..cfeae849 100644 --- a/docs/modules/cockpit/pages/modules/trino.adoc +++ b/docs/modules/cockpit/pages/modules/trino.adoc @@ -10,7 +10,7 @@ Set `trino.url` to connect all users to one Trino cluster: [source,yaml] ---- trino: - url: https://trino-coordinator:8443 # <1> + url: https://trino-coordinator-default-headless:8443 # <1> publicUrl: https://trino.example.com # <2> auth: type: basic # <3> @@ -23,6 +23,8 @@ trino: secretClass: tls # <4> ---- <1> The coordinator as Cockpit reaches it. +With `secretClass`, use the headless Service of the role group (`-coordinator--headless`), which the certificate covers. +From another namespace, append `..svc.cluster.local`. <2> Optional. The URL for links to the Trino web UI, defaults to `url`. <3> `none` (default) or `basic`. Cockpit does not start with `basic` and no username or password. <4> Provides the CA certificate of Trino. Alternatively set `caCert` to a mounted file, or `insecure: true` to skip verification. From 7921eb09904166caaa59174be0093adba52840fa Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Mon, 9 Nov 2026 14:10:16 +0100 Subject: [PATCH 13/15] docs(helm): Document the proxy buffer size for large response headers --- .../cockpit/pages/installation/helm.adoc | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/modules/cockpit/pages/installation/helm.adoc b/docs/modules/cockpit/pages/installation/helm.adoc index e1d1b39e..ff9b8784 100644 --- a/docs/modules/cockpit/pages/installation/helm.adoc +++ b/docs/modules/cockpit/pages/installation/helm.adoc @@ -32,6 +32,26 @@ proxy: hostHeader: x-forwarded-host ---- +=== Response header size + +Pages send a `Link` header that preloads their JavaScript and CSS. +It grows with the number of files a page loads and exceeds 4 KB on some pages. +Proxies with a smaller header buffer answer these pages with `502 Bad Gateway`, for example ingress-nginx and nginx with their default `4k` buffer. +Raise the buffer to 16 KB: + +[source,yaml] +---- +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/proxy-buffer-size: "16k" +---- + +For plain nginx, set `proxy_buffer_size 16k;` and `proxy_busy_buffers_size 16k;`. + +// TODO: Remove once Cockpit uses SvelteKit 3, which preloads with elements instead of a header, see https://github.com/sveltejs/kit/pull/15939. + == CA certificates For backends with a private CA, set either a SecretClass or the path of a mounted CA file: From 4d8bbe3ebf2be6f88d6ef4d0f7528126a75ad5b9 Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Tue, 10 Nov 2026 19:35:29 +0100 Subject: [PATCH 14/15] docs: pr feedback --- docs/modules/cockpit/pages/getting-started.adoc | 16 +++++++++++----- docs/modules/cockpit/pages/index.adoc | 11 +++-------- .../pages/installation/authentication.adoc | 2 +- .../cockpit/pages/installation/database.adoc | 6 +++--- docs/modules/cockpit/pages/modules/storage.adoc | 17 +++++++++++++---- docs/modules/cockpit/pages/modules/trino.adoc | 6 +++--- 6 files changed, 34 insertions(+), 24 deletions(-) diff --git a/docs/modules/cockpit/pages/getting-started.adoc b/docs/modules/cockpit/pages/getting-started.adoc index 1efb6455..ad3c2d02 100644 --- a/docs/modules/cockpit/pages/getting-started.adoc +++ b/docs/modules/cockpit/pages/getting-started.adoc @@ -2,8 +2,13 @@ :description: Install Stackable Cockpit on Kubernetes with Helm, connect it to an OIDC provider, PostgreSQL and Trino, and run your first SQL query. This guide installs Cockpit with Helm and runs a first Trino query. -You need an existing PostgreSQL database, an OIDC client for Cockpit, a Trino cluster, the Stackable Secret Operator and an Ingress or reverse proxy that serves `https://cockpit.example.com`. -Register the OIDC client with the redirect URI `https://cockpit.example.com/api/auth/callback/oidc`, see xref:installation/authentication.adoc[]. +You need: + +* a PostgreSQL database, +* an OIDC client for Cockpit with the redirect URI `https://cockpit.example.com/api/auth/callback/oidc`, see the xref:installation/authentication.adoc[authentication] page for more details, +* a Trino cluster, +* the xref:secret-operator:index.adoc[Stackable Secret Operator], +* an Ingress or reverse proxy that serves `https://cockpit.example.com`. Create a Secret with the database password and the OIDC client secret: @@ -35,13 +40,14 @@ database: tls: secretClass: tls # <2> trino: - url: https://trino-coordinator-default-headless:8443 + url: https://trino-coordinator-default-headless:8443 # <3> tls: - secretClass: tls # <3> + secretClass: tls # <4> ---- <1> The URL users open in the browser. It must use HTTPS, see xref:installation/helm.adoc#_ingress_and_reverse_proxy[Ingress and reverse proxy]. <2> The SecretClass that provides the CA certificate of PostgreSQL. Cockpit verifies the certificate by default, see xref:installation/database.adoc[]. -<3> The SecretClass that provides the CA certificate of Trino. +<3> Optional. Without `trino.url`, each user enters a Trino connection in Cockpit, see xref:modules/trino.adoc#_connection[Connection]. +<4> The SecretClass that provides the CA certificate of Trino. Install the chart: diff --git a/docs/modules/cockpit/pages/index.adoc b/docs/modules/cockpit/pages/index.adoc index 01ee96cb..05af9c3f 100644 --- a/docs/modules/cockpit/pages/index.adoc +++ b/docs/modules/cockpit/pages/index.adoc @@ -1,5 +1,5 @@ = Stackable Cockpit -:description: Stackable Cockpit is a web UI for the Stackable Data Platform with a Trino SQL editor, an S3 storage browser and a dashboard with bookmarks. +:description: Stackable Cockpit is a web UI for the Stackable Data Platform (SDP) to work with services such as Trino and S3 storage from a single place, behind one OIDC login. :github: https://github.com/stackabletech/cockpit/ [.link-bar] @@ -14,13 +14,8 @@ Follow the xref:getting-started.adoc[] guide to install Cockpit with Helm and ru == Modules -Cockpit consists of modules, and more are added over time: +Cockpit consists of modules: -* xref:modules/trino.adoc[Trino]: a SQL editor with code completion and a schema browser. +* xref:modules/trino.adoc[Trino]: an SQL editor with code completion and a schema browser. * xref:modules/storage.adoc[Storage]: a file browser for S3-compatible object storage. * xref:modules/bookmarks.adoc[Bookmarks]: links to frequently used tools on the dashboard. - -== Architecture - -Cockpit is a Node.js server that connects to Trino as the logged-in user and to S3 with the connections each user configures. -It stores users, sessions, bookmarks and storage connections in PostgreSQL. diff --git a/docs/modules/cockpit/pages/installation/authentication.adoc b/docs/modules/cockpit/pages/installation/authentication.adoc index c127166f..9ee9db88 100644 --- a/docs/modules/cockpit/pages/installation/authentication.adoc +++ b/docs/modules/cockpit/pages/installation/authentication.adoc @@ -23,7 +23,7 @@ sessionSecret: <1> The URL users open in the browser. <2> Scopes requested in addition to `openid`, `profile` and `email`. <3> The secret that signs session cookies. If empty, the chart generates a Secret (`cockpit-session` for the release `cockpit`) and keeps it across `helm upgrade`. -Set it explicitly when deploying with `helm template` or Argo CD, which cannot read the existing Secret, otherwise every deployment logs out all users. +Set it explicitly when deploying with `helm template` or Argo CD. They cannot read the existing Secret, so every deployment would generate a new one and log out all users. The OIDC claim that becomes the Trino user is configured in the xref:modules/trino.adoc#_user_identity[Trino module]. diff --git a/docs/modules/cockpit/pages/installation/database.adoc b/docs/modules/cockpit/pages/installation/database.adoc index 37bbb887..bcb1468e 100644 --- a/docs/modules/cockpit/pages/installation/database.adoc +++ b/docs/modules/cockpit/pages/installation/database.adoc @@ -1,7 +1,7 @@ = Database -:description: Connect Stackable Cockpit to PostgreSQL, which stores users, sessions, bookmarks and storage connections, and configure TLS for the connection. +:description: Connect Stackable Cockpit to its PostgreSQL database and configure TLS for the connection. -Cockpit requires a PostgreSQL database for users, sessions, bookmarks and storage connections. +Cockpit stores its data in a PostgreSQL database. It creates and migrates its tables on startup. [source,yaml] @@ -20,4 +20,4 @@ database: secretClass: tls # <2> ---- <1> `verify-full` (default), `require` (encrypt without verification) or `disable`. -<2> Provides the CA certificate of PostgreSQL. Alternatively set `caCert` to a mounted file. Both require `verify-full`. +<2> Provides the CA certificate of PostgreSQL. Alternatively set `caCert` to a mounted file. `secretClass` and `caCert` both require `verify-full`. diff --git a/docs/modules/cockpit/pages/modules/storage.adoc b/docs/modules/cockpit/pages/modules/storage.adoc index fd057e61..2694e26d 100644 --- a/docs/modules/cockpit/pages/modules/storage.adoc +++ b/docs/modules/cockpit/pages/modules/storage.adoc @@ -4,7 +4,16 @@ The storage module is a file browser for S3-compatible object storage. Users browse buckets, upload and download files, preview common formats such as CSV, Parquet, images, PDFs and archives, and edit text files. -The module is disabled by default: +The module is disabled by default. +To enable it, add an encryption key to the `cockpit` Secret: + +[source,console] +---- +$ kubectl patch secret cockpit --type merge \ + -p "{\"stringData\":{\"storage-encryption-key\":\"$(openssl rand -hex 32)\"}}" +---- + +Then set: [source,yaml] ---- @@ -19,10 +28,10 @@ storage: tls: secretClass: tls # <2> ---- -<1> A 64-character hex string, for example from `openssl rand -hex 32`. +<1> A 64-character hex string. Keep a backup, see below. <2> Optional. Provides the CA certificate of the S3 endpoints. Alternatively set `caCert` to a mounted file. -Each user adds their own S3 connections in the UI. +Each user adds their own S3 storage connections in the UI. Cockpit stores them in the database, with the credentials encrypted by the encryption key. If the key changes or is lost, the stored credentials can no longer be read. @@ -41,7 +50,7 @@ features: == Limits -Preview sizes, upload and transfer concurrency, the archive cache and the download history retention are set under `storage`, see the xref:reference/environment-variables.adoc#_storage[reference]: +Preview sizes, upload and transfer concurrency, the archive cache and the download history retention are set under `storage`, see the xref:reference/environment-variables.adoc#_storage[storage environment variables reference]: [source,yaml] ---- diff --git a/docs/modules/cockpit/pages/modules/trino.adoc b/docs/modules/cockpit/pages/modules/trino.adoc index cfeae849..644a0109 100644 --- a/docs/modules/cockpit/pages/modules/trino.adoc +++ b/docs/modules/cockpit/pages/modules/trino.adoc @@ -1,7 +1,7 @@ = Trino -:description: The Trino module of Stackable Cockpit is a SQL editor with code completion and a schema browser that runs queries as the logged-in user. +:description: The Trino module of Stackable Cockpit is an SQL editor with code completion and a schema browser that runs queries as the logged-in user. -The Trino module is a SQL editor for xref:trino:index.adoc[Trino] with syntax highlighting, code completion and a schema browser. +The Trino module is an SQL editor for xref:trino:index.adoc[Trino] with syntax highlighting, code completion and a schema browser. == Connection @@ -26,7 +26,7 @@ trino: With `secretClass`, use the headless Service of the role group (`-coordinator--headless`), which the certificate covers. From another namespace, append `..svc.cluster.local`. <2> Optional. The URL for links to the Trino web UI, defaults to `url`. -<3> `none` (default) or `basic`. Cockpit does not start with `basic` and no username or password. +<3> `none` (default) or `basic`. `basic` requires `username` and `password`, otherwise Cockpit does not start. <4> Provides the CA certificate of Trino. Alternatively set `caCert` to a mounted file, or `insecure: true` to skip verification. Without `trino.url`, each user enters a connection in the UI. From 10d305a2f7b5c6d846750eac6f6adac809b51a58 Mon Sep 17 00:00:00 2001 From: Johannes Fleck Date: Tue, 10 Nov 2026 20:10:36 +0100 Subject: [PATCH 15/15] docs: Add a dashboard screenshot to the overview page --- docs/modules/cockpit/images/dashboard.png | Bin 0 -> 101269 bytes docs/modules/cockpit/pages/index.adoc | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 docs/modules/cockpit/images/dashboard.png diff --git a/docs/modules/cockpit/images/dashboard.png b/docs/modules/cockpit/images/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..a97178e85eb3b8d196981500ceab0e0523d2e39f GIT binary patch literal 101269 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 sp0ru!PbiX~HJ&ZBH&M%~TIx~^?~uCAU3@ia2R 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ν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 Cq`d?H literal 0 HcmV?d00001 diff --git a/docs/modules/cockpit/pages/index.adoc b/docs/modules/cockpit/pages/index.adoc index 05af9c3f..232095f9 100644 --- a/docs/modules/cockpit/pages/index.adoc +++ b/docs/modules/cockpit/pages/index.adoc @@ -8,6 +8,8 @@ Stackable Cockpit is a web UI for the Stackable Data Platform (SDP). Users log in once through OpenID Connect (OIDC) and work with the platform's services from a single place. +image::dashboard.png[Cockpit dashboard with bookmarks to Trino, Superset, Airflow and other tools] + == Getting started Follow the xref:getting-started.adoc[] guide to install Cockpit with Helm and run your first Trino query.