Skip to content

fix(hosting): deploy ClickHouse from the official image instead of Bitnami#4249

Open
matt-aitken wants to merge 2 commits into
mainfrom
fix/self-hosting-official-clickhouse
Open

fix(hosting): deploy ClickHouse from the official image instead of Bitnami#4249
matt-aitken wants to merge 2 commits into
mainfrom
fix/self-hosting-official-clickhouse

Conversation

@matt-aitken

@matt-aitken matt-aitken commented Jul 13, 2026

Copy link
Copy Markdown
Member

Summary

Self-hosted deployments now run ClickHouse from the official clickhouse/clickhouse-server image instead of bitnamilegacy/clickhouse. Bitnami's free image catalog is EOL and the frozen legacy archive tops out at ClickHouse 25.7.5, below the 25.8 minimum the platform requires since v4.5.0, which broke every ClickHouse insert on chart-bundled deployments. Both stacks now default to 26.2, the same version the platform is developed and tested against.

Existing deployments keep their ClickHouse data with no manual migration.

Fixes #4197.

Details

Docker Compose: the clickhouse service uses the official image with its native env vars, plus the recommended nofile ulimits. It reuses the same named volume as before: a data-paths.xml config override points ClickHouse at the data/ subdirectory of the volume, which is exactly the layout the Bitnami image used, so old volumes work in place (including SQL-created users) and fresh installs get the identical layout.

Helm chart: the Bitnami ClickHouse subchart is replaced by a chart-owned single-node StatefulSet and Service running the official image (non-root, HTTP /ping probes, config overrides mounted into config.d, and the same data-paths.xml layout compatibility). On upgrade, the chart automatically adopts the data PVC left behind by the old subchart (data-<release>-clickhouse-shard0-0) via lookup, and fsGroup relabeling handles the uid change on first mount. Existing clickhouse.* values keep working: auth, persistence (including global.storageClass), resources, secure, external.*, and configdFiles. Bitnami-only keys (shards, replicaCount, keeper, resourcesPreset) are gone. The docs now state the 25.8 minimum for bring-your-own ClickHouse.

One caveat: lookup returns nothing when manifests are rendered without cluster access (GitOps tools that use helm template). For that case there's a new clickhouse.persistence.existingClaim value, documented in the values file and the Kubernetes self-hosting docs.

Verification

  • Full upgrade simulation for Compose: booted the ClickHouse service from the old compose file on main (Bitnami 25.5), wrote 5,000 rows, then brought the same project up with this branch's compose file. The official 26.2 server came up healthy on the same volume with all rows intact, SQL-created users working, and writes succeeding.
  • Adoption scenarios tested against real containers: old volume + root entrypoint (Compose), old volume owned by the Bitnami uid + non-root 101 with fsGroup-style group permissions (Kubernetes), and fresh volumes for both.
  • helm lint, helm template (default values, existingClaim set, external ClickHouse, and the production example) and kubeconform all pass, mirroring the release CI steps.
  • Inserts using input_format_json_infer_array_of_dynamic_from_array_of_different_types (the setting that fails on 25.7.5) succeed on the upgraded volume.

@changeset-bot

changeset-bot Bot commented Jul 13, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 7302aa9

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: e563b4fb-0a38-4517-9465-f0877ebab82c

📥 Commits

Reviewing files that changed from the base of the PR and between 4608012 and 7302aa9.

📒 Files selected for processing (2)
  • hosting/k8s/helm/templates/_helpers.tpl
  • hosting/k8s/helm/templates/clickhouse.yaml
🚧 Files skipped from review as they are similar to previous changes (2)
  • hosting/k8s/helm/templates/_helpers.tpl
  • hosting/k8s/helm/templates/clickhouse.yaml
📜 Recent review details
⏰ Context from checks skipped due to timeout. (3)
  • GitHub Check: code-quality / code-quality
  • GitHub Check: audit
  • GitHub Check: Analyze (javascript-typescript)

Walkthrough

ClickHouse configuration is updated across self-hosting documentation, Docker Compose, and Helm. Docker now uses the official image, updated credentials and paths, file limits, and a compatible data-path configuration. Helm replaces the Bitnami dependency with custom ClickHouse resources, pinned image settings, explicit ports, probes, persistence, security settings, generated URLs, and updated tests. Documentation records the ClickHouse 25.8+ requirement and external service port key.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: switching self-hosted ClickHouse from Bitnami to the official image.
Description check ✅ Passed The description covers the summary, details, and verification, though it does not fully match every template section.
Linked Issues check ✅ Passed The changes satisfy #4197 by switching to the official ClickHouse image, documenting the 25.8 minimum, and preserving upgrade paths.
Out of Scope Changes check ✅ Passed The added encoding, helper, test, and docs changes all support the ClickHouse image migration and version-floor requirements.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/self-hosting-official-clickhouse

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

🧭 Helm Chart Prerelease Published

Version: 4.5.4-pr4249.7302aa9

Install:

helm upgrade --install trigger \
  oci://ghcr.io/triggerdotdev/charts/trigger \
  --version "4.5.4-pr4249.7302aa9"

⚠️ This is a prerelease for testing. Do not use in production.

devin-ai-integration[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

…tnami

The Bitnami free image catalog is EOL and its frozen bitnamilegacy
archive tops out at ClickHouse 25.7.5, below the 25.8 floor the
platform requires since v4.5.0. The Docker Compose stack and the Helm
chart now run the official clickhouse/clickhouse-server image at 26.2,
the same version the platform is developed and tested against. The Helm
chart deploys ClickHouse with a chart-owned StatefulSet instead of the
Bitnami subchart.

Existing deployments keep their data with no manual steps: a config
override keeps the on-disk layout compatible with volumes created by
the Bitnami-based setup, Compose reuses the same named volume, and the
Helm chart automatically adopts the data PVC left behind by the old
subchart.
@matt-aitken matt-aitken force-pushed the fix/self-hosting-official-clickhouse branch from e2e7e33 to 4608012 Compare July 13, 2026 16:01
coderabbitai[bot]

This comment was marked as resolved.

…e inline credentials

The chart-deployed ClickHouse now reads CLICKHOUSE_PASSWORD from a
chart-owned Secret instead of a plaintext env value in the pod spec, and
the CLICKHOUSE_URL helpers percent-encode inline usernames and passwords
so special characters no longer produce an unparseable URL.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 1 new potential issue.

Open in Devin Review

Comment on lines +438 to +440
Inline credentials (auth.* and external.* values) are percent-encoded via
urlquery, so special characters are safe there — except spaces, which
urlquery encodes as `+` and userinfo decoding keeps literal.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔍 urlquery encodes spaces as + which may not decode correctly in URL userinfo

The comment at hosting/k8s/helm/templates/_helpers.tpl:438-440 correctly notes that Go's urlquery template function encodes spaces as + rather than %20. In the userinfo component of a URL, + is a literal character (not a space), so passwords containing spaces would be mangled. The default password (password) doesn't contain spaces, but users with space-containing passwords would hit this edge case. The comment documents it but there's no runtime guard. Worth considering a validation or a note in the values.yaml comments near auth.password.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

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.

v4.5.0 ClickHouse writers require CH ≥25.8, but the Helm chart still bundles ClickHouse 25.7.5 → every insert fails with UNKNOWN_SETTING

1 participant