视频加载失败

给 Obsidian 找个家:轻量服务器自建 WebDAV 同步 + Remotely Save 的完整复刻手册

3198 字
16 分钟
给 Obsidian 找个家:轻量服务器自建 WebDAV 同步 + Remotely Save 的完整复刻手册
给 Obsidian 找个家:轻量服务器自建 WebDAV 同步 + Remotely Save 的完整复刻手册

给 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)中中无内置模型是「设备互推」,新设备首次拉取绕

选型的三条决定性理由:

  1. 便宜的机器经不起再养一个数据库。本站服务器 2 GB 内存已跑着图床,CouchDB/Nextcloud 一类「为了同步再开一整个全家桶」的方案直接出局。而 rclone serve webdav 是一个二进制的事,内存占用几乎可以四舍五入为零;
  2. WebDAV 是被 Obsidian 插件生态充分支持的通用协议。Remotely Save 官方支持 WebDAV,配置只有地址、账号、密码三项,没有专有协议绑架——哪天不想用它了,同一个 WebDAV 端点还能给 Cyberduck、rclone、系统文件管理器复用;
  3. 能复用现成的 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 真身(普通目录,随便备份)

三个隔离原则(无论你的服务器上还跑着什么,都建议保持):

  1. 端口隔离:rclone 只绑 127.0.0.1:8082,防火墙和安全组层面根本没有这个端口,外界只能走 Nginx 的 443 进来;
  2. 目录隔离:同步数据放独立目录(本文用 /var/lib/obsidian-sync),不要和图床、站点等既有数据混放,备份和误删的爆炸半径都可控;
  3. 账号隔离:WebDAV 用户名密码单独生成,不复用任何已有服务的凭据。

1.2 前置条件清单#

  • 一台能跑 Nginx 的 Linux 服务器(本文以 Ubuntu + systemd 为准;配置思路与发行版无关);
  • 一个你自己的域名,以及在 DNS 服务商处添加记录的能力;
  • 域名解析到该服务器后能正常开 HTTPS——若服务器在中国大陆,域名必须已 ICP 备案(子域名不需要单独备案,根域备案即可覆盖;未备案域名在大陆服务器上 80/443 会被阻断,这是硬门槛,换海外服务器或先备案二选一);
  • 轻量服务器/云厂商安全组放行 443(腾讯云轻量控制台的「防火墙」默认可能只开 22/80,443 要手动加;症状是证书和 Nginx 都好、外网就是不通);
  • 本机 SSH 能登录服务器,装好 nginx、certbot(nginx 插件)、rclone:
Terminal window
sudo apt-get update
sudo apt-get install -y nginx rclone certbot python3-certbot-nginx
rclone version # 本文实测 rclone v1.60.x,任何 1.5x+ 都够用

二、服务器侧复刻步骤#

下文用两个占位符,照抄时替换:

  • sync.你的域名.com —— 本文实站为 sync.mstzuomu.space;
  • 账号 obsidav、密码 —— 密码自己生成,不要抄示例。

2.1 数据目录 + 生成强密码#

Terminal window
sudo mkdir -p /var/lib/obsidian-sync
sudo 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 和 Obsidian

2.2 rclone WebDAV 服务(systemd)#

新建 /etc/systemd/system/rclone-obsidian-webdav.service(把 YOUR_PASSWORD 换成上一步的密码):

[Unit]
Description=rclone WebDAV server for Obsidian vault sync
After=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 1s
Restart=on-failure
RestartSec=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 两种都能吃。

启用并验证:

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable --now rclone-obsidian-webdav
systemctl 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;
}
}
Terminal window
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 分钟延迟——立刻查查不到别慌,直接问权威服务器:

Terminal window
nslookup sync.你的域名.com 你的权威NS # 如 ns1.qeodns.com

2.5 certbot 签证书 + 切 HTTPS#

DNS 生效后(nslookup sync.你的域名.com 8.8.8.8 能返回 IP 即可):

