Files
senmesh-zc/README.md
KodouWZF 47273ae3fd init: 信创文件安全传输系统内外网本地 Docker 部署
包含 s-file 后端、React 前端、MeshSafe 安全检测对接,以及内外网两套
compose/nginx/配置(仅前端 28180/28280 对外发布,其余端口不暴露)。

说明:deploy/config/application-iw.yml 与 application-ow.yml 按维护者
明确要求原样入库,其中含本机 Docker 用的库口令、RabbitMQ 口令与 JWT
密钥;上生产前需替换。
2026-11-02 10:59:03 +08:00

86 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# senmesh-zc(信创文件安全传输系统 · 合并仓库)
光闸内外网文件摆渡系统,前后端合并仓库:
| 目录 | 项目 | 说明 | 技术栈 |
|---|---|---|---|
| `backend/` | s-file(原 alita-bjy-uygur) | 服务端:文件传输/网盘/机构用户管理/MeshSafe 安全检测对接 | Java 8 + Spring Boot 2.4.2 + MyBatis-Plus + PG/DM8 |
| `frontend/` | senmesh-zc-legacy | Web 前端:我的文件/分享/内外网传输/管理端 | React 19 + Vite + TanStack Router/Query + shadcn/ui |
> 两端保留原仓库完整提交历史(子目录导入),`git log --follow` 可追溯。
## 本地启动
```bash
# 后端(需 JDK8,本地联调配置见 backend/docker-test/application-local.yml)
cd backend && mvn spring-boot:run
# 前端(dev 代理 /api -> localhost:8081)
cd frontend && bun install && bun dev
```
---
## 文件安全检测(MeshSafe 对接配置)
对接独立检测服务 MeshSafe(`code.senmesh.com/zhaolei/MeshSate`):文件**上传**与跨网传输**接收解包**后自动送检(HMAC-SHA256 签名 + 响应验签),结论回写 `x_file_security` 表并标记在文件上。
**核心行为**:
- 检测不通过的文件**禁止分享与跨网传输**(下载/预览不受限);文件夹内部分文件不通过时,分享/传输弹窗列出清单,用户确认后**仅传输通过的内容**(`onlyPassed=true`)
- 检测中 → 禁止分享/传输;检测失败 → 默认放行(仅标记,可重新检测)
- 管理员可**人工复核**改判(必填说明,留痕并回写 MeshSafe)、**重新检测**
- 列表"安全检测"列展示状态徽章 + 结论摘要,悬停浮窗显示全信息;检测中的文件列表每 2 秒自动轮询刷新
### 1. 后端配置(`backend` 的 application.yml)
```yaml
meshsafe:
enabled: true # 总开关:false 时整体关闭——不送检/不拦截/预检返回空/前端隐藏检测列
base-url: https://meshsafe.internal # MeshSafe 服务地址
client-id: s-file # MeshSafe 分配的调用方标识
secret: "***" # MeshSafe 分配的密钥(勿泄露,建议环境变量注入)
channel: default # 业务通道标识(仅用于 MeshSafe 日志追溯)
timeout-seconds: 120 # 单次请求超时
fail-open: true # 检测服务异常时降级:true-放行(仅标记检测失败) / false-同样禁止分享传输
poll-timeout-minutes: 60 # "检测中"超过该时长仍无结论则标记检测失败(防死轮询)
review-sync-to-meshsafe: true # 人工复核是否回写 MeshSafe(失败仅告警,不影响本地生效)
poll:
cron: "0 */30 * * * ?" # 轮询未完成检测任务的定时任务(默认30秒)
```
| 配置项 | 说明 |
|---|---|
| `enabled` | **总开关**。关闭场景(无需 MeshSafe 的部署):后端上传/解包不送检、分享传输不拦截、`/file_security/share_check` 预检返回空、复核与重新检测接口报"文件安全检测未开启" |
| `fail-open` | 安全优先的部署建议 `false`(检测服务异常时宁可阻断);可用性优先用 `true` |
| 其余 | 一般保持默认即可 |
### 2. 数据库
执行 `backend/db/upgrade-20261101-meshsafe-file-security.sql`(新增 `x_file_security` 检测记录表,MySQL/DM8 与 PostgreSQL 双节;全新环境直接执行 init 脚本已包含)。同一文件允许多条检测记录(复核/重检均新增),业务取最新一条。
### 3. MeshSafe 侧配置
- 向管理员申请调用方凭证,并将 `client_id:secret` 加入 MeshSafe 的 `MESHSAFE_API_CLIENTS` 环境变量白名单;
- MeshSafe 策略 `config/policy.yaml` 的 `engine_failure_mode` 生产必须为 `fail_closed`(引擎异常宁可拒绝),注意不要为了"服务没起来也能用"改成 `fail_open` 后带上生产;
- 建议监控 `GET /api/v1/health`(重点 `clamav.available` 与签名库更新时间)。
### 4. 前端(无需配置)
前端通过 `GET /file_security/enabled` 自动感知总开关:开启时展示"安全检测"列与复核/重新检测入口,关闭时相关 UI 完全隐藏,无需前端发版。
### 5. 部署检查清单
1. 执行数据库升级脚本(`x_file_security`);
2. 后端配置 `meshsafe:` 段并确认 `enabled: true`;
3. MeshSafe 侧将后端凭证加入白名单,确认 `/api/v1/health` 健康;
4. 重启后端,上传一个测试文件验证:列表出现"检测中"→ 数秒内变为"检测通过/不通过";
5. 用测试样本验证拦截链路(分享/传输被拒、文件夹确认跳过、复核改判后放行)。
### 6. 相关文档与代码
- 接口文档:`backend/docs/接口文档-文件安全检测.md`
- 客户端实现:`backend/src/main/java/com/senmesh/sfile/client/MeshSafeClient.java`(HKDF 密钥派生、请求签名、multipart 手工构造、响应验签)
- 检测记录表:`x_file_security`(实体 `FileSecurity`,取最新一条生效)
- 送检触发点:网盘上传(`NormalUserFileServiceImpl`)、传输接收解包(`TransferFileMonitorServiceImpl`)、手动重检(`/file_security/rescan`)