方案概述

中转架构 · 零密码泄露

🏗️ 中转架构方案

已有的阿里云服务器上部署一个轻量中转服务,学校老师的本地服务不再直连 FTP,而是通过 HTTP API 把图片发到阿里云中转服务。中转服务收到图片后直接保存到阿里云本地磁盘(或可选转发到 FTP 存储)。


核心目标: 老师电脑上不存储任何 FTP 密码,只需知道阿里云中转 API 的地址。
已有阿里云服务器 只需新增一个 Node.js 服务,无需额外机器。

📐 架构图

🏫 老师电脑
文件监控 / SDK拍照
HTTP POST
(图片数据)
☁️ 阿里云中转
Node.js 中转服务
💾 阿里云本地磁盘
直接存储

老师电脑 → (HTTP) → 阿里云中转 → 本地磁盘存储(无需 FTP 转发)

也可选配 FTP 转发到其他服务器

🔑 关键变化

维度当前架构(直连)中转架构(推荐)
FTP 密码位置老师本地 ftp_config.json仅阿里云上,老师拿不到
老师配置项host + port + user + password仅一个 API 地址
权限隔离无法控制,有密码就能直接访问FTPAPI 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 密码,即使泄露也不会直接暴露存储服务器。

🔄 完整调用流程

文件监控 / SDK拍照
生成图片Buffer
HTTP POST + API Key
阿里云中转

🔒 安全分析

中转架构对安全性的提升:

🛡️ 风险缓解对照

风险直连架构中转架构
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