Files

101 lines
3.6 KiB
YAML
Raw Permalink Normal View History

# ============================================================
# OPC 智能园区后端 · Docker Compose 一键部署
#
# 启动: docker compose up -d --build
# 停止: docker compose down
# 查看: docker compose logs -f backend
# 重建: docker compose up -d --build backend
#
# 部署前配置(可选,均可用环境变量覆盖):
# export MQTT_PUBLIC_HOST=192.168.1.50 # 展播端能访问到的 Broker 地址(服务器局域网 IP)
# export EMQX_USER=dpmserver EMQX_PASS=xxxxx
# export DASHSCOPE_API_KEY=sk-xxxx # AI/语音(未配置时 AI 走本地规则引擎)
# export DPM_S2S_ENABLED=0 # 不需要实时语音对话可关闭
#
# 端口:
# · 10085 HTTPAPI + 管理后台 + 媒体)
# · 8765 s2s 实时语音 WebSocketDPM_S2S_ENABLED=1 时)
# · 1883/8083/18083 EMQXMQTT / MQTT-WS / 控制台)
# ============================================================
services:
# ---------- MQTT BrokerEMQX 5.x ----------
emqx:
image: emqx/emqx:5.8
container_name: dpm-emqx
restart: unless-stopped
ports:
- "1883:1883" # MQTT
- "8083:8083" # MQTT over WebSocket(展播端 /api/config 下发)
- "18083:18083" # EMQX Dashboard(可选,账号 admin / public
environment:
EMQX_NAME: dpm-emqx
EMQX_HOST: node.emqx.dpm.local
EMQX_NODE__COOKIE: dpm-emqx-cookie
EMQX_DASHBOARD__DEFAULT_PASSWORD: "${EMQX_DASHBOARD_PASS:-public}"
# 鉴权:禁止匿名,单账号 dpmserver(与 backend/.env 一致)
EMQX_ALLOW_ANONYMOUS: "false"
EMQX_AUTH__USER__1__LOGIN: "${EMQX_USER:-dpmserver}"
EMQX_AUTH__USER__1__PASSWORD: "${EMQX_PASS:-123456}"
volumes:
- emqx_data:/opt/emqx/data
- emqx_log:/opt/emqx/log
healthcheck:
test: ["CMD", "emqx", "ctl", "status"]
interval: 10s
timeout: 5s
retries: 12
start_period: 15s
networks:
- dpm_net
# ---------- 园区后端(FastAPI :10085 + s2s :8765 ----------
backend:
build:
context: .
dockerfile: backend/Dockerfile
image: dpm-backend:latest
container_name: dpm-backend
restart: unless-stopped
depends_on:
emqx:
condition: service_healthy
ports:
- "10085:10085" # API / 管理后台 / 媒体
- "8765:8765" # s2s 实时语音(DPM_S2S_ENABLED=1 时)
environment:
DPM_PORT: "10085"
DPM_MQTT_ENABLED: "1"
MQTT_BROKER_HOST: emqx
MQTT_BROKER_PORT: "1883"
MQTT_USERNAME: "${EMQX_USER:-dpmserver}"
MQTT_PASSWORD: "${EMQX_PASS:-123456}"
# 展播端(Tauri 大屏)经后端 /api/config 获取的 WebSocket 地址:
# 必须填"展播机能访问到的服务器地址",默认 192.168.1.9(同机部署)
DPM_MQTT_WS: "ws://${MQTT_PUBLIC_HOST:-192.168.1.9}:8083/mqtt"
DPM_S2S_ENABLED: "${DPM_S2S_ENABLED:-1}"
DASHSCOPE_API_KEY: "${DASHSCOPE_API_KEY:-}"
volumes:
- dpm_media:/app/backend/media # 媒体资源(上传持久化)
- dpm_knowledge:/app/backend/knowledge # 知识库 park.md(可热更新,删除 kb_index.json 触发重建)
- dpm_data:/app/backend/data.json # 播放列表 / 设置
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://192.168.1.9:10085/api/health', timeout=4).status==200 else 1)"]
interval: 15s
timeout: 5s
retries: 5
start_period: 30s
networks:
- dpm_net
networks:
dpm_net:
driver: bridge
volumes:
emqx_data:
emqx_log:
dpm_media:
dpm_knowledge:
dpm_data: