控制台 退出登录

告别坚果云:自有服务器搭 Obsidian 多设备同步

注:本文使用AI辅助写作


一、方案定位与收益

1.1 解决什么问题

商业网盘(坚果云、Dropbox 等)作为 Obsidian 的同步后端时,常见约束包括:订阅费用随容量线性增长、大文件或特定类型附件被限速或拒绝、服务端可审阅或限制内容、停止订阅即失去同步能力。对于已持有云服务器(例如本就用于托管个人博客)的用户,将同步后端迁移到自有服务器,可以把闲置算力转化为同步服务,同时收回数据主权。

1.2 核心价值

维度

说明

多设备一致

笔记与附件在 Windows / macOS / iOS / Android 间保持一致,编辑后手动触发同步即可对齐

成本可控

若服务器已存在,同步服务几乎不增加额外月度费用(仅占用部分存储与带宽)

数据自主

全部文件存于自有服务器,无第三方审阅、限制或留存

文件类型无限制

WebDAV 不按类型限速或拒收,压缩包、数据集、工程源文件均可同步(受服务器带宽约束,见第六节)

技能可迁移

涉及 Docker、反向代理、HTTPS 等通用基础设施概念,部署经验可复用于其他自托管场景

1.3 适用边界

本方案为手动/半自动同步,每次同步需用户点击触发(Remotely Save 支持增量比对,非实时监听)。若核心诉求是多人在多设备上实时协作编辑同一文档,应考虑基于 CouchDB 的 Obsidian LiveSync 方案。选型的取舍见第三节。


二、核心组件与数据流

部署前先明确各组件职责,无需记忆定义,只需理解"谁负责什么":

组件

职责

Obsidian

本地笔记客户端,文件以纯文本(Markdown)与附件形式存于本地仓库

WebDAV 服务

运行在服务器上的文件存储后端,对外提供标准 WebDAV 协议访问

Remotely Save

Obsidian 插件,按增量比对将本地变更上传至远端、并将远端变更拉回本地

反向代理

统一对外暴露一个域名与 443 端口,将请求转发至内部 WebDAV 服务

DNS

将人类可读域名解析为服务器公网 IP

SSL 证书

为客户端与服务器之间的传输提供加密(HTTPS)

数据流向:本地编辑完成 → Remotely Save 打包增量 → 经 HTTPS 送达反向代理 → 转发至 WebDAV 服务落盘;反向即拉取同步。


三、方案选型说明

候选方案

机制

取舍

Remotely Save → WebDAV(本文采用)

插件经 WebDAV 协议与自有存储同步,手动触发

部署简单、资源占用低、支持任意 WebDAV 后端;非实时,需手动触发

Obsidian LiveSync(CouchDB)

基于 CouchDB 的 P2P 实时双向同步

近实时、适合协作;需部署并维护 CouchDB,资源占用与复杂度更高

本文假定用户接受"手动点击同步"的交互方式,因此选择更轻量的 WebDAV 方案。若后续需要实时协作,可在此基础上追加 CouchDB,二者不冲突。


四、部署前准备

  • 一台云服务器(轻量应用服务器即可,本文假定其已可对外提供 Web 服务)

  • 一个已完成 ICP 备案的域名(中国大陆服务器对外提供 80/443 服务的前提。备案期间运营商会封禁公网 80/443 端口,需先完成备案再对外暴露;备案未通过前可仅做服务端调试,通过 SSH 本地端口隧道在本地私密访问)

  • 服务器已安装管理面板(如 1Panel、宝塔等),或具备命令行操作能力

  • 本地已安装 Obsidian

  • 预计耗时:部署约 30–60 分钟,首次全量同步另计(见第六节)


五、部署步骤

步骤 1:配置 DNS 解析

目标:使子域名(如 dav.yourdomain.com)指向服务器公网 IP。

  1. 登录域名服务商控制台(腾讯云 DNSPod、阿里云、Cloudflare 等)。

  2. 进入「DNS 解析 / 解析设置」→「添加记录」。

  3. 填写:

    • 记录类型:A

    • 主机记录:dav(可自定义,如 syncnote

    • 线路类型:默认

    • 记录值:服务器公网 IP

    • TTL:默认(如 600 秒)

  4. 保存。

验证:等待数分钟(最长约半小时)后,执行 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 为例(宝塔等操作类似):

  1. 进入「网站」→ 创建「反向代理」。

  2. 域名填:dav.yourdomain.com

  3. 上游地址:127.0.0.1,端口:8081

  4. 启用 HTTPS / SSL,证书类型选 Let's Encrypt,验证方式选 DNS 验证(按面板提示填入 DNS 服务商 API 授权,面板会自动完成域名所有权校验并签发,证书通常 90 天自动续期)。

  5. 保存,并确认开启「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 客户端

  1. Obsidian → 设置 → 第三方社区插件 → 关闭安全模式 → 浏览 → 搜索 Remotely Save → 安装并启用。

  2. Remotely Save 设置项:

    • 远程服务类型:WebDAV

    • 地址:https://dav.yourdomain.com

    • 用户名:obsidian

    • 密码:步骤 2 所设

  3. 点击「测试连接 / 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 201204 即上传通路正常。


六、带宽与耗时参考

全量同步耗时主要由服务器上行带宽决定。以 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 reload
    

    openresty -t 输出 syntax is ok / test is successful 表明配置无误;openresty -s reload 热重载不中断连接。或在面板网站界面点击「保存 / 重载」,效果等价。

坑 3:连接测试报 401 Unauthorized

  • 现象:Obsidian 连接测试返回 401。

  • 根因:多为服务端密码未真正生效,如 docker-compose.ymlPASSWORD 仍保留占位符未替换,或环境变量改动后未重启容器。

  • 解法:确认 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 私密验证,不触发公网端口。


八、远端文件的可视化管理

商业网盘的「可见、可翻、可下」体验,自建方案可通过以下方式获得:

方式

能力

适用场景

浏览器访问 https://dav.yourdomain.com

登录后逐层浏览目录、预览或下载单文件(WebDAV 的 GET 索引页)

零成本,偶发抽查备份完整性

Mountain Duck

挂载为本地磁盘,文件管理器显示同步状态角标

追求最接近商业网盘体验(付费,Win/Mac)

RaiDrive

挂载为本地磁盘(Windows),免费但无状态角标

Windows 用户

rclone mount

挂载为磁盘,全平台,可设为开机自启服务

偏好命令行、追求稳定

架构原则: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 解析出服务器 IP

  • curl http://127.0.0.1:8081/ 返回 Index of /

  • 浏览器 HTTPS 访问显示锁标与文件列表

  • Obsidian 连接测试成功

  • 大文件 curl 上传返回 201/204(或首推无 413)

  • du -sh 远端容量最终稳定且与本地仓库接近

本文采用 CC BY-NC-SA 4.0 协议发布

相关文章

eVTOL 电机转速推力建模:从拟合公式到推力响应

eVTOL 电机转速推力建模:从拟合公式到推力响应

再玩一次AI simulink:如何设计提示词让simulink模型美观规范

再玩一次AI simulink:如何设计提示词让simulink模型美观规范

一次实测:AI搭建simulink控制模型

一次实测:AI搭建simulink控制模型

一句话让 AI 写 Simulink:Simulink Agentic Toolkit 落地笔记

一句话让 AI 写 Simulink:Simulink Agentic Toolkit 落地笔记