重组为 backend/clients/docs 三层结构,并清理 git 污染。

将后端迁入 backend/,完善根目录 .gitignore,删除误提交的 .mypy_cache 缓存文件。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin
2026-05-21 16:02:25 +08:00
parent 6bc6801df9
commit 1af442481e
142 changed files with 175 additions and 212 deletions

View File

@@ -2,169 +2,76 @@
本文说明在 **NVIDIA GPU 服务器**上通过 Docker Compose 部署全套后端FastAPI + PostgreSQL + MinIO以及 Demo 客户端、语音确认页的**手动**启动方式。
## 仓库结构
```
operation-room-monitor/
backend/ # API + DB + MinIOdocker compose
clients/ # 独立前端(手动启动)
docs/ # 文档
```
## 架构
| 组件 | 部署方式 | 默认端口 |
|------|----------|----------|
| 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`
| API + PostgreSQL + MinIO | `cd backend && docker compose up -d --build` | 38080 / 35432 / 9000 |
| Demo 客户端 | `clients/demo-client/start.sh` | 38081 |
| 语音确认页 | `clients/voice-confirmation/start.sh` | 8080 |
---
## 一、前置条件
### 宿主机
- **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`
- Docker Compose V2、NVIDIA 驱动、NVIDIA Container Toolkit
- 复制 `backend/.env.example``backend/.env` 并填写
- ActionFormer 权重:`backend/app/resources/actionformer_epoch_045.pth.tar`
---
## 二、启动后端
```bash
cd backend
docker compose up -d --build
```
首次构建或代码变更后加 `--build`;日常重启可用 `docker compose up -d`
健康检查:
```bash
curl -sf http://127.0.0.1:38080/health
```
GPU 验证(可选)
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 down -v # 删除 PostgreSQL / MinIO 卷
```
---
## 三、手动启动客户端页面
后端 `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` 并启动静态服务,便于离线拷贝。
浏览器 Base URL 填 `http://<GPU服务器IP>:38080`
---
## 四、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
- [部署版使用指南.md](部署版使用指南.md)
- [客户端手术通信接口说明.md](客户端手术通信接口说明.md)
- [clients/demo-client/README.md](../clients/demo-client/README.md)
- [clients/voice-confirmation/README.md](../clients/voice-confirmation/README.md)
- [离线镜像tarball部署.md](离线镜像tarball部署.md)

View File

