使用 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 | Obsidian 插件 |
步骤详解
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
- 新建 Application
- 类型选择 Self-hosted。
- 应用域名填
couchdb.yourdomain.com
。
- 配置 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(如
Authorization
、Content-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。
登录后,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 中的,想要迁移真是个麻烦事。