diff --git a/sentence_api/.env.example b/sentence_api/.env.example index de4b039..851c5e8 100644 --- a/sentence_api/.env.example +++ b/sentence_api/.env.example @@ -1,4 +1,6 @@ ORAL_TRAINER_DATA_DIR=/app/sentence_api/data +# API 监听地址:默认 127.0.0.1(仅本机/nginx 回源)。需要内网直连 8000 端口时改为 0.0.0.0。 +# ORAL_TRAINER_BIND_HOST=0.0.0.0 PUBLIC_BASE_URL=https://videoservice.d1kt.cn ADMIN_API_KEY=replace-with-a-long-random-secret CLIENT_API_KEY=replace-with-a-separate-client-secret diff --git a/sentence_api/DEPLOYMENT.md b/sentence_api/DEPLOYMENT.md index 89d5d32..d83b81e 100644 --- a/sentence_api/DEPLOYMENT.md +++ b/sentence_api/DEPLOYMENT.md @@ -238,6 +238,35 @@ sudo journalctl -u oral-trainer-api -f 当前上传后的处理任务运行在 API 进程中,因此只能使用一个 Uvicorn worker。需要多机或多 worker 时,应把 `VideoProcessor.process` 迁移到 Celery、RQ 或其他持久化任务队列。 +### 3A. 内网直连(可选) + +默认 FastAPI 只监听 `127.0.0.1:8000`,由 nginx 对外提供访问。如果只想在可信内网 +(例如 `192.168.0.124` 这台虚拟机)直接上传,有两种方式: + +方式一(推荐,不改后端):nginx 已监听 `0.0.0.0:80`,直接访问 +`http://192.168.0.124/admin` 或在浏览器上传即可,上传地址为 +`http://192.168.0.124/api/v1/admin/videos/raw`。 + +方式二(把 API 绑定到所有网卡):在 `sentence_api/.env` 增加一行: + +```dotenv +ORAL_TRAINER_BIND_HOST=0.0.0.0 +``` + +然后重建容器: + +```bash +cd /opt/oral-trainer/sentence_api +docker compose up -d +ss -tlnp | grep 8000 # 应显示 0.0.0.0:8000 +``` + +之后即可访问 `http://192.168.0.124:8000/healthz` 和内网上传接口。 + +安全提醒:`0.0.0.0` 会把 API 暴露给整个内网(管理接口受 `X-Admin-Key` 保护,但公开的 +视频列表和 `/admin` 页面没有密钥)。仅建议在可信内网使用;公网部署务必保持 +`127.0.0.1` + nginx,或用防火墙限制来源 IP。 + ## 4. 配置 Nginx(HTTP 回源) 本机 Nginx 只监听 80 端口提供 HTTP,不在本机终结 HTTPS。总出口(线上边缘网关) diff --git a/sentence_api/docker-compose.yml b/sentence_api/docker-compose.yml index aef7d55..04c257c 100644 --- a/sentence_api/docker-compose.yml +++ b/sentence_api/docker-compose.yml @@ -7,7 +7,7 @@ services: network_mode: host env_file: - .env - command: ["python", "-m", "uvicorn", "sentence_api.main:app", "--host", "127.0.0.1", "--port", "8000", "--workers", "1", "--proxy-headers", "--forwarded-allow-ips", "*"] + command: ["python", "-m", "uvicorn", "sentence_api.main:app", "--host", "${ORAL_TRAINER_BIND_HOST:-127.0.0.1}", "--port", "8000", "--workers", "1", "--proxy-headers", "--forwarded-allow-ips", "*"] volumes: - ./data:/app/sentence_api/data healthcheck: