| title | Self-host standalone servers |
|---|---|
| sidebarTitle | Standalone servers |
| icon | server |
| description | Deploy standalone Agent Servers using Docker, Docker Compose, or Kubernetes without the LangSmith control plane. |
This guide shows you how to deploy standalone Agent Servers directly, without using the LangSmith control plane. You can deploy the server independently and still use LangSmith separately for tracing and evaluation. Standalone servers are production-ready and provide the most lightweight self-hosting option for running agents.
For an overview of self-hosted deployment options, see [self-hosted options](/langsmith/self-hosted).-
Use the LangGraph CLI to test your application locally.
-
Use the LangGraph CLI to build a Docker image (i.e.
langgraph build). -
The following environment variables are needed for a data plane deployment.
-
REDIS_URI: Connection details to a Redis instance. Redis will be used as a pub-sub broker to enable streaming real time output from background runs. The value ofREDIS_URImust be a valid Redis connection URI. Shared Redis Instance Multiple self-hosted deployments can share the same Redis instance. For example, forDeployment A,REDIS_URIcan be set toredis://<hostname_1>:<port>/1and forDeployment B,REDIS_URIcan be set toredis://<hostname_1>:<port>/2.1and2are different database numbers within the same instance, but<hostname_1>is shared. The same database number cannot be used for separate deployments. -
DATABASE_URI: Postgres connection details. Postgres will be used to store assistants, threads, runs, persist thread state and long term memory, and to manage the state of the background task queue with 'exactly once' semantics. The value ofDATABASE_URImust be a valid Postgres connection URI. Shared Postgres Instance Multiple self-hosted deployments can share the same Postgres instance. For example, forDeployment A,DATABASE_URIcan be set topostgres://<user>:<password>@/<database_name_1>?host=<hostname_1>and forDeployment B,DATABASE_URIcan be set topostgres://<user>:<password>@/<database_name_2>?host=<hostname_1>.<database_name_1>anddatabase_name_2are different databases within the same instance, but<hostname_1>is shared. The same database cannot be used for separate deployments. You can optionally store checkpoint data in MongoDB instead of PostgreSQL. PostgreSQL is still required for all other server data. See Configure checkpointer backend for details. -
LANGSMITH_API_KEY: LangSmith API key. -
LANGGRAPH_CLOUD_LICENSE_KEY: LangSmith license key. This will be used to authenticate ONCE at server start up. -
LANGSMITH_ENDPOINT: To send traces to a self-hosted LangSmith instance, setLANGSMITH_ENDPOINTto the hostname of the self-hosted LangSmith instance. -
Egress to
https://beacon.langchain.comfrom your network. This is required for license verification and usage reporting if not running in air-gapped mode. See the Egress documentation for more details.
Use this Helm chart to deploy an Agent Server to a Kubernetes cluster. This is the recommended setup for production standalone server deployments.
The Helm chart (v0.2.6+) supports MongoDB checkpointing with a bundled instance (dev/testing) or an external deployment (production). Set mongo.enabled: true in your values file. See Configure checkpointer backend for full configuration details.
This docker example is intended for local development and testing.
Run the following docker command:
docker run \
--env-file .env \
-p 8123:8000 \
-e REDIS_URI="foo" \
-e DATABASE_URI="bar" \
-e LANGSMITH_API_KEY="baz" \
my-imageand you should provide appropriate values for REDIS_URI, DATABASE_URI, and LANGSMITH_API_KEY.
- If your application requires additional environment variables, you can pass them in a similar way.
This Docker Compose example is intended for local development and testing.
Use the following Docker Compose file:
volumes:
langgraph-data:
driver: local
services:
langgraph-redis:
image: redis:6
healthcheck:
test: redis-cli ping
interval: 5s
timeout: 1s
retries: 5
langgraph-postgres:
image: postgres:16
ports:
- "5432:5432"
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- langgraph-data:/var/lib/postgresql/data
healthcheck:
test: pg_isready -U postgres
start_period: 10s
timeout: 1s
retries: 5
interval: 5s
langgraph-api:
image: ${IMAGE_NAME}
ports:
- "8123:8000"
depends_on:
langgraph-redis:
condition: service_healthy
langgraph-postgres:
condition: service_healthy
env_file:
- .env
environment:
REDIS_URI: redis://langgraph-redis:6379
LANGSMITH_API_KEY: ${LANGSMITH_API_KEY}
DATABASE_URI: postgres://postgres:postgres@langgraph-postgres:5432/postgres?sslmode=disableRun docker compose up with this file in the same folder.
volumes:
langgraph-data:
driver: local
langgraph-mongo-data:
driver: local
services:
langgraph-redis:
image: redis:6
healthcheck:
test: redis-cli ping
interval: 5s
timeout: 1s
retries: 5
langgraph-postgres:
image: postgres:16
ports:
- "5432:5432"
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- langgraph-data:/var/lib/postgresql/data
healthcheck:
test: pg_isready -U postgres
start_period: 10s
timeout: 1s
retries: 5
interval: 5s
langgraph-mongo:
image: mongo:7
command: ["mongod", "--replSet", "rs0"]
ports:
- "27017:27017"
volumes:
- langgraph-mongo-data:/data/db
healthcheck:
test: mongosh --eval "try { rs.status().ok } catch(e) { rs.initiate({_id:'rs0',members:[{_id:0,host:'langgraph-mongo:27017'}]}).ok }" --quiet
interval: 5s
timeout: 10s
retries: 10
start_period: 10s
langgraph-api:
image: ${IMAGE_NAME}
ports:
- "8123:8000"
depends_on:
langgraph-redis:
condition: service_healthy
langgraph-postgres:
condition: service_healthy
langgraph-mongo:
condition: service_healthy
env_file:
- .env
environment:
REDIS_URI: redis://langgraph-redis:6379
LANGSMITH_API_KEY: ${LANGSMITH_API_KEY}
DATABASE_URI: postgres://postgres:postgres@langgraph-postgres:5432/postgres?sslmode=disable
LS_DEFAULT_CHECKPOINTER_BACKEND: mongo
LS_MONGODB_URI: mongodb://langgraph-mongo:27017/langgraph?replicaSet=rs0See Configure checkpointer backend for more details on MongoDB configuration options.
This will launch an Agent Server on port 8123 (change the port mapping in langgraph-api if needed). Test if the application is healthy:
curl --request GET --url 0.0.0.0:8123/okAssuming everything is running correctly, you should see a response like:
{"ok":true}