Skip to main content
Automations run OpenHands conversations on a schedule or in response to an event. This guide adds the automation service to an existing Enterprise Helm installation. Complete Install with Helm and confirm that a regular conversation works before enabling automations. The shared configuration below uses bundled PostgreSQL. Choose automation package storage for your provider before applying it. For production, use external PostgreSQL and adapt the database host and credentials accordingly. The storage settings below apply to chart 0.88.0, which ships Automation 1.23.2. Keep the automation image supplied by your licensed chart unless your release instructions require an override. Compare these settings with your licensed chart values before installing or upgrading.

Prerequisites

  • A public HTTPS application origin, such as https://app.openhands.example.com. Event-based automations need a URL the event source can reach.
  • A PostgreSQL instance reachable from the automation pod. This example creates a separate automations database and automation_user in the bundled instance.
  • A durable S3-compatible or GCS bucket for automation packages, with access to list the bucket and read, write, and delete objects. Provision storage and permissions separately from the application values below.
  • Required and optional Kubernetes Secrets, with values stored in your secret manager:

Choose Package Storage

Enterprise conversation storage (filestore) and automation package storage (automation.filestore) are separate consumers. Configuring one does not configure the other. Use a separate automation bucket, such as automation-data, even when both consumers use the same object-store endpoint. Workspace PVCs are separate again. The chart defaults to automation.filestore.type: gcs; explicitly set type: s3 when using S3 or RustFS.
Use Amazon S3 with IRSA or EKS Pod Identity granted to the automation service account. IRSA is EKS-specific; do not copy its annotation into AKS or GKE values. For IRSA, merge this into the shared configuration below:
Leave endpoint empty for AWS S3. Provision the bucket and IAM access first.

S3-Compatible Settings for RustFS or External Storage

After provisioning the store, merge the following into your automation values. These are application connection settings; they do not deploy RustFS, provision its disks, or configure backup and restore.
Replace the endpoint with the reachable S3 API URL and use the region required by your store (us-east-1 in the AKS RustFS example). The URL scheme determines TLS; use the appropriate trusted HTTPS endpoint for an external service. The referenced Secret must be in the openhands release namespace and contain the two named keys. It can reference the same credential Secret as the store if its grants cover the separate automation bucket. If reusing a Secret with different key names, set accessKeyIdKey and secretAccessKeyKey to match. Never put real access keys in values or Git. Provision the bucket first, or set automation.filestore.createBucket: true and grant bucket-creation permission to let the automation service create it at startup. Enabling RustFS alone does not create or select the automation bucket. Plan disk capacity, availability, backups and restore for the in-cluster store.
For new installations, follow the Helm guide’s minio.enabled: false and use external storage or RustFS. Legacy MinIO images can fail to pull. Check custom values for MinIO overrides. Before replacing an existing store, plan backup and data migration.

Step 1: Create Secrets

Use independent, random values for the database password, service key and webhook secret. Create these three Kubernetes Secrets in the openhands namespace, plus the filestore credential Secret if using S3-compatible access keys. Create the optional Git sync and KV Secrets if you need those features; without them, Git sync credential storage is unavailable and the KV store is disabled. If you create Secrets with kubectl, use --from-file or your secret manager rather than putting values directly in a shell command. The service key and webhook secret should differ. Keep secret values out of your Helm values file and Git repository.

Step 2: Add Helm Values

Add the following to the values you already use for the openhands release. Replace the host and database settings with your own, and merge exactly one storage choice from above into this configuration. Keep your existing installation values alongside these overrides when upgrading. Remove automation.image.tag overrides copied from older versions of this guide or the AKS overlay, unless your release instructions explicitly require an override.
automation.automationBaseUrl is the public origin, without /api/automation. The automation service mounts its API under this value’s path plus /api/automation. Including the path here doubles the API prefix, so Canvas receives a 404 from /api/automation/health and reports “Automations Unavailable” even though the automation pod is Ready.
The automationService.url value does include /api/automation. It is used by the OpenHands application to reach the automation service.
automationService.eventForwardingEnabled is what makes the built-in event sources deliver: GitHub, Azure DevOps, Jira Data Center, and Bitbucket Data Center events reach automations only when it is true (Replicated installations set it when Automations are enabled). Jira Data Center events also need jiraDc.enabled: true, which turns on its webhook endpoint. See Data Center Event Automations.

Step 3: Upgrade and Verify

Upgrade the same licensed release used for your initial installation. This example assumes the baseline and merged automation values are in separate files. Use your installed chart version; enabling storage is not a release upgrade. On AKS, append --values values-aks-runc.yaml last:
On AKS, the upgrade command is:
Before running an automation, check that the selected bucket exists, the pod uses the intended service account, and its storage Secret references or workload identity grants match the bucket. Check pod events and logs for image-pull, credential, endpoint or bucket-access errors without printing Secret contents. A successful health response alone does not verify package storage. Sign in to OpenHands and open Automate in Canvas. Create a read-only prompt automation, run it once with Run now, and confirm that a completed run appears in Activity Log. For example, ask it to summarize the README of a test repository without changing files or posting messages. Disable the test schedule afterward if you do not want it to run again. Check the automation bucket for the package object after the test run, using an object-store client authenticated with your approved storage identity:
An in-cluster RustFS service name is reachable only inside the cluster. Run its listing command from a client pod, or port-forward svc/<rustfs-service> with kubectl -n openhands port-forward svc/<rustfs-service> 9000:9000 and use --endpoint-url http://localhost:9000 from your workstation. In a test environment, restart the automation deployment:
Run the same automation again with Run now and confirm it completes. This checks that package storage survives pod replacement. A healthy pod alone does not verify storage access or persistence.

Troubleshooting Storage

For creating and managing automations, see Automations Overview. For events from another service, see Event-Based Automations.