2026-03-21 14:53:39 +08:00
x-api-worker-env : &api-worker-env
HOST_IP : ${HOST_IP:-}
LITE_MODE : ${LITE_MODE:-}
RUNNING_IN_DOCKER : "true"
2026-05-04 09:33:47 +08:00
YUXI_ENV : production
2026-03-21 14:53:39 +08:00
PYTHONPATH : /app/package
2026-05-17 22:44:05 +08:00
POSTGRES_URL : ${POSTGRES_URL:-postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-yuxi}}
2026-03-21 14:53:39 +08:00
REDIS_URL : ${REDIS_URL:-redis://redis:6379/0}
RUN_CANCEL_KEY_TTL_SECONDS : ${RUN_CANCEL_KEY_TTL_SECONDS:-1800}
RUN_EVENTS_STREAM_TTL_SECONDS : ${RUN_EVENTS_STREAM_TTL_SECONDS:-7200}
NEO4J_URI : ${NEO4J_URI:-bolt://graph:7687}
NEO4J_USERNAME : ${NEO4J_USERNAME:-neo4j}
NEO4J_PASSWORD : ${NEO4J_PASSWORD:-0123456789}
MILVUS_URI : ${MILVUS_URI:-http://milvus:19530}
MILVUS_DB_NAME : ${MILVUS_DB_NAME:-default}
MILVUS_TOKEN : ${MILVUS_TOKEN:-}
MINERU_API_URI : ${MINERU_API_URI:-http://mineru-api:30001}
PADDLEX_URI : ${PADDLEX_URI:-http://paddlex:8080}
MINIO_URI : ${MINIO_URI:-http://minio:9000}
2026-03-25 03:36:08 +08:00
SANDBOX_PROVIDER : ${SANDBOX_PROVIDER:-provisioner}
SANDBOX_PROVISIONER_URL : ${SANDBOX_PROVISIONER_URL:-http://sandbox-provisioner:8002}
2026-03-26 03:29:34 +08:00
SANDBOX_VIRTUAL_PATH_PREFIX : ${SANDBOX_VIRTUAL_PATH_PREFIX:-/home/gem/user-data}
2026-03-25 03:36:08 +08:00
SANDBOX_EXEC_TIMEOUT_SECONDS : ${SANDBOX_EXEC_TIMEOUT_SECONDS:-180}
SANDBOX_MAX_OUTPUT_BYTES : ${SANDBOX_MAX_OUTPUT_BYTES:-262144}
2026-04-01 16:55:29 +08:00
NO_PROXY : localhost,127.0.0.1,milvus,graph,minio,milvus-etcd,etcd,mineru,paddlex,sandbox-provisioner,api.siliconflow.cn
no_proxy : localhost,127.0.0.1,milvus,graph,minio,milvus-etcd,etcd,mineru,paddlex,sandbox-provisioner,api.siliconflow.cn
2026-03-21 14:53:39 +08:00
2025-12-03 12:59:43 +08:00
services :
api :
build :
context : .
dockerfile : docker/api.Dockerfile
2026-06-13 01:02:43 +08:00
image : yuxi-api:${YUXI_VERSION:-0.7.0}
2025-12-03 12:59:43 +08:00
container_name : api-prod
working_dir : /app
networks :
- app-network
volumes :
2026-05-17 22:44:05 +08:00
- ./docker/volumes/yuxi:/app/saves
- ./docker/volumes/models:/app/models
2025-12-03 12:59:43 +08:00
extra_hosts :
- "host.docker.internal:host-gateway"
env_file :
- .env.prod
2026-03-21 14:53:39 +08:00
# region api_envs
2025-12-03 12:59:43 +08:00
environment :
2026-03-21 14:53:39 +08:00
<< : *api-worker-env
# endregion api_envs
2026-05-24 00:06:18 +08:00
command : uv run --no-sync --no-dev uvicorn server.main:app --host 0.0.0.0 --port 5050
2025-12-03 12:59:43 +08:00
restart : unless-stopped
healthcheck :
test : [ "CMD-SHELL" , "curl -f http://localhost:5050/api/system/health || exit 1" ]
interval : 30s
timeout : 15s
retries : 8
start_period : 180s
depends_on :
2026-02-25 16:26:09 +08:00
postgres :
condition : service_healthy
redis :
condition : service_healthy
minio :
condition : service_healthy
2026-03-04 08:53:50 +08:00
sandbox-provisioner :
condition : service_healthy
2026-02-25 16:26:09 +08:00
worker :
build :
context : .
dockerfile : docker/api.Dockerfile
2026-06-13 01:02:43 +08:00
image : yuxi-api:${YUXI_VERSION:-0.7.0}
2026-02-25 16:26:09 +08:00
container_name : worker-prod
working_dir : /app
networks :
- app-network
volumes :
2026-05-17 22:44:05 +08:00
- ./docker/volumes/yuxi:/app/saves
- ./docker/volumes/models:/app/models
2026-02-25 16:26:09 +08:00
extra_hosts :
- "host.docker.internal:host-gateway"
env_file :
- .env.prod
environment :
2026-03-21 14:53:39 +08:00
<< : *api-worker-env
2026-05-24 00:06:18 +08:00
command : uv run --no-sync --no-dev arq server.worker_main.WorkerSettings
2026-02-25 16:26:09 +08:00
restart : unless-stopped
depends_on :
postgres :
condition : service_healthy
redis :
condition : service_healthy
2025-12-03 12:59:43 +08:00
minio :
condition : service_healthy
2026-03-04 08:53:50 +08:00
sandbox-provisioner :
condition : service_healthy
sandbox-provisioner :
build :
context : ./docker/sandbox_provisioner
dockerfile : Dockerfile
container_name : sandbox-provisioner
volumes :
2026-05-17 22:44:05 +08:00
- ./docker/volumes/yuxi:/app/saves
2026-04-27 16:26:48 +08:00
- ./docker/sandbox_provisioner/sandbox.env:/app/sandbox.env:ro
2026-03-05 22:50:38 +08:00
- /var/run/docker.sock:/var/run/docker.sock
2026-03-04 08:53:50 +08:00
networks :
- app-network
extra_hosts :
- "host.docker.internal:host-gateway"
environment :
2026-03-29 16:52:33 +08:00
# Common provisioner settings
- PROVISIONER_BACKEND=${SANDBOX_PROVISIONER_BACKEND:-docker}
2026-03-05 22:50:38 +08:00
- SANDBOX_IMAGE=${SANDBOX_IMAGE:-enterprise-public-cn-beijing.cr.volces.com/vefaas-public/all-in-one-sandbox:latest}
- SANDBOX_CONTAINER_PORT=${SANDBOX_CONTAINER_PORT:-8080}
2026-03-04 08:53:50 +08:00
- MEMORY_SANDBOX_URL_TEMPLATE=${MEMORY_SANDBOX_URL_TEMPLATE:-http://agent-sandbox:8000}
2026-03-29 16:52:33 +08:00
- SANDBOX_HEALTH_TIMEOUT_SECONDS=${SANDBOX_HEALTH_TIMEOUT_SECONDS:-300}
- SANDBOX_IDLE_TIMEOUT_SECONDS=${SANDBOX_IDLE_TIMEOUT_SECONDS:-120}
- SANDBOX_IDLE_CHECK_INTERVAL_SECONDS=${SANDBOX_IDLE_CHECK_INTERVAL_SECONDS:-10}
- SANDBOX_EXEC_TIMEOUT_SECONDS=${SANDBOX_EXEC_TIMEOUT_SECONDS:-180}
# Optional proxy for sandbox-provisioner container
- HTTP_PROXY=${SANDBOX_HTTP_PROXY:-}
- HTTPS_PROXY=${SANDBOX_HTTPS_PROXY:-}
- NO_PROXY=localhost,127.0.0.1,host.docker.internal
# Docker backend only
2026-03-05 22:50:38 +08:00
- DOCKER_NETWORK=${SANDBOX_DOCKER_NETWORK:-yuxi-know_app-network}
- DOCKER_THREADS_HOST_PATH=${SANDBOX_DOCKER_THREADS_HOST_PATH:-}
- DOCKER_SANDBOX_PREFIX=${SANDBOX_DOCKER_SANDBOX_PREFIX:-yuxi-sandbox}
- DOCKER_SANDBOX_HOST=${SANDBOX_DOCKER_SANDBOX_HOST:-host.docker.internal}
2026-03-29 16:52:33 +08:00
# Kubernetes backend only
- K8S_NAMESPACE=${SANDBOX_K8S_NAMESPACE:-yuxi-know}
- NODE_HOST=${SANDBOX_NODE_HOST:-host.docker.internal}
- KUBECONFIG_PATH=${KUBECONFIG_PATH:-}
- THREAD_PVC=${THREAD_PVC:-yuxi-thread}
- SKILLS_PVC=${SKILLS_PVC:-yuxi-skills}
2026-03-04 08:53:50 +08:00
healthcheck :
test : [ "CMD" , "python" , "-c" , "import urllib.request; urllib.request.urlopen('http://localhost:8002/health').read()" ]
interval : 10s
timeout : 5s
retries : 6
start_period : 10s
restart : unless-stopped
2025-12-03 12:59:43 +08:00
web :
build :
context : .
dockerfile : docker/web.Dockerfile
target : production
2026-06-13 01:02:43 +08:00
image : yuxi-web:${YUXI_VERSION:-0.7.0}
2025-12-03 12:59:43 +08:00
container_name : web-prod
ports :
- "80:80"
depends_on :
- api
networks :
- app-network
environment :
- NODE_ENV=production
2026-03-19 11:26:04 +08:00
- VITE_LITE_MODE=${LITE_MODE:-}
2025-12-03 12:59:43 +08:00
command : nginx -g "daemon off;"
restart : unless-stopped
graph :
image : neo4j:5.26
container_name : graph
volumes :
- ./docker/volumes/neo4j/data:/data
- ./docker/volumes/neo4j/logs:/var/lib/neo4j/logs
healthcheck :
test : [ "CMD-SHELL" , "curl -f http://localhost:7474 || exit 1" ]
interval : 20s
timeout : 10s
retries : 5
start_period : 30s
environment :
- NEO4J_AUTH=${NEO4J_USERNAME:-neo4j}/${NEO4J_PASSWORD:-0123456789}
- NEO4J_server_bolt_listen__address=0.0.0.0:7687
- NEO4J_server_http_listen__address=0.0.0.0:7474
- ENTITY_EMBEDDING=true
networks :
- app-network
restart : unless-stopped
etcd :
container_name : milvus-etcd
image : quay.io/coreos/etcd:v3.5.5
environment :
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
- ETCD_SNAPSHOT_COUNT=50000
volumes :
- ./docker/volumes/milvus/etcd:/etcd
command : etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
healthcheck :
test : [ "CMD" , "etcdctl" , "endpoint" , "health" ]
interval : 60s
timeout : 30s
retries : 5
start_period : 30s
networks :
- app-network
restart : unless-stopped
minio :
2026-03-19 12:48:25 +08:00
container_name : minio
2025-12-03 12:59:43 +08:00
image : minio/minio:RELEASE.2023-03-20T20-16-18Z
environment :
MINIO_ACCESS_KEY : ${MINIO_ACCESS_KEY:-minioadmin}
MINIO_SECRET_KEY : ${MINIO_SECRET_KEY:-minioadmin}
volumes :
- ./docker/volumes/milvus/minio:/minio_data
- ./docker/volumes/milvus/minio_config:/root/.minio
command : minio server /minio_data --address 0.0.0.0:9000 --console-address 0.0.0.0:9001
healthcheck :
test : [ "CMD" , "curl" , "-f" , "http://localhost:9000/minio/health/live" ]
interval : 60s
timeout : 30s
retries : 5
start_period : 30s
networks :
- app-network
restart : unless-stopped
milvus :
image : milvusdb/milvus:v2.5.6
container_name : milvus
command : [ "milvus" , "run" , "standalone" ]
security_opt :
- seccomp:unconfined
environment :
ETCD_ENDPOINTS : etcd:2379
MINIO_ADDRESS : minio:9000
MILVUS_LOG_LEVEL : error
volumes :
- ./docker/volumes/milvus/milvus:/var/lib/milvus
- ./docker/volumes/milvus/logs:/var/lib/milvus/logs
healthcheck :
test : [ "CMD" , "curl" , "-f" , "http://localhost:9091/healthz" ]
interval : 60s
start_period : 120s
timeout : 30s
retries : 5
depends_on :
- "etcd"
- "minio"
networks :
2026-01-22 12:48:52 +08:00
- app-network
restart : unless-stopped
postgres :
image : postgres:16
container_name : postgres
ports :
- "5432:5432"
environment :
- POSTGRES_USER=${POSTGRES_USER:-postgres}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
2026-05-17 22:44:05 +08:00
- POSTGRES_DB=${POSTGRES_DB:-yuxi}
2026-01-22 12:48:52 +08:00
- TZ=${TZ:-Asia/Shanghai}
volumes :
- ./docker/volumes/postgresql:/var/lib/postgresql/data
healthcheck :
2026-05-17 22:44:05 +08:00
test : [ "CMD-SHELL" , "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-yuxi} || exit 1" ]
2026-01-22 12:48:52 +08:00
interval : 5s
timeout : 3s
retries : 30
networks :
2025-12-03 12:59:43 +08:00
- app-network
restart : unless-stopped
2026-02-25 16:26:09 +08:00
redis :
image : redis:7-alpine
container_name : redis
command : redis-server --appendonly yes
healthcheck :
test : [ "CMD" , "redis-cli" , "ping" ]
interval : 10s
timeout : 5s
retries : 10
volumes :
- ./docker/volumes/redis:/data
networks :
- app-network
restart : unless-stopped
2026-05-15 21:20:13 +08:00
mineru-api :
2025-12-03 12:59:43 +08:00
build :
context : .
dockerfile : docker/mineru.Dockerfile
image : mineru-vllm:latest
2026-05-15 21:20:13 +08:00
container_name : mineru-api
2025-12-03 12:59:43 +08:00
profiles :
- all
env_file :
2026-03-19 11:26:04 +08:00
- .env.prod
2026-05-15 21:20:13 +08:00
ports :
- 30001 : 30001
2025-12-03 12:59:43 +08:00
environment :
MINERU_MODEL_SOURCE : local
2026-05-15 21:20:13 +08:00
entrypoint : mineru-api
2025-12-03 12:59:43 +08:00
command :
--host 0.0.0.0
2026-05-15 21:20:13 +08:00
--port 30001
# --allow-public-http-client # Disabled by default; when binding to 0.0.0.0 or ::, this re-enables *-http-client backends and server_url. Enable only if you accept the SSRF risk.
# parameters for vllm-engine
# --gpu-memory-utilization 0.5 # If encountering VRAM shortage, reduce the KV cache size by this parameter; if VRAM issues persist, try lowering it further to `0.4` or below.
2025-12-03 12:59:43 +08:00
ulimits :
memlock : -1
stack : 67108864
ipc : host
healthcheck :
2026-05-15 21:20:13 +08:00
test : [ "CMD-SHELL" , "curl -f http://localhost:30001/health || exit 1" ]
2025-12-03 12:59:43 +08:00
deploy :
resources :
reservations :
devices :
- driver : nvidia
2026-05-15 21:20:13 +08:00
device_ids : [ "0" ] # Modify for multiple GPUs : [ "0" , "1" ]
2025-12-03 12:59:43 +08:00
capabilities : [ gpu]
networks :
- app-network
restart : unless-stopped
paddlex :
build :
context : .
dockerfile : docker/paddlex.Dockerfile
image : paddlex:latest
container_name : paddlex-ocr
profiles :
- all
volumes :
- ./docker/volumes/paddlex:/paddlex
healthcheck :
test : [ "CMD-SHELL" , "curl -f http://localhost:8080/health || exit 1" ]
interval : 20s
timeout : 10s
retries : 5
start_period : 60s
deploy :
resources :
reservations :
devices :
- driver : nvidia
device_ids : [ '0' ]
capabilities : [ gpu]
networks :
- app-network
restart : unless-stopped
networks :
app-network :
driver : bridge