Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1deba7d
docs: PLTF-388 add Helm-based installer instructions for OpenHands En…
aivong-openhands Jul 15, 2026
fc3bfa1
docs: PLTF-388 make the starter values a usable install (auth, runtim…
aivong-openhands Jul 15, 2026
c8f6cce
docs: PLTF-388 link the create_github_app script for auth setup
aivong-openhands Jul 15, 2026
1fb7701
docs: PLTF-388 single GitHub auth path, drop GitLab tab
aivong-openhands Jul 15, 2026
412e526
docs: PLTF-388 note other auth providers are supported
aivong-openhands Jul 15, 2026
dd0f509
docs: PLTF-388 name Bitbucket Data Center explicitly
aivong-openhands Jul 15, 2026
19610d8
docs: PLTF-388 simplify GitHub App script links
aivong-openhands Jul 15, 2026
a36a177
docs: PLTF-388 generalize auth prerequisite, GitHub as the example
aivong-openhands Jul 15, 2026
07d8343
docs: PLTF-388 next-steps links and Replicated chart URL in upgrade e…
aivong-openhands Jul 15, 2026
c152da8
docs: PLTF-388 corrections from live end-to-end validation
aivong-openhands Jul 16, 2026
e824822
docs(k8s-install): clarify channel slug, BYO-cert, CLI install, and b…
aivong-openhands Jul 16, 2026
df1a37b
docs(k8s-install): drop channel-slug guidance (customers install from…
aivong-openhands Jul 16, 2026
53117f1
docs(k8s-install): soften TLS trust language, trim storage-class trou…
aivong-openhands Jul 16, 2026
8dceef5
docs(k8s-install): drop the support-bundle upload no-link note
aivong-openhands Jul 16, 2026
5865a23
docs(k8s-install): cross-link Quick Start DNS reference
aivong-openhands Jul 16, 2026
33a0b50
docs(k8s-install): drop redundant 'not optional' from TLS prerequisite
aivong-openhands Jul 16, 2026
4325c3d
docs(k8s-install): remove DNS-01 issuer note from TLS prerequisite
aivong-openhands Jul 16, 2026
16f6332
docs(k8s-install): simplify GitHub App prerequisite to a link
aivong-openhands Jul 16, 2026
5071280
docs(k8s-install): make bring-your-own-cert the minimal TLS example
aivong-openhands Jul 16, 2026
d85723f
docs(k8s-install): regenerate llms-full.txt for BYO-cert example
aivong-openhands Jul 16, 2026
4982f4e
docs(k8s-install): add generic default-cert pointer for non-Traefik c…
aivong-openhands Jul 16, 2026
d9c5a5d
docs(k8s-install): regenerate llms-full.txt
aivong-openhands Jul 16, 2026
3975591
docs(k8s-install): trim 'no separate license file' aside from intro
aivong-openhands Jul 16, 2026
036b244
docs(k8s-install): use dns-checks anchor; trim TLS explanation
aivong-openhands Jul 16, 2026
49ee804
docs(k8s-install): trim helm-version prerequisite (covered in common …
aivong-openhands Jul 16, 2026
d807220
docs(k8s-install): trim cert-manager prereq and non-optional warning
aivong-openhands Jul 16, 2026
c9648be
docs(k8s-install): remove bring-your-own certificate note
aivong-openhands Jul 16, 2026
555419f
Merge branch 'main' into aivong/pltf-388-update-docsopenhandsdev-with…
aivong-openhands Jul 16, 2026
b0e3662
docs(k8s-install): fix minimal values so the install actually works
aivong-openhands Jul 16, 2026
2ca0c0e
docs(k8s-install): enable the bundled Keycloak in the minimal values
aivong-openhands Jul 17, 2026
3249a4b
docs(k8s-install): require STORAGE_CLASS for sandbox volumes
aivong-openhands Jul 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,7 @@
"group": "K8s Install",
"pages": [
"enterprise/k8s-install/index",
"enterprise/k8s-install/installation",
"enterprise/k8s-install/resource-limits"
]
}
Expand Down
4 changes: 2 additions & 2 deletions enterprise/analytics.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

Laminar helps you understand what your OpenHands deployment is doing in production:

- Inspect prompts, tool calls, answers, and nested agent behavior in Laminar's [trace views](https://laminar.sh/docs/platform/viewing-traces).

Check warning on line 19 in enterprise/analytics.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/analytics.mdx#L19

Did you really mean 'Laminar's'?
- Use [session replay for browser agents](https://laminar.sh/docs/tracing/browser-agent-observability) when conversations drive browser automation.
- For Helm installs, define [signals](https://laminar.sh/docs/signals/introduction) to classify failures, measure outcomes, and monitor recurring patterns across many traces.

Expand Down Expand Up @@ -93,7 +93,7 @@
Apply your updated `values.yaml` override file:

```bash
helm upgrade openhands oci://ghcr.io/openhands/helm-charts/openhands \
helm upgrade openhands oci://registry.replicated.com/openhands/openhands \
--namespace openhands \
--values values.yaml
```
Expand All @@ -107,13 +107,13 @@
Once the deployment status shows **Ready**, navigate to the Laminar frontend URL:

- VM install: `https://analytics.app.<your-base-domain>`
- Kubernetes install: the hostname configured in `laminar.frontend.ingress.hostname`

Check warning on line 110 in enterprise/analytics.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/analytics.mdx#L110

Did you really mean 'hostname'?

Click the **Continue with Keycloak** button:

Check warning on line 112 in enterprise/analytics.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/analytics.mdx#L112

Did you really mean 'Keycloak'?

![Laminar Keycloak Auth](./images/laminar-keycloak-auth.png)

Check warning on line 114 in enterprise/analytics.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/analytics.mdx#L114

Did you really mean 'Keycloak'?

If you want more background on Laminar Cloud versus self-hosting outside OHE, see Laminar's official [hosting options](https://laminar.sh/docs/hosting-options).

Check warning on line 116 in enterprise/analytics.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/analytics.mdx#L116

Did you really mean 'Laminar's'?

## Create a Laminar Project

Expand Down Expand Up @@ -249,7 +249,7 @@
Apply your updated `values.yaml` override file:

```bash
helm upgrade openhands oci://ghcr.io/openhands/helm-charts/openhands \
helm upgrade openhands oci://registry.replicated.com/openhands/openhands \
--namespace openhands \
--values values.yaml
```
Expand All @@ -270,11 +270,11 @@

## What to Do Next in Laminar

Once traces are flowing, use Laminar's official docs to go deeper:

Check warning on line 273 in enterprise/analytics.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/analytics.mdx#L273

Did you really mean 'Laminar's'?

- [Viewing Traces](https://laminar.sh/docs/platform/viewing-traces) to inspect a single conversation in transcript, tree, or timeline views.
- For Helm installs, [Signals](https://laminar.sh/docs/signals/introduction) to extract structured outcomes or failure modes across many traces.
- [Session replay for browser agents](https://laminar.sh/docs/tracing/browser-agent-observability) to debug browser-based automations.

Check warning on line 277 in enterprise/analytics.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/analytics.mdx#L277

Did you really mean 'automations'?
- [Observability for OpenHands Software Agent SDK](https://laminar.sh/docs/tracing/integrations/openhands-sdk) for the OpenHands-specific tracing model.

## Next Steps
Expand Down
4 changes: 4 additions & 0 deletions enterprise/k8s-install/index.mdx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Kubernetes Installation
description: Deploy OpenHands Enterprise into your own Kubernetes cluster using Helm
icon: dharmachakra

Check warning on line 4 in enterprise/k8s-install/index.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/k8s-install/index.mdx#L4

Did you really mean 'dharmachakra'?
---

OpenHands Enterprise can be deployed into an existing Kubernetes cluster using Helm.
Expand Down Expand Up @@ -35,8 +35,8 @@
|-----------|-------------|
| **OpenHands Server** | Main application server handling UI, API, and agent orchestration |
| **Runtime API** | Manages sandbox lifecycle—provisioning, scaling, and cleanup |
| **Runtimes (Sandboxes)** | Isolated containers where agents execute code |

Check warning on line 38 in enterprise/k8s-install/index.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/k8s-install/index.mdx#L38

Did you really mean 'Runtimes'?
| **Keycloak** | Identity and access management |

Check warning on line 39 in enterprise/k8s-install/index.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/k8s-install/index.mdx#L39

Did you really mean 'Keycloak'?
| **LiteLLM Proxy** | Routes requests to your LLM provider(s) |
| **PostgreSQL** | Persistent storage for application data |
| **Redis** | Caching and session management |
Expand All @@ -50,6 +50,10 @@

## Guides

<Card title="Install with Helm" icon="ship" href="/enterprise/k8s-install/installation">
End-to-end installation instructions using your OpenHands Enterprise license.
</Card>

<Card title="External PostgreSQL" icon="database" href="/enterprise/external-postgres">
Configure OpenHands to use your own PostgreSQL database instead of the bundled instance.
</Card>
Expand Down
296 changes: 296 additions & 0 deletions enterprise/k8s-install/installation.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,296 @@
---
title: Install with Helm
description: End-to-end installation of OpenHands Enterprise on Kubernetes using Helm
icon: ship
---

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.

<Note>
Helm-based installation requires an OpenHands Enterprise license. If you don't have
one yet, [contact our team](https://openhands.dev/contact) to get set up.
</Note>

## Prerequisites

- A Kubernetes cluster with a default storage class and an ingress controller
(see [Resource Limits](/enterprise/k8s-install/resource-limits) for sizing guidance)
- **Helm v3.18 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](https://console.anthropic.com/)
- DNS records you control, following the `app.<base-domain>` layout used
throughout this guide (with `openhands.example.com` as the base):
`app.openhands.example.com` (application), `auth.app.openhands.example.com`
(login), `runtime-api.openhands.example.com`, and a **wildcard**
`*.runtime.openhands.example.com` for runtime sandboxes. These point at your
cluster's ingress; see the Quick Start's
[DNS checks](/enterprise/quick-start#dns-checks) for the full hostname list.

Check warning on line 32 in enterprise/k8s-install/installation.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/k8s-install/installation.mdx#L32

Did you really mean 'hostname'?
- **TLS certificates covering all of the hostnames above**, which you provide.

Check warning on line 33 in enterprise/k8s-install/installation.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/k8s-install/installation.mdx#L33

Did you really mean 'hostnames'?
- 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](/enterprise/quick-start#create-a-github-app).

## Step 1: Log in to the registry

Authenticate Helm against the Replicated registry using your license:

```bash
helm registry login registry.replicated.com \
--username <your-license-email> \
--password <your-license-id>
```

## Step 2: Create the namespace and secrets

Check warning on line 48 in enterprise/k8s-install/installation.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/k8s-install/installation.mdx#L48

Did you really mean 'namespace'?

The chart references several Kubernetes secrets that you create ahead of installation:

```bash
kubectl create namespace openhands
```

```bash
kubectl -n openhands create secret generic jwt-secret \
--from-literal=jwt-secret=<random-string>

kubectl -n openhands create secret generic keycloak-admin \
--from-literal=admin-password=<random-string>

kubectl -n openhands create secret generic keycloak-realm \
--from-literal=realm-name=allhands \
--from-literal=server-url=http://keycloak \
--from-literal=client-id=allhands \
--from-literal=client-secret=<random-string> \
--from-literal=smtp-password=<smtp-password>

kubectl -n openhands create secret generic postgres-password \
--from-literal=username=postgres \
--from-literal=password=<random-string> \
--from-literal=postgres-password=<random-string>

kubectl -n openhands create secret generic redis \
--from-literal=redis-password=<random-string>

kubectl -n openhands create secret generic lite-llm-api-key \
--from-literal=lite-llm-api-key=<random-string>

kubectl -n openhands create secret generic admin-password \
--from-literal=admin-password=<random-string>

kubectl -n openhands create secret generic default-api-key \
--from-literal=default-api-key=<random-string>

kubectl -n openhands create secret generic sandbox-api-key \
--from-literal=sandbox-api-key=<random-string>

kubectl -n openhands create secret generic litellm-env-secrets \
--from-literal=ANTHROPIC_API_KEY=<your-llm-api-key>
```

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](/enterprise/quick-start#create-a-github-app) — its output provides
every value below, and the private key file is written to its `keys`
directory:

```bash
kubectl -n openhands create secret generic github-app \
--from-literal=app-id=<github-app-id> \
--from-literal=app-slug=<github-app-slug> \
--from-literal=client-id=<github-app-client-id> \
--from-literal=client-secret=<github-app-client-secret> \
--from-literal=private-key="$(cat <github-app-private-key>.pem)" \
--from-literal=webhook-secret=<github-app-webhook-secret>
```

<Tip>
Generate strong random values (for example with `openssl rand -hex 32`) for each
`<random-string>` placeholder, and store them in your secret manager. To use an
existing PostgreSQL instance instead of the bundled one, see
[External PostgreSQL](/enterprise/external-postgres).
</Tip>

## Step 3: Configure values

Create a `values.yaml` with your environment-specific configuration. The
minimum for a working installation covers five areas: 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](/enterprise/external-postgres)).

The example below uses Traefik, the chart's default ingress class; set

Check warning on line 128 in enterprise/k8s-install/installation.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/k8s-install/installation.mdx#L128

Did you really mean 'Traefik'?
`ingress.class` and the annotations to match your controller.

```yaml
ingress:
enabled: true
host: app.openhands.example.com
class: traefik

# This guide brings its own certificate, terminated at the ingress controller,
# so the chart's per-ingress TLS is disabled (see the note below the example).
tls:
enabled: false

# Enables login via the GitHub App created in Step 2
github:
enabled: true

# Bundled PostgreSQL: name the application database and let the chart create
# the databases it needs on first start
postgresql:
auth:
database: openhands
databaseMigrations:
createDatabases: true

# Login is served by the bundled Keycloak at auth.<ingress.host> — both the
# component and its ingress must be enabled for users to be able to log in
keycloak:
enabled: true
ingress:
enabled: true
hostname: auth.app.openhands.example.com
tls: false

# Where agent sandboxes run. The runtime API needs its own hostname, and each
# sandbox gets a subdomain under your wildcard DNS record.
sandbox:
apiHostname: https://runtime-api.openhands.example.com

env:
RUNTIME_URL_PATTERN: "https://{runtime_id}.runtime.openhands.example.com"
LITELLM_DEFAULT_MODEL: litellm_proxy/claude-sonnet-4-5

runtime-api:
ingress:
enabled: true
host: runtime-api.openhands.example.com
tls: false
databaseMigrations:
createDatabases: true
env:
# Base domain for the per-sandbox ingresses ({runtime_id}.<RUNTIME_BASE_URL>);
# must match RUNTIME_URL_PATTERN above. RUNTIME_DISABLE_SSL defaults to
# "true" — it must be "false" so sandbox URLs are served over https.
RUNTIME_BASE_URL: runtime.openhands.example.com
RUNTIME_DISABLE_SSL: "false"
# Storage class for sandbox volumes. The chart default (standard-rwo) only
# exists on GKE — set a storage class from `kubectl get storageclass` or
# sandboxes will never start.
STORAGE_CLASS: <your-storage-class>

# Store conversation data in the bundled MinIO, persisted to a volume
filestore:
ephemeral: true
minio:
persistence:
enabled: true

litellm-helm:
enabled: true
proxy_config:
model_list:
- model_name: claude-sonnet-4-5
litellm_params:
model: anthropic/claude-sonnet-4-5
api_key: os.environ/ANTHROPIC_API_KEY
```

## Step 4: Install

```bash
helm install openhands oci://registry.replicated.com/openhands/openhands \
--namespace openhands \
--values values.yaml
```

Watch the workloads come up:

```bash
kubectl get pods -n openhands --watch
```

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](https://troubleshoot.sh/docs/preflight/introduction/):

```bash
preflight secret/openhands/openhands-preflight
```

<Tip>
The `preflight` and `support-bundle` CLIs are both part of

Check warning on line 236 in enterprise/k8s-install/installation.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/k8s-install/installation.mdx#L236

Did you really mean 'CLIs'?
[Troubleshoot](https://troubleshoot.sh/docs/#installation). Install them with:

```bash
curl -L https://krew.sh/preflight | bash
curl -L https://krew.sh/support-bundle | bash
```
</Tip>

Then confirm the application is reachable at your configured hostname and log in.

Check warning on line 245 in enterprise/k8s-install/installation.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/k8s-install/installation.mdx#L245

Did you really mean 'hostname'?

## 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:

<CardGroup cols={2}>
<Card title="Resource Limits" icon="gauge-high" href="/enterprise/k8s-install/resource-limits">
Size memory, CPU, and replicas for production workloads.
</Card>
<Card title="External PostgreSQL" icon="database" href="/enterprise/external-postgres">
Use your own PostgreSQL instead of the embedded instance.
</Card>
<Card title="Analytics" icon="chart-line" href="/enterprise/analytics">
Enable conversation analytics with Laminar.
</Card>
<Card title="Plugin Marketplace" icon="puzzle-piece" href="/enterprise/plugin-marketplace">
Offer curated plugins to your users.
</Card>
</CardGroup>

## Troubleshooting

### Generate a support bundle

If something isn't working, generate a support bundle with the
[`support-bundle` CLI](https://troubleshoot.sh/docs/support-bundle/introduction/).
It discovers the diagnostic specs that ship with the chart and collects logs,
resource states, and health checks from the installation:

```bash
support-bundle --load-cluster-specs --namespace openhands
```

### Send it to us

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

```bash
support-bundle upload support-bundle-<timestamp>.tar.gz
```

### Common issues

| Symptom | Likely cause |
|---------|--------------|
| `helm install` fails with a template error mentioning `replicated` | Helm version too old — upgrade to v3.18+ |
| `helm registry login` or chart pull returns 401/403 | License credentials incorrect, or the license isn't enabled for Helm installs — contact support |
| Preflight warns about node memory | Cluster nodes below the recommended sizing — see [Resource Limits](/enterprise/k8s-install/resource-limits) |
2 changes: 1 addition & 1 deletion enterprise/plugin-marketplace.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<div style={{display: 'flex', gap: '1.5rem', alignItems: 'flex-start'}}>
<div style={{flex: 1}}>
The Plugin Marketplace is an opt-in feature that adds a browseable catalog of community-built

Check warning on line 9 in enterprise/plugin-marketplace.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/plugin-marketplace.mdx#L9

Did you really mean 'browseable'?
OpenHands plugins to your Enterprise deployment. Once enabled, users can discover and review
plugins directly at `/plugins` on your application hostname.

Expand Down Expand Up @@ -133,7 +133,7 @@
### Apply the changes

```bash
helm upgrade openhands oci://ghcr.io/openhands/helm-charts/openhands \
helm upgrade openhands oci://registry.replicated.com/openhands/openhands \
--namespace openhands \
--values values.yaml
```
Expand Down Expand Up @@ -173,7 +173,7 @@
https://app.<your-base-domain>/plugins
```

Users authenticate through the same Keycloak SSO used for the rest of OpenHands Enterprise.

Check warning on line 176 in enterprise/plugin-marketplace.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/plugin-marketplace.mdx#L176

Did you really mean 'Keycloak'?
The Plugin Directory API is also available at:

```text
Expand All @@ -184,7 +184,7 @@

<Tabs>
<Tab title="VM Install (Admin Console)">
Open the Admin Console, navigate to **Config**, uncheck **Enable Plugin Directory** in the

Check warning on line 187 in enterprise/plugin-marketplace.mdx

View check run for this annotation

Mintlify / Mintlify Validation (allhandsai) - vale-spellcheck

enterprise/plugin-marketplace.mdx#L187

Did you really mean 'uncheck'?
**Experimental** section, click **Save config**, then **Deploy**.
</Tab>
<Tab title="Kubernetes (Helm)">
Expand Down
Loading
Loading