Skip to main content

Overview

This guide covers everything needed to deploy xpander.ai onto your Kubernetes cluster — SSL certificates, ingress controller, Helm chart installation, DNS configuration, API key management, verification, and SDK setup.
Before you start, ensure you have:
  • A running Kubernetes cluster (see EKS Cluster Setup if you need one)
  • Decided on your deployment manager connectivity — public TLS or PrivateLink
  • Your organizationId, environmentId, and deploymentManagerApiKey from xpander
  • A domain managed in Route 53 (or ability to create DNS records)

1. Create a Self-Hosted Location

  1. Go to app.xpander.ai/admin_settings#locations
  2. Click “Add Location”
  3. Fill in the details:
    • Name: e.g., “Production”
    • URL (optional): Your server’s FQDN (e.g., xpander.my-company.com)
    • Use dash-based subdomains: Enable if your DNS uses chat-xpander.domain.com format instead of chat.xpander.domain.com
  4. Click “Continue to connect location”
The platform will generate your Helm installation commands with all required keys — including your organizationId, environmentId, and deploymentManagerApiKey. After deployment, the location page shows a Components tab with heartbeat status for each service, and a Configuration panel where you can toggle Cloud Controls (Chat, Streaming, Scheduler).

2. External Access (Choose One)

The xpander services (agent controller, chat UI, API, etc.) communicate with each other internally via Kubernetes Services — no ingress is needed for that. You only need external access so that users can reach the chat UI, API, and other endpoints from their browser or client.
Already have an ingress controller? Skip to step 4 (Install the Helm Chart) and set ingress.enabled=true.

Option A: VPN / Corporate Network Access

If your organization has a VPN that routes into the VPC, users can access xpander services directly — no ingress controller, NLB, ACM certificate, or public DNS needed. Point internal DNS records to the Kubernetes services:
When installing the Helm chart, set ingress.enabled=false (the default). Skip ahead to step 4.

Option B: Public Access via Ingress + NLB

For public or internet-facing access, set up an ACM certificate, nginx ingress controller, and NLB.

SSL Certificate

Request an ACM certificate for your domain.
The certificate must include a wildcard for *.chat.<DOMAIN> because the xpander chat UI generates per-thread subdomains (e.g., moccasin-prawn.chat.<DOMAIN>). Standard wildcards only match one level, so *.<DOMAIN> does not cover these. If you omit *.chat.<DOMAIN>, the chat UI will show SSL certificate errors for thread URLs.
Add the DNS validation CNAME records to your Route 53 hosted zone. There will be two unique validation records — one for <DOMAIN> / *.<DOMAIN> (shared) and one for *.chat.<DOMAIN>:
Wait for validation:

Ingress Controller

Install the nginx ingress controller with AWS NLB and ACM SSL termination:
Get the NLB hostname (you’ll need this for DNS in step 5):

4. Install the Helm Chart

Add the Repository

Install

Set the deployment manager URL based on your connectivity choice:
  • Public: https://deployment-manager.xpander.ai
  • PrivateLink: https://deployment-manager-privatelink.xpander.ai (requires PrivateLink setup)

Configuration Parameters

Required: Optional API keys — add during install or later:

Using a Values File

For production, use a values file instead of --set flags:
xpander-values.yaml

5. DNS Configuration

Create wildcard CNAME records pointing *.<DOMAIN> and *.chat.<DOMAIN> to the NLB hostname. Both are required — the chat UI generates per-thread subdomains under chat.<DOMAIN>.
This creates the following endpoints:

6. Verification

Check All Pods Are Running

All pods should show Running with 1/1 ready:

Test Ingress

Test via Port Forward

Connect in xpander.ai Console

  1. Go to app.xpander.ai/admin_settings#locations
  2. Find your location — it should show as “Self-deploy”
  3. Click the Components tab to verify all services show Alive status with recent heartbeats

Managing API Keys

Adding or Updating Keys After Installation

Use helm upgrade with --reuse-values to add or change API keys without affecting existing configuration:
After the upgrade, pods that use the updated secrets will automatically restart. Verify with:
The xpander-static secret has a Helm resource keep policy — helm upgrade may not update it on subsequent installs. If your API key isn’t being picked up after a helm upgrade, set it directly in the secret:
Secret field name mapping:

Using the SDK with Self-Hosted

Configure the xpander SDK to point to your Agent Controller endpoint.
When using self-hosted deployment, use the Agent Controller API key generated during Helm installation, not your xpander.ai cloud API key.

Using with Agno Framework

Make sure your base_url points to the Agent Controller endpoint (e.g., https://agent-controller.{your-domain}), not the root domain.For more SDK examples, see the Self-Hosted SDK Configuration.

Upgrading

Uninstalling