flowx-ai chart, which deploys the core and AI services as one Helm release.flowx-ai chart turns a small set of values into the environment of every service: database URLs, credentials, identity provider settings, and trusted certificates. This page explains the model behind those values so you can point the chart at your own infrastructure and read what it renders.
For the global, groups, and services layout, and for moving from the per-service or ai-platform charts, see Migrate self-hosted FlowX.AI to the flowx-ai Helm chart.
How do values reach a service?
Each service renders from its ownservices.<name> block plus the whole global block. Nothing else in the values tree is visible to it.
- Environment variables:
global.envandservices.<name>.envare merged, and the service value wins for the same name. - Connection definitions: the chart reads servers and credentials from
global.flowx.<dependency>. The chart already ships a definition there for PostgreSQL, MongoDB, Redis, Elasticsearch, S3, SpiceDB, SMTP, and Qdrant, so a definition placed underservices.<name>.<dependency>is not read. Change the global one. - Chart defaults: Helm merges your values file into the chart defaults key by key. Set only the keys you change, for example
global.flowx.postgresql.servers.flowx.host, and keep the rest.
How does a service connect to a dependency?
Every dependency connection has two halves: a definition, which says where a server is and how to log in, and a selector, which says which service uses it. This schema is defined by theflowx-ai chart. It is not a Kubernetes or Helm convention.
Define the server
global.flowx.<dependency>.servers.<key>, set the connection details, such as host and port. The key is a name you choose, for example flowx.Define the credentials
global.flowx.<dependency>.credentials.<key>, set the login, either as plain values or from a Kubernetes secret. One credentials entry usually belongs to one service.Select them in the service
services.<name>.component.<dependency>.<entry>, reference the server with serverRef and the credentials with credentials, then add what is specific to this service, such as database.Which selector fields can I set?
PostgreSQL selectors take these fields. The other dependencies follow the same pattern with fields of their own.jdbc:postgresql://<host>:<port>/<database><parameters>, where port defaults to 5432 and parameters is an optional string on the server definition, such as ?sslmode=require.
Several connections to one dependency
A service can select more than one entry for the same dependency, for example the main database and a second one. Only one entry per dependency may omitalias: the unaliased entry is the service’s main connection, and each aliased entry is rendered under its alias. The render fails when two entries have no alias.
The process-engine service ships with two PostgreSQL entries:
Example: point the services at your PostgreSQL server
The chart’s selectors already reference a server namedflowx and one credentials entry per service. To use your own PostgreSQL server, override the server definition and, where needed, the credentials:
serverRef: "flowx" now connects to postgres.db.svc.cluster.local. With these values, process-engine connects to jdbc:postgresql://postgres.db.svc.cluster.local:5432/process_engine?sslmode=require as process_engine, and reads the password from the password key of the flowx-postgres-process-engine secret.
To send one service to a different server, add a second server definition and change only that service’s serverRef:
document-plugin keeps the credentials and database of its documentPlugin entry and changes only its server.
How do I keep passwords in Kubernetes secrets?
Any definition that holds a secret value, such as credentials or a client secret, can read it from an existing Kubernetes secret throughexistingSecret. The chart never creates these secrets: create them before you install.
existingSecret, so all its secret fields come from the same Kubernetes secret. To keep a username in a secret as well, list it in keyMapping:
What does configmap mode change?
By default, every rendered setting is an environment variable in the pod spec. With configmap mode on, the chart moves the plain settings into a ConfigMap and keeps only the secret references in the pod spec:global.flowx.configmapMode: true, or for one service with services.<name>.configmapMode: true.
Default: false
global.flowx.configmapMode takes precedence over the service value when it is set. To turn configmap mode on for a single service, leave the global key unset.How do I update one service to a newer version?
The chart builds each service’s image tag fromservices.<name>.version and sets it to the version that ships with the platform release. To roll out a fix for one service without upgrading the platform, set that key to the version FlowX gives you, then run helm upgrade with the chart version you already run:
image.tag set, the chart uses that tag instead, so remove it.
Remove the version key again when you upgrade the chart. Your values override the chart defaults on every upgrade, so a leftover key keeps that service on the old image while the rest of the platform moves to the new release.
How do I read what the chart rendered?
Render the chart locally and look at the environment of one service:# postgresql: processEngine for the selector entry processEngine, # oauth client: admin for a client, or # java resource server variables. With configmap mode on, the comments appear in the <service>-env ConfigMap instead of the pod spec.
Why does the render stop with an error?
The chart checks each enabled service before rendering it. A check that fails stops the whole render with a message that starts with the service name in brackets, so nothing reaches the cluster in a half-configured state.devtime or runtime flags, service keys at the root instead of under services:, a root-level image or podLabels, or a service whose group isn’t declared under groups:. These keys would otherwise be ignored without any warning. The message names the key and where it moved.
How do I trust a private certificate authority?
When a dependency presents a certificate from a private certificate authority (CA), the services that call it need that CA in their trust store. The chart adds it with an init container:Store the CA in a secret
Define the certificate
global.flowx.certs with type: ca, the secret name, and one keyMapping entry that points to the key of the certificate in the secret.Select it in each service
services.<name>.component.certs for every service that calls the dependency.elasticsearch, which reads ca.crt from the elasticsearch-es-http-certs-public secret. It is selected by admin, audit-core, data-search, document-plugin, and process-engine. When you add a certificate to a service that already selects elasticsearch, keep it in the list: certs: ["elasticsearch", "internal-ca"].
type: ca are imported. Each entry uses one key of its secret: when keyMapping lists several, the first one in alphabetical order is used. Use one entry per CA.Configure the identity provider
The chart renders the identity provider settings of every service fromglobal.flowx.idp. A service reads three parts of it: the provider, the clients it selects, and the resource server it selects.
Choose the provider
Setglobal.flowx.idp.provider to keycloak or entraid.
Default: keycloak
Keycloak
url.host, the Keycloak URL is https://auth.<rootDomain> by default, built from global.flowx.rootDomain. With global.flowx.singleDomain: true, it is https://<rootDomain>.
Clients
A client is an identity a service uses to call the identity provider. Like connections, clients have a definition and a selector, and a service needs both:- Definition:
global.flowx.idp.clients.<key>, withgrantType,clientId, and the client secret. - Selector:
services.<name>.component.idpClients, a list of client keys.
anonymous, designer, and solution-portal. All service account secrets are read from the keycloak-flowx-realm-clients secret, one key per client, such as KEYCLOAK_ADMIN_CLIENT_SECRET or KEYCLOAK_PROCESS_ENGINE_CLIENT_SECRET. Create that secret with the client secrets from your identity provider, or point each client’s existingSecret at your own secret.
Resource servers
A resource server is how a service checks the access tokens it receives. A service selects one withservices.<name>.component.resourceServer, and the chart reads its settings from global.flowx.idp.resourceServers.<key>.
Default selection: default
The securityType of the selected resource server must match the provider:
IDP setup incorrect.
The 5.9.6 chart’s values define only one resource server, aiPlatform, while every service selects default. To set how the core services check tokens, define default:
How do I connect to Kafka with SASL?
By default, the chart connects every service to Kafka with OAuth:global.flowx.kafka.security.authentication.type is oauth, with the flowx-service-client client in the infra realm. To log in with a username and password instead, switch the type to sasl:
global.flowx.kafka. With TLS on, the services connect with SASL_SSL, otherwise with SASL_PLAINTEXT. When you set producer or consumer, the chart uses only those credentials and ignores sasl.username and sasl.password, so set both.
How do I use Redis Sentinel or Redis Cluster?
The chart’s services select thedefault Redis server, a standalone Redis at redis-master:6379, through services.<name>.component.redis.cache. To use Redis Sentinel or Redis Cluster, change the default server definition. The chart picks the connection mode in this order, and the first one that is set wins:
urlon the service’s selectorhoston the serversentinelon the serverclusteron the server
default server keeps host: redis-master unless you clear it. Set host: "" for Sentinel or Cluster, or the services keep connecting to the standalone host.
- Sentinel
- Cluster
sentinelCredentials, which is root in the chart, the same as for Redis. To use a separate Sentinel password, add a credentials entry under global.flowx.redis.credentials and point each service’s component.redis.cache.sentinelCredentials at it.root credentials entry, which reads the redis-password key of the flowx-redis secret. Change global.flowx.redis.credentials.root to read it from your own secret.
How do I use Oracle instead of PostgreSQL?
The chart can render an Oracle connection for the Java services. The chart ships no Oracle definitions and every Java service selects PostgreSQL, so you add the definitions, then replace each service’s PostgreSQL selector with an Oracle one. Check each service’s setup guide for Oracle support before you switch it.Define the server and the credentials
jdbc:oracle:thin:@//<host>:<port>/<database><parameters>, where port defaults to 1521 and parameters is an optional string on the server definition. Set url on a selector to use a complete URL instead.Replace the PostgreSQL selector of each service
component.postgresql to ~ to remove the chart’s PostgreSQL selector, and add an Oracle entry for each connection the service had. Keep the entry keys and aliases of the PostgreSQL selector:database is the Oracle service name in the URL. The FlowX.AI Engine and the Advancing Controller must use the same database type, so move process-engine, advancing-controller, and the advancing connection of integration-designer together. See Advancing controller setup.Switch data-sync too
dataSync.component, set postgresql: ~ and add an oracle entry for each of them that moved, with the alias the job uses (engine, appmanager, authsystem, or license) and renderingTemplate: "FLOWX_DATASOURCE_{{ .alias }}", as in the job’s PostgreSQL entries.How do I scale a service and keep it available?
Each service has its own replica count, autoscaler, and disruption budget underservices.<name>. All are off by default, and every service runs global.replicaCount replicas, which is 1 unless you change it.
replicas out of the Deployment so that the autoscaler owns it, and replicaCount has no effect. Utilization targets are percentages of the container’s resource requests, so the service needs CPU or memory requests for the target you set. A minAvailable equal to the replica count blocks node drains: keep it below minReplicas.
How do I restrict network traffic to a service?
Setservices.<name>.networkPolicy.enabled: true to render a NetworkPolicy for the service. By default, it allows inbound traffic from anywhere, but only to the ports under services.<name>.service.ports, which is the HTTP port 8080 by default.
How do I collect metrics with Prometheus?
The chart renders a Prometheus OperatorServiceMonitor for each service where you turn it on. The ServiceMonitor resource type comes with the Prometheus Operator, so install it first, or the release fails to install.
ServiceMonitor scrapes the service’s management port, mngt, at /manage/actuator/prometheus, the path the Java services serve. The service must have its management port turned on with mngt.enabled, which the chart sets for its services by default.
Troubleshooting
The render stops with a message that starts with a service name in brackets
The render stops with a message that starts with a service name in brackets
global.flowx rather than the service block.A service starts without a database URL or credentials
A service starts without a database URL or credentials
serverRef and credentials of its selector match keys under global.flowx.<dependency>.servers and .credentials exactly. A key that matches nothing renders nothing. Run helm template and look for the # postgresql: <entry> comment to see what was rendered for the entry.A pod stays in CreateContainerConfigError
A pod stays in CreateContainerConfigError
existingSecret.name and keyMapping value in your values file with kubectl get secret <name> -o jsonpath='{.data}'. Without keyMapping, the key must be named like the field, for example password.Java services fail at startup with an opaque-token introspection placeholder error
Java services fail at startup with an opaque-token introspection placeholder error
default resource server uses securityType: opaque. Set it to jwt, as described in Resource servers.Calls to a dependency fail with a certificate path or PKIX error
Calls to a dependency fail with a certificate path or PKIX error
global.flowx.certs and list it in that service’s component.certs, keeping elasticsearch if it was already listed. See How do I trust a private certificate authority?The render stops because autoscaling.maxReplicas is missing
The render stops because autoscaling.maxReplicas is missing
autoscaling.enabled: true without autoscaling.maxReplicas. Set it, see How do I scale a service and keep it available?Services still connect to the standalone Redis after you configured Sentinel or Cluster
Services still connect to the standalone Redis after you configured Sentinel or Cluster
default Redis server still has host: redis-master from the chart, and host wins over sentinel and cluster. Set host: "" on the server, see How do I use Redis Sentinel or Redis Cluster?Prometheus shows the ServiceMonitor target as down after you turned on the network policy
Prometheus shows the ServiceMonitor target as down after you turned on the network policy
extraIngress rule for it, see How do I restrict network traffic to a service?
