2026-05-21 16:02:25 +08:00
|
|
|
|
# 复制为 `backend/.env` 并按环境填写。在 `backend/` 目录执行:`docker compose up -d --build`
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# 详细说明见 docs/Docker部署.md 与 docs/video-backends.md。
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# 算法、管线、归档路径、视觉/语音日志等非部署项见 `app/baked/algorithm.py` 与 `app/baked/pipeline.py`。
|
|
|
|
|
|
#
|
|
|
|
|
|
# 5-6 ActionFormer 实时算法(默认开启):
|
|
|
|
|
|
# - app/resources/actionformer_epoch_045.pth.tar 必须存在(离线下发,~110MB,未入 git)。
|
2026-05-27 13:48:27 +08:00
|
|
|
|
# - VideoSwin Swin3D-T 权重在 Docker 构建时预下载到 /app/.cache/torch(见 scripts/bake_torch_hub_checkpoint.py);
|
|
|
|
|
|
# 运行时不再访问 pytorch.org。「首次运行」指 torch 缓存为空时才会联网下载;现已改为构建时烘焙进镜像。
|
|
|
|
|
|
# 国内 PyPI 镜像(南大/清华/阿里)不同步 /models/*.pth,构建默认先试 uv.agentsmirror.com 再回退官方源。
|
|
|
|
|
|
# 离线/弱网:先 wget 权重到 backend/weights/swin3d_t-7615ae03.pth,再 docker compose build api。
|
|
|
|
|
|
# 或:docker compose build --build-arg PYTORCH_MODELS_URL=https://your-mirror/.../swin3d_t-7615ae03.pth api
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# - Linux GPU 机:镜像内 torch / torchvision / torchaudio 为 cu130 wheel;
|
|
|
|
|
|
# 宿主机需 NVIDIA 驱动 + NVIDIA Container Toolkit;`api` 服务已配置 `gpus: all`。
|
|
|
|
|
|
# 启动后可验证:docker compose exec api python -c "import torch; print(torch.cuda.is_available())"
|
2026-05-21 15:48:03 +08:00
|
|
|
|
|
|
|
|
|
|
# --- PostgreSQL ---
|
|
|
|
|
|
POSTGRES_USER=postgres
|
|
|
|
|
|
POSTGRES_PASSWORD=postgres
|
|
|
|
|
|
POSTGRES_DB=operation_room
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# 以下两项供宿主机工具连库调试;API 容器内使用 POSTGRES_HOST=db、POSTGRES_PORT=5432(由 compose 注入)。
|
2026-05-21 15:48:03 +08:00
|
|
|
|
POSTGRES_HOST=localhost
|
2026-05-22 10:03:10 +08:00
|
|
|
|
POSTGRES_PORT=45432
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# 可选:整串 async DSN(会覆盖与默认一致的 POSTGRES_* 组合时的逻辑,见 Settings)
|
2026-05-22 10:03:10 +08:00
|
|
|
|
# DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:45432/operation_room
|
|
|
|
|
|
# 可选:映射 PostgreSQL 到宿主机端口(默认 45432),仅 DBA/调试用途
|
|
|
|
|
|
# DOCKER_POSTGRES_PUBLISH_PORT=45432
|
2026-05-21 15:48:03 +08:00
|
|
|
|
|
2026-05-27 10:56:59 +08:00
|
|
|
|
# --- API 容器用户(与宿主机一致,便于直接打开 logs/rtsp_segments 下的 slice MP4)---
|
|
|
|
|
|
# 填写 id -u / id -g / getent group docker | cut -d: -f3 的输出;改后需 docker compose up -d --force-recreate api
|
|
|
|
|
|
HOST_UID=1000
|
|
|
|
|
|
HOST_GID=1000
|
|
|
|
|
|
DOCKER_GID=999
|
2026-05-27 13:48:27 +08:00
|
|
|
|
# 非 root 运行时 uv/torch 缓存目录(compose 内已设;TORCH_HOME 为镜像内预烘焙路径)
|
2026-05-27 10:56:59 +08:00
|
|
|
|
# UV_CACHE_DIR=/tmp/uv-cache
|
2026-05-27 13:48:27 +08:00
|
|
|
|
# TORCH_HOME=/app/.cache/torch
|
2026-05-27 10:56:59 +08:00
|
|
|
|
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# --- HTTP(API 对外端口)---
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# 局域网语音确认终端 / Demo 客户端访问 API 时,填写
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# http://<GPU服务器局域网IP>:38080 作为服务端 Base URL。
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# API_PORT=38080
|
|
|
|
|
|
|
2026-05-26 13:11:30 +08:00
|
|
|
|
# --- 应用日志(loguru 持久化;目录已在 .gitignore)---
|
|
|
|
|
|
# APP_LOG_DIR=logs/app
|
|
|
|
|
|
# APP_LOG_FILE_NAME=server.log
|
|
|
|
|
|
# APP_LOG_FILE_ENABLED=true
|
|
|
|
|
|
# APP_LOG_ROTATION=7 days
|
|
|
|
|
|
# APP_LOG_RETENTION=7 days
|
|
|
|
|
|
# APP_LOG_LEVEL=INFO
|
|
|
|
|
|
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# --- GPU 推理(可选覆盖,默认自动选 cuda:0)---
|
|
|
|
|
|
# CONSUMABLE_CLASSIFIER_DEVICE=cuda:0
|
|
|
|
|
|
# HAND_DETECTION_DEVICE=cuda:0
|
|
|
|
|
|
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# --- Video:RTSP 与按路后端(须与客户端 camera_ids 一致)---
|
2026-05-26 13:11:30 +08:00
|
|
|
|
# 单路 RTSP 首次打开超时(秒);开录 API 在「该值 + 5」秒内确认主摄就绪,失败最多重试 3 次。
|
|
|
|
|
|
# 客户端 HTTP 超时建议 ≥ 300s(默认 90+5 秒 × 3 次)。穿透/公网链路可调大。
|
|
|
|
|
|
# VIDEO_OPEN_TIMEOUT_SEC=90
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# VIDEO_DEFAULT_BACKEND=rtsp
|
|
|
|
|
|
# VIDEO_CAMERA_BACKEND_OVERRIDES_JSON={"or-cam-01":"rtsp","or-cam-02":"hikvision_sdk"}
|
|
|
|
|
|
# 站点 JSON:术间↔摄像头↔语音终端只在这里维护(voice_or_room_bindings);须同时含 video_rtsp_urls;可为 []。
|
|
|
|
|
|
# 见 app/resources/or_site_config.sample.json
|
|
|
|
|
|
# OR_SITE_CONFIG_JSON_FILE=app/resources/or_site_config.sample.json
|
|
|
|
|
|
# VIDEO_RTSP_URL_TEMPLATE=rtsp://user:pass@host:554/path/{camera_id}
|
|
|
|
|
|
#
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# 语音终端 ID 在站点 JSON 的 voice_or_room_bindings 中配置;浏览器语音确认页(clients/voice-confirmation/)在页面内填写本机终端 ID。
|
2026-05-21 15:48:03 +08:00
|
|
|
|
#
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# API 在 Docker 内访问宿主机 RTSP 时使用 host.docker.internal(compose 已配置 extra_hosts)。
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# OpenCV/FFmpeg 拉 RTSP 默认使用 TCP;仅当必须让 FFmpeg 自选传输时在 .env 中设空覆盖:
|
|
|
|
|
|
# OPENCV_FFMPEG_CAPTURE_OPTIONS=
|
|
|
|
|
|
|
|
|
|
|
|
# --- 海康 SDK(Linux x86_64;二进制勿提交仓库)---
|
|
|
|
|
|
# HIKVISION_LIB_DIR=/opt/hikvision/lib
|
|
|
|
|
|
# 可选:单一路径,见 app/services/video/hikvision_runtime.py 直读 HIKVISION_LIB_PATH
|
|
|
|
|
|
# HIKVISION_LIB_PATH=
|
|
|
|
|
|
# HIKVISION_SDK_ENABLED=false
|
|
|
|
|
|
# HIKVISION_DEVICE_IP=
|
|
|
|
|
|
# HIKVISION_USER=
|
|
|
|
|
|
# HIKVISION_PASSWORD=
|
|
|
|
|
|
# HIKVISION_CHANNEL=1
|
|
|
|
|
|
# HIKVISION_PREVIEW_RTSP_TEMPLATE=rtsp://{user}:{password}@{ip}:554/Streaming/Channels/101
|
|
|
|
|
|
# HIKVISION_CAMERA_RTSP_URLS_JSON={}
|
|
|
|
|
|
# HIKVISION_SDK_FALLBACK_TO_RTSP=true
|
|
|
|
|
|
|
|
|
|
|
|
# --- 百度(语音:短语音识别 AipSpeech + 在线合成;控制台开通对应能力)---
|
|
|
|
|
|
# BAIDU_APP_ID=
|
|
|
|
|
|
# BAIDU_API_KEY=
|
|
|
|
|
|
# BAIDU_SECRET_KEY=
|
|
|
|
|
|
# 可选
|
|
|
|
|
|
# BAIDU_CONNECTION_TIMEOUT_MS=
|
|
|
|
|
|
# BAIDU_SOCKET_TIMEOUT_MS=
|
|
|
|
|
|
# BAIDU_ASR_DEV_PID=1537
|
|
|
|
|
|
|
|
|
|
|
|
# --- MinIO(语音 WAV)---
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# 容器内 API 默认通过 DOCKER_MINIO_ENDPOINT=minio:9000 访问;以下为 compose 默认值。
|
2026-05-22 09:35:41 +08:00
|
|
|
|
# MINIO_ENDPOINT=127.0.0.1:19000
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# MINIO_ACCESS_KEY=minioadmin
|
|
|
|
|
|
# MINIO_SECRET_KEY=minioadmin
|
|
|
|
|
|
# MINIO_BUCKET=operation-room-voice
|
|
|
|
|
|
# MINIO_SECURE=false
|
|
|
|
|
|
# MINIO_REGION=
|
2026-05-22 09:35:41 +08:00
|
|
|
|
# MINIO_PORT=19000
|
|
|
|
|
|
# MINIO_CONSOLE_PORT=19001
|
2026-05-21 15:48:03 +08:00
|
|
|
|
|
2026-05-25 10:24:25 +08:00
|
|
|
|
# --- 视频:RTSP 切片 + batch(链路 1)---
|
|
|
|
|
|
# RTSP_PRIMARY_CAMERA_ID=or-cam-03
|
|
|
|
|
|
# RTSP_RECORD_ALL_CAMERAS=false
|
|
|
|
|
|
# RTSP_SEGMENT_DURATION_SEC=120
|
|
|
|
|
|
# RTSP_SEGMENT_MIN_SEC=10
|
2026-05-26 16:32:55 +08:00
|
|
|
|
# RTSP_RECORD_HEIGHT=1080
|
|
|
|
|
|
# RTSP_RECORD_CRF=23
|
|
|
|
|
|
# RTSP_RECORD_PRESET=veryfast
|
2026-05-25 12:05:28 +08:00
|
|
|
|
# RTSP_FFMPEG_SOCKET_TIMEOUT_USEC=5000000
|
2026-05-26 13:16:42 +08:00
|
|
|
|
# RTSP_PREWARM_ENABLED=false
|
|
|
|
|
|
# RTSP_PREWARM_RECONNECT_MAX_SEC=30
|
2026-05-25 10:24:25 +08:00
|
|
|
|
# RTSP_SEGMENT_TTL_HOURS=24
|
|
|
|
|
|
# RTSP_SLICE_BATCH_MAX_CONCURRENT=1
|
|
|
|
|
|
# RTSP_SLICE_BATCH_DRAIN_TIMEOUT_SEC=900
|
|
|
|
|
|
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# --- Demo 客户端 / 语音确认客户端 ---
|
|
|
|
|
|
# 独立部署的 Demo 客户端 / 语音确认页访问 API 时需放行 CORS;正式部署建议收窄 origins。
|
|
|
|
|
|
# DEMO_CORS_ENABLED=true
|
|
|
|
|
|
# 跨主机语音页访问 API 时,可先用 * 联调;生产建议改成具体语音页来源,如 http://192.168.1.100:8080
|
|
|
|
|
|
# DEMO_CORS_ORIGINS=*
|
2026-05-25 10:24:25 +08:00
|
|
|
|
# 链路 3(离线 batch)Demo 需开启;链路 1 真 RTSP 开录不依赖此项
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# DEMO_ORCHESTRATOR_ENABLED=false
|
2026-05-22 16:29:57 +08:00
|
|
|
|
# 联调台 HLS(Compose:先 docker compose up -d mediamtx-hls api)
|
2026-05-22 17:18:27 +08:00
|
|
|
|
# Compose 内 api 反代侧车:DEMO_HLS_PREVIEW_UPSTREAM=http://mediamtx-hls:8888
|
|
|
|
|
|
# 本机 uvicorn 直连 published 端口:DEMO_HLS_PREVIEW_UPSTREAM=http://127.0.0.1:18888
|
2026-05-22 16:29:57 +08:00
|
|
|
|
# 本机 uvicorn 且无 mediamtx-hls 侧车时改为:DEMO_HLS_PREVIEW_UPSTREAM=ephemeral
|
2026-05-22 14:44:28 +08:00
|
|
|
|
# DEMO_HLS_PREVIEW_PORT=18888
|
2026-05-25 10:24:25 +08:00
|
|
|
|
# HLS 预览 MediaMTX 镜像(Compose mediamtx-hls 与 ensure 临时容器共用)
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# MEDIAMTX_DOCKER_IMAGE=m.daocloud.io/docker.io/bluenviron/mediamtx:latest
|
|
|
|
|
|
|
2026-05-21 15:56:53 +08:00
|
|
|
|
# --- 语音确认静态页(clients/voice-confirmation/start.sh)---
|
2026-05-21 15:48:03 +08:00
|
|
|
|
# 默认 0.0.0.0 供局域网内语音终端访问;仅本机调试时可设 127.0.0.1
|
|
|
|
|
|
# VOCH_HTTP_BIND=0.0.0.0
|