@@ -17,7 +17,7 @@
## Docker 与 RTSP 地址
- **站点 JSON 中的局域网 IP**(如 `[or_site_config.sample.json](../app/resources/or_site_config.sample.json)``192.168.3.x`API 在默认 **bridge** 网络下出站流量经 **宿主机** 转发,只要**宿主机**能访问该网段,容器内一般可直接使用相同 URL无需改成 `172.x` 等。
- **`127.0.0.1` / `localhost`**:在容器内指向**容器自身**。若 RTSP 服务跑在宿主机(含 `fake_rtsp_from_file.py`、本机 MediaMTXURL 应使用 **`rtsp://host.docker.internal:<端口>/<路径>`**。[`docker-compose.yml`](../docker-compose.yml) 已为 `api` 服务配置 `extra_hosts: host.docker.internal:host-gateway`Linux 兼容macOS/Windows Desktop 通常已内置该主机名)。
- **`127.0.0.1` / `localhost`**:在容器内指向**容器自身**。若 RTSP 服务跑在宿主机(含 `fake_rtsp_from_file.py`、本机 MediaMTXURL 应使用 **`rtsp://host.docker.internal:<端口>/<路径>`**。[`backend/docker-compose.yml`](../backend/docker-compose.yml) 已为 `api` 服务配置 `extra_hosts: host.docker.internal:host-gateway`Linux 兼容macOS/Windows Desktop 通常已内置该主机名)。
- **传输协议**compose 默认设置环境变量 **`OPENCV_FFMPEG_CAPTURE_OPTIONS=rtsp_transport;tcp`**,使 OpenCV 经 FFmpeg 以 **TCP** 拉 RTSP降低容器/NAT 下 UDP 丢包导致的首帧超时;可通过环境变量覆盖。
## 海康官方 SDK 模式(可选)
@@ -47,4 +47,4 @@ SDK **不作为构建期依赖**:将厂商提供的 Linux x86_64 动态库挂
## 相关环境变量
详见仓库根目录 `.env.example` 中「视频RTSP + 可选海康 HCNetSDK」一节。
详见 `backend/.env.example` 中「视频RTSP + 可选海康 HCNetSDK」一节。

View File

@@ -36,7 +36,7 @@ RTSP 地址、账号、口令等由客户端对接工程师提供给服务端运
| `or-cam-03` | `rtsp://admin:Aa183137@192.168.3.4:554/Streaming/Channels/101` | 同上 |
| `or-cam-04` | `rtsp://admin:Aa183137@192.168.3.5:554/Streaming/Channels/101` | 同上 |
**Docker 部署**API 在容器内拉流时,上表这类**术间摄像头局域网 IP**通常可继续使用(出站经宿主机路由,须宿主机已能访问该网段)。若 RTSP 实际跑在**宿主机本机**假流等URL 中的主机应使用 `host.docker.internal`,勿写 `127.0.0.1`;详见 `docs/video-backends.md``docker-compose.yml`
**Docker 部署**API 在容器内拉流时,上表这类**术间摄像头局域网 IP**通常可继续使用(出站经宿主机路由,须宿主机已能访问该网段)。若 RTSP 实际跑在**宿主机本机**假流等URL 中的主机应使用 `host.docker.internal`,勿写 `127.0.0.1`;详见 `docs/video-backends.md``backend/docker-compose.yml`
## 3. HTTP 路由一览

View File

@@ -2,7 +2,7 @@
本文说明 **方式 B**:厂商在可联网环境构建并导出 API 镜像为 `tar`/`tar.gz`,客户在目标服务器 **不拉取 API 镜像构建上下文** 的情况下,通过 `docker load` 加载后启动完整后端PostgreSQL + MinIO + API
> 说明:仓库默认的 `docker-compose.yml` 中 `api` 使用 `build:`。客户侧使用 tarball 时,必须使用下方 **「仅使用已加载镜像」** 的 Compose 片段(将 `build` 换成 `image`),否则仍会尝试本地构建。
> 说明:仓库默认的 `backend/docker-compose.yml` 中 `api` 使用 `build:`。客户侧使用 tarball 时,必须使用下方 **「仅使用已加载镜像」** 的 Compose 片段(将 `build` 换成 `image`),否则仍会尝试本地构建。
---
@@ -13,7 +13,7 @@
### 1. 构建并打标签
```bash
cd /path/to/operation-room-monitor-server
cd /path/to/operation-room-monitor/backend
docker compose build api
docker tag operation-room-monitor-server-api:latest <交付镜像名>:<版本号>
# 示例docker tag operation-room-monitor-server-api:latest acme/or-monitor-api:1.0.0
@@ -51,8 +51,8 @@ docker save \
|------|------|
| `or-monitor-api_*.tar.gz`(或全栈 `*_offline.tar.gz` | 镜像包 |
| 本文档 | 客户部署步骤 |
| `docker-compose.yml` **或** 下文「离线 Compose」全文 | `api` 使用 `image:` 而非 `build:` |
| `.env.example`(按项目实际改名) | 环境变量模板,勿包含真实密钥 plaintext 于公共渠道 |
| `docker-compose.yml` **或** 下文「离线 Compose」全文 | `api` 使用 `image:` 而非 `build:`(位于 `backend/` |
| `backend/.env.example`(按项目实际改名) | 环境变量模板,勿包含真实密钥 plaintext 于公共渠道 |
|(可选)语音确认前端静态包、`OR_SITE_CONFIG` 样例 | 按需 |
---
@@ -212,7 +212,7 @@ volumes:
## 五、环境变量与密钥
在同一目录放置 `.env`(可参考仓库内 `.env.example`)。至少建议关注:
在同一目录`backend/`放置 `.env`(可参考 `backend/.env.example`)。至少建议关注:
- `POSTGRES_PASSWORD`:生产请务必改为强密码。
- `API_PORT`:宿主机监听端口。

View File

@@ -52,4 +52,4 @@
---
以上内容对应仓库里的语音确认页面(`clients/voice-confirmation`。手术室主程序、摄像头等由别家软件或信息科配置,不在此页填写。
以上内容对应 `clients/voice-confirmation/` 语音确认页面。手术室主程序、摄像头等由别家软件或信息科配置,不在此页填写。