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
.env
.env.*
!.env.example
WebSite/.env
WebSite/.env.*
@@ -29,3 +28,4 @@ pnpm-debug.log*
Thumbs.db
.vscode/
.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_ReConstruct/`:默认 STL 模型。
- `Dockerfile`Docker 镜像构建文件。
- `docker_compose.yaml`通用 Docker Compose 部署文件。
- `.env.example`:通用环境变量示例
- `docker_compose.yaml`本机 Docker Compose 部署文件。
- `docker_compose.nas.yaml`:威联通 NAS / QTS Container Station 部署文件
- `data/`:运行后自动生成,保存项目状态和上传资产。
- `exports/`:运行后自动生成,保存导出结果。
通用版本不包含任何固定公网域名、固定 FRP 服务地址、固定鉴权 token 或固定远端端口。需要公网映射时,请按实际环境填写 `.env`
目录不包含工程分析、软著撰写材料、参考模板、旧运行产物和开发依赖缓存
## 本机直接部署
## 本机部署
在本目录执行:
@@ -23,54 +23,76 @@
docker compose -f docker_compose.yaml up -d --build
```
默认访问:
访问:
```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
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 --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"}
```
## 停止服务
```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
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 部署版。
# 默认只启动 Web 服务;如需 FRPC先复制 .env.example 为 .env 并填写参数,
# 再执行docker compose --profile frpc up -d --build
# ReVoxelSeg DICOM / QNAP QTS Container Station 独立部署版。
# 建议完整目录放到:/share/Container/revoxelseg_dicom
# Container Station 可能不在项目根目录执行 Compose因此这里使用绝对路径。
name: revoxelseg-dicom-generic
name: revoxelseg-dicom-qnap-standalone
services:
revoxelseg_web:
image: ${REVOXELSEG_IMAGE:-revoxelseg-dicom:generic}
image: revoxelseg-dicom:standalone-qnap-20260521
build:
context: .
context: /share/Container/revoxelseg_dicom
dockerfile: Dockerfile
args:
HTTP_PROXY: ${HTTP_PROXY:-}
HTTPS_PROXY: ${HTTPS_PROXY:-}
NO_PROXY: ${NO_PROXY:-localhost,127.0.0.1,revoxelseg_web,revoxelseg_frpc}
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:
- "${HOST_PORT:-4000}:4000"
- "4000:4000"
environment:
NODE_ENV: production
PORT: 4000
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}
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:
- ${REVOXELSEG_DATA_DIR:-./data}:/app/WebSite/data
- ${REVOXELSEG_EXPORTS_DIR:-./exports}:/app/WebSite/exports
- /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
@@ -38,32 +38,31 @@ services:
start_period: 20s
revoxelseg_frpc:
image: ${FRPC_IMAGE:-snowdreamtech/frpc:latest}
image: snowdreamtech/frpc:latest
restart: unless-stopped
profiles:
- frpc
entrypoint: ["/bin/sh"]
command:
- -c
- |
cat > /tmp/frpc.toml <<EOF
serverAddr = "${FRP_SERVER_ADDR}"
serverPort = ${FRP_SERVER_PORT}
cat > /tmp/frpc.toml <<'EOF'
serverAddr = "82.157.255.195"
serverPort = 7000
auth.method = "${FRP_AUTH_METHOD}"
auth.token = "${FRP_AUTH_TOKEN}"
auth.method = "token"
auth.token = "en.xjtu.edu.cn"
transport.poolCount = ${FRP_POOL_COUNT}
transport.heartbeatTimeout = ${FRP_HEARTBEAT_TIMEOUT}
transport.poolCount = 5
transport.heartbeatTimeout = -1
[[proxies]]
name = "${FRP_PROXY_NAME}"
name = "ReVoxelSeg_DICOM"
type = "tcp"
localIP = "revoxelseg_web"
localPort = 4000
remotePort = ${FRP_REMOTE_PORT}
remotePort = 10008
EOF
exec frpc -c /tmp/frpc.toml
depends_on:
revoxelseg_web:
condition: service_healthy