From c5c3852a4bbafafb5ab9689965f3f909277729e8 Mon Sep 17 00:00:00 2001 From: mlogclub Date: Sat, 23 May 2026 22:53:33 +0800 Subject: [PATCH] feat: add Docker Compose configuration and update README for improved setup instructions --- .dockerignore | 1 + README.md | 18 ++++++++--- docker-compose.yml | 53 ++++++++++++++++++++++++++++++++ docker/cs-agent.yaml | 73 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 docker-compose.yml create mode 100644 docker/cs-agent.yaml diff --git a/.dockerignore b/.dockerignore index c44b5d0..d76ed8d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,6 +7,7 @@ .superpowers Dockerfile +docker-data dist data qdrant diff --git a/README.md b/README.md index 784fbcb..b66f7d0 100644 --- a/README.md +++ b/README.md @@ -280,16 +280,26 @@ make migration # 执行 migration ## Docker +推荐使用 Docker Compose 同时启动应用、MySQL 和 Qdrant: + ```bash -docker build -t cs-agent . -docker run --rm -p 8083:8083 -v cs-agent-data:/app/data cs-agent +docker compose up -d --build ``` -容器默认使用 `/app/config/config.yaml`,镜像内会基于 `config/config.example.yaml` 放置一份默认配置。生产环境建议通过挂载配置文件覆盖: +Compose 默认会启动: + +- `cs-agent`:应用服务,端口 `8083` +- `mysql`:MySQL 8.4,数据卷 `mysql-data` +- `qdrant`:向量数据库,数据卷 `qdrant-data`,端口 `6333`/`6334` + +Compose 使用 [docker/cs-agent.yaml](docker/cs-agent.yaml) 作为容器内配置,应用会通过 Docker 内部服务名访问 `mysql` 和 `qdrant`。 + +也可以只构建应用镜像,但需要自行准备 MySQL 和 Qdrant,并挂载对应配置: ```bash +docker build -t cs-agent . docker run --rm -p 8083:8083 \ - -v $(pwd)/config/config.yaml:/app/config/config.yaml:ro \ + -v $(pwd)/docker/cs-agent.yaml:/app/config/config.yaml:ro \ -v cs-agent-data:/app/data \ cs-agent ``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f134ab9 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,53 @@ +services: + mysql: + image: mysql:8.4 + restart: unless-stopped + environment: + MYSQL_DATABASE: cs_ai_agent + MYSQL_USER: cs_agent + MYSQL_PASSWORD: cs_agent_password + MYSQL_ROOT_PASSWORD: cs_agent_root_password + TZ: Asia/Shanghai + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + volumes: + - mysql-data:/var/lib/mysql + healthcheck: + test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u\"$${MYSQL_USER}\" -p\"$${MYSQL_PASSWORD}\" --silent"] + interval: 10s + timeout: 5s + retries: 10 + + qdrant: + image: qdrant/qdrant:latest + restart: unless-stopped + volumes: + - qdrant-data:/qdrant/storage + ports: + - "6333:6333" + - "6334:6334" + + cs-agent: + build: + context: . + dockerfile: Dockerfile + image: cs-agent:latest + restart: unless-stopped + depends_on: + mysql: + condition: service_healthy + qdrant: + condition: service_started + ports: + - "8083:8083" + volumes: + - cs-agent-data:/app/data + - ./docker/cs-agent.yaml:/app/config/config.yaml:ro + environment: + TZ: Asia/Shanghai + +volumes: + mysql-data: + qdrant-data: + cs-agent-data: diff --git a/docker/cs-agent.yaml b/docker/cs-agent.yaml new file mode 100644 index 0000000..9d8b1c2 --- /dev/null +++ b/docker/cs-agent.yaml @@ -0,0 +1,73 @@ +server: + port: 8083 + +db: + type: mysql + dsn: cs_agent:cs_agent_password@tcp(mysql:3306)/cs_ai_agent?charset=utf8mb4&parseTime=True&multiStatements=true&loc=Local + maxIdleConns: 5 + maxOpenConns: 20 + connMaxIdleTimeSeconds: 300 + connMaxLifetimeSeconds: 1800 + +logger: + level: info + format: text + addSource: false + +auth: + tokenTTLHours: 12 + maxFailedAttempts: 5 + credentialLockMinute: 15 + +customerSession: + secret: replace-with-a-random-secret + ttlMinutes: 120 + refreshThresholdMinutes: 30 + +storage: + default: local + maxUploadSizeMB: 20 + local: + root: /app/data/storage + baseUrl: /storage + oss: + endpoint: "" + bucket: "" + accessKeyId: "" + accessKeySecret: "" + baseUrl: "" + private: false + signedUrlExpireSeconds: 600 + +vectorDB: + type: qdrant + host: qdrant + grpcPort: 6334 + apiKey: "" + useTls: false + +mcp: + enabled: true + servers: + system: + enabled: true + endpoint: "http://127.0.0.1:8083/api/mcp" + timeoutMs: 15000 + headers: {} + +wxWork: + enabled: false + corpId: "" + corpSecret: "" + agentId: "" + oauthRedirect: "" + stateSecret: "" + rsaPrivateKey: "" + token: "" + encodingAESKey: "" + notify: + enabled: false + toUsers: [] + safe: false + enableDuplicateCheck: true + duplicateCheckInterval: 1800