给 Obsidian 找个家:轻量服务器自建 WebDAV 同步 + Remotely Save 的完整复刻手册
- 1给站点统计安个家:自建 Umami + 公开统计页 /analytics 的完整复刻手册
- 2给 Obsidian 找个家:轻量服务器自建 WebDAV 同步 + Remotely Save 的完整复刻手册本文
- 3备案通过后的图床重生记:把 CloudFlare-ImgBed 从 Telegram 渠道搬回境内服务器的完整复刻手册
- 4全站动效补完与 anime.js 数字滚动:五项动效计划的落地、四轮实测踩坑与复刻清单
- 5全站视觉移植复刻:把 Firefly 改造成 animal-island-ui 风格的七期工程(含复刻清单与踩坑全录)
- 6导航栏 UI 改造全记录:卡片边框、悬浮胶囊、三段收拢与 PC 收拢态快捷面板(附完整复现指南)
- 7博客性能优化全记录:Lighthouse 报告拆解到帧率根因排查(A–F 六项实战)
- 8Firefly 博客实战:从零搭建任意设备可用的发布台(Vercel + GitHub API)
- 9评论区回复时表情面板被截断:一次 overflow 裁剪排查实录
- 10Firefly 博客实战:给文章页加阅读进度条与圆环百分比
- 11Firefly 博客接入友链朋友圈:从零开始的完整部署教程
- 12从零开始搭建个人图床
- 13文章中添加音乐播放器
- 14基于Firefly主题的列表封面位置改造
- 15基于rehype的博客PDF嵌入组件实现
- 16Twikoo评论系统部署踩坑记录:Vercel域名无法访问的解决之路
- 17这是我的第一篇BLOG

