使用 Cloudflare Access 防护 NAS 上的 CouchDB 用于 Obsidian 同步

Notion 用的各方面都挺好的,但画图一直是很大的缺憾。这几天尝试想要使用 excalidraw,Notion 虽然支持了 embed excalidraw,但并不能直接托管 excalidraw 文件:要么需要很 trick 的分享出链接,要么就要买 excalidraw 官方的托管服务。所以就又想到了 obsidian,鼓捣了一波同步后最终还是放弃了。

场景说明

  • 我们并不想使用 obsidian 的同步服务,而是选择在自己的 NAS 上部署 CouchDB 用户 obsidian 的同步。
  • 在 NAS上部署了 CouchDB 后,我们使用 Cloudflare tunnel + Cloudflare Access 来将 CouchDB 暴露到公网,同时做登录验证。
  • 使用 Obsidian 插件 https://github.com/vrtmrz/obsidian-livesync 来实现笔记和 CouchDB 之间的数据同步。livesync 相比 Git 的好处是在移动端也可以很方便的使用。

整体架构

1
2
3
4
5
6
7
8
9
Obsidian 插件
|
|(HTTPS+ CDN)
|
Cloudflare Access(Zero Trust 网关)
|
|(已认证流量)
|
NAS 上的 CouchDB 服务

步骤详解

1. NAS 上部署 CouchDB

  • 按照官方文档或 Docker 方式部署 CouchDB。
  • 设置管理员账号密码,不要用默认的“admin party”模式。
  • 确认本地访问(如 curl、浏览器)正常。

2. 用 Cloudflare Tunnel 公开 CouchDB

  • 在 NAS 上安装 Cloudflare Tunnel 客户端(cloudflared)。
  • 配置一个 Tunnel,把 NAS 的 CouchDB 端口(如 5984)映射到 Cloudflare 的子域名(如 couchdb.yourdomain.com)。
  • 在 Cloudflare Dashboard 上把该子域名接入 Zero Trust。

3. 配置 Cloudflare Access Application

  1. 新建 Application
    • 类型选择 Self-hosted
    • 应用域名填 couchdb.yourdomain.com
  2. 配置 Policy
    • 由于我们需要在插件中进行 Cloudflare Access 认证,因此需要使用 Service Token。这里需要创建一个单独的 Service Token 记下来后面需要配置
    • 配置允许哪些用户/邮箱可以访问。

4. 配置 CORS

重点:Cloudflare Access Application 也要配置 CORS!

  • 在 Cloudflare Zero Trust 控制台,进入该 Application 的设置页。
  • 在“CORS”选项卡里,填写允许的 Origin(如 https://app.obsidian.md 或你的 Obsidian 插件页面的本地地址)。
  • 设置允许的方法(GET/POST/PUT/DELETE)、允许的 Header(如 AuthorizationContent-Type 等)。
  • 勾选允许 Credentials(如果需要带 Cookie)。

这样,Cloudflare Access 在转发请求时会自动加上 CORS 响应头,前端 JS 才能正常访问!

5. 配置 CouchDB 的 CORS

  • CouchDB 也需要配置 CORS,允许来自 Obsidian 插件的请求。

  • 推荐 CouchDB 配置如下:

    1
    2
    3
    4
    5
    6
    [cors]
    origins = app://obsidian.md,capacitor://localhost,http://localhost
    credentials = true
    headers = accept, authorization, content-type, origin, referer, x-csrf-token, x-requested-with, cf-access-client-id, cf-access-client-secret
    methods = GET, PUT, POST, HEAD, DELETE, OPTIONS
    max_age = 3600

安全提示:生产环境建议 origins 填写具体的前端域名,而不是 “*”。

6. 在 Obsidian 插件中配置 CouchDB 访问

  • 打开 Obsidian,安装并启用 CouchDB 相关插件。

  • 填写 CouchDB 的公网地址(如 https://couchdb.yourdomain.com)、用户名、密码。

  • 在插件的 Remote Configuration 部分,找到 Custom Headers,填入我们之前申请的 Cloudflare Service Token。

    image.png

  • 登录后,Obsidian 插件即可正常同步数据。


常见问题与排查

问题1:curl 能访问,插件不能访问,报 CORS 错误

  • 说明 Cloudflare Access Application 或 CouchDB 的 CORS 配置没生效。
  • 检查 Cloudflare Access Application 的 CORS 配置,是否允许了你的前端 Origin 和 Header。
  • 检查 CouchDB 的 CORS 配置,是否允许了前端请求的 Header 和方法。

问题2:插件请求返回 403 或 HTML 页面

  • 说明 Cloudflare Access 拦截了请求。
  • 检查是否已登录 Access,或 Cookie 是否被浏览器/Obsidian 带上。
  • 检查 Access Policy,是否允许你的邮箱/账户访问。

问题3:Service Token 能 curl,但插件无法用

  • 需要确认 Custom Header 是否正确配置了 Service Token 。
  • 可以在打开 obsidian 后,Windows 下摁 Ctrl + Shift + I,MacOS 下摁 Ctrl + Command + I 来开启开发者工具,在 Network 中查看请求是否正确携带了 Header。

为什么我还是选择了 Notion

尽管搞定了 Obsidian 的同步,但我发现使用 Obsidian 要处理的问题还有非常多,比如使用久了以后文件体积会变得非常大。我尝试把 Notion 导出,会发现压缩包都要将近 3 个 G 了。Notion 再大也是按需访问的,访问、同步速度不会随着使用时间增加而增加。但如果使用 Obsidian 就要再每个机器都同步好几个 G 的文件了,太麻烦了。

占体积的文件内容大多数是图片、视频、PDF 等非文本文件,这时候就需要把这些内容自动配置上传到单独的服务中按需访问,这又要鼓捣半天。

最后 Obsidian 虽然 Canvas 以及画图都做得很好,但缺少了 Notion 中的 Database 功能,又需要鼓捣 DataView 等插件,很麻烦。

我的一系列工作流已经融入到 Notion 中的,想要迁移真是个麻烦事。

相关链接