# Dashboard Nanobot Docker 编排文件(Prod 模式) # 说明: # 1. 当前文件用于“前端 + 后端”部署。 # 2. PostgreSQL 与 Redis 由客户现场外部提供,本文件不会启动这两个服务。 # 3. 客户通常需要重点修改 `.env` 里的端口、数据库连接串、Redis 连接串、工作目录路径。 # 4. 如果需要调整宿主机挂载路径,可以直接修改下方 `volumes`。 services: # 定义当前 compose 里需要启动的服务 backend: # 后端 API 服务 build: # 保留构建信息,便于有源码时重新 build;离线部署通常直接用 image context: . # 构建上下文为项目根目录 dockerfile: backend/Dockerfile # 后端 Dockerfile 路径 args: # 构建参数 PYTHON_BASE_IMAGE: ${PYTHON_BASE_IMAGE:-python:3.12-slim} # Python 基础镜像 PIP_INDEX_URL: ${PIP_INDEX_URL:-https://pypi.org/simple} # pip 源地址 PIP_TRUSTED_HOST: ${PIP_TRUSTED_HOST:-} # pip 信任主机 image: dashboard-nanobot/backend:${BACKEND_IMAGE_TAG:-latest} # 后端运行镜像名 container_name: dashboard-nanobot-backend # 后端容器固定名称 restart: unless-stopped # 异常退出后自动拉起,手动停止时不自动启动 environment: # 后端环境变量 APP_HOST: 0.0.0.0 # 服务监听地址,容器内通常保持 0.0.0.0 APP_PORT: 8002 # 服务监听端口,需与 expose 和健康检查保持一致 APP_RELOAD: "false" # 生产环境关闭热重载 DATABASE_ECHO: "false" # 生产环境关闭 SQL 日志回显 DATABASE_POOL_SIZE: ${DATABASE_POOL_SIZE:-20} # 数据库连接池基础连接数 DATABASE_MAX_OVERFLOW: ${DATABASE_MAX_OVERFLOW:-40} # 连接池额外可溢出连接数 DATABASE_POOL_TIMEOUT: ${DATABASE_POOL_TIMEOUT:-30} # 获取连接超时时间(秒) DATABASE_POOL_RECYCLE: ${DATABASE_POOL_RECYCLE:-1800} # 连接回收周期(秒) DATA_ROOT: /app/data # 容器内业务数据目录 BOTS_WORKSPACE_ROOT: ${HOST_BOTS_WORKSPACE_ROOT} # Bot 工作目录,容器内外路径保持一致 DOCKER_NETWORK_NAME: ${DOCKER_NETWORK_NAME:-dashboard-nanobot-network} # 业务容器使用的 Docker 网络名称 DATABASE_URL: ${DATABASE_URL:-} # 外部 PostgreSQL 连接串,Prod 模式必须配置 REDIS_ENABLED: ${REDIS_ENABLED:-false} # 是否启用 Redis REDIS_URL: ${REDIS_URL:-} # 外部 Redis 连接串 REDIS_PREFIX: ${REDIS_PREFIX:-dashboard_nanobot} # Redis key 前缀 REDIS_DEFAULT_TTL: ${REDIS_DEFAULT_TTL:-60} # Redis 默认过期时间(秒) DEFAULT_BOT_SYSTEM_TIMEZONE: ${DEFAULT_BOT_SYSTEM_TIMEZONE:-Asia/Shanghai} # Bot 默认时区 PANEL_ACCESS_PASSWORD: ${PANEL_ACCESS_PASSWORD:-} # 面板访问密码 WORKSPACE_PREVIEW_SIGNING_SECRET: ${WORKSPACE_PREVIEW_SIGNING_SECRET:-} # 预览签名密钥 WORKSPACE_PREVIEW_TOKEN_TTL_SECONDS: ${WORKSPACE_PREVIEW_TOKEN_TTL_SECONDS:-3600} # 预览令牌有效期(秒) CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-} # 前端跨域白名单 STT_ENABLED: ${STT_ENABLED:-true} # 是否启用语音识别 STT_MODEL: ${STT_MODEL:-ggml-small-q8_0.bin} # 语音识别模型文件名 STT_MODEL_DIR: ${STT_MODEL_DIR:-/app/data/model} # 语音识别模型目录 STT_DEVICE: ${STT_DEVICE:-cpu} # 语音识别运行设备 STT_MAX_AUDIO_SECONDS: ${STT_MAX_AUDIO_SECONDS:-20} # 单次音频最大秒数 STT_DEFAULT_LANGUAGE: ${STT_DEFAULT_LANGUAGE:-zh} # 默认语音识别语言 STT_FORCE_SIMPLIFIED: ${STT_FORCE_SIMPLIFIED:-true} # 是否强制输出简体中文 STT_AUDIO_PREPROCESS: ${STT_AUDIO_PREPROCESS:-true} # 是否预处理音频 STT_AUDIO_FILTER: ${STT_AUDIO_FILTER:-highpass=f=120,lowpass=f=7600,afftdn=nf=-20} # 音频滤波参数 STT_INITIAL_PROMPT: ${STT_INITIAL_PROMPT:-以下内容可能包含简体中文和英文术语。请优先输出简体中文,英文单词、缩写、品牌名和数字保持原文,不要翻译。} # 语音识别初始提示词 volumes: # 宿主机与容器挂载关系 - /var/run/docker.sock:/var/run/docker.sock # 必须保留,后端需要管理 Bot 容器 - ./data:/app/data # 项目数据目录,建议保留在交付目录下 - ${HOST_BOTS_WORKSPACE_ROOT}:${HOST_BOTS_WORKSPACE_ROOT} # Bot 工作目录挂载,路径通常由客户现场决定 expose: # 只暴露给内部网络,不直接发布到宿主机 - "8002" # 后端服务端口 healthcheck: # 健康检查,供 nginx 依赖判断使用 test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8002/api/health', timeout=3).read()"] # 检测后端健康接口 interval: 15s # 每 15 秒检查一次 timeout: 5s # 单次检查超时 5 秒 retries: 5 # 连续失败 5 次判定不健康 start_period: 20s # 启动后预留 20 秒缓冲时间 logging: # 容器日志策略 driver: json-file # 使用 Docker 默认 json-file 日志驱动 options: # 日志滚动配置 max-size: "20m" # 单个日志文件最大 20MB max-file: "3" # 最多保留 3 个日志文件 nginx: # 前端 Nginx 服务 build: # 保留构建信息,离线部署通常直接使用导入镜像 context: ./frontend # 前端构建上下文 dockerfile: Dockerfile # 前端 Dockerfile 路径 args: # 前端构建参数 NODE_BASE_IMAGE: ${NODE_BASE_IMAGE:-node:22-alpine} # Node 基础镜像 NGINX_BASE_IMAGE: ${NGINX_BASE_IMAGE:-nginx:alpine} # Nginx 基础镜像 NPM_REGISTRY: ${NPM_REGISTRY:-https://registry.npmjs.org/} # npm 源地址 VITE_API_BASE: /api # 前端 API 前缀 VITE_WS_BASE: /ws/monitor # 前端 WebSocket 前缀 image: dashboard-nanobot/nginx:${FRONTEND_IMAGE_TAG:-latest} # 前端运行镜像名 container_name: dashboard-nanobot-nginx # 前端容器固定名称 restart: unless-stopped # 异常退出后自动拉起 environment: # 前端环境变量 UPLOAD_MAX_MB: ${UPLOAD_MAX_MB:-100} # 上传大小限制,传给 Nginx 配置使用 depends_on: # 依赖后端健康后再启动 backend: # 依赖后端容器 condition: service_healthy # 要求后端健康 ports: # 对外开放端口 - "${NGINX_PORT}:80" # 宿主机端口映射到容器 80 端口 healthcheck: # Nginx 健康检查 test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1/"] # 检测首页是否可访问 interval: 15s # 每 15 秒检查一次 timeout: 5s # 单次检查超时 5 秒 retries: 5 # 连续失败 5 次判定不健康 start_period: 10s # 启动后预留 10 秒缓冲时间 logging: # 容器日志策略 driver: json-file # 使用 Docker 默认 json-file 日志驱动 options: # 日志滚动配置 max-size: "20m" # 单个日志文件最大 20MB max-file: "3" # 最多保留 3 个日志文件 networks: # 自定义网络配置 default: # 默认网络 name: ${DOCKER_NETWORK_NAME:-dashboard-nanobot-network} # 网络名称,客户通常无需修改 driver: bridge # 使用 bridge 网络驱动 ipam: # IP 地址管理配置 config: # 网段配置列表 - subnet: ${DOCKER_NETWORK_SUBNET:-172.20.0.0/16} # 自定义子网,现场冲突时可修改