这是什么
ssh-fast-deploy 是一个 npm CLI 工具,把前端项目部署的三个步骤——打包 → 上传 → 远程解压——合并为一行命令。
1 2
| 旧流程:npm run build → 手动打包 → scp 上传 → ssh 解压 新流程:npx sfp
|
安装
1
| npm install ssh-fast-deploy -D
|
快速开始
1. 生成配置文件
会在项目根目录生成 .deployrc.json:
1 2 3 4 5 6 7 8 9
| { "host": "your-server.com", "port": 22, "username": "root", "privateKey": "~/.ssh/id_rsa", "remotePath": "/www/wwwroot/your-site", "localDir": "dist", "backup": false }
|
配置文件支持 // 行注释,填入实际信息即可。
2. 部署
一行搞定。也可以加到 package.json:
1 2 3 4 5
| { "scripts": { "deploy": "sfp" } }
|
然后 npm run deploy。
配置的四种方式
ssh-fast-deploy 支持多层配置,优先级从高到低:
1
| CLI 参数 > .deployrc.json > package.json#deploy > 环境变量
|
| 方式 |
适用场景 |
| CLI 参数 |
一次性部署、测试不同服务器 |
.deployrc.json |
项目固定配置,团队共享 |
package.json#deploy |
不想多一个配置文件 |
| 环境变量 |
CI/CD 流水线 |
CLI 参数
1
| sfp --host 192.168.1.100 --user root --pass xxx --remote-path /www/wwwroot/my-site
|
支持参数:--host、--port、--user、--pass、--key、--remote-path、--local-dir。
环境变量
1 2 3 4 5
| export SSH_HOST=192.168.1.100 export SSH_USER=root export SSH_PASSWORD=xxx export DEPLOY_REMOTE_PATH=/www/wwwroot/my-site npx sfp
|
适合 CI/CD 中避免明文密码出现在代码里。
双认证方式
支持密码和 SSH 密钥两种认证:
1 2 3 4 5 6 7 8 9
| { "privateKey": "~/.ssh/id_rsa" }
{ "password": "your-password" }
|
多目录打包
localDir 支持单个或多个目录:
1 2 3 4 5 6 7 8
| { "localDir": "dist" }
{ "localDir": "dist,public" }
|
CLI 中也可以:
1
| sfp --local-dir dist,public
|
API 编程调用
除了命令行,也可以在 Node.js 脚本中编程调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import { deploy } from 'ssh-fast-deploy';
await deploy();
await deploy({ host: '192.168.1.100', port: 22, username: 'root', password: 'your-password', remotePath: '/www/wwwroot/my-site', localDir: ['dist', 'public'], silent: false, });
|
打包与上传分离
如果需要在打包和上传之间插入自定义逻辑(比如先执行测试、上传前备份等),可以把两步拆开用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import { packFiles, uploadAndExtract } from 'ssh-fast-deploy';
const zipPath = await packFiles(['dist'], '.upload.zip');
await uploadAndExtract( { host: '...', username: 'root', password: '...' }, zipPath, '/www/wwwroot/my-site', );
|
工作原理
流程非常直接:
1 2 3 4 5 6 7 8 9 10
| packFiles() ├── 校验 localDir 目录是否存在 ├── archiver 打包为 zip (level 9 最高压缩) └── 返回 zip 文件路径
uploadAndExtract() ├── ssh2 建立 SSH 连接 ├── SFTP fastPut 上传 zip 到远程 ├── exec('unzip -o xxx.zip -d /target && rm -f xxx.zip') └── 关闭 SSH 连接
|
技术栈:
| 依赖 |
作用 |
ssh2 |
SSH 连接 + SFTP 上传 + 远程命令执行 |
archiver |
本地文件打包 |
commander |
CLI 参数解析 |
ora |
终端 spinner 动画 |
fs-extra |
文件操作增强 |
适用场景
| 场景 |
是否适合 |
| 前端静态站点(Vue/React/Hexo) |
✅ 最适合 |
| 小团队快速部署 |
✅ |
| Docker / K8s 环境 |
❌ 不适合,应走容器化流程 |
| 需要 CDN 加速的大规模站点 |
❌ 应走 CI/CD + CDN 方案 |
与自定义部署脚本的区别
写项目的时候最早也是手写了一个 deploy-sftp.js,后来抽出来做成这个通用工具。对比:
|
手写脚本 |
ssh-fast-deploy |
| 配置管理 |
硬编码 |
.deployrc.json / CLI / env 四层 |
| 跨项目复用 |
要复制粘贴 |
npm i -D 即可 |
| 参数校验 |
自己写 |
内置必填校验 + 友好提示 |
| 注释支持 |
— |
JSON 文件支持 // 注释 |
| CLI 体验 |
— |
commander + ora spinner |
| 代码量 |
数百行 |
零行,配置即用 |
开源