给 Obsidian 找个家:轻量服务器自建 WebDAV 同步 + Remotely Save 的完整复刻手册
2026-10-21,本站在不新增任何常驻重型服务的前提下,把已有的腾讯云轻量服务器(2 GB 内存,跑着图床与备案)改造出了一条独立的 Obsidian 同步链路:Remotely Save 插件 → https://sync.域名/ → Nginx → 本机 rclone WebDAV → 磁盘目录。从加 DNS 记录到全链路验收通过,实际动手时间不到半小时;服务器新增常驻内存开销约几 MB,证书续期全自动。
本文写给两类读者:
- 想复现的访客:文末「复刻清单」从零列出全部步骤,关键配置在正文中可照抄,不依赖本站任何私有环境;
- 未来的维护者(包括新会话的 AI 助手):读完应知道链路每一段在哪、为什么这么隔离、哪些坑已经踩过。
〇、方案选型:为什么是 WebDAV + Remotely Save
先把候选方案摆上桌。同等「自建、多端同步」需求下,常见的四条路:
| 方案 | 实时性 | 资源开销 | 部署复杂度 | 版本历史 | 结论 |
|---|---|---|---|---|---|
| WebDAV + Remotely Save | 手动/定时触发 | 极低(复用系统已有的 rclone) | 低 | 可配合备份 | 本站采用 |
| Obsidian Git + 裸仓库 | 手动/定时 | 极低 | 中(要会 git、冲突自己解) | 天然有 | 适合 git 重度用户 |
| Self-hosted LiveSync(CouchDB) | 实时 | 高(常驻 CouchDB 容器) | 高 | 插件自带 | 体验最好,但小内存机器别碰 |
| Syncthing | 实时(P2P) | 中 | 中 | 无内置 | 模型是「设备互推」,新设备首次拉取绕 |
选型的三条决定性理由:
- 便宜的机器经不起再养一个数据库。本站服务器 2 GB 内存已跑着图床,CouchDB/Nextcloud 一类「为了同步再开一整个全家桶」的方案直接出局。而
rclone serve webdav是一个二进制的事,内存占用几乎可以四舍五入为零; - WebDAV 是被 Obsidian 插件生态充分支持的通用协议。Remotely Save 官方支持 WebDAV,配置只有地址、账号、密码三项,没有专有协议绑架——哪天不想用它了,同一个 WebDAV 端点还能给 Cyberduck、rclone、系统文件管理器复用;
- 能复用现成的 Nginx + certbot 体系。绝大多数人自建服务的机器上已经有 Nginx 和证书自动续签,加一个子域名反代是增量里最小的那种。
官方 Obsidian Sync(约 $4–8/月)当然省事,但它解决的是「懒得自建」而不是「不能自建」。本文面向后者。
一、架构与前置条件
1.1 架构
Obsidian(Remotely Save 插件) │ HTTPS + Basic Auth(rclone 校验) ▼https://sync.你的域名.com │ ├─ DNS:A 记录 → 你的服务器公网 IP │Nginx(:80/:443,certbot 证书,80 强制 301 到 443) │ 反代到 127.0.0.1:8082(本机回环,公网摸不到裸端口) ▼rclone serve webdav(systemd 常驻,--user/--pass 认证) │ ▼/var/lib/obsidian-sync/ ← vault 真身(普通目录,随便备份)三个隔离原则(无论你的服务器上还跑着什么,都建议保持):
- 端口隔离:rclone 只绑
127.0.0.1:8082,防火墙和安全组层面根本没有这个端口,外界只能走 Nginx 的 443 进来; - 目录隔离:同步数据放独立目录(本文用
/var/lib/obsidian-sync),不要和图床、站点等既有数据混放,备份和误删的爆炸半径都可控; - 账号隔离:WebDAV 用户名密码单独生成,不复用任何已有服务的凭据。
1.2 前置条件清单
- 一台能跑 Nginx 的 Linux 服务器(本文以 Ubuntu + systemd 为准;配置思路与发行版无关);
- 一个你自己的域名,以及在 DNS 服务商处添加记录的能力;
- 域名解析到该服务器后能正常开 HTTPS——若服务器在中国大陆,域名必须已 ICP 备案(子域名不需要单独备案,根域备案即可覆盖;未备案域名在大陆服务器上 80/443 会被阻断,这是硬门槛,换海外服务器或先备案二选一);
- 轻量服务器/云厂商安全组放行 443(腾讯云轻量控制台的「防火墙」默认可能只开 22/80,443 要手动加;症状是证书和 Nginx 都好、外网就是不通);
- 本机 SSH 能登录服务器,装好
nginx、certbot(nginx 插件)、rclone:
sudo apt-get updatesudo apt-get install -y nginx rclone certbot python3-certbot-nginxrclone version # 本文实测 rclone v1.60.x,任何 1.5x+ 都够用二、服务器侧复刻步骤
下文用两个占位符,照抄时替换:
sync.你的域名.com—— 本文实站为sync.mstzuomu.space;- 账号
obsidav、密码 —— 密码自己生成,不要抄示例。
2.1 数据目录 + 生成强密码
sudo mkdir -p /var/lib/obsidian-syncsudo chown "$USER":"$USER" /var/lib/obsidian-sync
# 24 位随机密码(去 base64 特殊字符,避免 shell/配置里转义麻烦)PASS=$(openssl rand -base64 24 | tr -dc 'A-Za-z0-9' | cut -c1-24)echo "$PASS" # 记下来,稍后填进 systemd 和 Obsidian2.2 rclone WebDAV 服务(systemd)
新建 /etc/systemd/system/rclone-obsidian-webdav.service(把 YOUR_PASSWORD 换成上一步的密码):
[Unit]Description=rclone WebDAV server for Obsidian vault syncAfter=network.target
[Service]User=你的登录用户ExecStart=/usr/bin/rclone serve webdav /var/lib/obsidian-sync \ --addr 127.0.0.1:8082 \ --user obsidav \ --pass YOUR_PASSWORD \ --dir-cache-time 1sRestart=on-failureRestartSec=5
[Install]WantedBy=multi-user.target参数解释(都是有理由的,别随手删):
--addr 127.0.0.1:8082:只听本机回环。这是整个方案的安全底线——密码再强,裸端口暴露公网也是给别人刷;--dir-cache-time 1s:rclone 默认目录缓存 5 分钟。多设备同步场景下,设备 A 新建的文件可能 5 分钟内「看不见」,客户端会误判为「远端没有」。压到 1 秒,个人 vault 规模的 stat 开销可忽略;- 密码以明文躺在 unit 文件里,权限自然 root:
ls -l /etc/systemd/system/rclone-obsidian-webdav.service应为-rw-r--r-- 1 root root。嫌不够可以先rclone obscure YOUR_PASSWORD生成混淆串,但serve webdav的--pass两种都能吃。
启用并验证:
sudo systemctl daemon-reloadsudo systemctl enable --now rclone-obsidian-webdavsystemctl is-active rclone-obsidian-webdav # 期望:active
# 本机冒烟(207 Multi-Status = WebDAV PROPFIND 正常)curl -u "obsidav:$PASS" -X PROPFIND -H 'Depth: 1' http://127.0.0.1:8082/2.3 Nginx 反代(先走 HTTP)
新建 /etc/nginx/sites-available/sync:
server { listen 80; listen [::]:80; server_name sync.你的域名.com;
# 笔记附件里有图/PDF,上限别太小;与常见图床站保持一致用 100m client_max_body_size 100m;
location / { proxy_pass http://127.0.0.1:8082; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebDAV 上传希望边收边转,别在 Nginx 落盘缓冲 proxy_request_buffering off; proxy_buffering off; }}sudo ln -s /etc/nginx/sites-available/sync /etc/nginx/sites-enabled/sudo nginx -t && sudo systemctl reload nginx
# 此时带 Host 头应能透传到 rclone(401 = 认证层已生效)curl -s -o /dev/null -w '%{http_code}\n' -H 'Host: sync.你的域名.com' http://127.0.0.1/# 期望 401(未带账密被 rclone 拒绝;不是 502 就说明反代通了)2.4 DNS:添加 A 记录
在你的 DNS 服务商控制台添加:
| 项 | 值 |
|---|---|
| 记录类型 | A |
| 主机记录 | sync(或任意你想用的前缀) |
| 记录值 | 你的服务器公网 IP |
| TTL | 默认即可 |
本站 DNS 权威在腾讯云 EdgeOne(域名服务 → DNS 记录),记录刚保存时权威 NS 生效有 1~3 分钟延迟——立刻查查不到别慌,直接问权威服务器:
nslookup sync.你的域名.com 你的权威NS # 如 ns1.qeodns.com2.5 certbot 签证书 + 切 HTTPS
DNS 生效后(nslookup sync.你的域名.com 8.8.8.8 能返回 IP 即可):
sudo certbot certonly --nginx -d sync.你的域名.com \ --non-interactive --agree-tos --register-unsafely-without-email拿到证书后,把 2.3 的站点配置升级为「443 服务 + 80 跳转」。新建 /etc/nginx/sites-available/sync-ssl:
server { listen 443 ssl; http2 on; server_name sync.你的域名.com;
ssl_certificate /etc/letsencrypt/live/sync.你的域名.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sync.你的域名.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
client_max_body_size 100m;
location / { proxy_pass http://127.0.0.1:8082; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_request_buffering off; proxy_buffering off; }}把原 /etc/nginx/sites-available/sync 的内容整体替换为强制跳转:
server { listen 80; listen [::]:80; server_name sync.你的域名.com; return 301 https://$host$request_uri;}sudo ln -sf /etc/nginx/sites-available/sync-ssl /etc/nginx/sites-enabled/sudo nginx -t && sudo systemctl reload nginx想省事也可以用
sudo certbot --nginx -d sync.你的域名.com一键改写原配置(certbot 会自动插证书段并加 80→443 跳转),效果等价。本文实测走的是certonly+ 手写 443 段的显式路线,配置完全可控。证书 90 天到期由
certbot.timer自动续(默认每天两次尝试),不用手动管;续完会自动 reload Nginx。
2.6 全链路验收清单
在任何一台外部机器上逐条执行(替换成你的域名和密码),全绿才算完:
# 1. 未带凭据必须被挡在门外curl -s -o /dev/null -w '%{http_code}\n' -X PROPFIND -H 'Depth: 1' https://sync.你的域名.com/# 期望 401
# 2. 带凭据列目录 = WebDAV 正常curl -s -o /dev/null -w '%{http_code}\n' \ -u "obsidav:你的密码" -X PROPFIND -H 'Depth: 1' https://sync.你的域名.com/# 期望 207
# 3. 写入echo "hello obsidian" > /tmp/smoke.mdcurl -s -o /dev/null -w '%{http_code}\n' \ -u "obsidav:你的密码" -T /tmp/smoke.md https://sync.你的域名.com/smoke-test.md# 期望 201
# 4. 读回curl -s -u "obsidav:你的密码" https://sync.你的域名.com/smoke-test.md# 期望原样输出 hello obsidian
# 5. 删除curl -s -o /dev/null -w '%{http_code}\n' \ -u "obsidav:你的密码" -X DELETE https://sync.你的域名.com/smoke-test.md# 期望 204外加两条常规确认:
-
http://访问返回 301 跳到https://; - 服务器上
sudo systemctl is-enabled rclone-obsidian-webdav输出enabled(重启机器后自动爬起来)。
三、Obsidian 客户端:Remotely Save 配置
- Obsidian → 设置 → 第三方插件 → 浏览 → 搜索 Remotely Save(作者 fyears)→ 安装并启用;
- 进入 Remotely Save 设置:
| 设置项 | 值 |
|---|---|
| 服务类型(Remote type) | WebDAV |
| 服务器地址(Address) | https://sync.你的域名.com/ |
| 用户名 | obsidav |
| 密码 | 你生成的密码 |
| E2E 加密 | 保持关闭(链路已有 HTTPS;开了以后换设备要多记一串加密密码) |
| 自动同步 | 按需开启(如每 10 分钟),或手动点侧栏图标同步 |
- 首次同步务必先确认方向:设置页有「Force Upload / 强制上传」与「Force Download / 强制下载」一类按钮(不同版本措辞略有差异)。空仓库起步时先 Force Upload 把本地内容推上去;若远端已有数据、本地是空的,才 Force Download。方向搞反的代价是整库被空内容覆盖——这一步别靠肌肉记忆;
- 多 vault:同一端点下用子路径区分,如
https://sync.你的域名.com/日记/、https://sync.你的域名.com/工作/,目录不存在时插件会自行创建(rclone 端 MKCOL 默认允许)。
验收:手机和电脑各装一份插件指向同一地址,一边改一行字触发同步,另一边拉下来——链路即宣告打通。
四、踩坑记录与日常运维
以下均为本站实测踩过或现场规避的点,按严重程度排序:
- rclone 绝不能绑
0.0.0.0/公网 IP。反代架构里裸 WebDAV 端口一旦暴露,就是全网扫密码的活靶子。固定127.0.0.1,云安全组也不要放行 8082(或你选的端口); - 大陆服务器 + 未备案域名 = 443 连不上。症状极具迷惑性:服务器本地 curl 全绿、证书正常、安全组也开了,外网就是超时——因为域名没备案。子域跟随根域备案,无需单独操作,但根域必须已备案;
- 轻量服务器控制台防火墙默认不开 443。症状同上但域名已备案:本地通、外网不通。去控制台「防火墙」放行 443 即可;
--dir-cache-time默认值是同步场景的暗坑。5 分钟目录缓存会让刚建的文件对其他设备「隐身」,表现为同步时偶发漏文件,重启服务又好了——就是缓存在作怪;- Windows 上管理 systemd 单元别硬拼引号。远程改 unit 建议写成临时
.sh文件用管道传给ssh ... bash -s,比在 PowerShell 里嵌套多层引号可靠得多; - 改密码的完整动线:重新生成
PASS→ 改 unit 文件ExecStart→sudo systemctl restart rclone-obsidian-webdav→ 同步更新所有设备上 Remotely Save 的密码(漏一台的症状是那台设备 401); - 备份就是拷目录。同步端点本身不是备份(设备 A 删了,同步会把删除带到所有端和服务器)。建议在服务器上加一条 cron 定期打包:
# 每天 04:10 打包,保留最近 14 份10 4 * * * tar -czf /var/backups/obsidian-sync-$(date +\%F).tar.gz /var/lib/obsidian-sync && \ find /var/backups -name 'obsidian-sync-*.tar.gz' -mtime +14 -delete五、写给复刻者的最短路径
- 服务器:
apt install nginx rclone certbot,建/var/lib/obsidian-sync,openssl rand生成密码; - 写
rclone-obsidian-webdav.service(绑127.0.0.1:8082、--dir-cache-time 1s),enable --now,本机 PROPFIND 冒烟到 207; - Nginx 先配 HTTP 站点反代到 8082,
nginx -t+ reload; - DNS 加
syncA 记录指向服务器,等权威 NS 应答; certbot certonly --nginx签证书,升级 443 配置,80 改 301;- 跑 §2.6 五条 curl 验收,全绿;
- 装 Remotely Save,填地址/账密,首次先 Force Upload 确认方向,双端对拷验证;
- 加备份 cron,收工。
方案便宜、链路透明、每一段都能用 curl 单独验证——笔记是长期资产,同步后端值得用这种「随时能看穿」的朴素架构。祝各位一次跑通。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!




