Skip to content

docs(enterprise): private CA trust for Helm deployments - #1804

Open
robsyme wants to merge 4 commits into
masterfrom
docs/private-ca-helm-trust
Open

docs(enterprise): private CA trust for Helm deployments#1804
robsyme wants to merge 4 commits into
masterfrom
docs/private-ca-helm-trust

Conversation

@robsyme

@robsyme robsyme commented Aug 31, 2026

Copy link
Copy Markdown
Member

Closes EDU-1484

Why

Two problems found while working FD-7878 (Wave 1.32.4 / Platform Enterprise 25.3.6, self-hosted Harbor behind a private CA).

1. The only documented Kubernetes recipe can't work on the Helm install path. enterprise/configuration/ssl_tls.md is the sole private-CA page, and both of its Kubernetes recipes import in place:

keytool -import -trustcacerts -cacerts -storepass changeit -noprompt -alias TARGET_ALIAS -file /PRIVATE_CERT.pem

The Helm charts default containerSecurityContext.readOnlyRootFilesystem: true for backend, cron, wave, agent-backend, mcp, portal-web and pipeline-optimization (studios is the only false). So the documented command is guaranteed to fail at pod start with keytool error: java.io.FileNotFoundException: .../lib/security/cacerts (Read-only file system). This is not Wave-specific: the recipe is broken for backend and cron too, for anyone migrating manifests to charts. The page never mentions Helm, and extraEnvVars appears nowhere in the docs repo.

2. enterprise/configuration/wave.md says the thing is unsupported. Its entire "Limitations" section read:

Wave does not support container repositories with private CA SSL certificates

True for the hosted wave.seqera.io service, whose trust store a customer can't modify. False for self-hosted Wave, which is what the same page documents two sections further down. A customer reading it either doesn't file the ticket or files it expecting a no. The customer on FD-7878 is now running exactly this configuration successfully.

What changed

  • ssl_tls.md: new Use Helm charts recipe (copy the trust store to a mounted volume, import into the copy, point the JVM at it with JAVA_TOOL_OPTIONS), plus a caution on the existing in-place recipes. Includes the Picked up JAVA_TOOL_OPTIONS startup line as the verification signal, and the kubectl get deploy ... -o jsonpath check for when extraEnvVars is silently dropped.
  • wave.md: limitation scoped to the hosted service, with a link to the recipe.

Applied to platform-enterprise_docs/ and version-26.1 through version-25.1 — every version that documents the Helm install path. Patching the versioned dirs alone would fix the live pages but regress at the next release cut, so platform-enterprise_docs/ is included.

A note on JAVA_OPTS

The page's only JVM-options example is JAVA_OPTS="-Dmail.smtp.ssl.protocols=TLSv1.2", which is correct for the backend and silently wrong elsewhere. tower-backend/src/main/jib/tower.sh passes a bare ${JAVA_OPTS}; Wave's src/main/jib/launch.sh reads ${WAVE_JVM_OPTS:-<defaults>} and never looks at JAVA_OPTS. Two sibling Java services, two variable names, opposite semantics. The added note recommends JAVA_TOOL_OPTIONS, which the JVM reads itself and which adds flags without discarding each container's defaults.

Verification

The JVM behaviour in the added text was measured, not inferred, with a private CA plus an HTTPS stub and a clone of Wave's launch.sh on amazoncorretto:25 --read-only:

flag set via trustStore property connection container defaults
none (control) null SSLHandshakeException kept
JAVA_OPTS null same failure kept
WAVE_JVM_OPTS set 200 lost
JAVA_TOOL_OPTIONS set 200 kept

readOnlyRootFilesystem defaults were read from seqeralabs/helm-charts master. The recipe itself matches what the FD-7878 customer confirmed working in production; the initContainers variant mentioned in passing is the upgrade-safe alternative and is not what they ran.

Follow-ups, not in this PR

  • docs/install/configure-wave-build.md in seqeralabs/wave sets WAVE_JVM_OPTS: "-Xmx3g -Xms1g -XX:+UseG1GC", which silently discards MaxDirectMemorySize and the Netty/HTTP-client tuning. Needs a PR in that repo, since product docs are sourced there.
  • Chart side: a caCerts.existingConfigMap value would make this recipe unnecessary, and a JSON schema entry on extraEnvVars would turn the silent drop into a helm install error.

🤖 Generated with Claude Code

The only documented Kubernetes recipe for trusting a private CA imports
the certificate in place with `keytool -cacerts`. The Helm charts default
`containerSecurityContext.readOnlyRootFilesystem: true` for every
component except Studios, so that recipe fails at pod start with
`FileNotFoundException ... (Read-only file system)` on backend, cron and
wave alike.

Add a "Use Helm charts" recipe to the SSL/TLS page: copy the trust store
to a mounted volume, import into the copy, and point the JVM at it with
JAVA_TOOL_OPTIONS. Includes the startup log line that verifies the flag
landed, and a note that `JAVA_OPTS` works for backend and cron but is
ignored by Wave, which reads `WAVE_JVM_OPTS` and replaces its default
heap/GC/Netty options when set.

Also correct the Wave limitation, which claimed private-CA container
repositories are unsupported outright. That holds only for the hosted
wave.seqera.io service, whose trust store cannot be modified; self-hosted
Wave works, as verified with a customer running Wave 1.32.4 against a
private-CA Harbor registry.

Applied to platform-enterprise_docs and version-26.1 through 25.1, the
versions that document the Helm install path.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Signed-off-by: Rob Syme <rob.syme@gmail.com>
@netlify

netlify Bot commented Aug 31, 2026

Copy link
Copy Markdown

Deploy Preview for seqera-docs ready!

Name Link
🔨 Latest commit 858adfb
🔍 Latest deploy log https://app.netlify.com/projects/seqera-docs/deploys/6a962fae8a43f10008aa1e5f
😎 Deploy Preview https://deploy-preview-1804--seqera-docs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@christopher-hakkaart christopher-hakkaart left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good to me.

Note, I used this PR to format some of the headings and indentation at the same time. I've also applied our style guide to tidy up the text that was changed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants