🏗️ 中转架构方案
在已有的阿里云服务器上部署一个轻量中转服务,学校老师的本地服务不再直连 FTP,而是通过 HTTP API 把图片发到阿里云中转服务。中转服务收到图片后直接保存到阿里云本地磁盘(或可选转发到 FTP 存储)。
核心目标: 老师电脑上不存储任何 FTP 密码,只需知道阿里云中转 API 的地址。
已有阿里云服务器 只需新增一个 Node.js 服务,无需额外机器。
📐 架构图
(图片数据)
老师电脑 → (HTTP) → 阿里云中转 → 本地磁盘存储(无需 FTP 转发)
也可选配 FTP 转发到其他服务器
🔑 关键变化
| 维度 | 当前架构(直连) | 中转架构(推荐) |
|---|---|---|
| FTP 密码位置 | 老师本地 ftp_config.json | 仅阿里云上,老师拿不到 |
| 老师配置项 | host + port + user + password | 仅一个 API 地址 |
| 权限隔离 | 无法控制,有密码就能直接访问FTP | API Key 隔离,可吊销单个学校 |
| 部署复杂度 | 只需本地服务 | 阿里云已有 → 只需加一个 Node.js 服务 |
| 网络要求 | 本地能直连 FTP | 只需本地能访问阿里云(HTTP/HTTPS) |
⚖️ 两种架构详细对比
| 对比项 | 当前直连架构 | 中转架构 |
|---|---|---|
| 老师配置内容 | 阿里云IP + FTP端口 + 用户名 + 密码 | 仅一个 URL:http://中转IP:8080/upload |
| 密码安全性 | 明文存本地,所有老师可见 | 零泄露,本地无密码 |
| 权限管理 | 共用 FTP 账号,无法区分学校 | API Key 粒度控制,可单独禁用 |
| 上传协议 | FTP(需开多个端口) | HTTP POST(只需 80/443) |
| 穿透防火墙 | FTP 被动模式可能被防火墙拦截 | HTTP 通常放行 |
| 阿里云依赖 | 仅作为 FTP 服务端 | 已有阿里云 → 加一个 Node.js 中转服务即可 |
| 传输链路 | 老师 → FTP(一次) | 老师 → 阿里云中转 → 本地磁盘(一次 HTTP) |
| 上传失败排查 | 看本地日志 | 需查中转服务日志 |
📊 选择建议
用直连架构(当前)
- 老师人数少、可信
- 不想在阿里云上多部署一个服务
- FTP 已能正常穿透防火墙
用中转架构
- 多个学校共用,需要权限隔离
- 老师电脑安全不可控
- FTP 端口被防火墙拦截
- 需要审计每个学校的上传记录
☁️ 阿里云中转服务
在已有阿里云 ECS 上运行一个轻量 Node.js 服务,接收老师电脑发来的图片,直接保存到阿里云本地磁盘。中转服务持有 FTP 凭证(如果需要转发到其他存储),老师电脑上零密码。
关键 不需要额外购买服务器,现有阿里云 ECS 上多跑一个 Node.js 进程即可。
📝 中转服务逻辑
POST /upload
Headers:
X-API-Key: sk_xxxxxx # 学校标识,用于权限控制
Content-Type: application/json
Body:
{
"image": "data:image/jpeg;base64,...", // 图片base64
"name": "张三", // 操作人
"filename": "张三_时间戳.jpg" // 文件名(可选)
}
成功响应:
{ "success": true, "path": "张三_xxx.jpg", "size": 243461 }
失败响应:
{ "success": false, "message": "API Key 无效" }
🔐 API Key 管理
中转服务内置 API Key 验证,每个学校分配一个独立的 Key:
| 学校 | API Key | 状态 |
|---|---|---|
| 第一中学 | sk_a1b2c3d4... | 启用 |
| 第二中学 | sk_e5f6g7h8... | 启用 |
| 第三中学(已毕业) | sk_i9j0k1l2... | 已吊销 |
Key 保存在阿里云上,老师无法获取。某个学校毕业或不再使用时,直接吊销其 API Key。
💾 中转服务存储方式
中转服务收到图片后,支持两种存储方式:
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 本地磁盘 | 直接保存到阿里云 ECS 的 /uploads/ 目录 |
阿里云磁盘充足,不需要额外存储服务器 |
| FTP 转发 | 中转服务保留 FTP 凭证,收到图片后转发到独立 FTP 存储 | 已有独立 NAS/存储服务器,阿里云只做中转 |
📂 按学校分组存储
中转服务根据 API Key 识别学校,将图片归档到不同目录:
/uploads/ ├── 第一中学/ │ ├── 张三_1718000000000.jpg │ └── 李四_1718000000001.jpg ├── 第二中学/ │ └── 王五_1718000000002.jpg └── ...
💻 本地客户端(老师电脑)
老师电脑上运行的服务只需要改一处:上传目标从 FTP 改为 HTTP POST 到阿里云中转 API。
📝 改动内容
原有 uploadToFtp() 函数替换为:
async function uploadToRelay(buffer, filename, apiUrl, apiKey) {
const base64 = buffer.toString('base64');
const res = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': apiKey
},
body: JSON.stringify({
image: 'data:image/jpeg;base64,' + base64,
name: filename.split('_')[0] || '',
filename: filename
})
});
return res.json();
}
📋 配置文件变化
原有的 ftp_config.json 替换为 relay_config.json:
{
"apiUrl": "http://你的阿里云IP:8080/upload",
"apiKey": "sk_a1b2c3d4..."
}
老师和以前一样要配一个地址和一个密钥,但 这个 API Key 只对中转服务有效,不涉及 FTP 密码,即使泄露也不会直接暴露存储服务器。
🔄 完整调用流程
🔒 安全分析
中转架构对安全性的提升:
🛡️ 风险缓解对照
| 风险 | 直连架构 | 中转架构 |
|---|---|---|
| FTP 密码泄露 | 密码在每台老师电脑上,任何一台被入侵即泄露全部 | 密码只存在阿里云,老师电脑上只有 API Key |
| 内部人员泄密 | 老师可把密码传给其他人,直接访问FTP | API Key 可吊销,即使泄露也只影响传输权限 |
| 越权访问 | 共用 FTP 账号,学校 A 能看到学校 B 的文件 | 中转服务分流,根据 API Key 分配到不同目录 |
| FTP 端口被封 | 需要运维介入 开放防火墙 | HTTP 80/443 基本都放行 |
| 传输审计 | 无记录或依赖 FTP 日志 | 中转服务可记录 每次上传的学校、文件、时间 |
⚠️ 引入的新风险
- 中转服务宕机 → 所有学校无法上传(直连架构没有单点故障)
- 传输延迟增加:多一跳网络,上传时间略增
- 中转服务自身需要维护:更新、监控、日志清理
- HTTPS 非强制:如果只用 HTTP,API Key 在传输中可能被截获(建议配置 HTTPS)
🚀 部署步骤
中转架构需要部署两个服务:
步骤一:阿里云上部署中转服务
在阿里云 ECS(建议 2核4G,CentOS/Ubuntu)上:
# 1. 安装 Node.js curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - apt install -y nodejs # 2. 创建中转服务项目 mkdir ~/relay-server && cd ~/relay-server npm init -y npm install express basic-ftp # 3. 创建 server.js(中转服务代码) # 4. 配置 FTP 凭证和 API Key(仅存于此) # 5. 启动 node server.js # 6. (推荐)使用 pm2 守护进程 npm install -g pm2 pm2 start server.js --name relay pm2 save pm2 startup
步骤二:配置安全组
阿里云安全组放行:
| 端口 | 用途 | 来源 |
|---|---|---|
| 8080 (或 80/443) | 中转 API | 各学校公网 IP |
| FTP 端口 | 中转→FTP | 阿里云出站(默认放行) |
步骤三:本地客户端部署(老师电脑)
老师电脑上需要安装本地服务来监控文件夹或连接 SDK 拍照:
| 部署方式 | 说明 | 难度 |
|---|---|---|
| 压缩包 + start.bat | 把 ftp-upload/ 发给老师,双击 start.bat 启动 |
低(老师需手动解压、双击) |
| 安装程序 setup.exe | 使用 NSIS / Inno Setup 打包成安装程序,一键安装 + 开机自启 | 极低(老师双击 .exe 下一步到底) |
安装程序只需在压缩包基础上加一个打包工具(约 30 分钟配置),老师体验最好。
⚠️ 多人共用电脑注意事项
① 每个老师需要独立的监控文件夹
多位老师共用一台电脑时,不能共用同一个文件夹。建议按 Windows 用户隔离:
C:\Users\老师A\Pictures\高拍仪扫描\ C:\Users\老师B\Pictures\高拍仪扫描\
每个老师运行自己的 start.bat,各自监控自己的目录。
② EloamCamera 保存路径需手动设置
打开 EloamCamera.exe → 设置 → 保存路径 → 改成上面的监控文件夹路径。
配置修改
将原来的 ftp_config.json 替换为 relay_config.json:
{
"apiUrl": "http://你的阿里云IP:8080/upload",
"apiKey": "sk_分配给该校的密钥"
}
# 修改 server.js 中 uploadToFtp() 为调用中转 API
# (约改动 30 行代码)
步骤四:验证
- 老师拍照 → 上传成功
- 查看中转服务日志,确认收到请求
- 查看 FTP 存储目录,确认文件已归档到对应学校目录
- 测试错误 API Key → 应返回 403