告别坚果云:自有服务器搭 Obsidian 多设备同步
注:本文使用AI辅助写作
一、方案定位与收益
1.1 解决什么问题
商业网盘(坚果云、Dropbox 等)作为 Obsidian 的同步后端时,常见约束包括:订阅费用随容量线性增长、大文件或特定类型附件被限速或拒绝、服务端可审阅或限制内容、停止订阅即失去同步能力。对于已持有云服务器(例如本就用于托管个人博客)的用户,将同步后端迁移到自有服务器,可以把闲置算力转化为同步服务,同时收回数据主权。
1.2 核心价值
1.3 适用边界
本方案为手动/半自动同步,每次同步需用户点击触发(Remotely Save 支持增量比对,非实时监听)。若核心诉求是多人在多设备上实时协作编辑同一文档,应考虑基于 CouchDB 的 Obsidian LiveSync 方案。选型的取舍见第三节。
二、核心组件与数据流
部署前先明确各组件职责,无需记忆定义,只需理解"谁负责什么":
数据流向:本地编辑完成 → Remotely Save 打包增量 → 经 HTTPS 送达反向代理 → 转发至 WebDAV 服务落盘;反向即拉取同步。
三、方案选型说明
本文假定用户接受"手动点击同步"的交互方式,因此选择更轻量的 WebDAV 方案。若后续需要实时协作,可在此基础上追加 CouchDB,二者不冲突。
四、部署前准备
一台云服务器(轻量应用服务器即可,本文假定其已可对外提供 Web 服务)
一个已完成 ICP 备案的域名(中国大陆服务器对外提供 80/443 服务的前提。备案期间运营商会封禁公网 80/443 端口,需先完成备案再对外暴露;备案未通过前可仅做服务端调试,通过 SSH 本地端口隧道在本地私密访问)
服务器已安装管理面板(如 1Panel、宝塔等),或具备命令行操作能力
本地已安装 Obsidian
预计耗时:部署约 30–60 分钟,首次全量同步另计(见第六节)
五、部署步骤
步骤 1:配置 DNS 解析
目标:使子域名(如 dav.yourdomain.com)指向服务器公网 IP。
登录域名服务商控制台(腾讯云 DNSPod、阿里云、Cloudflare 等)。
进入「DNS 解析 / 解析设置」→「添加记录」。
填写:
记录类型:
A主机记录:
dav(可自定义,如sync、note)线路类型:默认
记录值:服务器公网 IP
TTL:默认(如 600 秒)
保存。
验证:等待数分钟(最长约半小时)后,执行 ping dav.yourdomain.com,能解析出服务器 IP 即配置生效。若服务器位于中国大陆且未完成 ICP 备案,即便解析正确,公网 80/443 仍会被封锁,需先完成备案。
步骤 2:部署 WebDAV 容器
使用 Docker Compose 部署 derkades/webdav 镜像。在服务器新建目录(如 /opt/webdav/;若使用 1Panel,可置于其应用目录下统一管理),创建 docker-compose.yml:
services:
webdav:
image: derkades/webdav
container_name: obsidian-webdav
restart: unless-stopped
environment:
USERNAME: obsidian
PASSWORD: 你的强密码
ports:
- "127.0.0.1:8081:80" # 仅监听本机回环地址,不直接暴露公网
volumes:
- ./webdav-data:/data # 数据持久化到宿主机目录
deploy:
resources:
limits:
memory: 128M # 内存上限,适配轻量服务器
关键配置说明:
image:使用社区维护的derkades/webdav镜像,开箱即用。PASSWORD:请使用密码管理器生成的强密码,且不与其它服务复用。127.0.0.1:8081:80:服务仅绑定宿主机回环地址,外部无法直接访问,由反向代理统一对外。./webdav-data:/data:将容器内/data映射到宿主机目录,容器重建不丢数据。memory: 128M:限制内存占用,降低对轻量服务器的影响。
启动:
cd /opt/webdav
docker compose up -d
验证:curl http://127.0.0.1:8081/ 返回含 Index of / 的 HTML,表明服务已就绪。derkades/webdav 对 GET 请求返回目录索引页,这也是后续浏览器可视化的基础。
步骤 3:配置反向代理与 SSL
当前 WebDAV 仅服务器内部可访问,需经面板对外暴露并启用 HTTPS。以 1Panel 为例(宝塔等操作类似):
进入「网站」→ 创建「反向代理」。
域名填:
dav.yourdomain.com。上游地址:
127.0.0.1,端口:8081。启用 HTTPS / SSL,证书类型选 Let's Encrypt,验证方式选 DNS 验证(按面板提示填入 DNS 服务商 API 授权,面板会自动完成域名所有权校验并签发,证书通常 90 天自动续期)。
保存,并确认开启「HTTP 自动跳转 HTTPS」。
验证:浏览器访问 https://dav.yourdomain.com,出现文件列表页且地址栏显示 HTTPS 锁标,即部署完成。
配置文件位置与结构(排错必读):面板会自动在 OpenResty 配置目录下生成站点文件(如
/usr/local/openresty/nginx/conf/conf.d/dav.yourdomain.com.conf),其内部通过include /www/sites/dav.yourdomain.com/proxy/*.conf;引入由面板生成的location /与proxy_pass。反向代理的转发规则已由这段 include 自动写好,切勿再手动追加location /块——这是下一节「坑 1」中duplicate location /报错的直接来源。
命令差异:本文服务器 Web 组件基于 OpenResty,配置语法与 Nginx 一致,但二进制命令名为
openresty而非nginx(详见坑 2)。
步骤 4:配置 Obsidian 客户端
Obsidian → 设置 → 第三方社区插件 → 关闭安全模式 → 浏览 → 搜索 Remotely Save → 安装并启用。
Remotely Save 设置项:
远程服务类型:WebDAV
地址:
https://dav.yourdomain.com用户名:
obsidian密码:步骤 2 所设
点击「测试连接 / Check connection」。
验证:提示连接成功,无错误。
步骤 5:首次全量同步与进度观察
在 Obsidian 命令面板或插件面板执行 Sync(或 Sync all)。首次同步将本地仓库全量上传至服务器,耗时取决于仓库体积与服务器带宽(见第六节)。
服务端进度观察:在服务器执行以下命令,观察远端目录容量增长:
du -sh /opt/webdav/webdav-data/
连续多次数值不变、随后跃升,多为单个大文件(数百 MB 级)正在流式上传、尚未落盘,属正常现象(详见第六节)。可配合 watch 周期性刷新:
watch -n 30 'du -sh /opt/webdav/webdav-data/'
大文件上传预检(可选):若担心代理层限制,可先在服务器造一个测试大文件,经 curl 验证上传通路:
dd if=/dev/zero of=/tmp/test_large.bin bs=1M count=100
curl -u obsidian:你的密码 --upload-file /tmp/test_large.bin \
https://dav.yourdomain.com/test_large.bin -w "HTTP %{http_code}\n"
# 验证后清理,避免污染知识库目录
curl -u obsidian:你的密码 -X DELETE https://dav.yourdomain.com/test_large.bin
返回 HTTP 201 或 204 即上传通路正常。
六、带宽与耗时参考
全量同步耗时主要由服务器上行带宽决定。以 6 Mbps 带宽(理论上行约 0.75 MB/s)为例,9 GB 仓库理论耗时约 3.5–5 小时(含协议开销与小文件握手损耗,实际偏长)。同步过程中 du -sh 观察到的远端目录容量可能出现短暂平台期,多为单个大文件正在流式上传、尚未落盘所致,属正常现象,非卡死。建议每 10–15 分钟查看一次进度,待容量稳定且 Obsidian 报告同步完成即可。
七、常见故障排查
坑 1:大文件上传失败,报 413 Request Entity Too Large
现象:同步至大附件(压缩包、数据集等)时失败,日志出现
413。根因:反向代理默认请求体大小限制(约 1 MB)小于待上传文件。
解法:在站点 OpenResty/Nginx 配置的
server { }层级(所有location之外)添加:client_max_body_size 500m;该配置层级示意:
server { listen 80; listen 443 ssl; server_name dav.yourdomain.com; client_max_body_size 500m; # ← 放在 server 层级,location 之外 # ... ssl 配置、http→https 跳转 ... include /www/sites/dav.yourdomain.com/proxy/*.conf; # 转发规则在此自动生成 }随后重载配置(命令见坑 2)。
注意:不要手动新增
location / { ... proxy_pass ... }块。面板的include已包含由它生成的location /,手动再写一段会导致nginx: [emerg] duplicate location "/"。仅新增上述单行、保留原include即可。
坑 2:执行 nginx -t 报 Command not found
现象:配置校验时报
Command 'nginx' not found,并提示可apt install nginx-core。根因:服务器 Web 组件为 OpenResty,未安装独立
nginx二进制,直接调用nginx自然找不到。解法:使用 OpenResty 命令:
openresty -t && openresty -s reloadopenresty -t输出syntax is ok/test is successful表明配置无误;openresty -s reload热重载不中断连接。或在面板网站界面点击「保存 / 重载」,效果等价。
坑 3:连接测试报 401 Unauthorized
现象:Obsidian 连接测试返回 401。
根因:多为服务端密码未真正生效,如
docker-compose.yml中PASSWORD仍保留占位符未替换,或环境变量改动后未重启容器。解法:确认
PASSWORD为真实密码后,执行docker compose up -d重启容器使环境变量生效,再测。也可用curl -u obsidian:你的密码 https://dav.yourdomain.com/在服务器端直接验证认证是否通过。
坑 4:备案期间公网无法访问 80/443
现象:配置与容器均正常,但公网访问超时。
根因:中国大陆服务器在域名未完成 ICP 备案前,运营商封锁公网 80/443 端口。
解法:先完成备案再对外暴露;备案期间仅做服务端调试时,可通过 SSH 本地端口隧道将远端端口映射到本地(如
ssh -L 8081:127.0.0.1:8081 user@server),在本地浏览器访问http://127.0.0.1:8081私密验证,不触发公网端口。
八、远端文件的可视化管理
商业网盘的「可见、可翻、可下」体验,自建方案可通过以下方式获得:
架构原则:Obsidian 仓库始终存于本地,由 Remotely Save 负责同步;挂载磁盘仅用于查看与管理远端文件,不应将 Obsidian 仓库直接指向挂载盘——网络波动将导致仓库卡顿、断网不可编辑,且存在写入中断损坏风险。同一文件避免同时经 Obsidian 与挂载盘修改,以防两端内容分歧。
九、安全建议
使用独立强密码,不与其它服务复用。
配置文件与截图勿暴露明文密码、服务器 IP 等敏感信息。曾有案例因截图泄露 WebDAV 凭证导致未授权访问,应引以为戒;若密码曾出现在截图或命令行历史中,同步跑通后应立即更换(改
PASSWORD环境变量 →docker compose up -d重启 → Obsidian 侧更新密码)。在公共或共享设备上访问远端时,不勾选「记住密码」。
同步通道不等同于备份。重要知识库应另存离线副本(如移动硬盘),防范误删与服务器故障。
十、总结
完成上述步骤后,你已具备:自有域名绑定(DNS)、私有存储后端(WebDAV 容器)、加密对外通道(反向代理 + SSL)、Obsidian 客户端接入(Remotely Save),以及四类常见故障的排查能力。该方案最适合"已持有服务器、接受手动触发同步、希望收回数据主权"的个人用户。
若未来需要实时协作,可在本架构上追加 CouchDB 与 LiveSync,二者互不排斥。首次全量同步受带宽限制可能耗时数小时,容量平台期多为大文件上传中,属正常表现,耐心等待即可。
部署验证清单:
ping dav.yourdomain.com解析出服务器 IPcurl http://127.0.0.1:8081/返回Index of /浏览器 HTTPS 访问显示锁标与文件列表
Obsidian 连接测试成功
大文件 curl 上传返回 201/204(或首推无 413)
du -sh远端容量最终稳定且与本地仓库接近