1 Commits

Author SHA1 Message Date
Codex
ce78e3e4f4 2026-05-21-14-19-12 NAS直接部署Release配置 2026-05-21 14:22:08 +08:00
6 changed files with 164 additions and 108 deletions

View File

@@ -1,28 +0,0 @@
# 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

2
.gitignore vendored
View File

@@ -15,7 +15,6 @@ WebSite/exports/
# Local env # Local env
.env .env
.env.* .env.*
!.env.example
WebSite/.env WebSite/.env
WebSite/.env.* WebSite/.env.*
@@ -29,3 +28,4 @@ pnpm-debug.log*
Thumbs.db Thumbs.db
.vscode/ .vscode/
.idea/ .idea/

111
README.md
View File

@@ -1,6 +1,6 @@
# ReVoxelSeg DICOM Docker 通用运行包 # ReVoxelSeg DICOM Docker 独立运行包
这是“基于模型逆向体素化及 DICOM 分割标注系统”的通用 Docker 程序目录。目录内包含运行所需源码、默认 DICOM 演示数据和默认 STL 模型数据,因此可以脱离原始工程目录独立构建和运行。 这是“基于模型逆向体素化及 DICOM 分割标注系统”的独立 Docker 程序目录。目录内已经包含运行所需源码、默认 DICOM 演示数据和默认 STL 模型数据,因此即使没有原始 `ReVoxelSeg_DICOM` 工程目录,也可以直接在本目录构建和运行。
## 目录内容 ## 目录内容
@@ -8,14 +8,14 @@
- `Head_CT_DICOM/`:默认 DICOM 影像序列。 - `Head_CT_DICOM/`:默认 DICOM 影像序列。
- `Head_CT_ReConstruct/`:默认 STL 模型。 - `Head_CT_ReConstruct/`:默认 STL 模型。
- `Dockerfile`Docker 镜像构建文件。 - `Dockerfile`Docker 镜像构建文件。
- `docker_compose.yaml`通用 Docker Compose 部署文件。 - `docker_compose.yaml`本机 Docker Compose 部署文件。
- `.env.example`:通用环境变量示例 - `docker_compose.nas.yaml`:威联通 NAS / QTS Container Station 部署文件
- `data/`:运行后自动生成,保存项目状态和上传资产。 - `data/`:运行后自动生成,保存项目状态和上传资产。
- `exports/`:运行后自动生成,保存导出结果。 - `exports/`:运行后自动生成,保存导出结果。
通用版本不包含任何固定公网域名、固定 FRP 服务地址、固定鉴权 token 或固定远端端口。需要公网映射时,请按实际环境填写 `.env` 目录不包含工程分析、软著撰写材料、参考模板、旧运行产物和开发依赖缓存
## 本机直接部署 ## 本机部署
在本目录执行: 在本目录执行:
@@ -23,54 +23,76 @@
docker compose -f docker_compose.yaml up -d --build docker compose -f docker_compose.yaml up -d --build
``` ```
默认访问: 访问:
```text ```text
http://localhost:4000/ http://192.168.3.11:4000/
http://127.0.0.1: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 ```bash
docker compose -f docker_compose.yaml ps 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_web
docker compose -f docker_compose.yaml logs -f revoxelseg_frpc
``` ```
启用 FRPC 后查看 停止
```bash ```bash
docker compose --profile frpc -f docker_compose.yaml logs -f revoxelseg_frpc 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/
``` ```
## 健康检查 ## 健康检查
@@ -85,8 +107,3 @@ curl http://127.0.0.1:4000/api/health
{"ok":true,"service":"revoxelseg-dicom"} {"ok":true,"service":"revoxelseg-dicom"}
``` ```
## 停止服务
```bash
docker compose -f docker_compose.yaml down
```

View File

@@ -35,7 +35,7 @@ npm run serve -- --host 0.0.0.0 --port 4000
访问: 访问:
```text ```text
http://localhost:4000/ http://192.168.3.11:4000/
``` ```
## 构建检查 ## 构建检查

68
docker_compose.nas.yaml Normal file
View File

@@ -0,0 +1,68 @@
# 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

View File

@@ -1,35 +1,35 @@
# ReVoxelSeg DICOM 通用 Docker 部署版。 # ReVoxelSeg DICOM / QNAP QTS Container Station 独立部署版。
# 默认只启动 Web 服务;如需 FRPC先复制 .env.example 为 .env 并填写参数, # 建议完整目录放到:/share/Container/revoxelseg_dicom
# 再执行docker compose --profile frpc up -d --build # Container Station 可能不在项目根目录执行 Compose因此这里使用绝对路径。
name: revoxelseg-dicom-generic name: revoxelseg-dicom-qnap-standalone
services: services:
revoxelseg_web: revoxelseg_web:
image: ${REVOXELSEG_IMAGE:-revoxelseg-dicom:generic} image: revoxelseg-dicom:standalone-qnap-20260521
build: build:
context: . context: /share/Container/revoxelseg_dicom
dockerfile: Dockerfile dockerfile: Dockerfile
args: args:
HTTP_PROXY: ${HTTP_PROXY:-} HTTP_PROXY: http://192.168.31.7:7893
HTTPS_PROXY: ${HTTPS_PROXY:-} HTTPS_PROXY: http://192.168.31.7:7893
NO_PROXY: ${NO_PROXY:-localhost,127.0.0.1,revoxelseg_web,revoxelseg_frpc} NO_PROXY: localhost,127.0.0.1,192.168.31.0/24,192.168.3.0/24,revoxelseg_web,revoxelseg_frpc
restart: unless-stopped restart: unless-stopped
ports: ports:
- "${HOST_PORT:-4000}:4000" - "4000:4000"
environment: environment:
NODE_ENV: production NODE_ENV: production
PORT: 4000 PORT: 4000
APP_URL: ${APP_URL:-http://localhost:4000} APP_URL: https://revoxel.huijutec.cn
TRUST_PROXY: ${TRUST_PROXY:-true} TRUST_PROXY: "true"
HTTP_PROXY: ${HTTP_PROXY:-} HTTP_PROXY: http://192.168.31.7:7893
HTTPS_PROXY: ${HTTPS_PROXY:-} HTTPS_PROXY: http://192.168.31.7:7893
http_proxy: ${HTTP_PROXY:-} http_proxy: http://192.168.31.7:7893
https_proxy: ${HTTPS_PROXY:-} https_proxy: http://192.168.31.7:7893
NO_PROXY: ${NO_PROXY:-localhost,127.0.0.1,revoxelseg_web,revoxelseg_frpc} NO_PROXY: localhost,127.0.0.1,192.168.31.0/24,192.168.3.0/24,revoxelseg_web,revoxelseg_frpc
volumes: volumes:
- ${REVOXELSEG_DATA_DIR:-./data}:/app/WebSite/data - /share/Container/revoxelseg_dicom/data:/app/WebSite/data
- ${REVOXELSEG_EXPORTS_DIR:-./exports}:/app/WebSite/exports - /share/Container/revoxelseg_dicom/exports:/app/WebSite/exports
healthcheck: 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))\""] 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 interval: 10s
@@ -38,32 +38,31 @@ services:
start_period: 20s start_period: 20s
revoxelseg_frpc: revoxelseg_frpc:
image: ${FRPC_IMAGE:-snowdreamtech/frpc:latest} image: snowdreamtech/frpc:latest
restart: unless-stopped restart: unless-stopped
profiles:
- frpc
entrypoint: ["/bin/sh"] entrypoint: ["/bin/sh"]
command: command:
- -c - -c
- | - |
cat > /tmp/frpc.toml <<EOF cat > /tmp/frpc.toml <<'EOF'
serverAddr = "${FRP_SERVER_ADDR}" serverAddr = "82.157.255.195"
serverPort = ${FRP_SERVER_PORT} serverPort = 7000
auth.method = "${FRP_AUTH_METHOD}" auth.method = "token"
auth.token = "${FRP_AUTH_TOKEN}" auth.token = "en.xjtu.edu.cn"
transport.poolCount = ${FRP_POOL_COUNT} transport.poolCount = 5
transport.heartbeatTimeout = ${FRP_HEARTBEAT_TIMEOUT} transport.heartbeatTimeout = -1
[[proxies]] [[proxies]]
name = "${FRP_PROXY_NAME}" name = "ReVoxelSeg_DICOM"
type = "tcp" type = "tcp"
localIP = "revoxelseg_web" localIP = "revoxelseg_web"
localPort = 4000 localPort = 4000
remotePort = ${FRP_REMOTE_PORT} remotePort = 10008
EOF EOF
exec frpc -c /tmp/frpc.toml exec frpc -c /tmp/frpc.toml
depends_on: depends_on:
revoxelseg_web: revoxelseg_web:
condition: service_healthy condition: service_healthy