diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..2a4a8cd --- /dev/null +++ b/.env.example @@ -0,0 +1,28 @@ +# ReVoxelSeg DICOM 通用部署配置示例 + +# Web 服务 +HOST_PORT=4000 +APP_URL=http://localhost:4000 +TRUST_PROXY=true +REVOXELSEG_IMAGE=revoxelseg-dicom:generic +REVOXELSEG_DATA_DIR=./data +REVOXELSEG_EXPORTS_DIR=./exports + +# 如需在 NAS 或受限网络环境构建,可按需填写代理;不需要时留空。 +HTTP_PROXY= +HTTPS_PROXY= +NO_PROXY=localhost,127.0.0.1,revoxelseg_web,revoxelseg_frpc + +# FRPC 可选配置。 +# 默认 docker compose up 不会启动 frpc。 +# 需要公网映射时,填写以下变量后执行: +# docker compose --profile frpc up -d --build +FRPC_IMAGE=snowdreamtech/frpc:latest +FRP_SERVER_ADDR=your-frp-server.example.com +FRP_SERVER_PORT=7000 +FRP_AUTH_METHOD=token +FRP_AUTH_TOKEN=replace-with-your-token +FRP_POOL_COUNT=5 +FRP_HEARTBEAT_TIMEOUT=-1 +FRP_PROXY_NAME=ReVoxelSeg_DICOM +FRP_REMOTE_PORT=10000 diff --git a/.gitignore b/.gitignore index 7568238..7bc0371 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ WebSite/exports/ # Local env .env .env.* +!.env.example WebSite/.env WebSite/.env.* @@ -28,4 +29,3 @@ pnpm-debug.log* Thumbs.db .vscode/ .idea/ - diff --git a/README.md b/README.md index 37a7020..d355f79 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# ReVoxelSeg DICOM Docker 独立运行包 +# ReVoxelSeg DICOM Docker 通用运行包 -这是“基于模型逆向体素化及 DICOM 分割标注系统”的独立 Docker 程序目录。目录内已经包含运行所需源码、默认 DICOM 演示数据和默认 STL 模型数据,因此即使没有原始 `ReVoxelSeg_DICOM` 工程目录,也可以直接在本目录构建和运行。 +这是“基于模型逆向体素化及 DICOM 分割标注系统”的通用 Docker 程序目录。目录内包含运行所需源码、默认 DICOM 演示数据和默认 STL 模型数据,因此可以脱离原始工程目录独立构建和运行。 ## 目录内容 @@ -8,14 +8,14 @@ - `Head_CT_DICOM/`:默认 DICOM 影像序列。 - `Head_CT_ReConstruct/`:默认 STL 模型。 - `Dockerfile`:Docker 镜像构建文件。 -- `docker_compose.yaml`:本机 Docker Compose 部署文件。 -- `docker_compose.nas.yaml`:威联通 NAS / QTS Container Station 部署文件。 +- `docker_compose.yaml`:通用 Docker Compose 部署文件。 +- `.env.example`:通用环境变量示例。 - `data/`:运行后自动生成,保存项目状态和上传资产。 - `exports/`:运行后自动生成,保存导出结果。 -本目录不包含工程分析、软著撰写材料、参考模板、旧运行产物和开发依赖缓存。 +本通用版本不包含任何固定公网域名、固定 FRP 服务地址、固定鉴权 token 或固定远端端口。需要公网映射时,请按实际环境填写 `.env`。 -## 本机部署 +## 本机直接部署 在本目录执行: @@ -23,76 +23,54 @@ docker compose -f docker_compose.yaml up -d --build ``` -访问: +默认访问: ```text -http://192.168.3.11:4000/ -http://127.0.0.1:4000/ +http://localhost:4000/ ``` -查看状态和日志: +如需改端口,复制环境变量文件后修改 `HOST_PORT`: + +```bash +cp .env.example .env +docker compose --env-file .env -f docker_compose.yaml up -d --build +``` + +## 启用 FRPC 公网映射 + +复制配置模板: + +```bash +cp .env.example .env +``` + +编辑 `.env`,填写: + +- `FRP_SERVER_ADDR` +- `FRP_SERVER_PORT` +- `FRP_AUTH_METHOD` +- `FRP_AUTH_TOKEN` +- `FRP_PROXY_NAME` +- `FRP_REMOTE_PORT` +- `APP_URL` + +启动 Web 与 FRPC: + +```bash +docker compose --env-file .env --profile frpc -f docker_compose.yaml up -d --build +``` + +## 查看状态 ```bash docker compose -f docker_compose.yaml ps docker compose -f docker_compose.yaml logs -f revoxelseg_web -docker compose -f docker_compose.yaml logs -f revoxelseg_frpc ``` -停止: +启用 FRPC 后查看: ```bash -docker compose -f docker_compose.yaml down -``` - -## 威联通 NAS / QTS 部署 - -建议将完整目录放到: - -```text -/share/Container/revoxelseg_dicom -``` - -然后在 QTS Container Station 中导入或粘贴: - -```text -docker_compose.nas.yaml -``` - -SSH 部署命令: - -```bash -cd /share/Container/revoxelseg_dicom -docker compose -f docker_compose.nas.yaml up -d --build -``` - -如果目录不是 `/share/Container/revoxelseg_dicom`,请修改 `docker_compose.nas.yaml` 中的 `build.context`、`data` 和 `exports` 挂载路径。 - -## FRPC 公网映射 - -两份 Compose 都内置 frpc 配置: - -```toml -serverAddr = "82.157.255.195" -serverPort = 7000 - -auth.method = "token" -auth.token = "en.xjtu.edu.cn" - -transport.poolCount = 5 -transport.heartbeatTimeout = -1 - -[[proxies]] -name = "ReVoxelSeg_DICOM" -type = "tcp" -localIP = "revoxelseg_web" -localPort = 4000 -remotePort = 10008 -``` - -FRPC 在线且 NPM 反向代理配置生效后,可通过: - -```text -https://revoxel.huijutec.cn/ +docker compose --profile frpc -f docker_compose.yaml logs -f revoxelseg_frpc ``` ## 健康检查 @@ -107,3 +85,8 @@ curl http://127.0.0.1:4000/api/health {"ok":true,"service":"revoxelseg-dicom"} ``` +## 停止服务 + +```bash +docker compose -f docker_compose.yaml down +``` diff --git a/WebSite/README.md b/WebSite/README.md index ae8ae58..e55be77 100644 --- a/WebSite/README.md +++ b/WebSite/README.md @@ -35,7 +35,7 @@ npm run serve -- --host 0.0.0.0 --port 4000 访问: ```text -http://192.168.3.11:4000/ +http://localhost:4000/ ``` ## 构建检查 diff --git a/docker_compose.nas.yaml b/docker_compose.nas.yaml deleted file mode 100644 index 2fc5acc..0000000 --- a/docker_compose.nas.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# ReVoxelSeg DICOM / QNAP QTS Container Station 独立部署版。 -# 建议完整目录放到:/share/Container/revoxelseg_dicom -# Container Station 可能不在项目根目录执行 Compose,因此这里使用绝对路径。 - -name: revoxelseg-dicom-qnap-standalone - -services: - revoxelseg_web: - image: revoxelseg-dicom:standalone-qnap-20260521 - build: - context: /share/Container/revoxelseg_dicom - dockerfile: Dockerfile - args: - HTTP_PROXY: http://192.168.31.7:7893 - HTTPS_PROXY: http://192.168.31.7:7893 - NO_PROXY: localhost,127.0.0.1,192.168.31.0/24,192.168.3.0/24,revoxelseg_web,revoxelseg_frpc - restart: unless-stopped - ports: - - "4000:4000" - environment: - NODE_ENV: production - PORT: 4000 - APP_URL: https://revoxel.huijutec.cn - TRUST_PROXY: "true" - HTTP_PROXY: http://192.168.31.7:7893 - HTTPS_PROXY: http://192.168.31.7:7893 - http_proxy: http://192.168.31.7:7893 - https_proxy: http://192.168.31.7:7893 - NO_PROXY: localhost,127.0.0.1,192.168.31.0/24,192.168.3.0/24,revoxelseg_web,revoxelseg_frpc - volumes: - - /share/Container/revoxelseg_dicom/data:/app/WebSite/data - - /share/Container/revoxelseg_dicom/exports:/app/WebSite/exports - healthcheck: - test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:4000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] - interval: 10s - timeout: 5s - retries: 12 - start_period: 20s - - revoxelseg_frpc: - image: snowdreamtech/frpc:latest - restart: unless-stopped - entrypoint: ["/bin/sh"] - command: - - -c - - | - cat > /tmp/frpc.toml <<'EOF' - serverAddr = "82.157.255.195" - serverPort = 7000 - - auth.method = "token" - auth.token = "en.xjtu.edu.cn" - - transport.poolCount = 5 - transport.heartbeatTimeout = -1 - - [[proxies]] - name = "ReVoxelSeg_DICOM" - type = "tcp" - localIP = "revoxelseg_web" - localPort = 4000 - remotePort = 10008 - EOF - exec frpc -c /tmp/frpc.toml - depends_on: - revoxelseg_web: - condition: service_healthy - diff --git a/docker_compose.yaml b/docker_compose.yaml index f81bcfe..0b6dd56 100644 --- a/docker_compose.yaml +++ b/docker_compose.yaml @@ -1,27 +1,35 @@ -# ReVoxelSeg DICOM 独立 Docker 本机部署版。 -# 在本目录执行:docker compose -f docker_compose.yaml up -d --build -# 局域网访问:http://192.168.3.11:4000/ -# 公网访问:https://revoxel.huijutec.cn/ +# ReVoxelSeg DICOM 通用 Docker 部署版。 +# 默认只启动 Web 服务;如需 FRPC,先复制 .env.example 为 .env 并填写参数, +# 再执行:docker compose --profile frpc up -d --build -name: revoxelseg-dicom-standalone +name: revoxelseg-dicom-generic services: revoxelseg_web: - image: revoxelseg-dicom:standalone-20260521 + image: ${REVOXELSEG_IMAGE:-revoxelseg-dicom:generic} build: context: . dockerfile: Dockerfile + args: + HTTP_PROXY: ${HTTP_PROXY:-} + HTTPS_PROXY: ${HTTPS_PROXY:-} + NO_PROXY: ${NO_PROXY:-localhost,127.0.0.1,revoxelseg_web,revoxelseg_frpc} restart: unless-stopped ports: - - "4000:4000" + - "${HOST_PORT:-4000}:4000" environment: NODE_ENV: production PORT: 4000 - APP_URL: http://192.168.3.11:4000 - TRUST_PROXY: "true" + APP_URL: ${APP_URL:-http://localhost:4000} + TRUST_PROXY: ${TRUST_PROXY:-true} + HTTP_PROXY: ${HTTP_PROXY:-} + HTTPS_PROXY: ${HTTPS_PROXY:-} + http_proxy: ${HTTP_PROXY:-} + https_proxy: ${HTTPS_PROXY:-} + NO_PROXY: ${NO_PROXY:-localhost,127.0.0.1,revoxelseg_web,revoxelseg_frpc} volumes: - - ./data:/app/WebSite/data - - ./exports:/app/WebSite/exports + - ${REVOXELSEG_DATA_DIR:-./data}:/app/WebSite/data + - ${REVOXELSEG_EXPORTS_DIR:-./exports}:/app/WebSite/exports healthcheck: test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:4000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] interval: 10s @@ -30,31 +38,32 @@ services: start_period: 20s revoxelseg_frpc: - image: snowdreamtech/frpc:latest + image: ${FRPC_IMAGE:-snowdreamtech/frpc:latest} restart: unless-stopped + profiles: + - frpc entrypoint: ["/bin/sh"] command: - -c - | - cat > /tmp/frpc.toml <<'EOF' - serverAddr = "82.157.255.195" - serverPort = 7000 + cat > /tmp/frpc.toml <