Terminal window
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;
}
Terminal window
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 全链路验收清单#

在任何一台外部机器上逐条执行(替换成你的域名和密码),全绿才算完:

Terminal window
# 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.md
curl -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 配置#

  1. Obsidian → 设置 → 第三方插件 → 浏览 → 搜索 Remotely Save(作者 fyears)→ 安装并启用;
  2. 进入 Remotely Save 设置:
设置项值
服务类型(Remote type)WebDAV
服务器地址(Address)https://sync.你的域名.com/
用户名obsidav
密码你生成的密码
E2E 加密保持关闭(链路已有 HTTPS;开了以后换设备要多记一串加密密码)
自动同步按需开启(如每 10 分钟),或手动点侧栏图标同步
  1. 首次同步务必先确认方向:设置页有「Force Upload / 强制上传」与「Force Download / 强制下载」一类按钮(不同版本措辞略有差异)。空仓库起步时先 Force Upload 把本地内容推上去;若远端已有数据、本地是空的,才 Force Download。方向搞反的代价是整库被空内容覆盖——这一步别靠肌肉记忆;
  2. 多 vault:同一端点下用子路径区分,如 https://sync.你的域名.com/日记/、https://sync.你的域名.com/工作/,目录不存在时插件会自行创建(rclone 端 MKCOL 默认允许)。

验收:手机和电脑各装一份插件指向同一地址,一边改一行字触发同步,另一边拉下来——链路即宣告打通。


四、踩坑记录与日常运维#

以下均为本站实测踩过或现场规避的点,按严重程度排序:

  1. rclone 绝不能绑 0.0.0.0/公网 IP。反代架构里裸 WebDAV 端口一旦暴露,就是全网扫密码的活靶子。固定 127.0.0.1,云安全组也不要放行 8082(或你选的端口);
  2. 大陆服务器 + 未备案域名 = 443 连不上。症状极具迷惑性:服务器本地 curl 全绿、证书正常、安全组也开了,外网就是超时——因为域名没备案。子域跟随根域备案,无需单独操作,但根域必须已备案;
  3. 轻量服务器控制台防火墙默认不开 443。症状同上但域名已备案:本地通、外网不通。去控制台「防火墙」放行 443 即可;
  4. --dir-cache-time 默认值是同步场景的暗坑。5 分钟目录缓存会让刚建的文件对其他设备「隐身」,表现为同步时偶发漏文件,重启服务又好了——就是缓存在作怪;
  5. Windows 上管理 systemd 单元别硬拼引号。远程改 unit 建议写成临时 .sh 文件用管道传给 ssh ... bash -s,比在 PowerShell 里嵌套多层引号可靠得多;
  6. 改密码的完整动线:重新生成 PASS → 改 unit 文件 ExecStart → sudo systemctl restart rclone-obsidian-webdav → 同步更新所有设备上 Remotely Save 的密码(漏一台的症状是那台设备 401);
  7. 备份就是拷目录。同步端点本身不是备份(设备 A 删了,同步会把删除带到所有端和服务器)。建议在服务器上加一条 cron 定期打包:
Terminal window
# 每天 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

五、写给复刻者的最短路径#

  1. 服务器:apt install nginx rclone certbot,建 /var/lib/obsidian-sync,openssl rand 生成密码;
  2. 写 rclone-obsidian-webdav.service(绑 127.0.0.1:8082、--dir-cache-time 1s),enable --now,本机 PROPFIND 冒烟到 207;
  3. Nginx 先配 HTTP 站点反代到 8082,nginx -t + reload;
  4. DNS 加 sync A 记录指向服务器,等权威 NS 应答;
  5. certbot certonly --nginx 签证书,升级 443 配置,80 改 301;
  6. 跑 §2.6 五条 curl 验收,全绿;
  7. 装 Remotely Save,填地址/账密,首次先 Force Upload 确认方向,双端对拷验证;
  8. 加备份 cron,收工。

