Skip to main content

Helm Values Reference

This page contains the reference for all the Helm values options available in the Self Hosted Akuity Platform.

Parameters​

License Key​

NameDescriptionValue
licenseKey""

Image Parameters​

NameDescriptionValue
image.repositoryImage repository of the Akuity Platformus-docker.pkg.dev/akuity/akp-sh/akuity-platform
image.tagOverrides the image tag (default is the chart version)""
image.secret.enabledReference the 'akuity-pullsecrets' image pull secret from platform workloads. Disable when images are pulled without a secret (e.g. node IRSA for ECR).true
image.secret.createCreates the 'akuity-pullsecrets' secret. Set to false when the secret is provided externally (e.g. via External Secrets Operator).true
image.usernameUsername to the Akuity Platform container registry_json_key_base64
image.passwordPassword to the Akuity Platform container registry""
image.argocd.hostOverrides the Argo CD image host""
image.argocd.repoOverrides the Argo CD image repository""
image.agentServer.hostOverrides the agent server image host. If not set, the hostnil

Registry Parameters​

NameDescriptionValue
registry.useAkuityPull every image the chart and the platform controller render from Akuity's Google Artifact Registry instead of the upstream registry each image is named from. Tags do not change. A repository value set away from its default is left alone, and so is a tag the mirror does not hold. Requires image.secret.enabled: true; a Helm pre-install and pre-upgrade hook Job copies akuity-pullsecrets into traefik-external and, with dragonflydb.enabled, dragonfly-operator-system, creating a missing namespace for the release to adopt, so helm install --wait finds the credential in place. With nats.enabled it also requires global.image.registry: us-docker.pkg.dev/akuity/mirror and global.image.pullSecretNames: [akuity-pullsecrets]; with surveyor.enabled also surveyor.image.registry: us-docker.pkg.dev/akuity/mirror and surveyor.imagePullSecrets: [{name: akuity-pullsecrets}].false

Sharding Parameters​

A shard is one workload cluster. global.shard.name is this installation's own name — its controllers then manage the instances placed on that shard.

Leave global.shard.name empty on the primary cluster — the one running the portal, Dex, the migration job and the cron jobs. That cluster is also the default shard: instances created without naming a shard land on it. Every other cluster sets global.shard.name to its own name (e.g. us1).

global.shard.name cannot be changed once deployed, and must not be set to global.shard.defaultName — that value is only a display name, and the chart refuses to render such a configuration.

Connecting a shard to the primary​

The clusters do not run in isolation: the primary hosts an endpoint that every other shard opens a connection back to, so events published on one cluster reach the others. A shard that does not configure global.shard.primary is refused at render time, because the connection is required

Each shard needs three things, all taken from the primary cluster:

  • global.shard.primary.url — where to reach it.
  • global.shard.primary.caCert — the CA that signs the primary's endpoint certificate, read from the primary's nats-ca Secret (key ca.crt).
  • global.shard.primary.authKey — the credential shards authenticate with, read from the primary's nats-user-leafnode Secret (key seed.nk). The primary provisions it automatically, and should be fetched by the operator

Installations that deliver secrets out of band (External Secrets, sealed-secrets) can skip the last two and point global.shard.primary.existingSecret at a Secret holding auth.key and ca.crt instead.

Only that one endpoint has to be reachable between clusters. A shard opens a single outbound connection to it and multiplexes everything over it.

Exposing the endpoint across networks​

When the clusters sit in different locations the endpoint is usually published through a load balancer, and there are two ways to handle its certificate:

  • Keep the platform's own certificate. Add the published hostname to global.shard.primary.extraDNSNames on the primary so the certificate covers it, and keep supplying caCert on each shard.
  • Bring your own certificate. Point global.shard.primary.tlsSecret on the primary at a kubernetes.io/tls Secret — one issued by a public CA through cert-manager, for instance. Shards whose trust store already covers that CA then leave caCert empty and verify it the way any HTTPS client would. Only this endpoint changes; everything inside the cluster keeps using the certificates the platform issues itself.

Either way the connection is end-to-end TLS to the messaging server, so the load balancer has to forward TCP rather than terminate TLS itself.

Upgrading an existing installation​

Leave global.shard.name unset. The cluster you already run becomes the primary and every existing instance stays on it — nothing moves, and no other value has to change. Sharding only starts to matter once you install a second cluster with its own name.

Choosing global.shard.defaultName​

global.shard.defaultName is the name the API reports for instances on the primary shard. Treat it as fixed once the platform is installed:

  • Renaming it re-labels every instance on the primary. Anything that pinned the old name has to be updated
  • It must never match another cluster's global.shard.name. A create request naming defaultName is normalized to the primary shard, so a collision silently sends that shard's new instances to the primary cluster instead. The chart only sees one cluster's values at a time and cannot catch this for you.
  • Keep it identical on every cluster, like global.shard.available — each cluster runs a portal-server that uses it to translate shard names.

Leaving defaultName empty is only valid while available is empty too (an unsharded install then reports no region anywhere). Setting available without naming the primary shard is refused at render time: an entry meant to be the primary would otherwise stay a literal shard name that no cluster serves.

