version: '3.8' services: # ---------------------- 基础设施 ---------------------- mysql: image: mysql:5.7 container_name: ai-assistant-mysql restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} MYSQL_DATABASE: ${MYSQL_DATABASE:-ai_assistant} MYSQL_CHARACTER_SET_SERVER: utf8mb4 MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql command: > --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD:-root}"] interval: 10s timeout: 5s retries: 5 start_period: 30s networks: - ai-assistant-network redis: image: redis:6-alpine container_name: ai-assistant-redis restart: always ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - ai-assistant-network rabbitmq: image: rabbitmq:3-management-alpine container_name: ai-assistant-rabbitmq restart: always ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER:-admin} RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS:-admin} volumes: - rabbitmq_data:/var/lib/rabbitmq healthcheck: test: ["CMD", "rabbitmq-diagnostics", "ping"] interval: 10s timeout: 5s retries: 5 networks: - ai-assistant-network # ---------------------- 后端服务 ---------------------- gateway: build: ./backend/gateway container_name: ai-assistant-gateway restart: always ports: - "8080:8080" volumes: - ./gateway-application.yml:/app/config/application.yml depends_on: - auth-service - archive-service - conversation-service - intent-service - recommend-service - generation-service - kb-admin-service - analytics-service networks: - ai-assistant-network auth-service: build: ./backend/auth-service container_name: ai-assistant-auth restart: always ports: - "8081:8081" environment: - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 - SERVER_SERVLET_ENCODING_ENABLED=true - SERVER_SERVLET_ENCODING_FORCE=true - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - MYSQL_PORT=63912 - MYSQL_DATABASE=ai_assistant - SPRING_DATASOURCE_USERNAME=assistant_prod - SPRING_DATASOURCE_PASSWORD=U%$4Tu_C3+4 - SPRING_DATASOURCE_URL=jdbc:mysql://sh-cdb-6fzlwnms.sql.tencentcdb.com:63912/ai_assistant?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false - REDIS_HOST=redis - JWT_SECRET=${JWT_SECRET:-your-256-bit-secret-key-here-at-least-32-characters} depends_on: - mysql - redis networks: - ai-assistant-network archive-service: build: ./backend/archive-service container_name: ai-assistant-archive restart: always ports: - "8082:8082" environment: - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 - SERVER_SERVLET_ENCODING_ENABLED=true - SERVER_SERVLET_ENCODING_FORCE=true - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - MYSQL_PORT=63912 - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - REDIS_HOST=redis - RABBITMQ_HOST=rabbitmq - WECOM_ARCHIVE_SECRET=${WECOM_ARCHIVE_SECRET:-} - WECOM_ARCHIVE_CALLBACK_TOKEN=${WECOM_ARCHIVE_CALLBACK_TOKEN:-} - WECOM_ARCHIVE_CALLBACK_AESKEY=${WECOM_ARCHIVE_CALLBACK_AESKEY:-} - WECOM_ARCHIVE_SDK_PATH=${WECOM_ARCHIVE_SDK_PATH:-/app/sdk} - ARCHIVE_REPAIR_ON_STARTUP=true - WECOM_AGENT_SECRET=nU1xezyHyonS9rOJ9Kwo3i5OM9iuWc1TrjXf-rOYZx0 - WECOM_CONTACT_SECRET=zrZkae10k1T7bqrt-jVYjj9LQ4GgMibj-wUMy48OsyY volumes: - ./keys:/app/keys # 如需真实企微SDK,取消注释下行并将Linux .so文件放入 ./sdk/linux/ - ./sdk/linux:/app/sdk depends_on: - mysql - redis - rabbitmq networks: - ai-assistant-network conversation-service: build: ./backend/conversation-service container_name: ai-assistant-conversation restart: always ports: - "8083:8083" environment: - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 - SERVER_SERVLET_ENCODING_ENABLED=true - SERVER_SERVLET_ENCODING_FORCE=true - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - MYSQL_PORT=63912 - REDIS_HOST=redis - RABBITMQ_HOST=rabbitmq depends_on: - mysql - redis - rabbitmq networks: - ai-assistant-network intent-service: build: ./backend/intent-service container_name: ai-assistant-intent restart: always ports: - "8084:8084" environment: - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 - SERVER_SERVLET_ENCODING_ENABLED=true - SERVER_SERVLET_ENCODING_FORCE=true - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - MYSQL_PORT=63912 - REDIS_HOST=redis - RABBITMQ_HOST=rabbitmq depends_on: - mysql - redis - rabbitmq networks: - ai-assistant-network recommend-service: build: ./backend/recommendation-service container_name: ai-assistant-recommend restart: always ports: - "8085:8085" environment: - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 - SERVER_SERVLET_ENCODING_ENABLED=true - SERVER_SERVLET_ENCODING_FORCE=true - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - MYSQL_PORT=63912 - REDIS_HOST=redis - RABBITMQ_HOST=rabbitmq - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY:-} - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com - MYSQL_PORT=63912 - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - MYSQL_DATABASE=ai_assistant depends_on: - mysql - redis - rabbitmq networks: - ai-assistant-network generation-service: build: ./backend/generation-service container_name: ai-assistant-generation restart: always ports: - "8086:8086" environment: - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 - SERVER_SERVLET_ENCODING_ENABLED=true - SERVER_SERVLET_ENCODING_FORCE=true - REDIS_HOST=redis - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY:-} - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com - MYSQL_PORT=63912 - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - MYSQL_DATABASE=ai_assistant depends_on: - redis networks: - ai-assistant-network kb-admin-service: build: ./backend/kb-admin-service container_name: ai-assistant-kbadmin restart: always ports: - "8087:8087" environment: - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 - SERVER_SERVLET_ENCODING_ENABLED=true - SERVER_SERVLET_ENCODING_FORCE=true - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - MYSQL_PORT=63912 - REDIS_HOST=redis depends_on: - mysql - redis networks: - ai-assistant-network analytics-service: build: ./backend/analytics-service container_name: ai-assistant-analytics restart: always ports: - "8088:8088" environment: - SERVER_SERVLET_ENCODING_CHARSET=UTF-8 - SERVER_SERVLET_ENCODING_ENABLED=true - SERVER_SERVLET_ENCODING_FORCE=true - MYSQL_HOST=sh-cdb-6fzlwnms.sql.tencentcdb.com - MYSQL_USERNAME=assistant_prod - MYSQL_PASSWORD=U%$4Tu_C3+4 - MYSQL_PORT=63912 - REDIS_HOST=redis depends_on: - mysql - redis networks: - ai-assistant-network # ---------------------- 前端服务 ---------------------- admin: build: ./frontend/admin container_name: ai-assistant-admin restart: always ports: - "5174:80" depends_on: - gateway networks: - ai-assistant-network sidebar: build: ./frontend/sidebar container_name: ai-assistant-sidebar restart: always ports: - "5173:80" depends_on: - gateway networks: - ai-assistant-network # ---------------------- 统一入口 Nginx ---------------------- nginx: image: nginx:alpine container_name: ai-assistant-nginx restart: always ports: - "8089:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - gateway - admin - sidebar networks: - ai-assistant-network # ---------------------- 数据卷 ---------------------- volumes: mysql_data: redis_data: rabbitmq_data: # ---------------------- 网络 ---------------------- networks: ai-assistant-network: driver: bridge