mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-08-04 18:46:07 +00:00
163 lines
5.8 KiB
YAML
163 lines
5.8 KiB
YAML
services:
|
|
postgres:
|
|
image: pgvector/pgvector:pg17
|
|
container_name: langbot-cloud-postgres
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_DB: langbot
|
|
POSTGRES_USER: langbot_operator
|
|
POSTGRES_PASSWORD: ${POSTGRES_OPERATOR_PASSWORD}
|
|
volumes:
|
|
- postgres-data:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: [CMD-SHELL, "pg_isready -U langbot_operator -d langbot"]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 30
|
|
networks: [internal]
|
|
|
|
redis:
|
|
image: redis:7.4-alpine
|
|
container_name: langbot-cloud-redis
|
|
restart: unless-stopped
|
|
command: [redis-server, --appendonly, "yes", --requirepass, "${REDIS_PASSWORD}"]
|
|
volumes:
|
|
- redis-data:/data
|
|
healthcheck:
|
|
test: [CMD-SHELL, "redis-cli -a \"$${REDIS_PASSWORD}\" ping | grep PONG"]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 20
|
|
environment:
|
|
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
|
networks: [internal]
|
|
|
|
migrate:
|
|
image: rockchin/langbot-cloud-core:${LANGBOT_IMAGE_TAG}
|
|
profiles: [tools]
|
|
command: [uv, run, langbot, migrate, --cloud]
|
|
environment: &core-env
|
|
TZ: Asia/Shanghai
|
|
SYSTEM__INSTANCE_ID: ${CLOUD_V2_INSTANCE_UUID}
|
|
SYSTEM__EDITION: cloud
|
|
SYSTEM__RECOVERY_KEY: ${SYSTEM_RECOVERY_KEY}
|
|
SYSTEM__JWT__SECRET: ${JWT_SECRET}
|
|
SYSTEM__LIMITATION__MAX_BOTS: "2"
|
|
SYSTEM__LIMITATION__MAX_PIPELINES: "3"
|
|
SYSTEM__LIMITATION__MAX_EXTENSIONS: "3"
|
|
SYSTEM__LIMITATION__MAX_KNOWLEDGE_BASES: "2"
|
|
API__WEBHOOK_PREFIX: https://cloud.langbot.app
|
|
API__WEBUI_URL: https://cloud.langbot.app
|
|
WORKSPACE__INVITATIONS__PUBLIC_WEB_URL: https://cloud.langbot.app
|
|
DATABASE__USE: postgresql
|
|
DATABASE__POSTGRESQL__URL: postgresql+asyncpg://langbot_runtime:${POSTGRES_RUNTIME_PASSWORD}@postgres:5432/langbot
|
|
DATABASE__CLOUD_MIGRATION__OPERATOR_DSN_ENV: LANGBOT_CLOUD_MIGRATION_DSN
|
|
LANGBOT_CLOUD_MIGRATION_DSN: postgresql://langbot_operator:${POSTGRES_OPERATOR_PASSWORD}@postgres:5432/langbot
|
|
VDB__USE: pgvector
|
|
VDB__PGVECTOR__USE_BUSINESS_DATABASE: "true"
|
|
VDB__PGVECTOR__ALLOWED_DIMENSIONS: "384,512,768,1024,1536"
|
|
PLUGIN__ENABLE: "true"
|
|
PLUGIN__RUNTIME_WS_URL: ws://plugin-runtime:5400/control/ws
|
|
PLUGIN__DISPLAY_PLUGIN_DEBUG_URL: wss://cloud.langbot.app/plugin/debug/ws
|
|
PLUGIN__WORKER__MAX_CPUS: "0.25"
|
|
PLUGIN__WORKER__MAX_MEMORY_MB: "256"
|
|
PLUGIN__WORKER__MAX_PIDS: "128"
|
|
PLUGIN__WORKER__MAX_WORKERS: "16"
|
|
PLUGIN__WORKER__MAX_TOTAL_CPUS: "4.0"
|
|
PLUGIN__WORKER__MAX_TOTAL_MEMORY_MB: "4096"
|
|
PLUGIN__WORKER__REQUIRE_HARD_LIMITS: "true"
|
|
LANGBOT_PLUGIN_RUNTIME_CONTROL_TOKEN: ${PLUGIN_RUNTIME_CONTROL_TOKEN}
|
|
# Cloud v2 currently grants no managed Box capability. Keep the shared
|
|
# runtime deployed but disable Core integration until a hard-quota-capable
|
|
# backend can satisfy the fail-closed Cloud readiness contract.
|
|
BOX__ENABLED: "false"
|
|
BOX__BACKEND: nsjail
|
|
BOX__RUNTIME__ENDPOINT: ws://box:5410
|
|
BOX__ADMISSION__REQUIRED: "true"
|
|
BOX__ADMISSION__LOGICAL_SESSION_ID: global
|
|
BOX__ADMISSION__REQUIRED_BACKEND: nsjail
|
|
BOX__ADMISSION__MAX_SESSIONS: "1"
|
|
BOX__ADMISSION__MAX_MANAGED_PROCESSES: "0"
|
|
BOX__ADMISSION__CPUS: "0.25"
|
|
BOX__ADMISSION__MEMORY_MB: "256"
|
|
BOX__ADMISSION__WORKSPACE_QUOTA_MB: "256"
|
|
BOX__LOCAL__HOST_ROOT: /app/data/box
|
|
BOX__LOCAL__DEFAULT_WORKSPACE: /app/data/box
|
|
BOX__LOCAL__ALLOWED_MOUNT_ROOTS: /app/data/box
|
|
LANGBOT_BOX_CONTROL_TOKEN: ${BOX_CONTROL_TOKEN}
|
|
MCP__STDIO__ENABLED: "false"
|
|
LANGBOT_SPACE_CONTROL_PLANE_URL: https://space.langbot.app
|
|
LANGBOT_SPACE_CONTROL_PLANE_TOKEN: ${CLOUD_V2_CONTROL_PLANE_TOKEN}
|
|
LANGBOT_TELEMETRY_INGEST_TOKEN: ${CLOUD_V2_CONTROL_PLANE_TOKEN}
|
|
LANGBOT_SPACE_CONTROL_PLANE_PUBLIC_KEY: ${CLOUD_V2_MANIFEST_PUBLIC_KEY}
|
|
LANGBOT_SPACE_CONTROL_PLANE_KEY_ID: ${CLOUD_V2_MANIFEST_KEY_ID}
|
|
SPACE__URL: https://space.langbot.app
|
|
depends_on:
|
|
postgres: {condition: service_healthy}
|
|
networks: [internal]
|
|
|
|
plugin-runtime:
|
|
image: rockchin/langbot:${LANGBOT_IMAGE_TAG}
|
|
container_name: langbot-cloud-plugin-runtime
|
|
restart: unless-stopped
|
|
command: [uv, run, python, -m, langbot_plugin.cli.__init__, rt]
|
|
environment:
|
|
LANGBOT_PLUGIN_RUNTIME_CONTROL_TOKEN: ${PLUGIN_RUNTIME_CONTROL_TOKEN}
|
|
volumes:
|
|
- plugin-data:/app/data
|
|
- /sys/fs/cgroup:/sys/fs/cgroup:rw
|
|
cgroup: host
|
|
privileged: true
|
|
expose: ["5400"]
|
|
networks: [internal]
|
|
|
|
box:
|
|
image: rockchin/langbot:${LANGBOT_IMAGE_TAG}
|
|
container_name: langbot-cloud-box
|
|
restart: unless-stopped
|
|
command: [uv, run, lbp, box, --host, 0.0.0.0, --ws-control-port, "5410"]
|
|
environment:
|
|
LANGBOT_BOX_CONTROL_TOKEN: ${BOX_CONTROL_TOKEN}
|
|
LANGBOT_BOX_ROOT: /app/data/box
|
|
volumes:
|
|
- box-data:/app/data/box
|
|
- /sys/fs/cgroup:/sys/fs/cgroup:rw
|
|
cgroup: host
|
|
privileged: true
|
|
expose: ["5410"]
|
|
networks: [internal]
|
|
|
|
core:
|
|
image: rockchin/langbot-cloud-core:${LANGBOT_IMAGE_TAG}
|
|
container_name: langbot-cloud-core
|
|
restart: unless-stopped
|
|
environment: *core-env
|
|
volumes:
|
|
- core-data:/app/data
|
|
- box-data:/app/data/box
|
|
depends_on:
|
|
postgres: {condition: service_healthy}
|
|
redis: {condition: service_healthy}
|
|
plugin-runtime: {condition: service_started}
|
|
box: {condition: service_started}
|
|
expose: ["5300"]
|
|
healthcheck:
|
|
test: [CMD-SHELL, "python -c 'import urllib.request; urllib.request.urlopen(\"http://127.0.0.1:5300/healthz\", timeout=3)'" ]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 30
|
|
start_period: 30s
|
|
networks: [internal, shared-network]
|
|
|
|
networks:
|
|
internal:
|
|
shared-network:
|
|
external: true
|
|
|
|
volumes:
|
|
postgres-data:
|
|
redis-data:
|
|
plugin-data:
|
|
box-data:
|
|
core-data:
|