场景:本地 macOS 开发,远程阿里云 ECS,宝塔面板管理网站
痛点:每次部署都要手动 build → 打开宝塔 → 删旧文件 → 拖新文件
目标:一行命令搞定 build + 部署
原始流程
每次改完代码,部署流程是这样的:
- 本地
pnpm build - 打开浏览器,登录宝塔面板
- 进入网站目录,删除旧的
dist文件 - 把本地
dist文件夹拖进去 - 等待上传完成
整个过程大约 5-10 分钟,而且容易出错(忘删旧文件、拖错目录等)。
优化方案
第一步:SSH 密钥配置
首先,让本地 Mac 免密登录服务器:
# 生成密钥(如果还没有)
ssh-keygen -t ed25519
# 把公钥复制到服务器
ssh-copy-id root@你的服务器IP
配置完成后,ssh root@服务器IP 不需要输入密码。
第二步:rsync 增量同步
rsync 是一个强大的文件同步工具,支持增量传输:
rsync -avz --delete ./dist/ root@服务器:/www/wwwroot/网站目录/
参数说明:
-a:归档模式,保留权限、时间等-v:显示传输详情-z:压缩传输--delete:删除目标目录中源目录没有的文件(保证完全同步)
第三步:封装成脚本
在项目根目录创建 deploy.sh:
#!/bin/bash
set -e
SERVER="root@你的服务器IP"
REMOTE_DIR="/www/wwwroot/yi.selena.ink"
echo "🔨 Building..."
pnpm build
echo "🚀 Deploying..."
rsync -avz --delete ./dist/ $SERVER:$REMOTE_DIR/
echo "✅ Done!"
赋予执行权限:
chmod +x deploy.sh
以后部署只需要:
./deploy.sh
进阶:多项目快捷命令
如果有多个项目,可以配置 shell 别名:
# ~/.zshrc
alias dp1="cd ~/Desktop/project1 && ./deploy.sh"
alias dp2="cd ~/Desktop/project2 && ./deploy.sh"
alias dp3="cd ~/Desktop/project3 && ./deploy.sh"
执行 source ~/.zshrc 后,直接输入 dp1、dp2、dp3 即可部署对应项目。
效果对比
| 项目 | 之前 | 现在 |
|---|---|---|
| 耗时 | 5-10 分钟 | 10 秒 |
| 操作步骤 | 5 步 | 1 行命令 |
| 出错概率 | 高 | 几乎为零 |
原理解析
为什么 rsync 不需要密码?
因为 SSH 密钥认证。rsync 底层走的是 SSH 协议:
本地 Mac ──SSH 密钥认证──▶ 服务器
│
└── rsync 通过这条 SSH 通道传文件
本地有私钥(~/.ssh/id_ed25519),服务器有公钥,配对成功就自动登录。
为什么用 --delete?
Vite 打包的文件名带 hash(如 index-DPmJ5pWZ.js),每次打包 hash 不同。如果不删除旧文件,服务器上会堆积越来越多的旧文件。
--delete 参数会删除服务器上存在但本地 dist 中没有的文件,保证服务器和本地完全一致。
增量同步的优势
rsync 只传输变化的文件,不是全量覆盖。从日志可以看出:
sent 140083 bytes received 292 bytes
total size is 453126 speedup is 3.23
比全量传输快 3.23 倍。
总结
前端部署不应该是重复的手工活。通过 SSH 密钥 + rsync + shell 脚本,可以把部署流程自动化,节省大量时间。
配置一次,终身受益。
完整配置步骤
- 生成 SSH 密钥:
ssh-keygen -t ed25519 - 复制公钥到服务器:
ssh-copy-id root@服务器IP - 在项目根目录创建
deploy.sh - 赋予执行权限:
chmod +x deploy.sh - 执行部署:
./deploy.sh