场景:本地 macOS 开发,远程阿里云 ECS,宝塔面板管理网站
痛点:每次部署都要手动 build → 打开宝塔 → 删旧文件 → 拖新文件
目标:一行命令搞定 build + 部署


原始流程

每次改完代码,部署流程是这样的:

  1. 本地 pnpm build
  2. 打开浏览器,登录宝塔面板
  3. 进入网站目录,删除旧的 dist 文件
  4. 把本地 dist 文件夹拖进去
  5. 等待上传完成

整个过程大约 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 后,直接输入 dp1dp2dp3 即可部署对应项目。


效果对比

项目之前现在
耗时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 脚本,可以把部署流程自动化,节省大量时间。

配置一次,终身受益。


完整配置步骤

  1. 生成 SSH 密钥:ssh-keygen -t ed25519
  2. 复制公钥到服务器:ssh-copy-id root@服务器IP
  3. 在项目根目录创建 deploy.sh
  4. 赋予执行权限:chmod +x deploy.sh
  5. 执行部署:./deploy.sh