NameDescriptionValue
global.shard.nameThis installation's own shard name. Empty = the primary cluster (the one running the portal, Dex, migration job and crons); any other cluster sets its own name, e.g. us1. Cannot be changed after deployment. Upgrading an existing installation: leave this unset — that cluster becomes the primary and all existing instances stay on it.""
global.shard.defaultNameDisplay name the API reports for instances on the primary shard. Does NOT choose which cluster is primary — global.shard.name does. Treat as fixed after installation, keep it identical on every cluster, and never reuse another cluster's shard name.""
global.shard.availableShards every organization may use, on top of per-org feature gates. Use display names (e.g. ["us0","us1"]), keep the same list on every cluster, and include defaultName in it to keep the primary shard selectable. Requires defaultName to be set — the chart refuses to render otherwise. Empty means the primary shard only.[]
global.shard.primary.urlEndpoint of the primary shard that this shard connects back to, e.g. tls://nats.akuity-platform.svc.cluster.local:7422. Required on every non-primary cluster; the host must be covered by the primary's endpoint certificate (see extraDNSNames). Leave empty on the primary.""
global.shard.primary.caCertPEM CA certificate that signs the primary shard's endpoint certificate — the ca.crt value of the primary's nats-ca Secret. Leave empty when the primary serves a certificate from a publicly trusted CA (see tlsSecret): the shard then verifies it against the system trust store, exactly as any HTTPS client would. Ignored when existingSecret is set.""
global.shard.primary.authKeyCredential this shard authenticates to the primary with — the seed.nk value of the primary's nats-user-leafnode Secret, which the primary provisions on its own. Ignored when existingSecret is set.""
global.shard.primary.existingSecretName of a pre-created Secret holding auth.key and, unless the primary uses a publicly trusted certificate, ca.crt. For installations that deliver secrets out of band (External Secrets, sealed-secrets). When set, caCert and authKey are ignored and the chart renders no Secret of its own.""
global.shard.primary.extraDNSNamesSet this on the primary cluster: additional DNS names its endpoint is reachable under, beyond the in-cluster Service names it already covers. Needed when shards dial it through a load balancer or external hostname, since a shard verifies the primary against this certificate. Adding a name reissues the endpoint certificate under the existing CA, leaving connected clients undisturbed. Has no effect alongside tlsSecret, which replaces that certificate outright.[]
global.shard.primary.tlsSecretSet this on the primary cluster: name of an existing kubernetes.io/tls Secret (tls.crt + tls.key) to serve the shard endpoint with, instead of the certificate the platform issues itself. Use it to put a certificate from a public or corporate CA on the one port shards connect to — shards whose CA is already trusted can then leave caCert empty. The certificate must cover the hostname shards dial, and only this endpoint is affected: everything inside the cluster keeps using the internally issued certificates. A rotated Secret is picked up without a restart.""

Scheduling Parameters​

Tolerations applied to every workload in the chart. A workload-specific list (for example litellm.tolerations) overwrites the global list for that workload: the two are not merged, so a workload that needs the global tolerations as well must repeat them in its own list. NATS and Surveyor pods come from the vendored subcharts and take theirs from nats.podTemplate.merge.spec.tolerations and surveyor.tolerations instead.

NameDescriptionValue
tolerationsGlobal tolerations for all workload pods. A workload's own <component>.tolerations overwrites this list for that workload; the two are not merged[]

Portal Parameters​

