统一 Docker Compose 部署,并将客户端拆分为独立子项目。

移除宿主机/conda 启动脚本与 dev 联调工具,后端仅通过 docker compose 部署并默认启用 GPU。模拟客户端与语音确认页迁入 clients/ 下自包含目录,切断对后端源码路径的依赖。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin
2026-05-21 15:56:53 +08:00
parent c869fcc6b9
commit 6bc6801df9
38 changed files with 478 additions and 1702 deletions

170
docs/Docker部署.md Normal file
View File

@@ -0,0 +1,170 @@
# Docker Compose 部署NVIDIA GPU
本文说明在 **NVIDIA GPU 服务器**上通过 Docker Compose 部署全套后端FastAPI + PostgreSQL + MinIO以及 Demo 客户端、语音确认页的**手动**启动方式。
## 架构
| 组件 | 部署方式 | 默认端口 |
|------|----------|----------|
| API + PostgreSQL + MinIO | `docker compose up -d --build` | 38080 / 35432 / 9000 |
| Demo 客户端 | `clients/demo-client/start.sh`(宿主机 Python | 38081 |
| 语音确认页 | `clients/voice-confirmation/start.sh`(宿主机 Python | 8080 |
Demo 页与语音页通过 HTTP/WebSocket 访问 API浏览器 Base URL 填 `http://<GPU服务器局域网IP>:38080`
---
## 一、前置条件
### 宿主机
- **Docker** 与 **Docker Compose V2**`docker compose`
- **NVIDIA 驱动**`nvidia-smi` 正常
- **[NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html)**,且 `docker run --rm --gpus all nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi` 可用
- 磁盘PostgreSQL / MinIO 使用命名卷,建议预留数十 GB
### 仓库与配置
1. 复制环境变量模板:
```bash
cp .env.example .env
```
2. 编辑 `.env`:至少修改 `POSTGRES_PASSWORD`;配置 `BAIDU_*`(语音)、`OR_SITE_CONFIG_JSON_FILE`(站点 JSON等。
3. 确保 ActionFormer 权重存在:`app/resources/actionformer_epoch_045.pth.tar`~110MB离线下发未入 git
4. VideoSwin 预训练权重首次运行可能需联网下载;容器内默认缓存目录 `TORCH_HOME=/root/.cache/torch`
---
## 二、启动后端
```bash
docker compose up -d --build
```
首次构建或代码变更后加 `--build`;日常重启可用 `docker compose up -d`
健康检查:
```bash
curl -sf http://127.0.0.1:38080/health
```
GPU 验证(可选):
```bash
docker compose exec api python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
```
常用环境变量(写在 `.env` 中):
| 变量 | 说明 |
|------|------|
| `API_PORT` | API 宿主机映射端口,默认 38080 |
| `DOCKER_POSTGRES_PUBLISH_PORT` | PostgreSQL 宿主机映射端口,默认 35432仅调试 |
查看日志:
```bash
docker compose logs -f api
```
停止服务:
```bash
docker compose down
```
**重置所有数据**PostgreSQL + MinIO 卷会被删除):
```bash
docker compose down -v
```
---
## 三、手动启动客户端页面
后端 `docker compose up -d` 成功后,在**同一台或局域网内其他机器**上:
```bash
# Demo 联调页(默认 0.0.0.0:38081
cd clients/demo-client && ./start.sh
# 语音确认页(默认 0.0.0.0:8080
cd clients/voice-confirmation && ./start.sh
```
浏览器访问:
- Demo`http://<主机IP>:38081/`
- 语音确认:`http://<主机IP>:8080/`
两页内的 **服务端 Base URL** 均指向监控 API`http://<GPU服务器IP>:38080`
### CORS
独立部署的前端跨域访问 API 时,`.env` 中需 `DEMO_CORS_ENABLED=true`。生产环境建议将 `DEMO_CORS_ORIGINS` 收窄为具体来源,例如:
```bash
DEMO_CORS_ORIGINS=http://192.168.1.100:8080,http://192.168.1.100:38081
```
### 语音确认单 HTML 分发
```bash
cd clients/voice-confirmation && ./start.sh --single 8080
```
会生成 `clients/voice-confirmation/dist/index.html` 并启动静态服务,便于离线拷贝。
---
## 四、RTSP 与站点配置
- 站点 JSON`OR_SITE_CONFIG_JSON_FILE`)维护术间、摄像头 RTSP、语音终端绑定样例见 `app/resources/or_site_config.sample.json`
- API 在 Docker 内访问**宿主机**上的 RTSP 假流时URL 应使用 `host.docker.internal`compose 已为 `api` 配置 `extra_hosts`)。
- 详见 [video-backends.md](video-backends.md)。
无真摄像头联调时,可在宿主机运行 `clients/demo-client/fake_rtsp_from_file.py`,详见 [clients/demo-client/README.md](../clients/demo-client/README.md)。
---
## 五、常见问题
**Q容器内 GPU 不可用?**
确认宿主机已安装 NVIDIA Container Toolkit`docker-compose.yml``api` 服务含 `gpus: all`。验证:
```bash
docker compose exec api python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
```
**Q语音页麦克风不可用**
勿用 `file://` 打开;须通过 HTTP(S) 访问。非 localhost 场景通常需要 HTTPS。
**Q如何升级 API**
```bash
docker compose build api
docker compose up -d api
```
容器启动时会执行 `alembic upgrade head`
**Q离线 tarball 交付?**
见 [离线镜像tarball部署.md](离线镜像tarball部署.md)。
---
## 六、相关文档
- [部署版使用指南.md](部署版使用指南.md) — 语音确认页填写说明(面向现场人员)
- [客户端手术通信接口说明.md](客户端手术通信接口说明.md) — API 协议
- [clients/voice-confirmation/README.md](../clients/voice-confirmation/README.md) — 语音页独立分发
- [clients/demo-client/README.md](../clients/demo-client/README.md) — Demo 页与假 RTSP