将后端迁入 backend/,完善根目录 .gitignore,删除误提交的 .mypy_cache 缓存文件。 Co-authored-by: Cursor <cursoragent@cursor.com>
119 lines
4.6 KiB
YAML
119 lines
4.6 KiB
YAML
# Unified backend stack: FastAPI + PostgreSQL + MinIO (GPU via NVIDIA Container Toolkit).
|
|
# Deploy from this directory: docker compose up -d --build
|
|
# Client pages (repo root): ../clients/demo-client/start.sh, ../clients/voice-confirmation/start.sh
|
|
services:
|
|
db:
|
|
image: m.daocloud.io/docker.io/library/postgres:16-alpine
|
|
environment:
|
|
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
|
|
POSTGRES_DB: ${POSTGRES_DB:-operation_room}
|
|
# Optional: publish PostgreSQL to host for DBA/debug tools (API connects via db:5432 inside compose).
|
|
ports:
|
|
- "${DOCKER_POSTGRES_PUBLISH_PORT:-35432}:5432"
|
|
volumes:
|
|
- pgdata:/var/lib/postgresql/data
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U \"$${POSTGRES_USER}\" -d \"$${POSTGRES_DB}\""]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 20
|
|
start_period: 5s
|
|
|
|
minio:
|
|
image: m.daocloud.io/docker.io/minio/minio:latest
|
|
command: server /data --console-address ":9001"
|
|
environment:
|
|
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin}
|
|
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin}
|
|
ports:
|
|
- "${MINIO_PORT:-9000}:9000"
|
|
- "${MINIO_CONSOLE_PORT:-9001}:9001"
|
|
volumes:
|
|
- minio_data:/data
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://127.0.0.1:9000/minio/health/live"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 10s
|
|
|
|
api:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
network: host
|
|
gpus: all
|
|
extra_hosts:
|
|
- "host.docker.internal:host-gateway"
|
|
environment:
|
|
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
|
|
POSTGRES_DB: ${POSTGRES_DB:-operation_room}
|
|
POSTGRES_HOST: db
|
|
POSTGRES_PORT: 5432
|
|
CONSUMABLE_CLASSIFIER_IMGSZ: ${CONSUMABLE_CLASSIFIER_IMGSZ:-224}
|
|
CONSUMABLE_CLASSIFIER_DEVICE: ${CONSUMABLE_CLASSIFIER_DEVICE:-}
|
|
CONSUMABLE_CLASSIFIER_TOPK: ${CONSUMABLE_CLASSIFIER_TOPK:-5}
|
|
CONSUMABLE_MIN_CLS_CONFIDENCE: ${CONSUMABLE_MIN_CLS_CONFIDENCE:-0.5}
|
|
CONSUMABLE_VISION_WINDOW_SEC: ${CONSUMABLE_VISION_WINDOW_SEC:-15}
|
|
HAND_DETECTION_WEIGHTS: ${HAND_DETECTION_WEIGHTS:-}
|
|
HAND_DETECTION_IMGSZ: ${HAND_DETECTION_IMGSZ:-640}
|
|
HAND_DETECTION_DEVICE: ${HAND_DETECTION_DEVICE:-}
|
|
VIDEO_DEFAULT_BACKEND: ${VIDEO_DEFAULT_BACKEND:-rtsp}
|
|
VIDEO_RTSP_URL_TEMPLATE: ${VIDEO_RTSP_URL_TEMPLATE:-}
|
|
OR_SITE_CONFIG_JSON_FILE: ${OR_SITE_CONFIG_JSON_FILE:-}
|
|
VIDEO_CAMERA_BACKEND_OVERRIDES_JSON: ${VIDEO_CAMERA_BACKEND_OVERRIDES_JSON:-}
|
|
HIKVISION_SDK_ENABLED: ${HIKVISION_SDK_ENABLED:-false}
|
|
HIKVISION_LIB_DIR: ${HIKVISION_LIB_DIR:-/opt/hikvision/lib}
|
|
HIKVISION_DEVICE_IP: ${HIKVISION_DEVICE_IP:-}
|
|
HIKVISION_USER: ${HIKVISION_USER:-}
|
|
HIKVISION_PASSWORD: ${HIKVISION_PASSWORD:-}
|
|
HIKVISION_PREVIEW_RTSP_TEMPLATE: ${HIKVISION_PREVIEW_RTSP_TEMPLATE:-}
|
|
OPENCV_FFMPEG_CAPTURE_OPTIONS: ${OPENCV_FFMPEG_CAPTURE_OPTIONS:-rtsp_transport;tcp}
|
|
BAIDU_APP_ID: ${BAIDU_APP_ID:-}
|
|
BAIDU_API_KEY: ${BAIDU_API_KEY:-}
|
|
BAIDU_SECRET_KEY: ${BAIDU_SECRET_KEY:-}
|
|
BAIDU_ASR_DEV_PID: ${BAIDU_ASR_DEV_PID:-1537}
|
|
MINIO_ENDPOINT: ${DOCKER_MINIO_ENDPOINT:-minio:9000}
|
|
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin}
|
|
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin}
|
|
MINIO_BUCKET: ${MINIO_BUCKET:-operation-room-voice}
|
|
MINIO_SECURE: ${MINIO_SECURE:-false}
|
|
MINIO_REGION: ${MINIO_REGION:-}
|
|
DEMO_CORS_ENABLED: ${DEMO_CORS_ENABLED:-true}
|
|
DEMO_CORS_ORIGINS: ${DEMO_CORS_ORIGINS:-*}
|
|
DEMO_ORCHESTRATOR_ENABLED: ${DEMO_ORCHESTRATOR_ENABLED:-false}
|
|
DEMO_ORCHESTRATOR_RTSP_PORT: ${DEMO_ORCHESTRATOR_RTSP_PORT:-18554}
|
|
DEMO_ORCHESTRATOR_RTSP_JSON_HOST: ${DOCKER_DEMO_ORCHESTRATOR_RTSP_JSON_HOST:-host.docker.internal}
|
|
MEDIAMTX_DOCKER_IMAGE: ${MEDIAMTX_DOCKER_IMAGE:-m.daocloud.io/docker.io/bluenviron/mediamtx:latest}
|
|
command: >
|
|
sh -c "uv run --no-sync alembic upgrade head &&
|
|
uv run --no-sync uvicorn main:app --host 0.0.0.0 --port 8000"
|
|
ports:
|
|
- "${API_PORT:-38080}:8000"
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
minio:
|
|
condition: service_started
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test:
|
|
[
|
|
"CMD",
|
|
"python",
|
|
"-c",
|
|
"import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health', timeout=2)",
|
|
]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 20s
|
|
|
|
volumes:
|
|
pgdata:
|
|
minio_data:
|