NameDescriptionValue
portal.urlPublic URL to portal (e.g. https://akuity.example.com)""
portal.imagePullPolicyPortal server image pull policyAlways
portal.debugEnable debug logging on the portal server. Only enable in production for debugging purposes.false
portal.maxEmailInvitationsPerBatchMaximum number of invitation emails which can be sent in one go5
portal.autoscaling.enabledEnables horizontal pod autoscaling for the portal servertrue
portal.autoscaling.minReplicasSets the minimum number of replicas3
portal.autoscaling.maxReplicasSets the maximum number of replicas10
portal.autoscaling.targetCPUUtilizationPercentageSets the target CPU utilization percentage80
portal.autoscaling.targetMemoryUtilizationPercentageSets the target memory utilization percentage80
portal.seed.organization.nameCreates an organization with a given namenil
portal.seed.organization.ownerCreates an owner for the given organization with the given e-mail address.nil
portal.seed.organization.apiKey.createIf set to true, generates an api key for the given organization.nil
portal.seed.organization.apiKey.descriptionSets the description for the API Key.nil
portal.seed.organization.apiKey.roleCan be set to organization/owner (default), organization/admin or organization/membernil
portal.seed.organization.apiKey.expiryInA valid interval string (e.g 1d, 2w, 6h) or 0 (default) for no expiry.nil
portal.seed.organization.apiKey.outputFormatCan be set to wide (default) or jsonnil
portal.seed.organization.apiKey.recreateRecreate the key if it already exists (default: false)nil
portal.seed.tolerationsTolerations for the create-organization and create-api-key Job podsnil
portal.resourcesResources limits and requests for the portal server containers{}
portal.tolerationsTolerations for the portal-server pod[]
portal.serviceAccount.annotationsAnnotations for the portal-server service account{}
portal.envAdditional environment variables added to the portal server{}
portal.env.OTEL_SDK_DISABLEDDisables the OpenTelemetry SDK. Defaults to "true" (no traces exported). Set to "false" and configure the standard OTEL_TRACES_EXPORTER / OTEL_EXPORTER_OTLP_* variables to export traces to an OTLP collector.true
portal.env.OTEL_SERVICE_NAMESets the OpenTelemetry service.name resource attribute reported on this component's traces.portal-server
portal.env.MIN_ORGANIZATION_NAME_LENGTHThe minimum length of an organization name that is allowed on the platform, minimum value is 2, defaults to 4 if undefinednil
portal.env.MIN_CLUSTER_NAME_LENGTHThe minimum length of a cluster name that is allowed on the platform, minimum value is 2, defaults to 3 if undefinednil
portal.env.MIN_INSTANCE_NAME_LENGTHThe minimum length of an Argo CD instance name that is allowed on the platform, minimum value is 2, defaults to 3 if undefinednil
portal.env.PORTAL_MCP_MUTATION_ADMISSION_ENABLEDSet to "true" to turn on the shared rate limit on MCP tool calls and the destructive-tool pause. Off by default. The PORTAL_MCP_READ_*, PORTAL_MCP_WRITE_*, PORTAL_MCP_FULL_* and PORTAL_MCP_FULL_PAUSE_* variables tune it; a burst of -1 means no limit, which is the default for read-only tools.nil
portal.topologySpreadConstraintsSets topology spread constraints for the portal server deploymentnil

Platform controller Parameters​

NameDescriptionValue
platformController.imagePullPolicyPlatform controller image pull policyAlways
platformController.debugEnable debug logging on the platform controller. Only enable in production for debugging purposes.false
platformController.domainSuffixPlatform controller domain suffix to use (defaults to hostname of .portal.url)""
platformController.instanceSubDomainsEnables using nested subdomains for managed argocd/kargo instancestrue
platformController.overrideDefaultDomainsEnables setting subdomains for k3s, agent server etc. or setting the FQDN as a suffix for those services.false
platformController.userProvidedArgoCDVersionsEnables setting extra Argo CD patch versions. This is useful if an Argo CD version has been released (e.g a critical bugfix or a CVE) that is not present in the current version of the Akuity Platform.[]
platformController.tolerationsTolerations for the platform controller pod[]
platformController.serviceAccount.annotationsAnnotations for the platform controller service account{}

Resources limits and requests for the platform controller containers​

NameDescriptionValue
platformController.envAdds additional environment variables to the platform controller configmap{}
platformController.env.OTEL_SDK_DISABLEDDisables the OpenTelemetry SDK. Defaults to "true" (no traces exported). Set to "false" and configure the standard OTEL_TRACES_EXPORTER / OTEL_EXPORTER_OTLP_* variables to export traces to an OTLP collector.true
platformController.env.OTEL_SERVICE_NAMESets the OpenTelemetry service.name resource attribute reported on this component's traces.platform-controller
platformController.env.ARGOCD_APP_RESYNC_INTERVAL_SECONDSArgo CD Application resync interval in seconds (if 0 or undefined then Argo CD built-in default is used)nil
platformController.env.AGENT_STATUS_UPDATE_INTERVAL_SECONDSAgent status update interval in seconds (if 0 or undefined then Agent built-in default is used)nil
platformController.env.SHARED_K3S_DB_CONNECTION_AUTHSet to true for all tenants to use database.user and database.password credentials rather than a personal credentials for each tenant. This might be needed when connecting to the database through RDS Proxy which has a limit of 200 usersnil
platformController.commonAgentCertcommon agent cert provides the shared certificate for both *.cdsvcs.akuity.example.com as well as *.kargosvcs.akuity.example.com domains used by agents""
platformController.argocdAgentCertargocd agent cert provides the certificate for only *.cdsvcs.akuity.example.com used by argocd agents""
platformController.kargoAgentCertkargo agent cert provides the certificate for only *.kargosvcs.akuity.example.com domains used by kargo agents""

Notification controller Parameters​

NameDescriptionValue
notificationController.enabledEnabled the notification controllerfalse
notificationController.imagePullPolicyNotification controller image pull policyAlways
notificationController.debugEnable debug logging on the notification controller. Only enable in production for debugging purposes.false
notificationController.tolerationsTolerations for the notification controller pod[]
notificationController.serviceAccount.annotationsAnnotations for the notification controller service account{}
notificationController.resourcesResources limits and requests for the notification controller containers{}
notificationController.envAdds additional environment variables to the notification controller configmap{}
notificationController.env.OTEL_SDK_DISABLEDDisables the OpenTelemetry SDK. Defaults to "true" (no traces exported). Set to "false" and configure the standard OTEL_TRACES_EXPORTER / OTEL_EXPORTER_OTLP_* variables to export traces to an OTLP collector.true
notificationController.env.OTEL_SERVICE_NAMESets the OpenTelemetry service.name resource attribute reported on this component's traces.notification-controller
addonController.enabledEnabled the addon controllertrue
addonController.imagePullPolicyNotification controller image pull policyAlways
addonController.debugEnable debug logging on the addon controller. Only enable in production for debugging purposes.false
addonController.tolerationsTolerations for the addon controller pod[]
addonController.serviceAccount.annotationsAnnotations for the addon controller service account{}
addonController.resourcesResources limits and requests for the addon controller containers{}
addonController.envAdds additional environment variables to the addon controller configmap{}
addonController.env.OTEL_SDK_DISABLEDDisables the OpenTelemetry SDK. Defaults to "true" (no traces exported). Set to "false" and configure the standard OTEL_TRACES_EXPORTER / OTEL_EXPORTER_OTLP_* variables to export traces to an OTLP collector.true
addonController.env.OTEL_SERVICE_NAMESets the OpenTelemetry service.name resource attribute reported on this component's traces.addon-controller

Secret Parameters​

NameDescriptionValue
secret.createCreates the 'akuity-platform' Secrettrue

TLS Parameters​

TLS configuration for ingress. These details are used for configuring Traefik with the proper certificates.

NameDescriptionValue
tls.terminationEnabledEnable TLS for the Akuity Platform. TLS can be disabled to allow for SSL termination to be handled by a load balancer or other proxy/ingress before it reaches the Akuity Platformtrue
tls.secret.createCreates the 'akuity-platform-tls' Secret used as the Traefik default certificate. Set to false if creating the secret in another way (e.g. cert-manager)true
tls.crtTLS certificate. Can be valid for multiple domains (e.g. https://akuity.example.com, https://*.cd.akuity.example.com, https://*.cdsvcs.akuity.example.com)""
tls.keyTLS private key""
tls.additionalCertificatesList of additional TLS certificates to serve in the form of Kubernetes Secrets. This may be necessary if different certificates are used for different domains (e.g. https://akuity.example.com, https://*.cd.akuity.example.com, https://*.cdsvcs.akuity.example.com)[]

Database Parameters​

NameDescriptionValue
database.hostDatabase hostname""
database.portDatabase port5432
database.userDatabase username""
database.passwordDatabase password""
database.dbnameDatabase namepostgres
database.schemanameSchema namepublic
database.createSchemacreate schema automaticallyfalse
database.dataKey256-bit base64 encoded encryption key used for envelope encryption of sensitive data columns. A random key can be generated with the following command: openssl rand -base64 32. NOTE: loss of this key will result in permanent and irrevocable data loss!""
database.readOnlyHostDatabase read-only hostname. Used for connection load balancing of read requests to read-only database replicas. If omitted, will default to the write hostname.""
database.sslmodeDatabase SSL moderequire

Service Account Parameters​

NameDescriptionValue
serviceAccounts.signingKeyBase64 key (at least 32 bytes) that signs credentials issued by the OIDC federation token exchange. Generate with openssl rand -base64 32. Empty disables the exchange.""
serviceAccounts.allowInsecureIssuerURLAllow trusted OIDC issuers on private or http addresses (self-hosted clusters whose issuer is only reachable inside the network).false

Password Policy Parameters​

Password complexity policy applied to all platform-generated passwords (tenant Postgres users, Redis instance passwords, and agent passwords). Each field is optional — leave it unset to keep the platform default (a 21-character mixed-case alphanumeric password including special characters). These overrides exist primarily for self-hosted deployments whose database engine (e.g. GCP Cloud SQL with password_validation_policy) enforces a stricter or different policy than the platform default.

NameDescriptionValue
passwordPolicy.lengthLength of generated passwords. Leave unset (or 0) to use the platform default of 21 characters. Must be at least as large as the number of enabled character classes.nil
passwordPolicy.useSpecialCharsWhether to include non-alphanumeric characters in generated passwords. Set to false if the target database rejects passwords containing special characters; set to true if the database requires at least one special character. Leave unset to use the platform default (true).nil
passwordPolicy.useNumbersWhether to include digits in generated passwords. Leave unset to use the platform default (true).nil
passwordPolicy.useUppercaseWhether to include uppercase letters in generated passwords. Leave unset to use the platform default (true).nil
passwordPolicy.useLowercaseWhether to include lowercase letters in generated passwords. Leave unset to use the platform default (true).nil

SSO Parameters​

Single Sign-On configuration. Either OIDC or auth0 must be configured.

NameDescriptionValue
sso.oidc.enabledEnable OIDC authenticationtrue
sso.oidc.issuerOIDC issuer URL. This value is ignored if dex is enabled and served as a subpath""
sso.oidc.clientIDOIDC client ID. If dex is enabled, value will be used as Dex's client ID""
sso.oidc.clientSecretOIDC client secret. If dex is enabled, value will be used as Dex's client secret""
sso.oidc.mcpClientIDOIDC client id handed to MCP clients on the platform MCP endpoint (direct OIDC). Register a SEPARATE public PKCE application holding no API permissions beyond OIDC sign-in, and add each serving host's /mcp/oauth/callback to it — the only callback the IdP ever sees, and the only registration it needs. Leaving this empty keeps the MCP endpoint's OAuth onboarding unavailable (404, logged at startup); it does not fall back to clientID, since sharing the portal's own login application would make MCP tokens indistinguishable from browser sessions. This is for a customer-managed identity provider only: when sso.dex.enabled the chart declares its own MCP client (akuity-platform-mcp) and reaches that dex in-cluster, so nothing is owed here on either dex shape — under the portal's /dex subpath or on its own host (sso.dex.issuerSubPath false)""
sso.oidc.scopesOIDC scopes to request (default: openid,profile,email,offline_access)openid,profile,email,offline_access
sso.oidc.logoutURLOIDC logout url""
sso.oidc.insecureSkipTLSVerifySkip TLS verification of the OIDC provider. This will be needed if dex is served as a subpath, and TLS is not yet configured.false
sso.auth0.enabledEnable Auth0 configurationfalse
sso.auth0.domainAuth0 domain (e.g. example.us.auth0.com)""
sso.auth0.audienceAuth0 Audience of the token""
sso.auth0.clientIDAuth0 client id for portal servicenil
sso.auth0.cliClientIDAuth0 client id for CLInil
sso.dex.enabledInstall dexfalse
sso.dex.image.repositoryImage repository for Dexghcr.io/dexidp/dex
sso.dex.image.tagOverrides the Dex image tagv2.35.3
sso.dex.image.secret.createCreates the 'dex-pullsecrets' secretfalse
sso.dex.image.usernameUsername for the Dex container registry""
sso.dex.image.passwordPassword for the Dex container registry""
sso.dex.tolerationsTolerations for the Dex pod[]
sso.dex.imagePullSecretsImage pull secrets for Dex[]
sso.dex.serviceAccount.annotationsAnnotations for the Dex service account{}
sso.dex.secret.createCreates the 'dex' Secret whose data values will be mounted as environment variables to the Dex Deploymenttrue
sso.dex.secret.dataSecret data keys and plain-text values to set in the 'dex' Secret. These will be environment variables to dex so they can be referenced in the dex/config.yaml{}
sso.dex.resourcesResources limits and requests for the Dex containers{}
sso.dex.issuerSubPathServe dex as a subpath of the portal URL (e.g. https://akuity.example.com/dex)true
sso.dex.ingress.enabledEnable ingress to dexfalse
sso.dex.ingress.hostHost value to dex ingress""
sso.dex.configAdditional dex/config.yaml configuration. See https://dexidp.io/docs/ for dex documentation. Configuration can reference environment variables in the 'dex' Secret (e.g. $MICROSOFT_CLIENT_SECRET){}
sso.roleFromGroupsContains the SSO groups that will be automatically assigned rolesnil
sso.roleFromGroups.memberComma separated list of SSO groups that will be assigned the 'member' role""
sso.roleFromGroups.adminComma separated list of SSO groups that will be assigned the 'admin' role""
sso.roleFromGroups.ownerComma separated list of SSO groups that will be assigned the 'owner' role""
sso.roleTeamFromGroupsContains the slice of SSO groups with org and team mappingnil
sso.roleTeamFromGroups.oidcGroupSSO group namenil
sso.roleTeamFromGroups.orgRoleorg role(member or owner)nil
sso.roleTeamFromGroups.teamsslice of teams to be assignednil
sso.roleTeamFromGroups.teams.namename of the teamnil

Traefik Parameters​

Traefik is a required component of the Akuity Platform.

The Akuity Platform expects a traefik-external ingress class to be present and is installed with Traefik in this section.

NameDescriptionValue
traefik.enabledInstall Traefiktrue
traefik.service.annotationsAnnotations for the Traefik service. CAUTION: This has the potential to override annotations set by aws.enabled or compatibility.ipv6!{}
traefik.service.loadBalancerClassAllows for setting the load balancer class. By default this is empty. NOTE: once set, this cannot be changed without destroying and recreating the servicenil
traefik.tolerationsTolerations for the Traefik pod[]
traefik.imagePullSecretsExtra/optional image pull secrets for Traefik[]
traefik.serviceAccount.annotationsAnnotations for the Traefik service account{}
traefik.image.repositoryImage repository for Traefikpublic.ecr.aws/docker/library/traefik
traefik.image.tagOverrides the Traefik image tagv3.3.6
traefik.image.secret.createCreates the 'traefik-pullsecrets' secretfalse
traefik.image.usernameUsername for the Traefik container registry""
traefik.image.passwordPassword for the Traefik container registry""
traefik.crd.enabledInstall Traefik CRDstrue
traefik.websecureRedirectRedirect 80 to 443. Only set this to false for testing purposestrue
traefik.forceLoadBalancerForces the traefik service to be of type LoadBalancer. By default, if tls.terminationEnabled is true, the service will be of type LoadBalancer. If tls.terminationEnabled is false, the service will be of type ClusterIP. This allows you to override the default behavior and force the service to be of type LoadBalancer.false
traefik.autoscaling.enabledEnables horizontal pod autoscaling for Traefiktrue
traefik.autoscaling.minReplicasSets the minimum number of replicas3
traefik.autoscaling.maxReplicasSets the maximum number of replicas20
traefik.autoscaling.targetCPUUtilizationPercentageSets the target CPU utilization percentage80
traefik.autoscaling.targetMemoryUtilizationPercentageSets the target memory utilization percentage80
traefik.replicasIf autoscaling is not enabled, the number of replicas for the Traefik deployment1
traefik.resourcesResources limits and requests for the Traefik containers{}
traefik.topologySpreadConstraintsSets topology spread constraints for the Traefik deploymentnil

Network Policy Parameters​

NetworkPolicies for the platform components, for clusters whose CNI enforces a default-deny baseline. The policies are ingress only: each one allows the traffic the platform itself needs (Traefik to portal-server and Dex, portal-server and the platform controller to LiteLLM, platform pods to NATS and the bundled Postgres, Kargo API servers to the extensions API, tenant k3s and Grafana to the bundled Postgres, the load balancer to Traefik, Prometheus to the metrics ports) and leaves egress untouched. Instance namespaces are matched on the instance-id labels the platform stamps on them and carry their own policies.

The default ingressFrom peer is the Traefik this chart installs. When another ingress controller fronts the platform (traefik.enabled: false, or a legacy Ambassador front), replace ingressFrom with that controller's pods, otherwise the policies block every HTTP path to portal-server and Dex.

NameDescriptionValue
networkPolicy.enabledCreate NetworkPolicies for the platform componentsfalse
networkPolicy.ingressFromNetworkPolicy peers allowed to reach portal-server (ports 9090 and 9092) and Dex (port 5556). Defaults to the Traefik pods in the traefik-external namespace. Must be replaced when another ingress controller fronts the platform, or every HTTP path to portal-server and Dex is blocked.[]
networkPolicy.internalApiFromNetworkPolicy peers (typically ipBlock entries for the remote region's load balancer) allowed to reach the portal-server internal API on port 9098. Empty keeps the port closed, which is right for installs without remote regions.[]
networkPolicy.shardEndpointFromNetworkPolicy peers (typically ipBlock entries for the shard clusters' egress addresses) allowed to reach the shard endpoint on port 7422. Only rendered on the primary cluster, which is the only one that accepts these connections. Empty keeps the port closed, which is right for single-cluster installs — but a sharded install must set it, or every shard is cut off from the primary.[]
networkPolicy.metricsFromNetworkPolicy peers allowed to scrape the metrics ports (and, with the Grafana datasource enabled, the bundled Postgres). Defaults to every pod in the monitoring namespace. Set to an empty list to keep the metrics ports closed.[]

Other Parameters​

NameDescriptionValue
agent.insecureSkipTLSVerifySkip TLS verification from agents to Akuity Platformfalse
aws.enabledAdd AWS specific annotations to resourcestrue

Kargo Instance Parameters​

NameDescriptionValue
kargoInstanceValues.k3s.etcd_compaction_intervalInterval at which the kube-apiserver triggers Kine compaction. Lower values compact more frequently but increase database load. Only adjust after investigating database performance, instance resource limits, and workload.5m
kargoInstanceValues.k3s.kine_compact_timeoutMaximum time allowed for a single compaction transaction. Only adjust after investigating database performance, instance resource limits, and workload.5s
kargoInstanceValues.k3s.kine_compact_batch_sizeNumber of revisions to compact per batch. Smaller batches reduce per-transaction load but may take more cycles to catch up. Only adjust after investigating database performance, instance resource limits, and workload.1000

Argo CD Instance Parameters​

NameDescriptionValue
instanceValues.k3s.etcd_compaction_intervalInterval at which the kube-apiserver triggers Kine compaction. Lower values compact more frequently but increase database load. Only adjust after investigating database performance, instance resource limits, and workload.5m
instanceValues.k3s.kine_compact_timeoutMaximum time allowed for a single compaction transaction. Only adjust after investigating database performance, instance resource limits, and workload.5s
instanceValues.k3s.kine_compact_batch_sizeNumber of revisions to compact per batch. Smaller batches reduce per-transaction load but may take more cycles to catch up. Only adjust after investigating database performance, instance resource limits, and workload.1000
instanceValues.kustomizationKustomizations to be applied to Argo CD instancesnil
instanceValues.k3s_proxyk3s proxy parametersnil
instanceValues.pgpoolpgpool parametersnil
smtp.hostSMTP host""
smtp.portSMTP port587
smtp.userSMTP username""
smtp.passwordSMTP password""
liquibase.image.repositoryImage repository for Liquibasequay.io/akuity/liquibase
liquibase.image.tagOverrides the Liquibase image tag4.32
liquibase.image.secret.createCreates the 'liquibase-pullsecrets' secretfalse
liquibase.image.usernameUsername for the Liquibase container registry""
liquibase.image.passwordPassword for the Liquibase container registry""
liquibase.tolerationsTolerations for the portaldb-update Job pod[]

Dragonflydb​

Dragonflydb Operator is used to deploy and manage Dragonfly instances, this should only be enabled for experimental purposes.

NameDescriptionValue
dragonflydb.enabledInstalls the Dragonfly operator.false
dragonflydb.image.repositoryImage repository for the Dragonfly operatordocker.dragonflydb.io/dragonflydb/operator
dragonflydb.image.tagOverrides the Dragonfly operator image tagv1.3.0
dragonflydb.replicasThe number of replicas for the Dragonfly deployment2
dragonflydb.resourcesResources limits and requests for the Dragonfly operator containers{}
dragonflydb.serviceMonitorWhen set true then use a ServiceMonitor to configure scraping for the operatorfalse
dragonflydb.tolerationsTolerations for the Dragonfly operator pod[]

Instance Upgrader Parameters​

Instance Upgrader is a job that upgrades managed instances during Akuity Platform upgrade.

NameDescriptionValue
instanceUpgrader.enabledEnables the instance upgrader jobtrue
instanceUpgrader.tolerationsTolerations for the instances-upgrader Job pod[]

Compatibility​

Specify which compatibility modes will be required

NameDescriptionValue
compatibility.openshiftEnables Openshift compatibility. This option will modify platform install manifests, Argo CD instance manifests, and Kargo instance manifests to support running on Openshift.false
compatibility.sidecarContainersenables use of the Kubernetes sidecar containers feature in the platform workloadstrue
compatibility.ipv6OnlyEnables IPv6 only compatibilityfalse

Callhome Parameters​

Callhome periodically uploads a telemetry bundle to Akuity for usage tracking.

NameDescriptionValue
callhome.enabledEnable the callhome CronJobtrue
callhome.scheduleCron schedule (default: weekly on Sunday at 2am UTC)0 2 * * 0
callhome.uploadUrlAkuity callhome upload endpointhttps://telemetry-us.akuity.io/upload
callhome.imagePullPolicyImage pull policyIfNotPresent
callhome.resourcesResource requests/limits{}
callhome.tolerationsTolerations for the callhome CronJob pod[]

Log Cleanup Parameters​

Log Cleaner is a cron job that cleans up old logs stored from the database. These logs can be from different tasks like kargo analysis jobs etc.

NameDescriptionValue
logCleaner.enabledEnables the log cleaner jobfalse
logCleaner.dryRunEnables dry run mode for the log cleaner job, when enabled the entries aren't deletedfalse
logCleaner.debugEnable debug logging on the log cleaner job. Only enable in production for debugging purposes.false
logCleaner.imagePullPolicyimage pull policy for the log cleanerAlways
logCleaner.scheduleCron schedule for the log cleaner job0 0 * * *
logCleaner.resourcesResources limits and requests for the log cleaner job{}
logCleaner.tolerationsTolerations for the log cleaner CronJob pod[]

Event Cleaner Parameters​

Event Cleaner is a cron job that batch-deletes events older than a configurable retention window from the portal database.

NameDescriptionValue
eventCleaner.enabledEnables the event cleaner jobtrue
eventCleaner.dryRunEnables dry run mode for the event cleaner job, when enabled the entries aren't deletedfalse
eventCleaner.debugEnable debug logging on the event cleaner job. Only enable in production for debugging purposes.false
eventCleaner.imagePullPolicyimage pull policy for the event cleanerAlways
eventCleaner.scheduleCron schedule for the event cleaner job0 0 * * *
eventCleaner.batchSizeNumber of rows to delete per batch10000
eventCleaner.retentionDaysDelete events older than this many days90
eventCleaner.resourcesResources limits and requests for the event cleaner job{}
eventCleaner.tolerationsTolerations for the event cleaner CronJob pod[]

MCP Mutation Cleaner Parameters​

NameDescriptionValue
mcpMutationCleaner.enabledEnables hourly cleanup of expired MCP mutation rate-limit bucketstrue
mcpMutationCleaner.imagePullPolicyImage pull policy for the MCP mutation cleanerAlways
mcpMutationCleaner.scheduleCron schedule for the MCP mutation cleaner job0 * * * *
mcpMutationCleaner.resourcesResource limits and requests for the MCP mutation cleaner job{}
mcpMutationCleaner.tolerationsTolerations for the MCP mutation cleaner CronJob pod[]

Maintenance CronJob Parameters​

Scheduling for the cron jobs that have no other configuration: audit record aggregation, expired token cleanup and KubeVision event cleanup.

NameDescriptionValue
aggregator.tolerationsTolerations for the records-aggregator CronJob pod[]
blacklistedTokens.tolerationsTolerations for the blacklisted-token-cleanup CronJob pod[]
kubevision.tolerationsTolerations for the kubevision-event-cleaner CronJob pod[]

Akuity Intelligence Parameters​

Akuity Intelligence is an optional component that provides advanced insights and recommendations for your Kubernetes clusters.

NameDescriptionValue
intelligence.openAI.baseURLbase URL for OpenAI API compatible endpoints (default https://api.openai.com/v1)""
intelligence.openAI.mainModelmain model used by AI Agent (e.g. gpt-4.1)""
intelligence.openAI.searchModelmodel with search capabilities (e.g. gpt-5-search-api)""
intelligence.openAI.lightweightModellightweight model for non-critical tasks (e.g. gpt-4.1-nano)""
intelligence.openAI.apiKeyOpenAI API key for Akuity Intelligence features""
intelligence.anthropic.apiKeyAnthropic API key for Akuity Intelligence features""
intelligence.gemini.apiKeyGemini API key (Google AI Studio) for Akuity Intelligence features""

LiteLLM Parameters​

LiteLLM is a proxy server for LLM providers.

NameDescriptionValue
litellm.image.repositoryImage repository for LiteLLMquay.io/akuity/litellm
litellm.image.tagLiteLLM image tagv1.94.3
litellm.autoscaling.enabledEnables horizontal pod autoscaling for LiteLLMtrue
litellm.autoscaling.minReplicasSets the minimum number of replicas2
litellm.autoscaling.maxReplicasSets the maximum number of replicas3
litellm.autoscaling.targetCPUUtilizationPercentageSets the target CPU utilization percentage80
litellm.autoscaling.targetMemoryUtilizationPercentageSets the target memory utilization percentage80
litellm.replicasIf autoscaling is disabled, the number of replicas1
litellm.tolerationsTolerations for the LiteLLM pod[]

Monitoring Parameters​

Monitoring integration with the Prometheus Operator and Grafana. When enabled, the chart deploys ServiceMonitors and PodMonitors for scraping, a PrometheusRule with bundled alerts, a Grafana dashboard ConfigMap, and a Grafana PostgreSQL datasource Secret used by the dashboard's portal-DB-backed panels. Disabled by default. See the Monitoring guide at https://docs.akuity.io/self-hosted/monitoring for the full setup, verification, and operations reference.

NameDescriptionValue
monitoring.enabledEnable monitoring integration (ServiceMonitors, PodMonitors, PrometheusRule, Grafana dashboard, Grafana datasource)false
monitoring.serviceMonitors.enabledDeploy ServiceMonitors for platform componentstrue
monitoring.serviceMonitors.intervalPrometheus scrape interval60s
monitoring.serviceMonitors.scrapeTimeoutPrometheus scrape timeout (if empty, Prometheus uses the global scrape timeout)""
monitoring.serviceMonitors.additionalLabels.releaseLabel that satisfies kube-prometheus-stack's default serviceMonitorSelector so Prometheus discovers these ServiceMonitors out of the box. Set to your kube-prometheus-stack Helm release name if it differs. You can add more labels to this map as needed.kube-prometheus-stack
monitoring.serviceMonitors.annotationsAnnotations on ServiceMonitor resources{}
monitoring.serviceMonitors.namespaceNamespace to deploy ServiceMonitors into (defaults to release namespace)""
monitoring.serviceMonitors.relabelingsPrometheus relabel configs applied before scraping[]
monitoring.serviceMonitors.metricRelabelingsPrometheus relabel configs applied to scraped samples before ingestion[]
monitoring.serviceMonitors.honorLabelsWhen true, preserves the metric's labels when they collide with the target's labelsfalse
monitoring.podMonitors.enabledDeploy PodMonitors that scrape repo-server-delegate and repo-server-proxy metrics from instance namespaces. These only produce data when an instance uses the Repo Server Delegate feature; leaving them enabled when no instance uses it is safe and has no cost.true
monitoring.podMonitors.intervalPrometheus scrape interval60s
monitoring.podMonitors.scrapeTimeoutPrometheus scrape timeout (if empty, Prometheus uses the global scrape timeout)""
monitoring.podMonitors.additionalLabels.releaseLabel that satisfies kube-prometheus-stack's default podMonitorSelector so Prometheus discovers these PodMonitors out of the box. Set to your kube-prometheus-stack Helm release name if it differs. You can add more labels to this map as needed.kube-prometheus-stack
monitoring.podMonitors.annotationsAnnotations on PodMonitor resources{}
monitoring.podMonitors.namespaceNamespace to deploy PodMonitors into (defaults to release namespace)""
monitoring.podMonitors.relabelingsPrometheus relabel configs applied before scraping[]
monitoring.podMonitors.metricRelabelingsPrometheus relabel configs applied to scraped samples before ingestion[]
monitoring.podMonitors.honorLabelsWhen true, preserves the metric's labels when they collide with the target's labelsfalse
monitoring.prometheusRules.enabledDeploy PrometheusRule alert definitionstrue
monitoring.prometheusRules.additionalLabels.releaseLabel that satisfies kube-prometheus-stack's default ruleSelector so Prometheus loads these alert rules out of the box. Set to your kube-prometheus-stack Helm release name if it differs. You can add more labels to this map as needed.kube-prometheus-stack
monitoring.prometheusRules.annotationsAnnotations on the PrometheusRule resource{}
monitoring.prometheusRules.namespaceNamespace to deploy the PrometheusRule into (defaults to release namespace)""
monitoring.prometheusRules.additionalRulesAdditional user-defined Prometheus alerting or recording rules appended to the bundled rule groups. Entries follow the standard PrometheusRule rule schema (alert, expr, for, labels, annotations, or record + expr).[]
monitoring.grafanaDashboard.enabledDeploy the Akuity Platform Grafana dashboard as a ConfigMaptrue
monitoring.grafanaDashboard.namespaceNamespace to deploy the dashboard ConfigMap into (defaults to release namespace)""
monitoring.grafanaDashboard.additionalLabelsAdditional labels on the dashboard ConfigMap{}
monitoring.grafanaDashboard.labelLabel key that the Grafana sidecar watches to discover dashboard ConfigMaps. Must match the Grafana sidecar's configured dashboards.label.grafana_dashboard
monitoring.grafanaDashboard.labelValueValue for the Grafana sidecar discovery label. Must match the Grafana sidecar's configured dashboards.labelValue (empty string matches any value).1
monitoring.grafanaDashboard.annotationsAnnotations on the dashboard ConfigMap{}
monitoring.grafanaDashboard.folderGrafana folder to place the dashboard in. Applied via the grafana_folder annotation on the dashboard ConfigMap; the Grafana dashboard sidecar must be configured with folderAnnotation: grafana_folder for this to take effect. Leave empty to use the sidecar's default folder.""
monitoring.grafanaDatasource.enabledProvision a Grafana PostgreSQL datasource for portal DB-backed panelstrue
monitoring.grafanaDatasource.namespaceNamespace to deploy the datasource Secret into (defaults to grafanaDashboard.namespace or release namespace)""
monitoring.grafanaDatasource.additionalLabelsAdditional labels on the datasource Secret{}
monitoring.grafanaDatasource.labelLabel key that the Grafana datasource sidecar watches to discover datasource Secrets. Must match the Grafana sidecar's configured datasources.label.grafana_datasource
monitoring.grafanaDatasource.labelValueValue for the Grafana datasource sidecar discovery label. Must match the Grafana sidecar's configured datasources.labelValue (empty string matches any value).1
monitoring.grafanaDatasource.annotationsAnnotations on the datasource Secret{}
monitoring.grafanaDatasource.datasourceNameGrafana datasource name shown in the Grafana UI. When empty, defaults to the Helm release name followed by Portal DB (for example, akuity Portal DB). Dashboard panels look up the datasource by UID, not by name, so changing this does not break the bundled dashboard.""
monitoring.grafanaDatasource.datasourceUIDGrafana datasource UID referenced by dashboard panels. When empty, defaults to the Helm release name followed by -portal-db (for example, akuity-portal-db). If overridden, update the dashboard's datasource UIDs to match or panels will not load data.""
monitoring.grafanaDatasource.postgresVersionPostgreSQL server version encoded as an integer (1300 = PostgreSQL 13, 1400 = PostgreSQL 14, 1500 = PostgreSQL 15, etc.). Must match the actual Postgres version backing the portal database so Grafana uses the correct query dialect.1300
monitoring.grafanaDatasource.timescaledbEnable TimescaleDB support in the Grafana datasource. Set to true only if the portal database is running on TimescaleDB.false
monitoring.alerts.platformController.goroutinesThresholdGoroutine count threshold for the platform controller1000
monitoring.alerts.platformController.threadsThresholdThread count threshold for the platform controller50
monitoring.alerts.platformController.memoryBytesThresholdAllocated memory threshold (bytes) for the platform controller (~200 MiB)209715200
monitoring.alerts.platformController.heapObjectsThresholdHeap object count threshold for the platform controller1536000
monitoring.alerts.platformController.fileDescriptorsThresholdFile descriptor count threshold for the platform controller300
monitoring.alerts.portalServer.goroutinesThresholdGoroutine count threshold for the portal server500
monitoring.alerts.portalServer.threadsThresholdThread count threshold for the portal server50
monitoring.alerts.portalServer.memoryBytesThresholdAllocated memory threshold (bytes) for the portal server (~350 MiB)367001600
monitoring.alerts.portalServer.heapObjectsThresholdHeap object count threshold for the portal server1638400
monitoring.alerts.portalServer.fileDescriptorsThresholdFile descriptor count threshold for the portal server150
monitoring.alerts.portalServer.transmittedBytesThresholdTransmitted bytes threshold (bytes per 10m) for the portal server (~1.5 GiB)1610612736
monitoring.alerts.portalServer.slowResponseAvgSecondsAverage response time threshold (integer seconds) for the slow response alert1
monitoring.alerts.portalServer.slowResponseP90SecondsP90 response time threshold (integer seconds) for the slow response alert2
monitoring.alerts.argoCD.enabledEnable Argo CD instance and heartbeat alerts (disable if not using Argo CD)true
monitoring.alerts.argoCD.disconnectedWarningRatioFraction of disconnected Argo CD clusters that triggers a warning (0-1)0.5
monitoring.alerts.argoCD.disconnectedCriticalRatioFraction of disconnected Argo CD clusters that triggers a critical alert (0-1)0.8
monitoring.alerts.argoCD.unhealthyWarningRatioFraction of connected but unhealthy Argo CD clusters that triggers a warning (0-1)0.5
monitoring.alerts.argoCD.unhealthyCriticalRatioFraction of connected but unhealthy Argo CD clusters that triggers a critical alert (0-1)0.8
monitoring.alerts.kargo.enabledEnable Kargo instance and heartbeat alerts (disable if not using Kargo)true
monitoring.alerts.kargo.disconnectedWarningRatioFraction of disconnected Kargo agents that triggers a warning (0-1)0.6
monitoring.alerts.kargo.disconnectedCriticalRatioFraction of disconnected Kargo agents that triggers a critical alert (0-1)0.8
monitoring.alerts.kargo.unhealthyWarningRatioFraction of connected but unhealthy Kargo agents that triggers a warning (0-1)0.5
monitoring.alerts.kargo.unhealthyCriticalRatioFraction of connected but unhealthy Kargo agents that triggers a critical alert (0-1)0.8
monitoring.alerts.reconciliation.slowReconcileP90SecondsSlow reconciliation loop p90 threshold (integer seconds; fractional values are rounded)2
monitoring.alerts.reconciliation.slowEnqueueP90SecondsSlow enqueue loop p90 threshold (integer seconds; fractional values are rounded)1
monitoring.alerts.addonController.slowReconcileP90SecondsSlow addon controller reconciliation loop p90 threshold (integer seconds; fractional values are rounded)5
monitoring.alerts.addonController.slowEnqueueP90SecondsSlow addon controller enqueue loop p90 threshold (integer seconds; fractional values are rounded)1
monitoring.alerts.notificationController.slowReconcileP90SecondsSlow notification controller reconciliation loop p90 threshold (integer seconds; fractional values are rounded)1
monitoring.alerts.notificationController.slowEnqueueP90SecondsSlow notification controller enqueue loop p90 threshold (integer seconds; fractional values are rounded)1
monitoring.alerts.notificationController.deliveryFailureRateThresholdFraction of failed notification deliveries that triggers a warning (0-1, excludes web delivery method, requires >10 notifications)0.2
monitoring.alerts.notificationController.pendingRateThresholdFraction of pending notification deliveries that triggers a warning (0-1, excludes web delivery method, requires >10 notifications)0.8