方案便宜、链路透明、每一段都能用 curl 单独验证——笔记是长期资产,同步后端值得用这种「随时能看穿」的朴素架构。祝各位一次跑通。

支持与分享

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

打赏
给 Obsidian 找个家:轻量服务器自建 WebDAV 同步 + Remotely Save 的完整复刻手册
https://azuma.mstzuomu.space/posts/azuma.zuomu-blog-23/
作者
左沐
发布于
2026-10-21
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
给站点统计安个家:自建 Umami + 公开统计页 /analytics 的完整复刻手册
技术分享不再挂不蒜子、不租统计面板,也能有带趋势图和热力图的公开统计页。本文记录本站把站点统计迁到自建 Umami 并移植 /analytics 的全过程:Docker 部署与版本钉死、share_id 直写 SQL、v2.20 API 语义差异、历史数据重放、Astro 端接入与布局修整,附踩坑表与从零复刻清单
2
备案通过后的图床重生记:把 CloudFlare-ImgBed 从 Telegram 渠道搬回境内服务器的完整复刻手册
技术分享ICP 备案下证后,本站完成从 Cloudflare 全家桶到腾讯云生态的整体迁移。本文以图床为主线:为什么 CloudFlare-ImgBed 在国内必死(Telegram 渠道、workers.dev 污染、EO 反代 522、CF 封死子域 zone 四重死因),如何无损导出数据,并在轻量服务器上用 Docker 原版程序 + Nginx + rclone WebDAV 重建出「网页上传 + 后台设置」的完整体验,附全部踩坑与可照抄的复刻步骤
3
全站动效补完与 anime.js 数字滚动:五项动效计划的落地、四轮实测踩坑与复刻清单
技术分享完整记录 Firefly 博客一次「按门禁筛出来的动效改造」:五项动效计划(浮层开合/模态进出场/公告折叠/翻页桥接/切标签)的病灶定位、精确参数与四个实测才现形的 bug,以及用 anime.js 给侧栏统计做数字滚动的选型决策、v4 API 与零面积 IntersectionObserver 抢跑坑,附可照做的复刻清单
4
全站视觉移植复刻:把 Firefly 改造成 animal-island-ui 风格的七期工程(含复刻清单与踩坑全录)
技术分享完整记录如何把一个 Astro + Svelte 博客移植成 animal-island-ui 的治愈系海岛风格:决策依据(为什么不引库、不重写)、规范获取方式、七期改造的逐文件实录与精确色值、Tailwind 层序覆盖等关键机制、Nunito 字体接入、验证三件套,附他人可照做的复刻清单与未尽事项
5
导航栏 UI 改造全记录:卡片边框、悬浮胶囊、三段收拢与 PC 收拢态快捷面板(附完整复现指南)
技术分享一次连续迭代的完整复盘——从卡片边框体系、悬浮胶囊导航,到三段结构拆分、下滑收拢动画,再到 PC 收拢态汉堡的控件快捷面板与"行点击原位弹卡"的两处根因修复,追加 PC 搜索控件图标化与收拢动画卡顿的逐帧诊断修复。每个批次改了哪些文件、为什么这么改、踩了哪些坑(CSS 层序、正圆公式、包含块、Vite 缓存、Playwright headless 动画冻结),附 git 重放与手工重做两条复现路径及验收清单
随机文章随机推荐

评论区

Profile Image of the Author
陌殊途左沐
热爱是拯救无趣人生的唯一途径
公告
欢迎来到我的博客!这里是左沐的个人空间,分享我的学习、生活和兴趣爱好。希望你能在这里找到有趣的内容,请不要对我的喜好做出评价哦!请勿使用公网访问本站。
分类
访客信息
加载中...
标签
最新动态
站点统计
文章
32
分类
2
标签
59
总字数
65,948
运行时长
0 天
最后活动
0 天前
总浏览量
-
访客数
-
文章目录