dashboard-nanobot/docker-compose.full.yml

164 lines
10 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Dashboard Nanobot Docker 编排文件Full 模式)
# 说明:
# 1. 当前文件用于“前端 + 后端 + PostgreSQL + Redis”整套部署。
# 2. 数据库和 Redis 都在本 compose 中启动,适合客户没有外部中间件时使用。
# 3. 客户通常需要重点修改 `.env` 里的端口、数据库密码、工作目录路径。
# 4. 如果需要调整宿主机挂载路径,可以直接修改下方 `volumes`。
services: # 定义当前 compose 里需要启动的服务
postgres: # PostgreSQL 数据库服务
image: ${POSTGRES_IMAGE:-postgres:16-alpine} # PostgreSQL 镜像名
container_name: dashboard-nanobot-postgres # PostgreSQL 容器固定名称
restart: unless-stopped # 异常退出后自动拉起
environment: # PostgreSQL 启动参数
TZ: ${TZ:-Asia/Shanghai} # 容器时区
POSTGRES_USER: ${POSTGRES_SUPERUSER:-postgres} # PostgreSQL 超级用户
POSTGRES_PASSWORD: ${POSTGRES_SUPERPASSWORD:?POSTGRES_SUPERPASSWORD is required} # PostgreSQL 超级用户密码
POSTGRES_DB: ${POSTGRES_BOOTSTRAP_DB:-postgres} # 启动时默认数据库
volumes: # 数据库存储挂载
- ./data/postgres:/var/lib/postgresql/data # 宿主机数据库目录映射到容器数据目录
expose: # 仅对内部网络开放
- "5432" # PostgreSQL 默认端口
healthcheck: # PostgreSQL 健康检查
test: ["CMD-SHELL", "pg_isready -U \"$${POSTGRES_USER}\" -d \"$${POSTGRES_DB}\""] # 检测数据库是否就绪
interval: 10s # 每 10 秒检查一次
timeout: 5s # 单次检查超时 5 秒
retries: 10 # 连续失败 10 次判定不健康
start_period: 20s # 启动后预留 20 秒缓冲时间
logging: # 容器日志策略
driver: json-file # 使用 Docker 默认 json-file 日志驱动
options: # 日志滚动配置
max-size: "20m" # 单个日志文件最大 20MB
max-file: "3" # 最多保留 3 个日志文件
redis: # Redis 缓存服务
image: ${REDIS_IMAGE:-redis:7-alpine} # Redis 镜像名
container_name: dashboard-nanobot-redis # Redis 容器固定名称
restart: unless-stopped # 异常退出后自动拉起
environment: # Redis 运行环境变量
TZ: ${TZ:-Asia/Shanghai} # 容器时区
command: ["redis-server", "--appendonly", "yes", "--save", "60", "1000"] # 开启 AOF 持久化并保留快照策略
volumes: # Redis 数据挂载
- ./data/redis:/data # 宿主机 Redis 数据目录映射到容器
expose: # 仅对内部网络开放
- "6379" # Redis 默认端口
healthcheck: # Redis 健康检查
test: ["CMD", "redis-cli", "ping"] # 检测 Redis 是否响应
interval: 10s # 每 10 秒检查一次
timeout: 5s # 单次检查超时 5 秒
retries: 10 # 连续失败 10 次判定不健康
start_period: 10s # 启动后预留 10 秒缓冲时间
logging: # 容器日志策略
driver: json-file # 使用 Docker 默认 json-file 日志驱动
options: # 日志滚动配置
max-size: "20m" # 单个日志文件最大 20MB
max-file: "3" # 最多保留 3 个日志文件
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 # 异常退出后自动拉起
depends_on: # 依赖中间件健康后再启动
postgres: # 依赖 PostgreSQL
condition: service_healthy # 要求 PostgreSQL 健康
redis: # 依赖 Redis
condition: service_healthy # 要求 Redis 健康
environment: # 后端环境变量
TZ: ${TZ:-Asia/Shanghai} # 容器时区
APP_HOST: 0.0.0.0 # 服务监听地址,容器内通常保持 0.0.0.0
APP_PORT: 8000 # 服务监听端口,需与 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: postgresql+psycopg://${POSTGRES_APP_USER}:${POSTGRES_APP_PASSWORD}@postgres:5432/${POSTGRES_APP_DB} # Full 模式固定连接内部 PostgreSQL
REDIS_ENABLED: ${REDIS_ENABLED:-true} # Full 模式默认启用 Redis
REDIS_URL: redis://redis:6379/${REDIS_DB:-8} # Full 模式固定连接内部 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: # 只暴露给内部网络,不直接发布到宿主机
- "8000" # 后端服务端口
healthcheck: # 健康检查,供 nginx 依赖判断使用
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/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: # 前端环境变量
TZ: ${TZ:-Asia/Shanghai} # 容器时区
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} # 自定义子网,现场冲突时可修改