静态博客增量同步到服务器:rclone + sftp 实战指南

🌟 概述
对于使用 Astro、Hugo、Hexo 等静态博客框架的用户来说,把本地构建好的 dist 目录上传到服务器是发布流程的关键一步。传统的 FTP/宝塔文件管理器上传方式效率低且容易出错,而 rclone 是目前最优的解决方案之一:增量同步、多协议支持、跨平台、支持校验。
本文将带你从零开始,使用 rclone 的 sftp 协议将静态博客一键同步到 Linux 服务器,并针对 Windows 用户补充了所有路径避坑和时区差异导致的重复上传问题。
📦 第一步:安装 rclone
下载
前往 rclone 官网下载页,下载对应你操作系统的版本。Windows 用户下载 Intel/AMD - 64 Bit 的 .zip 包。
解压与环境变量配置
- 在
C:\Program Files\下新建一个rclone目录 - 将下载解压后的
rclone.exe复制到该目录 - 添加环境变量:系统属性 → 环境变量 → 系统变量 Path → 新建,填入:
C:\Program Files\rclone\- 打开 PowerShell 输入
rclone version,输出版本号即为安装成功。
若普通 PowerShell 解压/写入 C:\Program Files\ 提示权限不足,可改用 C:\tools\rclone\ 无 UAC 拦截,对应环境变量也改成该路径即可。
🔐 第二步:生成 SSH 密钥(免密登录)
为了每次同步不需要手动输入密码,我们使用 ed25519 算法生成密钥对。
生成密钥
在 PowerShell 中执行:
ssh-keygen -t ed25519一路回车即可(不设密码),生成两个文件:
| 路径 | 说明 |
|---|---|
C:\Users\你的用户名\.ssh\id_ed25519 | 私钥(本地保留,千万不要泄露) |
C:\Users\你的用户名\.ssh\id_ed25519.pub | 公钥(放到服务器上) |
将公钥推送到服务器(推荐一键命令)
下面的命令会自动创建目录、追加公钥并设置权限,避免手动复制粘贴导致 echo 错乱:
# 把 64.90.3.3 改成你自己的服务器 IPcat ~/.ssh/id_ed25519.pub | ssh root@64.90.3.3 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"如果第一次连接会弹出以下确认,输入 yes 回车:
Are you sure you want to continue connecting (yes/no)?推送完成后,再次 ssh root@你的服务器IP 登录,如果不再要求输入密码,说明密钥配置成功。
如果仍然要求输入密码,检查服务器端权限:
chmod 700 /root/.sshchmod 600 /root/.ssh/authorized_keys# 仅 CentOS7+/Rocky/AlmaLinux 需要执行 SELinux 上下文修复;Debian/Ubuntu 无需运行restorecon -Rv /root/.ssh⚙️ 第三步:rclone 配置文件
推荐放置位置
在项目根目录创建 rclone.conf(推荐,配合 --config 指定路径即可):
E:\blog\rclone.conf如果想全局生效而不用每次写 --config,应放在:
C:\Users\Administrator\.config\rclone\rclone.conf(不是 C:\Program Files\rclone\,放在程序目录会触发 UAC 权限拦截,读取失败率高)
配置文件完整内容
[blog-server]# 远程存储类型:sftp 协议type = sftp# 服务器 IP 地址host = 64.90.3.3# SSH 登录用户名user = root# SSH 端口,默认 22port = 22# 本地私钥绝对路径(ed25519 密钥,免密登录)# ⚠️ Windows INI 写法:使用正斜杠 / (推荐,跨平台无转义问题)key_file = C:/Users/Administrator/.ssh/id_ed25519# 或者双反斜杠也可:key_file = C:\\Users\\Administrator\\.ssh\\id_ed25519# 远端服务器 shell 类型,linux 统一填 unixshell_type = unix# 文件 md5 校验命令(用于哈希比对文件,不填默认尝试探测)md5sum_command = md5sum# 文件 sha1 校验命令sha1sum_command = sha1sum[blog-server]:这个括号里的是远端名称,后续同步命令中会用到host:替换为你自己的服务器公网 IPuser:如果不用 root 账户就改成对应用户名(远程目录也要对应调整)key_file:Windows 务必使用正斜杠C:/Users/...,避免 INI 中单\被当作转义符导致私钥找不到- Windows 路径两种合法写法:
C:/Users/...或C:\\Users\\...,C:\Users\...单反斜杠不保证兼容所有版本
🚀 第四步:构建与同步命令
构建项目(以 Astro 为例)
# 进入你的博客项目根目录cd E:\blog
# 构建静态站点(生成 dist 目录)pnpm build测试 rclone 连接
先列出服务器目标目录,确认配置是否正确:
rclone lsd --config "E:\blog\rclone.conf" blog-server:/www/wwwroot/正常情况下会输出服务器上 /www/wwwroot/ 下的目录列表。
如果提示 directory not found,属于正常现象——首次同步时 rclone 会自动创建远端目标文件夹,不影响后续使用。
⚡ 关键参数说明(必读!)
| 参数 | 作用 |
|---|---|
sync | 使目标与源完全一致(目标中多出的文件会被删除) |
copy | 只上传不删除(保留服务器上额外文件,更安全) |
-P / --progress | 实时显示进度条、传输速度、剩余时间 |
--size-only | 静态博客必备——只按文件大小判断是否变更,避开 Windows/Linux 时区 mtime 不一致导致的无变更重复上传 |
--dry-run | 干跑模式,列出操作但不实际执行 |
-v | 配合 dry-run 输出更详细的变更日志(包含删除的完整文件清单) |
--config | 指定 rclone.conf 配置文件路径 |
--exclude | 排除匹配规则的文件(支持通配符 **) |
--transfers N | 并发传输数,sftp 默认 4;低配服务器建议 4~8,高配可调至 16 |
先干跑再正式跑(推荐必做)
不确定会不会删错东西?用 --dry-run -v 先完整模拟一遍:
rclone sync -P --dry-run -v --size-only --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"控制台会输出所有要上传 / 删除 / 更新的文件清单,但不会真的执行。确认无误后再去掉
--dry-run -v正式运行。
正式镜像同步(会删除远端多余文件)
rclone sync -P --size-only --exclude "**.user.ini" --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"
--exclude "**.user.ini"会匹配所有目录下的宝塔防跨站.user.ini文件(比单写.user.ini只匹配根目录更可靠)。
安全上传(不删除服务器文件)
如果你在服务器 dist 目录下放了别的自定义文件或 .htaccess,改用 copy:
rclone copy -P --size-only --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"sync:镜像(目标 = 源),服务器多余的文件会被删,好处是不会有残留旧版本copy:增量追加,安全但会留下冗余的旧静态文件- 纯静态博客建议用
sync,用--exclude保留服务器必要文件即可
⚡ 第五步:一键部署
方案 A:直接在 PowerShell 执行
# 构建 + 镜像同步(一行搞定)cd E:\blog ; pnpm build ; rclone sync -P --size-only --exclude "**.user.ini" --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"方案 B:保存为 deploy.ps1 脚本(推荐,含容错)
在博客根目录创建 deploy.ps1:
$ErrorActionPreference = "Stop"
# 路径定义$confPath = "$PSScriptRoot\rclone.conf"$distPath = "$PSScriptRoot\dist"$remote = "blog-server:/www/wwwroot/blog"
# 1. 配置文件存在性检查if (-not (Test-Path $confPath)) { Write-Host "❌ 未找到 rclone 配置文件 $confPath" -ForegroundColor Red exit 1}
# 2. 构建Write-Host "🔨 开始构建项目..." -ForegroundColor Cyanpnpm buildif ($LASTEXITCODE -ne 0) { Write-Host "❌ 构建失败,终止部署" -ForegroundColor Red exit 1}
# 3. dist 目录二次校验if (-not (Test-Path $distPath)) { Write-Host "❌ 构建产物目录不存在:$distPath" -ForegroundColor Red exit 1}
# 4. 同步Write-Host "🚀 开始同步到服务器..." -ForegroundColor Cyanrclone sync -P --size-only --exclude "**.user.ini" --config $confPath $distPath $remote
if ($LASTEXITCODE -eq 0) { Write-Host "✅ 部署完成!" -ForegroundColor Green} else { Write-Host "❌ 同步失败,退出码:$LASTEXITCODE" -ForegroundColor Red exit $LASTEXITCODE}执行方式:
.\deploy.ps1📋 完整流程速查表
本地准备(一次性)├── 1. 下载 rclone.exe → C:\Program Files\rclone\├── 2. 添加到环境变量 Path├── 3. ssh-keygen -t ed25519 生成密钥└── 4. cat ~/.ssh/id_ed25519.pub | ssh root@IP \ "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys \ && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
配置(一次性)└── rclone.conf → sftp 配置(host / user / key_file 正斜杠 / port)
每次发布├── pnpm build # 构建 dist├── rclone lsd --config ... blog-server:... # 测试连接(可选)├── rclone sync -P --dry-run -v --size-only \│ --config ... dist blog-server:... # 模拟运行(强烈推荐)└── rclone sync -P --size-only \ --exclude "**.user.ini" --config ... # 正式同步❓ 常见问题
1. 宝塔站点的 .user.ini 每次都报错删不掉?
这是宝塔自动创建的防跨站文件,同步命令必须加排除规则(推荐用通配匹配所有目录):
rclone sync -P --size-only --exclude "**.user.ini" --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"或者更安全改用 copy:
rclone copy -P --size-only --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"2. 连接报错 “Host key verification failed”
首次连接需要手动接受主机指纹。最简单的方法:先用 ssh root@服务器IP 登录一次,输入 yes 就会自动记录到 known_hosts,之后 rclone 就能正常连接。
3. 为什么相同的文件每次都被重复上传?
核心原因:Windows 和 Linux 的文件修改时间(mtime)时区/格式不一致,rclone 默认以 size + mtime 综合判断,本地时间戳与服务器稍有不同就触发重传。
解决方案:所有 sync/copy 命令务必加 --size-only,只按文件大小判断,静态博客场景下大小不同 = 内容不同,完全准确。
4. 同步速度慢?
rclone sftp 默认并发是 4,服务器带宽和 CPU 充裕时可以调大:
# 低配服务器:4~8;高配服务器:8~16rclone sync -P --size-only --transfers 8 --exclude "**.user.ini" --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"⚠️ 不建议直接拉满 16:sftp 走 SSH 加密通道,过多并发极易打满低配云服务器 CPU/带宽,导致 SSH 连接断开。从默认 4 开始逐步往上试。
5. 如何验证同步结果一致?
# 只做哈希比对,不实际传输rclone check --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"rclone check 仅列出哈希差异文件清单,不会自动修复。若发现不一致,重新执行同步命令(sync/copy)即可覆盖修复。
6. Windows 配置中 key_file 提示私钥找不到?
检查这两点:
- 是否用了单
\(例如C:\Users\...)→ 必须改成正斜杠C:/Users/...或双反斜杠C:\\Users\\... - 路径中是否有中文或空格 → 有空格时在 INI 里不需要加引号,rclone 自动处理
🎉 总结
整个流程只需要配置一次,之后发布新文章就是一个命令的事:构建 + 同步。相比传统方式:
- ✅ 增量同步 +
--size-only:只传真正变化的文件,完美避开 Windows/Linux 时间戳差异 - ✅ 哈希校验:内置 md5/sha1 比对,防止传输损坏
- ✅ SSH 加密 + 密钥登录:走 sftp 协议,比 FTP 安全得多
- ✅ 全链路容错:
--dry-run预演 +--exclude "**.user.ini"防误删 + 部署脚本前置检查 - ✅ 跨平台:配置正斜杠路径,Windows / macOS / Linux 都能用
- ✅ 兼容协议多:除了 sftp,还支持 S3、WebDAV、OSS、Cloudflare R2 等 70+ 种存储
更多用法可以看 rclone sync 官方文档 和 rclone sftp 参数说明。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!




