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

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

🌟 概述#

对于使用 Astro、Hugo、Hexo 等静态博客框架的用户来说,把本地构建好的 dist 目录上传到服务器是发布流程的关键一步。传统的 FTP/宝塔文件管理器上传方式效率低且容易出错,而 rclone 是目前最优的解决方案之一:增量同步、多协议支持、跨平台、支持校验。

本文将带你从零开始,使用 rclone 的 sftp 协议将静态博客一键同步到 Linux 服务器,并针对 Windows 用户补充了所有路径避坑和时区差异导致的重复上传问题。


📦 第一步:安装 rclone#

下载#

前往 rclone 官网下载页,下载对应你操作系统的版本。Windows 用户下载 Intel/AMD - 64 Bit.zip 包。

解压与环境变量配置#

  1. C:\Program Files\ 下新建一个 rclone 目录
  2. 将下载解压后的 rclone.exe 复制到该目录
  3. 添加环境变量:系统属性 → 环境变量 → 系统变量 Path → 新建,填入:
C:\Program Files\rclone\
  1. 打开 PowerShell 输入 rclone version,输出版本号即为安装成功。
权限不足?

若普通 PowerShell 解压/写入 C:\Program Files\ 提示权限不足,可改用 C:\tools\rclone\ 无 UAC 拦截,对应环境变量也改成该路径即可。


🔐 第二步:生成 SSH 密钥(免密登录)#

为了每次同步不需要手动输入密码,我们使用 ed25519 算法生成密钥对。

生成密钥#

在 PowerShell 中执行:

Terminal window
ssh-keygen -t ed25519

一路回车即可(不设密码),生成两个文件:

路径说明
C:\Users\你的用户名\.ssh\id_ed25519私钥(本地保留,千万不要泄露)
C:\Users\你的用户名\.ssh\id_ed25519.pub公钥(放到服务器上)

将公钥推送到服务器(推荐一键命令)#

下面的命令会自动创建目录、追加公钥并设置权限,避免手动复制粘贴导致 echo 错乱

Terminal window
# 把 64.90.3.3 改成你自己的服务器 IP
cat ~/.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 登录,如果不再要求输入密码,说明密钥配置成功。

权限问题排查

如果仍然要求输入密码,检查服务器端权限:

Terminal window
chmod 700 /root/.ssh
chmod 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 端口,默认 22
port = 22
# 本地私钥绝对路径(ed25519 密钥,免密登录)
# ⚠️ Windows INI 写法:使用正斜杠 / (推荐,跨平台无转义问题)
key_file = C:/Users/Administrator/.ssh/id_ed25519
# 或者双反斜杠也可:key_file = C:\\Users\\Administrator\\.ssh\\id_ed25519
# 远端服务器 shell 类型,linux 统一填 unix
shell_type = unix
# 文件 md5 校验命令(用于哈希比对文件,不填默认尝试探测)
md5sum_command = md5sum
# 文件 sha1 校验命令
sha1sum_command = sha1sum
配置说明
  • [blog-server]:这个括号里的是远端名称,后续同步命令中会用到
  • host:替换为你自己的服务器公网 IP
  • user:如果不用 root 账户就改成对应用户名(远程目录也要对应调整)
  • key_file:Windows 务必使用正斜杠 C:/Users/...,避免 INI 中单 \ 被当作转义符导致私钥找不到
  • Windows 路径两种合法写法:C:/Users/...C:\\Users\\...C:\Users\... 单反斜杠不保证兼容所有版本

🚀 第四步:构建与同步命令#

构建项目(以 Astro 为例)#

Terminal window
# 进入你的博客项目根目录
cd E:\blog
# 构建静态站点(生成 dist 目录)
pnpm build

测试 rclone 连接#

先列出服务器目标目录,确认配置是否正确:

Terminal window
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 先完整模拟一遍:

Terminal window
rclone sync -P --dry-run -v --size-only --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"

控制台会输出所有要上传 / 删除 / 更新的文件清单,但不会真的执行。确认无误后再去掉 --dry-run -v 正式运行。

正式镜像同步(会删除远端多余文件)#

Terminal window
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

Terminal window
rclone copy -P --size-only --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"
sync 与 copy 的区别
  • sync:镜像(目标 = 源),服务器多余的文件会被删,好处是不会有残留旧版本
  • copy:增量追加,安全但会留下冗余的旧静态文件
  • 纯静态博客建议用 sync,用 --exclude 保留服务器必要文件即可

⚡ 第五步:一键部署#

方案 A:直接在 PowerShell 执行#

Terminal window
# 构建 + 镜像同步(一行搞定)
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

Terminal window
$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 Cyan
pnpm build
if ($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 Cyan
rclone 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
}

执行方式:

Terminal window
.\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 每次都报错删不掉?#

这是宝塔自动创建的防跨站文件,同步命令必须加排除规则(推荐用通配匹配所有目录):

Terminal window
rclone sync -P --size-only --exclude "**.user.ini" --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"

或者更安全改用 copy

Terminal window
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 充裕时可以调大:

Terminal window
# 低配服务器:4~8;高配服务器:8~16
rclone 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. 如何验证同步结果一致?#

Terminal window
# 只做哈希比对,不实际传输
rclone check --config "E:\blog\rclone.conf" "E:\blog\dist" "blog-server:/www/wwwroot/blog"
check 只对比不修复

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 参数说明

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

静态博客增量同步到服务器:rclone + sftp 实战指南
https://www.cpdd520.top/posts/static-blog-rclone-sync/
作者
小鼠宝
发布于
2026-08-07
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
小鼠宝
来和我一起打洲吧!
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
最新动态
站点统计
文章
6
分类
3
标签
22
总字数
7,264
运行时长
0
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.15.6
文章许可
CC BY-NC-SA 4.0