# Windows 打包部署指南(免重打包改地址) ## 一、打包后在 exe 同目录放置 config.json(推荐) 打包安装后,在 exe 所在目录(如 `C:\Program Files\云超服昆创园OPC运营中心\`)新建 **`config.json`**, 改地址**不需要重新打包**,重启应用即生效: ```json { "api_base": "http://192.168.1.9:8090/park", "mqtt_url": "ws://192.168.1.3:8083/mqtt", "mqtt_username": "dpm", "mqtt_password": "123456", "voice_url": "ws://192.168.1.3:8765/v1/realtime", "vision_api": "http://192.168.1.9:8091" } ``` - `api_base`:server-core 统一入口园区地址(`http://:8090/park`;生产 `https://opc.pinesound.cn/park`),大屏 API/媒体/OTA 都走它 - `mqtt_url`:EMQX Broker 的 **WebSocket** 地址(端口 8083) - `mqtt_username/password`:Broker 鉴权账号(默认 dpm / 123456,与后端 .env 一致) - `vision_api`:**可选**。视频识别独立服务(code/park-vision,`http://:8091`)。不填=视频识别禁用(摄像头不开启)。也可经 server-core `/park/api/config` 下发(见「三、视频识别」)。 地址解析优先级:**config.json > 后端 /api/config > 构建默认(192.168.1.9)**。 ## 二、后端 /api/config 方式(同机部署自动生效) 后端 `.env`(backend/.env)配置 Broker 后,展播端启动时自动从 `GET /api/config` 获取 MQTT 地址,**无需 config.json**: ``` DPM_MQTT_HOST=192.168.1.3 DPM_MQTT_PORT=1883 DPM_MQTT_WS=ws://192.168.1.3:8083/mqtt # 展播端可访问的 WebSocket 地址 DPM_VOICE_WS=ws://192.168.1.3:8765/v1/realtime # s2s 语音 WS(可选,默认按主机推导) MQTT_USERNAME=dpmserver MQTT_PASSWORD=你的密码 ``` > 若后端与 Broker 同机:后端默认 `MQTT_WS_URL=ws://localhost:8083/mqtt` 即可, > 展播端连 `192.168.1.9` 也通;跨机必须显式配置上面的 IP。 ## 三、构建期固定地址(不推荐,需重新打包) 在项目根目录(**构建机器上**)配置 `.env.local`(已被 gitignore): ``` VITE_API_BASE=http://192.168.1.9:8090/park VITE_MQTT_URL=ws://192.168.1.3:8083/mqtt VITE_MQTT_USERNAME=dpm VITE_MQTT_PASSWORD=123456 ``` 然后 `yarn build:win`(脚本自动清理旧 exe 进程再打包)。 ## 四、打包前必须确认 | 检查项 | 说明 | |---|---| | exe 未被运行 | `taskkill /f /im "昆明大学生创业园展播系统.exe"`,或直接用 `yarn build:win` | | 后端已启动 | 浏览器打开 `http://<后端IP>:8090/park/api/health` 应返回 `{"ok":true,...}` | | Broker WebSocket 已开 | EMQX 需开启 8083 端口 WS 监听,且账号密码与 config.json 一致 | | Windows 防火墙 | 首次运行允许,或放行出站 8090/8083(大屏经 8090 调 server-core) | ## 五、常见排查 ``` # 测试后端连通(展播机 PowerShell) Invoke-WebRequest http://192.168.1.9:8090/park/api/health # 测试 Broker WS 端口 Test-NetConnection 192.168.1.3 -Port 8083 # 看前端启动日志(bootstrap 会打印 MQTT 地址来源) 打开应用后按 F12(WebView2 开发者工具)→ Console ``` - 应用日志打印 `[bootstrap] config.json MQTT -> ...` = config.json 生效 - 打印 `[bootstrap] /api/config MQTT -> ...` = 后端下发 - 两者都没有 = 两个来源都不可达,请检查 IP/防火墙 ## 三、视频识别(可选,独立 park-vision 服务) 视频识别能力已从 server-core 剥离为**独立项目 `code/park-vision`**(YOLO 帧识别 + LLM 场景语义), server-core `/park` 不再承接识别请求(`/park/api/vision/frame|llm` 已移除,仅保留遥测 `/api/vision/event`)。 **配置方式(二选一)**,未配置则视频识别整体禁用(摄像头不开启、页面显示「手势识别未启用」): 1. **config.json(部署机)**:`"vision_api": "http://:8091"` 2. **server-core 全局(admin 端)**:运营端「视频识别服务」页启用+填地址 → 写 `park_settings` → 大屏启动时从 `GET /park/api/config` 取 `vision_api`(enabled=1 才下发) **部署完整识别链路**: ```bash # 独立识别服务(需 torch/ultralytics + 模型 yolov8n-face.pt / yolov8n-pose.pt 置于 models/) cd code/park-vision && uv sync && uv run uvicorn app.main:app --host 0.0.0.0 --port 8091 # 放模型后再启动;缺模型时 /vision/frame 返回「模型未加载」 ```