Skip to main content
OpenHands Enterprise is distributed as a Helm chart through the Replicated registry. Your license credentials authenticate the chart download, and the chart embeds your license automatically at install time.
Helm-based installation requires an OpenHands Enterprise license. If you don’t have one yet, register for a free 30-day trial or contact our team to get set up. The license YAML from the install portal is all the licensing material you need: use spec.customerEmail as the registry username and spec.licenseID as its password. The embedded-cluster installer assets on that portal are for VM installations, not Helm.

Prerequisites

  • A Kubernetes cluster with a default storage class and an ingress controller (see Resource Limits for sizing guidance)
  • Helm v4 or later
  • kubectl access to the target cluster
  • Your license ID and the email address registered with your license (both provided by our team)
  • LLM credentials from your chosen provider, for example an Anthropic API key from the Anthropic Console
  • DNS records you control, following the layout used throughout this guide (with openhands.example.com as the base domain): app.openhands.example.com (application), auth.openhands.example.com (login), runtime-api.openhands.example.com, and <id>-runtime.openhands.example.com for the per-session sandboxes. Every hostname sits one label under the base domain, so a single wildcard record *.openhands.example.com pointing at your cluster’s ingress covers all of them; see DNS and TLS.
  • A wildcard TLS certificate for *.openhands.example.com, which you provide.
  • An authentication method for user login — GitLab, Bitbucket Data Center, and more are supported; this guide uses a GitHub App. See Creating a GitHub App.

Step 1: Log in to the registry

Authenticate Helm against the Replicated registry using your license. Supply the license ID on standard input so it does not appear in the command history:

Step 2: Create the namespaces and secrets

We recommend running agent sandboxes in a namespace separate from the application. Sandboxes run agent-authored code, so a dedicated namespace keeps them isolated from the application, database, and secrets. Create both namespaces now:
The chart references several Kubernetes secrets that you create ahead of installation, all in the openhands namespace:
The application and Runtime API must use the same key. Create both Secrets from one generated value:
Then create the secret for user authentication. Other providers (GitLab, Bitbucket Data Center, and more) are supported, but this guide uses GitHub throughout. If you don’t have a GitHub App yet, run our script — its output provides every value below, and the private key file is written to its keys directory:
Generate strong random values (for example with openssl rand -hex 32) for each remaining <random-string> placeholder, and store them in your secret manager. Use one value for both Runtime API Secrets. Since this example connects to PostgreSQL as postgres, use one value for its password and postgres-password fields too. To use an existing PostgreSQL instance instead of the bundled one, see External PostgreSQL.

Step 3: Configure values

Create a values.yaml with your environment-specific configuration. The minimum for a working installation covers application ingress and TLS, user authentication, the runtime (sandbox) endpoints, conversation storage, and your LLM provider. PostgreSQL and Redis run embedded in the cluster; the bundled PostgreSQL needs a database name and database creation turned on, both shown below (to use your own database instead, see External PostgreSQL).
The embedded PostgreSQL is intended for proof-of-concept and evaluation use only, not production. For production deployments we recommend bringing your own managed PostgreSQL — see External PostgreSQL. There is no officially supported migration path from the embedded PostgreSQL instance to an external one, so plan to switch to an external database before you load production data.
The example below uses Traefik, the chart’s default ingress class; set ingress.class and the annotations to match your controller.
This example uses Amazon S3 for conversation storage. Follow the EKS object storage steps to grant the application access to the bucket. On another Kubernetes provider, configure a supported external object store and its credentials before installing.
Chart 0.71.1 redirects signed-in users to /canvas but does not enable that frontend by default. For this chart version, add the following to values.yaml so the first conversation can start:
The static frontend can load without a second API-key prompt; Enterprise API requests still use the signed-in session. Later chart versions may provide a working default UI without these overrides.

Step 4: Install

Watch the workloads come up:
The first install pulls all container images, which can take a while. Along with the application components you’ll see a replicated pod — the Replicated SDK, which handles license verification and powers the support tooling below.

Step 5: Validate the installation

The chart ships preflight checks that validate your cluster against the application’s requirements. Run them with the preflight CLI:
The preflight and support-bundle CLIs are both part of Troubleshoot. Install them with:
Then confirm the application is reachable at your configured hostname and log in. A complete first-use check goes beyond Ready pods and preflight:
  1. Open https://app.openhands.example.com and sign in through your configured identity provider. The conversation UI should load without an additional backend URL or API-key prompt.
  2. Start a new conversation and ask the agent to run pwd. Confirm a sandbox starts in openhands-runtimes, the command returns a path, and the agent gives a completed reply.
  3. If the conversation cannot start, use the first-conversation checks before changing the deployment.
On chart 0.71.1, a fresh user’s selected Default LLM profile may not match LITELLM_DEFAULT_MODEL. If the first request reports an invalid proxy token or model, inspect the selected profile and the bundled LiteLLM model list using the troubleshooting checks. Do not enter an infrastructure API key into the browser to work around this error.

Next Steps

The install above is a minimal working baseline. Features and tuning are values overrides on the same release — edit your values.yaml and apply with helm upgrade using the chart URL from Step 4:

Resource Limits

Size memory, CPU, and replicas for production workloads.

External PostgreSQL

Use your own PostgreSQL instead of the embedded instance.

Analytics

Enable conversation analytics with Laminar.

Automations

Run scheduled or event-triggered tasks on a Helm installation.

Plugin Marketplace

Offer curated plugins to your users.

Troubleshooting

For a guided diagnostic workflow and a map of OHE components, see Troubleshooting.

Generate a support bundle

If something isn’t working, generate a support bundle with the support-bundle CLI. It discovers the diagnostic specs that ship with the chart and collects logs, resource states, and health checks from the installation:

Send it to us

Upload the resulting archive directly to our support team — the upload authenticates with the license embedded in the bundle:

Common issues