A Helm chart for Obot
| Repository | Name | Version |
|---|---|---|
| substrate | 0.1.0 |
To install the chart with the release name obot:
helm repo add obot https://charts.obot.ai
helm install obot obot/obot
This chart defaults to the open source version of Obot.
If you want to use the enterprise version of Obot instead, set image.repository to ghcr.io/obot-platform/obot-enterprise. To install this version, you must create an imagePullSecret and configure that in the chart.
| Key | Type | Default | Description |
|---|---|---|---|
| additionalLabels | object | {} |
|
| affinity | object | {} |
Configure affinity rules for pod scheduling |
| config.AWS_REGION | string | "" |
An AWS region, used to access AWS KMS |
| config.KINM_DB_CONNECTIONS | string | "5" |
Advanced - the number of connections in the database pool for kinm, both open and idle connections |
| config.KINM_DB_DISABLE_NOTIFY | string | "false" |
Advanced - disables kinm’s use of PostgreSQL LISTEN/NOTIFY, so replicas learn about each other’s writes by polling |
| config.KINM_DB_MAX_CONNECTIONS | string | "5" |
Advanced - the number of open connections in the database pool for kinm, overrides KINM_DB_CONNECTIONS |
| config.KINM_DB_MAX_CONNECTION_LIFETIME_SECONDS | string | "180" |
Advanced - the maximum lifetime of a connection in the database pool for kinm in seconds |
| config.KINM_DB_MAX_IDLE_CONNECTIONS | string | "2" |
Advanced - the number of idle connections in the database pool for kinm, overrides KINM_DB_CONNECTIONS |
| config.KINM_DB_NOTIFY_DEBOUNCE_MILLISECONDS | string | "1000" |
Advanced - how often change notifications may wake the watches on one table in kinm, in milliseconds |
| config.KINM_DB_WATCH_POLL_SECONDS | string | "120" |
Advanced - how long a kinm watch waits before listing again when nothing has woken it, in seconds, while the change listener is connected |
| config.NAH_THREADINESS | string | "10000" |
Advanced - sets the number of concurrent threads that can run in the Obot controller |
| config.OBOT_AUTH_PROVIDER_POSTGRES_CONNECTION_LIFETIME_SECONDS | string | "180" |
Advanced - the maximum lifetime of a connection in the database pool for the auth provider in seconds |
| config.OBOT_AUTH_PROVIDER_POSTGRES_MAX_CONNECTIONS | string | "5" |
Advanced - the maximum number of connections in the database pool for the auth provider |
| config.OBOT_AUTH_PROVIDER_POSTGRES_MAX_IDLE_CONNECTIONS | string | "2" |
Advanced - the maximum number of idle connections in the database pool for the auth provider |
| config.OBOT_GCP_KMS_KEY_URI | string | "" |
The URI of a Google Cloud KMS key, used for encryption |
| config.OBOT_SERVER_AUDIT_LOGS_COMPRESS_FILE | bool | true |
Whether to compress audit log files |
| config.OBOT_SERVER_AUDIT_LOGS_MODE | string | "off" |
Configures the storage backend for audit logs in Obot. Can be ‘off’, ‘disk’, or ‘s3’ |
| config.OBOT_SERVER_AUDIT_LOGS_STORE_S3BUCKET | string | "" |
The name of the S3 bucket to store audit logs in. Only used if config.OBOT_SERVER_AUDIT_LOGS_MODE is ‘s3’ |
| config.OBOT_SERVER_AUDIT_LOGS_STORE_S3ENDPOINT | string | "" |
If config.OBOT_SERVER_AUDIT_LOGS_MODE is ‘s3’ and you are not using AWS S3, this needs to be set to the S3 api endpoint of your provider. |
| config.OBOT_SERVER_AUDIT_LOGS_USE_PATH_STYLE | bool | false |
Whether to use path style for S3 |
| config.OBOT_SERVER_AUTHENTICATED_RATE_LIMIT | string | "" |
Rate limit for authenticated non-admin requests in requests per second. Tracked by user ID. Admin users are exempt. Defaults to 200. |
| config.OBOT_SERVER_AUTH_ADMIN_EMAILS | string | "" |
A comma separated list of email addresses that will have the Admin role in Obot. |
| config.OBOT_SERVER_AUTH_OWNER_EMAILS | string | "" |
A comma separated list of email addresses that will have the Owner role in Obot. |
| config.OBOT_SERVER_DAILY_USER_INPUT_TOKEN_LIMIT | string | "" |
Daily input token limit per user in the LLM gateway’s “Daily token limit” budget, which the gateway puts on every profile when it first starts. Only used then; after that, edit each profile’s budget under LLM Gateway > Profiles. Set to a negative value to leave out this limit. Defaults to 10000000. |
| config.OBOT_SERVER_DAILY_USER_OUTPUT_TOKEN_LIMIT | string | "" |
Daily output token limit per user in the LLM gateway’s “Daily token limit” budget, which the gateway puts on every profile when it first starts. Only used then. Set to a negative value to leave out this limit. Defaults to 100000. |
| config.OBOT_SERVER_DISABLE_UPDATE_CHECK | string | "" |
Disable the Obot server update check. Defaults to false. |
| config.OBOT_SERVER_DISALLOW_LINK_LOCAL_MCP | string | "" |
Disallow MCP servers that resolve to link-local addresses. Defaults to true. |
| config.OBOT_SERVER_DISALLOW_LOCALHOST_MCP | string | "" |
Disallow MCP servers that try to connect to localhost. Defaults to true. |
| config.OBOT_SERVER_DISALLOW_PRIVATE_IPMCP | string | "" |
Disallow MCP servers that resolve to private IP addresses. Defaults to true. |
| config.OBOT_SERVER_EGRESS_AUDIT_LOG_RETENTION_DAYS | int | 90 |
|
| config.OBOT_SERVER_ENABLE_AUTHENTICATION | bool | false |
Enables authentication for Obot |
| config.OBOT_SERVER_ENABLE_REGISTRY_AUTH | bool | false |
Enables authentication for the MCP registry API. When false (default), registry is accessible without authentication and returns only default catalog items with wildcard access control rules. |
| config.OBOT_SERVER_ENCRYPTION_CONFIG_FILE | string | "" |
The path to a file containing the encryption configuration. Only used if config.OBOT_SERVER_ENCRYPTION_PROVIDER is ‘custom’ |
| config.OBOT_SERVER_ENCRYPTION_PROVIDER | string | "" |
Configures an encryption provider for credentials in Obot |
| config.OBOT_SERVER_FORCE_DYNAMIC_CLIENT | bool | false |
Force Dynamic Client Registration when Obot authenticates to remote MCP servers, even when the authorization server supports Client ID Metadata Documents. Defaults to false. |
| config.OBOT_SERVER_HIDE_K8S_DETAILS | bool | false |
Hide Kubernetes configuration details such as the Server Scheduling page from the UI. Defaults to false. |
| config.OBOT_SERVER_HOSTNAME | string | "" |
The hostname of your Obot instance, including protocol |
| config.OBOT_SERVER_LOCAL_AUTH_INITIAL_OWNER_EMAIL | string | "" |
Provisions this email as the initial owner through the built-in local auth provider. Requires secret.OBOT_SERVER_LOCAL_AUTH_INITIAL_OWNER_SETUP_TOKEN. |
| config.OBOT_SERVER_LOCAL_AUTH_INITIAL_OWNER_SETUP_TOKEN_EXPIRATION_HOURS | string | "168" |
How long the initial owner setup link remains valid. The link can be reopened until password setup completes. |
| config.OBOT_SERVER_MCPAUDIT_LOGS_PERSIST_BATCH_SIZE | string | "" |
The batch size to use when persisting MCP audit logs to the database. Defaults to 1000 |
| config.OBOT_SERVER_MCPAUDIT_LOG_PERSIST_INTERVAL_SECONDS | string | "" |
The interval in seconds to persist MCP audit logs to the database. Defaults to 5 seconds. |
| config.OBOT_SERVER_MCPBASE_IMAGE | string | "" |
Deploy MCP servers in the cluster using this base image. |
| config.OBOT_SERVER_MCPCLUSTER_DOMAIN | string | "" |
The cluster domain to use for MCP services. Defaults to cluster.local. Only matters if the above image is set. |
| config.OBOT_SERVER_MCPDEFAULT_DENY_ALL_EGRESS | string | "" |
Default new MCP servers to allow all egress or deny all egress when a network policy provider is configured. Set to false to default to allow all egress, or true to default to deny all egress. Defaults to false. |
| config.OBOT_SERVER_MCPHTTPWEBHOOK_BASE_IMAGE | string | "" |
Deploy MCP HTTP webhook servers in the cluster using this base image. |
| config.OBOT_SERVER_MCPNETWORK_POLICY_PROVIDER_CHART_NAME | string | "" |
Helm chart name for the network policy provider chart. Setting this enables network policy integration. |
| config.OBOT_SERVER_MCPNETWORK_POLICY_PROVIDER_CHART_PATH | string | "" |
Local filesystem path to the network policy provider chart. Setting this enables network policy integration. |
| config.OBOT_SERVER_MCPNETWORK_POLICY_PROVIDER_CHART_REPO | string | "" |
Helm repository URL for the network policy provider chart. Used when config.OBOT_SERVER_MCPNETWORK_POLICY_PROVIDER_CHART_NAME is set. |
| config.OBOT_SERVER_MCPNETWORK_POLICY_PROVIDER_CHART_VERSION | string | "" |
Helm chart version for the network policy provider chart. |
| config.OBOT_SERVER_MCPNETWORK_POLICY_PROVIDER_VALUES | string | "" |
YAML or JSON values blob merged into the network policy provider chart values. |
| config.OBOT_SERVER_MCPOAUTH_CLIENT_EXPIRATION | string | "" |
The expiration time for dynamically registered MCP OAuth clients. Must be a valid duration string and may include days, hours, or minutes. Defaults to 30d. |
| config.OBOT_SERVER_MCPOAUTH_CLIENT_NATIVE_EXCEPTIONS | string | "" |
A comma-separated list of additional Client ID Metadata Document URLs that default to the native application type when application_type is omitted. |
| config.OBOT_SERVER_MCPRUNTIME_BACKEND | string | "kubernetes" |
The runtime backend to use for MCP servers. Can be ‘docker’ or ‘kubernetes’. Defaults to ‘docker’. Setting this to ‘kubernetes’ will also create the necessary service account, role and rolebinding. |
| config.OBOT_SERVER_MCPSECRET_BINDING_ALLOWED_LABEL | string | "" |
Kubernetes Secret label key required for admin UI secret-binding lookup and runtime secret-binding resolution. Empty uses the server default: obot.obot.ai/allow-secret-binding. |
| config.OBOT_SERVER_MCPSERVER_SEARCH_IMAGE | string | "" |
The container image to use for the MCP server search functionality. |
| config.OBOT_SERVER_MDM_ASSET_SOURCE | string | "" |
URL to the MDM assets tar archive. |
| config.OBOT_SERVER_MODEL_PROXY_URL | string | "https://model-service.obot.ai" |
MCP Tester model proxy used when no model provider is configured. Set to an empty string to disable; omission uses the hosted service. |
| config.OBOT_SERVER_MULTI_USER_IDLE_SERVER_SHUTDOWN_HOURS | string | "" |
The interval in hours to check for idle multi-user MCP servers and shut them down. Set to -1 to disable. Defaults to 168. |
| config.OBOT_SERVER_SINGLE_USER_IDLE_SERVER_SHUTDOWN_HOURS | string | "" |
The interval in hours to check for idle single-user MCP servers and shut them down. Set to -1 to disable. Defaults to 24. |
| config.OBOT_SERVER_SUBSTRATE_NAMESPACE | string | "obot-agents" |
Namespace for environment worker pools. |
| config.OBOT_SERVER_SUBSTRATE_RUNNER_IMAGE | string | "" |
Override the built-in digest-pinned Claude runner image for new environments (repository@sha256:…); empty uses the Obot default. |
| config.OBOT_SERVER_SUBSTRATE_SNAPSHOT_LOCATION | string | "" |
Required cluster-wide snapshot bucket URI (s3:// or gs://) when Claude Environments is enabled. |
| config.OBOT_SERVER_SUBSTRATE_WORKER_IMAGE | string | "" |
Default worker image; empty derives it from substrate.image.repository and the bundled Substrate version. |
| config.OBOT_SERVER_UNAUTHENTICATED_RATE_LIMIT | string | "" |
Rate limit for unauthenticated requests in requests per second. Tracked by source IP address. Defaults to 100. |
| deploymentStrategy | object | {} |
Configures the complete Kubernetes deployment strategy. When empty, updateStrategy is used. |
| dev.useEmbeddedDb | bool | false |
For development/testing use only, enables the use of an postgres database embedded in the obot container. Do not use in production. |
| extraVolumeMounts | list | [] |
A list of additional volume mounts to create |
| extraVolumes | list | [] |
A list of additional volumes to create |
| image.pullPolicy | string | "IfNotPresent" |
Kubernetes image pullPolicy to use for Obot |
| image.repository | string | "ghcr.io/obot-platform/obot" |
The name of the docker repository for Obot. ghcr.io/obot-platform/obot for open-source or ghcr.io/obot-platform/obot-enterprise for enterprise. Please note that for enterprise you will need to set an imagePullSecret |
| image.tag | string | "" |
The docker tag to pull for obot. If blank, will default to the chart appVersion |
| imagePullSecrets | list | [] |
Kubernetes secrets used to pull the Obot server image. For private MCP server images, see mcpImagePullSecrets below. Expects a list of secret objects imagePullSecrets:[{"name": "fooBar"}] |
| ingress.annotations | object | {} |
Configure annotations to add to the ingress object |
| ingress.className | string | nil |
Configures a preexisting ingress class to use. |
| ingress.enabled | bool | false |
Enables ingress creation for Obot. |
| ingress.extraPaths | list | [] |
Define complete path objects, will be inserted before regular paths. Can be useful for things like ALB Ingress Controller actions |
| ingress.hosts | list | [] |
List of hostnames to configure the ingress with. Required when ingress.enabled is true. |
| ingress.paths[0].path | string | "/" |
|
| ingress.paths[0].pathType | string | "Prefix" |
|
| ingress.tls | list | [] |
List of secrets used to configure TLS for the ingress. |
| mcpImagePullSecrets | list | [] |
Configuration for creating image pull secrets for MCP containers. Each entry should contain registry credentials that will be used to create Kubernetes secrets. If you set .Values.secret.existingSecret, you must define OBOT_SERVER_MCPIMAGE_PULL_SECRETS to use these |
| mcpNamespace.annotations.”argocd.argoproj.io/sync-wave” | string | "-1" |
|
| mcpNamespace.name | string | "" |
The namespace in which to deploy the MCP servers. Defaults to -mcp |
| mcpNamespace.networkPolicy | object | {"dnsNamespace":"kube-system","enabled":true} |
Network policy configuration for the MCP namespace |
| mcpNamespace.networkPolicy.dnsNamespace | string | "kube-system" |
The namespace where DNS pods are running. Default is kube-system. Adjust if your cluster uses a different namespace for DNS services. |
| mcpNamespace.networkPolicy.enabled | bool | true |
Enable network policy to restrict traffic to/from MCP servers. Default is true, and is recommended for production deployments. |
| mcpNamespace.podSecurity | object | {"audit":"restricted","auditVersion":"latest","enabled":true,"enforce":"restricted","enforceVersion":"latest","warn":"restricted","warnVersion":"latest"} |
Pod Security Admission configuration for the MCP namespace. |
| mcpNamespace.podSecurity.audit | string | "restricted" |
Pod Security Standards level to audit (privileged, baseline, or restricted). Default is restricted. |
| mcpNamespace.podSecurity.auditVersion | string | "latest" |
Kubernetes version for the audit policy. Default is latest. |
| mcpNamespace.podSecurity.enabled | bool | true |
Enable Pod Security Admission labels on the MCP namespace. Default is true. |
| mcpNamespace.podSecurity.enforce | string | "restricted" |
Pod Security Standards level to enforce (privileged, baseline, or restricted). Default is restricted. |
| mcpNamespace.podSecurity.enforceVersion | string | "latest" |
Kubernetes version for the enforce policy. Default is latest. |
| mcpNamespace.podSecurity.warn | string | "restricted" |
Pod Security Standards level to warn about (privileged, baseline, or restricted). Default is restricted. |
| mcpNamespace.podSecurity.warnVersion | string | "latest" |
Kubernetes version for the warn policy. Default is latest. |
| mcpNamespace.resourceQuota | object | {} |
Define requests and limits for total resources available in the mcp namespace. |
| mcpServerDefaults | object | {"affinity":{},"maxCPULimit":"","maxCPURequest":"","maxMemoryLimit":"","maxMemoryRequest":"","resources":{},"runtimeClassName":"","tolerations":[]} |
Default Kubernetes configuration for all deployed MCP server pods |
| mcpServerDefaults.affinity | object | {} |
Affinity rules for MCP server pods (YAML format) When set via Helm, these settings cannot be updated through the API |
| mcpServerDefaults.maxCPULimit | string | "" |
Maximum CPU limit allowed for MCP server pods |
| mcpServerDefaults.maxCPURequest | string | "" |
Maximum CPU request allowed for MCP server pods Also caps the built-in default CPU request when no explicit default is configured. |
| mcpServerDefaults.maxMemoryLimit | string | "" |
Maximum memory limit allowed for MCP server pods |
| mcpServerDefaults.maxMemoryRequest | string | "" |
Maximum memory request allowed for MCP server pods Also caps the built-in default memory request when no explicit default is configured. |
| mcpServerDefaults.resources | object | {} |
Resource requests and limits for MCP server pods When set via Helm, these settings cannot be updated through the API |
| mcpServerDefaults.runtimeClassName | string | "" |
RuntimeClass name for MCP server pods This allows running MCP servers with specific container runtimes (e.g., gVisor, Kata) |
| mcpServerDefaults.tolerations | list | [] |
Tolerations for MCP server pods (YAML list format) When set via Helm, these settings cannot be updated through the API |
| nodeSelector | object | {} |
Configure node selector for pod assignment |
| persistence.accessModes | list | ["ReadWriteOnce"] |
Persistent Volume access modes. ReadWriteOnce is appropriate for replicaCount=1. |
| persistence.enabled | bool | true |
Enables persistence using a PVC mounted at /data. With dev.useEmbeddedDb, the built-in Postgres lives on this volume, including the LLM gateway’s database and its encryption key. With an external secret.OBOT_SERVER_DSN, the gateway keeps its state in Postgres, so it doesn’t depend on this volume. |
| persistence.existingClaim | string | "" |
|
| persistence.path | string | "/data" |
The path the volume will be mounted |
| persistence.size | string | "8Gi" |
Persistent Volume size |
| persistence.storageClass | string | "" |
Persistent Volume storage class If defined, storageClassName: |
| podAnnotations | object | {} |
Extra pod annotations to add. |
| podDisruptionBudget | object | {"annotations":{},"enabled":false,"maxUnavailable":"","minAvailable":1} |
PodDisruptionBudget configuration for Obot pods. Only enable this with replicaCount >= 2. With a single replica, minAvailable: 1 permanently blocks node drains, since the one pod can never be evicted. |
| podDisruptionBudget.annotations | object | {} |
Annotations to add to the PodDisruptionBudget. |
| podDisruptionBudget.enabled | bool | false |
Enables creation of a PodDisruptionBudget. Disabled by default. |
| podDisruptionBudget.maxUnavailable | string | "" |
Maximum number of Obot pods that may be unavailable during voluntary disruptions. Set this instead of minAvailable. |
| podDisruptionBudget.minAvailable | int | 1 |
Minimum number of Obot pods that must remain available during voluntary disruptions. Ignored when maxUnavailable is set. |
| replicaCount | int | 1 |
The number of Obot server instances to run. When greater than one, the chart configures replicas to peer tunnel connections through the Obot Service. |
| resources | object | {} |
Resource requests and limits to use for Obot |
| runtimeClassName | string | "" |
RuntimeClass name for Obot server pods. This allows running Obot with specific container runtimes (e.g., gVisor, Kata). |
| secret.ANTHROPIC_API_KEY | string | "" |
An Anthropic API key. At startup, Obot configures the LLM gateway’s anthropic provider with it, and updates the provider’s key when the value changes. |
| secret.AWS_ACCESS_KEY_ID | string | "" |
An AWS access key with permissions for AWS KMS, used for encryption |
| secret.AWS_SECRET_ACCESS_KEY | string | "" |
An AWS secret access key with permissions for AWS KMS, used for encryption |
| secret.GITHUB_AUTH_TOKEN | string | "" |
A GitHub PAT, used to authenticate catalog and tool pulls to avoid GitHub rate limiting |
| secret.OBOT_BOOTSTRAP_TOKEN | string | "" |
Sets a bootstrap token. If the chart is managing the Secret, one will be autogenerated (and preserved across upgrades) when this is left empty. |
| secret.OBOT_SERVER_DSN | string | "" |
The DSN for your database. For example: postgres:// |
| secret.OBOT_SERVER_ENCRYPTION_KEY | string | "" |
The key to use for encryption. Only used if config.OBOT_SERVER_ENCRYPTION_PROVIDER is ‘custom’. A key can be generated with openssl rand -base64 32 |
| secret.OBOT_SERVER_LICENSE_KEY | string | "" |
A license key for Obot Enterprise. If set here, it cannot be set in the UI. |
| secret.OBOT_SERVER_LOCAL_AUTH_INITIAL_OWNER_SETUP_TOKEN | string | "" |
Randomly generated, high-entropy secret used by the initial owner’s setup link (for example, openssl rand -hex 32). Set with config.OBOT_SERVER_LOCAL_AUTH_INITIAL_OWNER_EMAIL. It is never stored in plaintext by Obot. |
| secret.OBOT_SERVER_OTEL_BEARER_TOKEN | string | "" |
The bearer token for authentication with OpenTelemetry |
| secret.OPENAI_API_KEY | string | "" |
An OpenAI API key. At startup, Obot configures the LLM gateway’s openai provider with it, and updates the provider’s key when the value changes. You can also add providers under LLM Gateway > Providers. |
| secret.existingSecret | string | "" |
The name of an existing Secret to use instead of creating one. It only needs to contain the sensitive keys configured below; non-sensitive chart-derived configuration is still supplied by the chart ConfigMap. |
| service.annotations | object | {} |
Extra annotations to add to service object |
| service.port | int | 80 |
Port for the Kubernetes service to expose |
| service.spec | object | {} |
Any extra fields to add to the service object spec |
| service.type | string | "ClusterIP" |
Type of Kubernetes service to create |
| serviceAccount.annotations | object | {} |
|
| serviceAccount.create | bool | true |
|
| serviceAccount.name | string | "" |
|
| substrate.apiServer.replicas | int | 2 |
|
| substrate.enabled | bool | false |
|
| substrate.image.repository | string | "ghcr.io/obot-platform/substrate" |
|
| substrate.imagePullSecrets | list | [] |
|
| substrate.postgres.dsn | string | "" |
|
| substrate.postgres.role | string | "" |
|
| substrate.storage.backend | string | "s3" |
|
| substrate.storage.credentials | object | {} |
|
| substrate.storage.env.AWS_REGION | string | "us-east-1" |
|
| substrate.storage.existingSecret | string | "" |
|
| substrate.worker.nodeSelector.”kubernetes.io/os” | string | "linux" |
|
| substrate.worker.tolerations | list | [] |
|
| tolerations | list | [] |
Configure tolerations for pod scheduling |
| topologySpreadConstraints | object | {} |
Configurable topologySpreadConstraints for Obot pods |
| tunnelPeer.existingSecret | string | "" |
An existing Secret containing OBOT_SERVER_TUNNEL_PEER_TOKEN. Use this or token for stable GitOps rendering. The chart creates and preserves a token when both are empty. |
| tunnelPeer.token | string | "" |
The shared peer token stored in the chart-managed Secret. Set this to a stable secret value when manifests are rendered without live-cluster lookup (for example, with a GitOps renderer). |
| updateStrategy | string | "RollingUpdate" |
Configures what update strategy to use for the deployment (Recreate or RollingUpdate) |
This repo will be updated automatically whenever there is a release of Obot (and by extension, the helm chart). The GitHub Actions that control this can be found here.
You can manually update the documentation in this readme using helm-docs. If you have both the charts and obot repos checked out in the same folder, you can use this command:
helm-docs -c ../obot/chart -o '../../charts/README.md' --template-files '../../charts/README.md.gotmpl'
The template for the readme is ./README.md.gotmpl