From 67085f50d7e4ab53f667426cc8f9847b4ed8a1e1 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Mon, 13 Oct 2025 13:57:01 +0100 Subject: [PATCH 01/12] Add Valkey cache for scaling --- helm/flowfuse/Chart.lock | 7 +++++-- helm/flowfuse/Chart.yaml | 4 ++++ helm/flowfuse/charts/valkey-0.4.1.tgz | Bin 0 -> 23354 bytes helm/flowfuse/templates/_helpers.tpl | 24 ++++++++++++++++++++- helm/flowfuse/templates/configmap.yaml | 6 ++++++ helm/flowfuse/values.yaml | 28 +++++++++++++++++++++++++ 6 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 helm/flowfuse/charts/valkey-0.4.1.tgz diff --git a/helm/flowfuse/Chart.lock b/helm/flowfuse/Chart.lock index 4a972786..89a034fc 100644 --- a/helm/flowfuse/Chart.lock +++ b/helm/flowfuse/Chart.lock @@ -2,5 +2,8 @@ dependencies: - name: postgresql repository: https://charts.bitnami.com/bitnami version: 11.9.13 -digest: sha256:1423e37aa789fccab1a4b5db593ccda3887032de2a4814b928df938f6db1de3a -generated: "2024-02-13T12:15:48.820039+01:00" +- name: valkey + repository: oci://registry-1.docker.io/cloudpirates + version: 0.4.1 +digest: sha256:18914f01a3fbac576b655e1eca8cae8303dc16ce33df9532c1f9c800ec932289 +generated: "2025-10-10T17:09:58.788141744+01:00" diff --git a/helm/flowfuse/Chart.yaml b/helm/flowfuse/Chart.yaml index f23799c7..e86ea9c7 100644 --- a/helm/flowfuse/Chart.yaml +++ b/helm/flowfuse/Chart.yaml @@ -16,6 +16,10 @@ dependencies: import-values: - child: image parent: postgresql.image + - name: valkey + version: 0.4.1 + repository: oci://registry-1.docker.io/cloudpirates + condition: forge.localValey maintainers: - name: "FlowFuse Inc" url: "https://flowfuse.com" diff --git a/helm/flowfuse/charts/valkey-0.4.1.tgz b/helm/flowfuse/charts/valkey-0.4.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c099c51d0442d9533fbbc99667aae8def83c359f GIT binary patch literal 23354 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 F`44JRft>&V literal 0 HcmV?d00001 diff --git a/helm/flowfuse/templates/_helpers.tpl b/helm/flowfuse/templates/_helpers.tpl index dd39bfd2..4dfd9db4 100644 --- a/helm/flowfuse/templates/_helpers.tpl +++ b/helm/flowfuse/templates/_helpers.tpl @@ -317,4 +317,26 @@ Usage: {{ include "forge.filteredBrokerIngressAnnotations" . }} {{- if $filtered -}} {{- toYaml $filtered -}} {{- end -}} -{{- end -}} \ No newline at end of file +{{- end -}} + +{{/* +Get the valkey host name. +*/}} +{{- define "forge.valkeyHost" -}} +{{- if not .Values.valkey.host -}} + {{- printf "%s-%s" .Release.Name "valkey" }} +{{- else -}} + {{- .Values.valkey.host }} +{{- end -}} +{{- end -}} + +{{/* +Get the valkey port number. +*/}} +{{- define "forge.valkeyPort" -}} +{{- if not .Values.valkey.host -}} + 6379 +{{- else -}} + {{- .Values.valkey.port }} +{{- end -}} +{{- end -}} diff --git a/helm/flowfuse/templates/configmap.yaml b/helm/flowfuse/templates/configmap.yaml index 30641e93..49bae8ea 100644 --- a/helm/flowfuse/templates/configmap.yaml +++ b/helm/flowfuse/templates/configmap.yaml @@ -359,3 +359,9 @@ data: {{ toYaml .Values.forge.tables.driver | indent 8 }} {{- end -}} {{- end -}} + {{- if gt (int .Values.forge.replicas) 1 }} + cache: + driver: 'redis' + options: + url: redis://{{ include "forge.valkeyHost" . }}:{{ include "forge.valkeyPort" . }} + {{- end -}} diff --git a/helm/flowfuse/values.yaml b/helm/flowfuse/values.yaml index 73611435..d9b14706 100644 --- a/helm/flowfuse/values.yaml +++ b/helm/flowfuse/values.yaml @@ -356,3 +356,31 @@ npmRegistry: repository: "flowfuse/npm-registry" tag: "latest" podSecurityContext: {} + +valkey: + replicaCount: 1 + + persistence: + enabled: false + size: 20Gi + + resources: + requests: + memory: 512Mi + cpu: 250m + limits: + memory: 1Gi + cpu: 500m + + auth: + enabled: false + + metrics: + enabled: true + serviceMonitor: + enabled: true + + config: + maxMemory: 800mb + maxMemoryPolicy: allkeys-lru + save: 3600 1 300 100 60 10000 \ No newline at end of file From d704642400ed8cb1a4c8e544f9aef0fc4865fa0e Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Mon, 13 Oct 2025 14:11:41 +0100 Subject: [PATCH 02/12] Add docs and fix values.yaml lint --- helm/flowfuse/README.md | 9 +++++++++ helm/flowfuse/values.yaml | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/helm/flowfuse/README.md b/helm/flowfuse/README.md index f1ee58b3..5a284158 100644 --- a/helm/flowfuse/README.md +++ b/helm/flowfuse/README.md @@ -355,6 +355,15 @@ Note: External secret must contain following keys: - `postgress-password` - the password to use for the postgres user (equivalent to `postgresql.auth.postgresPassword` key) +### Valkey Shared Cache +- `valkey.replicaCount` Number of Redis instances (default `1`) +- `valkey.persistence.enabled` Should Valkey persist to disk (default `false`) +- `valkey.persistence.size` How large a storage volume should be created if enabled (default `20Gi`) +- `valkey.auth.enabled` Should Valkey require authentication (default `false`) +- `valkey.auth.password` Set a password (default not set, will generate if enabled) +- `valkey.metrics.enabled` Enabled metrics endpoint (default `true`) +- `valkey.config` allows to overwrite the default Valkey configuration + ### Liveness, readiness and startup probes Following values can be used to configure the liveness, readiness and startup probes for all pods: diff --git a/helm/flowfuse/values.yaml b/helm/flowfuse/values.yaml index d9b14706..db93b573 100644 --- a/helm/flowfuse/values.yaml +++ b/helm/flowfuse/values.yaml @@ -374,7 +374,7 @@ valkey: auth: enabled: false - + metrics: enabled: true serviceMonitor: @@ -383,4 +383,4 @@ valkey: config: maxMemory: 800mb maxMemoryPolicy: allkeys-lru - save: 3600 1 300 100 60 10000 \ No newline at end of file + save: 3600 1 300 100 60 10000 From d99cd307f8ee0a26eb4b1d27c092d6a39ed0ebd5 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Tue, 14 Oct 2025 09:25:01 +0100 Subject: [PATCH 03/12] Make metrics off by default --- helm/flowfuse/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/flowfuse/values.yaml b/helm/flowfuse/values.yaml index db93b573..278bc275 100644 --- a/helm/flowfuse/values.yaml +++ b/helm/flowfuse/values.yaml @@ -376,7 +376,7 @@ valkey: enabled: false metrics: - enabled: true + enabled: false serviceMonitor: enabled: true From 5c56ee4f00e02fd9283cc6c066dbc00496b6593f Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Tue, 14 Oct 2025 17:29:53 +0100 Subject: [PATCH 04/12] Allow external REDIS URL and always use Valkey --- helm/flowfuse/Chart.yaml | 2 +- helm/flowfuse/README.md | 6 +++++- helm/flowfuse/templates/configmap.yaml | 8 +++++--- helm/flowfuse/values.yaml | 1 + 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/helm/flowfuse/Chart.yaml b/helm/flowfuse/Chart.yaml index e86ea9c7..c32f27e5 100644 --- a/helm/flowfuse/Chart.yaml +++ b/helm/flowfuse/Chart.yaml @@ -19,7 +19,7 @@ dependencies: - name: valkey version: 0.4.1 repository: oci://registry-1.docker.io/cloudpirates - condition: forge.localValey + condition: forge.localValkey maintainers: - name: "FlowFuse Inc" url: "https://flowfuse.com" diff --git a/helm/flowfuse/README.md b/helm/flowfuse/README.md index 5a284158..2d4fc285 100644 --- a/helm/flowfuse/README.md +++ b/helm/flowfuse/README.md @@ -28,6 +28,7 @@ For other values please refer to the documentation below. - `forge.https` is the Forge App accessed via HTTPS (default `true`) - `forge.registry` the hostname for the container registry used for FlowFuse images and as a fallback for init containers and other images in this chart (default: empty, meaning Docker Hub) - `forge.localPostgresql` Deploy a PostgreSQL v14 Database into Kubernetes cluster (default `true`) + - `forge.localValkey` Deploy a Valkey Cache instacne (default `true`) - `forge.initContainers.config.image.registry` optional registry override used only for the "config" init container image; falls back to `forge.registry` when unset - `forge.initContainers.waitForLocalDb.image.registry` optional registry override used only for the "wait-for-local-db" init container image; falls back to `forge.registry` when unset - `forge.cloudProvider` can be `aws` or `openshift` but will include more as needed (default not set) @@ -356,7 +357,10 @@ Note: External secret must contain following keys: ### Valkey Shared Cache -- `valkey.replicaCount` Number of Redis instances (default `1`) +- `valkey.host` Hostname for external Valkey/Redis instance (default empty) +- `valkey.port` Port for external Valkey/Redis instance (default empty) +- `valkey.url` Full URL for an external Valkey/Redis instance (default empty) +- `valkey.replicaCount` Number of Valkey instances (default `1`) - `valkey.persistence.enabled` Should Valkey persist to disk (default `false`) - `valkey.persistence.size` How large a storage volume should be created if enabled (default `20Gi`) - `valkey.auth.enabled` Should Valkey require authentication (default `false`) diff --git a/helm/flowfuse/templates/configmap.yaml b/helm/flowfuse/templates/configmap.yaml index 49bae8ea..4664f329 100644 --- a/helm/flowfuse/templates/configmap.yaml +++ b/helm/flowfuse/templates/configmap.yaml @@ -358,10 +358,12 @@ data: driver: {{ toYaml .Values.forge.tables.driver | indent 8 }} {{- end -}} - {{- end -}} - {{- if gt (int .Values.forge.replicas) 1 }} + {{- end }} cache: driver: 'redis' options: + {{- if .Values.valkey.url }} + url: {{ .Values.valkey.url }} + {{ else }} url: redis://{{ include "forge.valkeyHost" . }}:{{ include "forge.valkeyPort" . }} - {{- end -}} + {{- end -}} diff --git a/helm/flowfuse/values.yaml b/helm/flowfuse/values.yaml index 278bc275..1f803535 100644 --- a/helm/flowfuse/values.yaml +++ b/helm/flowfuse/values.yaml @@ -2,6 +2,7 @@ forge: replicas: 1 revisionHistoryLimit: 10 localPostgresql: true + localValkey: true https: true projectNamespace: flowforge projectSelector: From 7cdacbb2bf29d8fc5c2455daaa9f3af664198341 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Tue, 14 Oct 2025 17:37:56 +0100 Subject: [PATCH 05/12] Update lock file --- helm/flowfuse/Chart.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm/flowfuse/Chart.lock b/helm/flowfuse/Chart.lock index 89a034fc..e0a81fd2 100644 --- a/helm/flowfuse/Chart.lock +++ b/helm/flowfuse/Chart.lock @@ -5,5 +5,5 @@ dependencies: - name: valkey repository: oci://registry-1.docker.io/cloudpirates version: 0.4.1 -digest: sha256:18914f01a3fbac576b655e1eca8cae8303dc16ce33df9532c1f9c800ec932289 -generated: "2025-10-10T17:09:58.788141744+01:00" +digest: sha256:1e13c34b13da4af2417772e3e16a58cc121a626c6b876cb8a6d58d398abb291b +generated: "2025-10-14T17:37:27.179684443+01:00" From 7b28de5d6bbb4eb6a0d56c1e15bcb78167b3feca Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Mon, 13 Oct 2025 13:57:01 +0100 Subject: [PATCH 06/12] Add Valkey cache for scaling --- helm/flowfuse/values.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/helm/flowfuse/values.yaml b/helm/flowfuse/values.yaml index 1f803535..90338a07 100644 --- a/helm/flowfuse/values.yaml +++ b/helm/flowfuse/values.yaml @@ -375,9 +375,9 @@ valkey: auth: enabled: false - + metrics: - enabled: false + enabled: true serviceMonitor: enabled: true @@ -385,3 +385,4 @@ valkey: maxMemory: 800mb maxMemoryPolicy: allkeys-lru save: 3600 1 300 100 60 10000 + From 37b8677e0a83948f03e948c7a4565de37744393d Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Mon, 13 Oct 2025 14:11:41 +0100 Subject: [PATCH 07/12] Add docs and fix values.yaml lint --- helm/flowfuse/values.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/helm/flowfuse/values.yaml b/helm/flowfuse/values.yaml index 90338a07..65a1256b 100644 --- a/helm/flowfuse/values.yaml +++ b/helm/flowfuse/values.yaml @@ -375,7 +375,7 @@ valkey: auth: enabled: false - + metrics: enabled: true serviceMonitor: @@ -385,4 +385,3 @@ valkey: maxMemory: 800mb maxMemoryPolicy: allkeys-lru save: 3600 1 300 100 60 10000 - From 06bab8ae5ebd0b74188f4aed3d660ae6f8fa208b Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Tue, 14 Oct 2025 09:25:01 +0100 Subject: [PATCH 08/12] Make metrics off by default --- helm/flowfuse/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/flowfuse/values.yaml b/helm/flowfuse/values.yaml index 65a1256b..1f803535 100644 --- a/helm/flowfuse/values.yaml +++ b/helm/flowfuse/values.yaml @@ -377,7 +377,7 @@ valkey: enabled: false metrics: - enabled: true + enabled: false serviceMonitor: enabled: true From 4326bd0ca7283dc97e7b516cd5bf7936c3b7e0b1 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Wed, 15 Oct 2025 10:26:15 +0100 Subject: [PATCH 09/12] Update helm/flowfuse/README.md Co-authored-by: PPawlowski --- helm/flowfuse/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/flowfuse/README.md b/helm/flowfuse/README.md index 2d4fc285..97ac4605 100644 --- a/helm/flowfuse/README.md +++ b/helm/flowfuse/README.md @@ -365,7 +365,7 @@ Note: External secret must contain following keys: - `valkey.persistence.size` How large a storage volume should be created if enabled (default `20Gi`) - `valkey.auth.enabled` Should Valkey require authentication (default `false`) - `valkey.auth.password` Set a password (default not set, will generate if enabled) -- `valkey.metrics.enabled` Enabled metrics endpoint (default `true`) +- `valkey.metrics.enabled` Enabled metrics endpoint (default `false`) - `valkey.config` allows to overwrite the default Valkey configuration ### Liveness, readiness and startup probes From 33f278b06feb5d1f4f51d91bb0e1431b8aad66d0 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Mon, 2 Feb 2026 13:37:06 +0000 Subject: [PATCH 10/12] Reveiw updates --- helm/flowfuse/README.md | 6 +++--- helm/flowfuse/values.yaml | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/helm/flowfuse/README.md b/helm/flowfuse/README.md index 97ac4605..5d533903 100644 --- a/helm/flowfuse/README.md +++ b/helm/flowfuse/README.md @@ -357,9 +357,9 @@ Note: External secret must contain following keys: ### Valkey Shared Cache -- `valkey.host` Hostname for external Valkey/Redis instance (default empty) -- `valkey.port` Port for external Valkey/Redis instance (default empty) -- `valkey.url` Full URL for an external Valkey/Redis instance (default empty) +- `valkey.host` Hostname for external Valkey/Redis instance (default `-valkey`) +- `valkey.port` Port for external Valkey/Redis instance (default `6379`) +- `valkey.url` Full URL for an external Valkey/Redis instance (default empty, this take priority over `valkey.host` & `valkey.port`) - `valkey.replicaCount` Number of Valkey instances (default `1`) - `valkey.persistence.enabled` Should Valkey persist to disk (default `false`) - `valkey.persistence.size` How large a storage volume should be created if enabled (default `20Gi`) diff --git a/helm/flowfuse/values.yaml b/helm/flowfuse/values.yaml index 1f803535..d09b5624 100644 --- a/helm/flowfuse/values.yaml +++ b/helm/flowfuse/values.yaml @@ -363,7 +363,6 @@ valkey: persistence: enabled: false - size: 20Gi resources: requests: @@ -378,8 +377,6 @@ valkey: metrics: enabled: false - serviceMonitor: - enabled: true config: maxMemory: 800mb From 174b94b590e47a43ec0b58466bed021973633944 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Tue, 3 Feb 2026 15:08:51 +0000 Subject: [PATCH 11/12] Make Valkey password generation more explicit --- helm/flowfuse/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm/flowfuse/README.md b/helm/flowfuse/README.md index 5d533903..74711630 100644 --- a/helm/flowfuse/README.md +++ b/helm/flowfuse/README.md @@ -364,7 +364,7 @@ Note: External secret must contain following keys: - `valkey.persistence.enabled` Should Valkey persist to disk (default `false`) - `valkey.persistence.size` How large a storage volume should be created if enabled (default `20Gi`) - `valkey.auth.enabled` Should Valkey require authentication (default `false`) -- `valkey.auth.password` Set a password (default not set, will generate if enabled) +- `valkey.auth.password` Set a password (default not set, will generate if auth enabled) - `valkey.metrics.enabled` Enabled metrics endpoint (default `false`) - `valkey.config` allows to overwrite the default Valkey configuration From 453171b8fc83e1973041b7e13fa35dafdf0e9ee3 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Tue, 3 Feb 2026 16:09:06 +0000 Subject: [PATCH 12/12] Update valkey chart --- helm/flowfuse/Chart.lock | 6 +++--- helm/flowfuse/Chart.yaml | 2 +- helm/flowfuse/charts/valkey-0.15.3.tgz | Bin 0 -> 35319 bytes helm/flowfuse/charts/valkey-0.4.1.tgz | Bin 23354 -> 0 bytes 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 helm/flowfuse/charts/valkey-0.15.3.tgz delete mode 100644 helm/flowfuse/charts/valkey-0.4.1.tgz diff --git a/helm/flowfuse/Chart.lock b/helm/flowfuse/Chart.lock index e0a81fd2..6664fb81 100644 --- a/helm/flowfuse/Chart.lock +++ b/helm/flowfuse/Chart.lock @@ -4,6 +4,6 @@ dependencies: version: 11.9.13 - name: valkey repository: oci://registry-1.docker.io/cloudpirates - version: 0.4.1 -digest: sha256:1e13c34b13da4af2417772e3e16a58cc121a626c6b876cb8a6d58d398abb291b -generated: "2025-10-14T17:37:27.179684443+01:00" + version: 0.15.3 +digest: sha256:e43b7e22bffb62a4f6c6042e837e5bcb9e7a6e2f5066d96bcf62ce05ef7bab03 +generated: "2026-02-03T16:07:53.32473377Z" diff --git a/helm/flowfuse/Chart.yaml b/helm/flowfuse/Chart.yaml index c32f27e5..40b6bb62 100644 --- a/helm/flowfuse/Chart.yaml +++ b/helm/flowfuse/Chart.yaml @@ -17,7 +17,7 @@ dependencies: - child: image parent: postgresql.image - name: valkey - version: 0.4.1 + version: 0.15.3 repository: oci://registry-1.docker.io/cloudpirates condition: forge.localValkey maintainers: diff --git a/helm/flowfuse/charts/valkey-0.15.3.tgz b/helm/flowfuse/charts/valkey-0.15.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..52d88a38bd2f574ddb13518e0a8f1d08f2cf6976 GIT binary patch literal 35319 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

g&)nZh3msV*$ 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

;b%~--Igh>U% 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 literal 0 HcmV?d00001 diff --git a/helm/flowfuse/charts/valkey-0.4.1.tgz b/helm/flowfuse/charts/valkey-0.4.1.tgz deleted file mode 100644 index c099c51d0442d9533fbbc99667aae8def83c359f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23354 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 F`44JRft>&V