2026-03-20 20:21:02 +08:00
x-api-worker-env : &api-worker-env
HOST_IP : ${HOST_IP:-}
2026-03-24 21:48:28 +08:00
LITE_MODE : ${LITE_MODE:-false}
2026-03-20 20:21:02 +08:00
RUNNING_IN_DOCKER : "true"
2026-05-04 09:33:47 +08:00
YUXI_ENV : development
2026-03-25 14:24:52 +08:00
# DBs and other services
2026-03-20 20:21:02 +08:00
POSTGRES_URL : ${POSTGRES_URL:-postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-yuxi_know}}
REDIS_URL : ${REDIS_URL:-redis://redis:6379/0}
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:-}
2026-03-25 14:24:52 +08:00
MINIO_URI : ${MINIO_URI:-http://minio:9000}
# 文档解析
2026-03-20 20:21:02 +08:00
MINERU_API_URI : ${MINERU_API_URI:-http://mineru-api:30001}
PADDLEX_URI : ${PADDLEX_URI:-http://paddlex:8080}
2026-03-25 14:24:52 +08:00
# Sandbox related
2026-03-24 21:48:28 +08:00
YUXI_DOCKER_API_BASE : ${YUXI_DOCKER_API_BASE:-http://localhost}
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-05-17 13:06:25 +08:00
# Model request timeouts
2026-03-25 14:24:52 +08:00
EMBEDDING_TIMEOUT : ${EMBEDDING_TIMEOUT:-600}
LLM_TIMEOUT : ${LLM_TIMEOUT:-600}
# Agent run
RUN_CANCEL_KEY_TTL_SECONDS : ${RUN_CANCEL_KEY_TTL_SECONDS:-1800}
RUN_EVENTS_STREAM_TTL_SECONDS : ${RUN_EVENTS_STREAM_TTL_SECONDS:-7200}
# 其他环境变量
2026-03-25 03:36:08 +08:00
NO_PROXY : localhost,127.0.0.1,milvus,graph,minio,milvus-etcd-dev,etcd,mineru,paddlex,sandbox-provisioner,api.siliconflow.cn
no_proxy : localhost,127.0.0.1,milvus,graph,minio,milvus-etcd-dev,etcd,mineru,paddlex,sandbox-provisioner,api.siliconflow.cn
2026-03-20 20:21:02 +08:00
2024-10-08 22:16:17 +08:00
services :
api :
build :
2025-04-28 22:53:13 +08:00
context : .
2024-10-08 22:16:17 +08:00
dockerfile : docker/api.Dockerfile
2026-05-22 20:22:09 +08:00
image : yuxi-api:${YUXI_VERSION:-0.6.2}
2024-10-08 22:16:17 +08:00
container_name : api-dev
working_dir : /app
volumes :
2026-03-17 10:16:44 +08:00
- ./backend/server:/app/server
2026-04-03 13:09:12 +08:00
- ./backend/package:/app/package
2025-04-29 00:04:40 +08:00
- ./saves:/app/saves
2026-03-17 10:16:44 +08:00
- ./backend/test:/app/test
- ./backend/scripts:/app/scripts
2026-03-30 15:24:47 +08:00
- ./docker/sandbox_provisioner:/app/docker/sandbox_provisioner:ro
2025-10-23 14:08:08 +08:00
- ./.env:/app/.env
2026-03-24 21:48:28 +08:00
- /var/run/docker.sock:/var/run/docker.sock
2026-04-24 16:18:01 +08:00
- nltk_data:/root/nltk_data # 使用命名卷持久化NLTK数据, 避免路径展开差异
2024-10-08 22:16:17 +08:00
ports :
2025-02-24 11:27:08 +08:00
- "5050:5050"
2024-10-08 22:16:17 +08:00
networks :
- app-network
2025-02-28 14:39:03 +08:00
extra_hosts :
- "host.docker.internal:host-gateway"
2025-06-27 01:55:04 +08:00
env_file :
2025-10-10 18:07:06 +08:00
- .env
2025-10-10 10:49:51 +08:00
# region api_envs
2024-10-08 22:16:17 +08:00
environment :
2026-03-20 20:21:02 +08:00
<< : *api-worker-env
2025-10-10 10:49:51 +08:00
# 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 --reload --reload-dir /app/server --reload-dir /app/package
2025-05-09 16:10:45 +08:00
restart : unless-stopped
2025-06-27 01:55:04 +08:00
healthcheck :
2025-07-22 17:29:38 +08:00
test : [ "CMD-SHELL" , "curl -f http://localhost:5050/api/system/health || exit 1" ]
2025-07-02 02:17:31 +08:00
interval : 30s
timeout : 15s
retries : 8
start_period : 180s
2025-06-20 17:32:49 +08:00
depends_on :
2026-01-21 15:15:52 +08:00
postgres :
condition : service_healthy
2026-02-25 16:26:09 +08:00
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-05-22 20:22:09 +08:00
image : yuxi-api:${YUXI_VERSION:-0.6.2}
2026-02-25 16:26:09 +08:00
container_name : worker-dev
working_dir : /app
volumes :
2026-03-17 10:16:44 +08:00
- ./backend/server:/app/server
2026-04-03 13:09:12 +08:00
- ./backend/package:/app/package
2026-02-25 16:26:09 +08:00
- ./saves:/app/saves
2026-03-17 10:16:44 +08:00
- ./backend/test:/app/test
- ./backend/scripts:/app/scripts
2026-03-30 15:24:47 +08:00
- ./docker/sandbox_provisioner:/app/docker/sandbox_provisioner:ro
2026-02-25 16:26:09 +08:00
- ./.env:/app/.env
2026-03-17 10:16:44 +08:00
- ./backend/pyproject.toml:/app/pyproject.toml
- ./backend/uv.lock:/app/uv.lock
2026-03-24 21:48:28 +08:00
- /var/run/docker.sock:/var/run/docker.sock
2026-02-25 16:26:09 +08:00
networks :
- app-network
extra_hosts :
- "host.docker.internal:host-gateway"
env_file :
- .env
environment :
2026-03-20 20:21:02 +08:00
<< : *api-worker-env
2026-05-23 12:24:11 +08:00
command : watchfiles --filter python "arq server.worker_main.WorkerSettings" /app/server /app/package
2026-02-25 16:26:09 +08:00
restart : unless-stopped
depends_on :
postgres :
condition : service_healthy
redis :
condition : service_healthy
2025-06-24 00:16:19 +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
2026-05-22 20:22:09 +08:00
image : yuxi-sandbox-provisioner:${YUXI_VERSION:-0.6.2}
2026-03-04 08:53:50 +08:00
container_name : sandbox-provisioner
volumes :
- ./saves:/app/saves
2026-03-05 22:50:38 +08:00
- ./docker/sandbox_provisioner/app.py:/app/app.py:ro
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-14 23:54:52 +08:00
ports :
- "8002:8002"
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
2026-03-05 22:50:38 +08:00
- HTTP_PROXY=${SANDBOX_HTTP_PROXY:-}
- HTTPS_PROXY=${SANDBOX_HTTPS_PROXY:-}
- NO_PROXY=localhost,127.0.0.1,host.docker.internal
2026-03-29 16:52:33 +08:00
# 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-05 22:50:38 +08:00
command : >
sh -lc "python -c 'import docker' >/dev/null 2>&1 || pip install --no-cache-dir 'docker>=7.1.0';
uvicorn app:app --host 0.0.0.0 --port 8002"
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
2024-10-08 22:16:17 +08:00
web :
build :
2025-04-28 22:53:13 +08:00
context : .
2024-10-08 22:16:17 +08:00
dockerfile : docker/web.Dockerfile
target : development
2026-05-22 20:22:09 +08:00
image : yuxi-web:${YUXI_VERSION:-0.6.2}
2024-10-08 22:16:17 +08:00
container_name : web-dev
volumes :
2025-07-28 19:07:58 +08:00
- ./web/src:/app/src
- ./web/public:/app/public
- ./web/index.html:/app/index.html
- ./web/vite.config.js:/app/vite.config.js
2024-10-08 22:16:17 +08:00
ports :
- "5173:5173"
depends_on :
- api
networks :
- app-network
environment :
- NODE_ENV=development
2025-05-09 16:10:45 +08:00
- VITE_API_URL=http://api:5050
2026-02-25 16:26:09 +08:00
- VITE_USE_RUNS_API=${VITE_USE_RUNS_API:-false}
2026-03-19 04:11:30 +08:00
- VITE_LITE_MODE=${LITE_MODE:-}
2025-04-28 22:53:13 +08:00
command : pnpm run server
2025-05-09 16:10:45 +08:00
restart : unless-stopped
2024-10-08 22:16:17 +08:00
2025-10-10 10:49:51 +08:00
# region neo4j
2024-10-08 22:16:17 +08:00
graph :
2025-04-28 16:47:26 +08:00
image : neo4j:5.26
2025-05-23 15:30:14 +08:00
container_name : graph
2024-10-08 22:16:17 +08:00
ports :
- "7474:7474"
- "7687:7687"
volumes :
2025-04-28 23:48:01 +08:00
- ./docker/volumes/neo4j/data:/data
- ./docker/volumes/neo4j/logs:/var/lib/neo4j/logs
2025-06-20 17:32:49 +08:00
healthcheck :
2026-03-17 10:16:44 +08:00
test : [ "CMD-SHELL" , "cypher-shell -a bolt://localhost:7687 -u ${NEO4J_USERNAME:-neo4j} -p ${NEO4J_PASSWORD:-0123456789} 'RETURN 1;' >/dev/null || exit 1" ]
2025-06-20 17:32:49 +08:00
interval : 20s
timeout : 10s
retries : 5
start_period : 30s
2024-10-08 22:16:17 +08:00
environment :
2025-05-09 16:10:45 +08:00
- NEO4J_AUTH=${NEO4J_USERNAME:-neo4j}/${NEO4J_PASSWORD:-0123456789}
2024-10-08 22:16:17 +08:00
- NEO4J_server_bolt_listen__address=0.0.0.0:7687
- NEO4J_server_http_listen__address=0.0.0.0:7474
2025-04-04 18:34:49 +08:00
- ENTITY_EMBEDDING=true
2024-10-08 22:16:17 +08:00
networks :
- app-network
2025-05-09 16:10:45 +08:00
restart : unless-stopped
2025-10-10 10:49:51 +08:00
# endregion neo4j
2024-10-08 22:16:17 +08:00
etcd :
container_name : milvus-etcd-dev
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 :
2025-04-28 23:48:01 +08:00
- ./docker/volumes/milvus/etcd:/etcd
2025-10-23 14:08:08 +08:00
command : etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
2024-10-08 22:16:17 +08:00
healthcheck :
test : [ "CMD" , "etcdctl" , "endpoint" , "health" ]
2025-05-09 16:10:45 +08:00
interval : 60s
timeout : 30s
retries : 5
start_period : 30s
2024-10-08 22:16:17 +08:00
networks :
- app-network
2025-05-09 16:10:45 +08:00
restart : unless-stopped
2024-10-08 22:16:17 +08:00
minio :
2026-03-19 12:48:25 +08:00
container_name : minio
2024-10-08 22:16:17 +08:00
image : minio/minio:RELEASE.2023-03-20T20-16-18Z
environment :
2025-05-09 16:10:45 +08:00
MINIO_ACCESS_KEY : ${MINIO_ACCESS_KEY:-minioadmin}
MINIO_SECRET_KEY : ${MINIO_SECRET_KEY:-minioadmin}
2024-10-08 22:16:17 +08:00
volumes :
2025-04-28 23:48:01 +08:00
- ./docker/volumes/milvus/minio:/minio_data
2025-06-24 00:16:19 +08:00
- ./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
2024-10-08 22:16:17 +08:00
healthcheck :
test : [ "CMD" , "curl" , "-f" , "http://localhost:9000/minio/health/live" ]
2025-05-09 16:10:45 +08:00
interval : 60s
timeout : 30s
retries : 5
start_period : 30s
2025-06-24 00:16:19 +08:00
ports :
- "9000:9000"
- "9001:9001"
2024-10-08 22:16:17 +08:00
networks :
- app-network
2025-05-09 16:10:45 +08:00
restart : unless-stopped
2024-10-08 22:16:17 +08:00
milvus :
2025-04-28 16:40:03 +08:00
image : milvusdb/milvus:v2.5.6
2025-05-23 15:30:14 +08:00
container_name : milvus
2024-10-08 22:16:17 +08:00
command : [ "milvus" , "run" , "standalone" ]
security_opt :
- seccomp:unconfined
environment :
ETCD_ENDPOINTS : etcd:2379
MINIO_ADDRESS : minio:9000
2025-05-09 16:10:45 +08:00
MILVUS_LOG_LEVEL : error
2024-10-08 22:16:17 +08:00
volumes :
2025-04-28 23:48:01 +08:00
- ./docker/volumes/milvus/milvus:/var/lib/milvus
- ./docker/volumes/milvus/logs:/var/lib/milvus/logs
2024-10-08 22:16:17 +08:00
healthcheck :
test : [ "CMD" , "curl" , "-f" , "http://localhost:9091/healthz" ]
2025-05-09 16:10:45 +08:00
interval : 60s
start_period : 120s
timeout : 30s
retries : 5
2024-10-08 22:16:17 +08:00
ports :
- "19530:19530"
- "9091:9091"
depends_on :
- "etcd"
- "minio"
networks :
- app-network
2025-05-09 16:10:45 +08:00
restart : unless-stopped
2025-10-24 01:09:24 +08:00
2026-01-21 15:15:52 +08:00
postgres :
image : postgres:16
container_name : postgres
ports :
- "5432:5432"
environment :
- POSTGRES_USER=${POSTGRES_USER:-postgres}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
- POSTGRES_DB=${POSTGRES_DB:-yuxi_know}
- TZ=${TZ:-Asia/Shanghai}
volumes :
- ./docker/volumes/postgresql:/var/lib/postgresql/data
healthcheck :
test : [ "CMD-SHELL" , "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-yuxi_know} || exit 1" ]
interval : 5s
timeout : 3s
retries : 30
networks :
- app-network
restart : unless-stopped
2026-02-25 16:26:09 +08:00
redis :
image : redis:7-alpine
container_name : redis
2026-03-14 15:58:35 +08:00
ports :
- "6379:6379"
2026-02-25 16:26:09 +08:00
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
2025-06-18 19:07:29 +08:00
# lastest version: wget https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/docker/compose.yaml
2026-05-15 21:20:13 +08:00
mineru-api :
2025-05-23 15:30:14 +08:00
build :
2025-06-20 17:32:49 +08:00
context : .
dockerfile : docker/mineru.Dockerfile
2025-10-24 01:09:24 +08:00
image : mineru-vllm:latest
2026-05-15 21:20:13 +08:00
container_name : mineru-api
2025-06-20 17:32:49 +08:00
profiles :
- all
2025-10-26 18:30:59 +08:00
env_file :
- .env
2025-06-18 19:07:29 +08:00
ports :
2026-05-15 21:20:13 +08:00
- 30001 : 30001
2025-06-18 19:07:29 +08:00
environment :
2025-10-24 01:09:24 +08:00
MINERU_MODEL_SOURCE : local
2026-05-15 21:20:13 +08:00
VLLM_USE_V1 : "1"
entrypoint : mineru-api
2025-06-18 19:07:29 +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.
2025-10-24 01:09:24 +08:00
# parameters for vllm-engine
2026-05-15 21:20:13 +08:00
# --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-06-18 19:07:29 +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-05-23 15:30:14 +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-06-20 17:33:14 +08:00
capabilities : [ gpu]
networks :
- app-network
restart : unless-stopped
paddlex :
build :
context : .
dockerfile : docker/paddlex.Dockerfile
image : paddlex:latest
2025-06-25 14:16:34 +08:00
container_name : paddlex-ocr
2025-06-20 17:33:14 +08:00
profiles :
- all
volumes :
- ./docker/volumes/paddlex:/paddlex
ports :
- "8080:8080"
healthcheck :
2025-08-28 23:08:04 +08:00
test : [ "CMD-SHELL" , "curl -f http://localhost:8080/health || exit 1" ]
2025-06-20 17:33:14 +08:00
interval : 20s
timeout : 10s
retries : 5
start_period : 60s
deploy :
resources :
reservations :
devices :
- driver : nvidia
device_ids : [ '0' ]
2025-05-23 15:30:14 +08:00
capabilities : [ gpu]
networks :
- app-network
restart : unless-stopped
2025-06-17 10:54:45 +08:00
2026-04-24 16:18:01 +08:00
volumes :
nltk_data :
2024-10-08 22:16:17 +08:00
networks :
app-network :
2024-10-23 16:24:09 +08:00
driver : bridge
2026-04-05 17:56:15 +08:00
name : ${SANDBOX_DOCKER_NETWORK:-yuxi-know_app-network}