不是 VNC!Obsidian 网页版来了:Docker 自托管 Ignis 部署教程
TL;DR: Obsidian 官方没有网页版,想在浏览器里用完整 Obsidian 有两个办法: VNC/KasmVNC 远程桌面(重、卡、体验差)或者用 Ignis——一个把 Electron API 在浏览器里重写出来的兼容层,让 Obsidian 原生跑在网页里,vault 留在你自己的服务器上。用 Docker Compose 三分钟能起一个实例,数据全在自己手里,配合 Tailscale 或反向代理,任何设备打开浏览器就能读写笔记。项目 Docker 镜像为 nobbe/ignis,开源免费(AGPL v3)。
我为什么想要一个能远程访问的笔记应用?
先交代一下背景。我对笔记应用有几条硬标准:
- 好看,主题丰富,可扩展,社区够大
- 笔记有私密性,本地优先
- 免费最好(不强求)
- 全平台,尤其要有 Web 端——出门在外,浏览器是最不挑设备的入口
这套标准筛下来,Obsidian 在前三条全部命中,唯独第四条卡住了。Obsidian 是 Electron 应用没有官方 Web 版,官方论坛也直接确认过这一点1。它本质是浏览器渲染 UI + Node.js 跑本地逻辑,插件直接调 Node API 和系统能力2。浏览器沙箱里没有 Node,装不了本地文件、跑不了 child_process,所以 Obsidian 的原生二进制没法直接塞进网页。
Ignis 是怎么在浏览器里跑起 Obsidian 的?
Ignis 并不是 Docker 里装个 Obsidian 桌面版,再用 VNC/KasmVNC 把画面推给浏览器3,而是绕开”在浏览器里跑 Node”这个死结:它写了一个兼容层,把 Obsidian 依赖的 Electron/Node API 逐个在浏览器端重新实现,Obsidian 本体原封不动地在浏览器里跑4。vault 文件留在服务器上,由服务端负责读写和持久化。
项目本身不包含任何 Obsidian 代码,Docker 容器首次启动时从 Obsidian 官方源下载客户端,协议是 AGPL v35。

Ignis 有哪些功能特性?
- 完整的核心体验:编辑器、Canvas、Bases、命令面板、右键菜单、主题、CSS 片段
- 大部分社区插件能跑——依赖 Node 原生模块或
child_process的除外 - 多 vault 管理,每个浏览器标签页可以开不同的 vault
- 多标签页通过 WebSocket 实时同步,编辑 1 秒内互相可见
- 笔记可用
?file=URL 直接打开,工作区可用?workspace=直达 - 同步双方案:网页里登录官方 Obsidian Sync,或者用服务端 Headless Sync(不用开网页也在后台同步)
- 移动端自适应界面
用 Docker 部署 Ignis 需要什么条件?
一台装好 Docker 的机器即可,没有其他硬性要求。建议内存 1 GB 以上,因为要跑 Obsidian 渲染进程。官方要求文档见6。
本地快速起步:如何用 Docker Compose 跑起 Ignis?
先在本机试跑,验证效果再谈公网。找一个空目录,保存 docker-compose.yml:
services: ignis: image: nobbe/ignis:latest ports: - "8080:8080" environment: # 改成你主机的用户 ID(终端运行 id 查看) - PUID=1000 - PGID=1000 volumes: - ./vaults:/vaults - ./data:/app/data - obsidian-app:/app/obsidian-app restart: unless-stopped
volumes: obsidian-app:三个挂载点各管一件事:
| 挂载路径 | 作用 |
|---|---|
./vaults | 所有 vault,一个 vault 一个子文件夹 |
./data | Ignis 状态:服务端插件配置、同步配置 |
obsidian-app | Obsidian 缓存,容器重建时不重复下载 |
然后启动:
docker compose up -d首次启动会从官方源拉取 Obsidian 和 headless CLI,等一两分钟,浏览器打开 http://localhost:8080。如果 vaults 文件夹里已有 vault 会自动加载,否则进入 vault 管理器新建。
若端口冲突启动失败就换端口,改左边数字即可,例如 9000:8080。
这套配置只适合本地试跑——Ignis 没有内置认证,直接暴露公网等于把整个 vault 送给路过的人。
跑起来了,怎么在外面访问?Tailscale 就够了
如果 Ignis 只跑在自家服务器上、访问的都是你自己的设备,Tailscale 是比公网部署轻得多的方案:它是组网工具(mesh VPN),把服务器和你的手机、笔记本拉进同一个虚拟局域网(tailnet),设备之间加密直连7。不需要公网 IP、不需要域名、不用动路由器。
- 服务器和你的设备都安装 Tailscale,登录同一个账号,并启用 MagicDNS,否则无法生成可访问的域名。
- 服务器上运行
tailscale serve --bg 8080,把 Ignis 包装成 HTTPS 站点(首次运行时会自动完成 HTTPS 证书配置,无需额外操作) - 浏览器打开它生成的
https://机器名.你的网络名.ts.net地址
注意一个细节:直接访问 http://服务器虚拟IP:8080 也能通,但纯 HTTP 不是浏览器认可的安全上下文,Obsidian 的加密和剪贴板功能会失效——所以别省掉 tailscale serve 那步,必须拿到 HTTPS 域名。
Tailscale 只对你自己组网内的设备开放。但如果你有幸拥有公网IP,又恰巧财力雄厚拥有了域名,那么请看下一节的 Caddy + basic auth。
公网部署时如何加认证和 HTTPS?推荐 Caddy + basic auth
公网部署必须做两件事:套 HTTPS,加认证。HTTPS 不只是为了保密——浏览器的加密和剪贴板 API 只对安全上下文(HTTPS 或 localhost)开放,纯 HTTP 公网访问会让 Obsidian 的部分功能直接失效8。
推荐组合是 Caddy + basic auth:Caddy 自动申请和续期 Let’s Encrypt 证书,一行配置就带 HTTP 基本认证。对单用户自用来说,这比 Authelia 这类完整身份系统轻得多,少一个要维护的服务,安全性对这个场景已经足够。项目仓库自带这个组合的完整示例9。
完整 docker-compose.yml:
services: caddy: image: caddy:2 ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config networks: - ignis restart: unless-stopped
ignis: image: nobbe/ignis:latest environment: - OBSIDIAN_VERSION=1.12.7 volumes: - ./vaults:/vaults - ./data:/app/data - obsidian-app:/app/obsidian-app networks: - ignis restart: unless-stopped
networks: ignis:
volumes: caddy_data: caddy_config: obsidian-app:和本地试跑版的关键区别:两个容器挂在同一个内网 network 上,Caddy 反向代理到 ignis:8080,外网只暴露 80/443,ignis 不映射任何端口,公网根本碰不到它。
同目录的 Caddyfile:
ignis.example.com { basic_auth { admin $2a$14$REPLACE_THIS_WITH_YOUR_BCRYPT_HASH }
reverse_proxy ignis:8080}把 ignis.example.com 换成你的域名并解析到服务器 IP,Caddy 会自动从 Let’s Encrypt 申请证书。认证密码要先生成 bcrypt hash:
docker run --rm caddy:2 caddy hash-password --plaintext YOUR_PASSWORD把输出填进 Caddyfile 替换占位符即可。
两个建议:
- 设置
WS_ORIGINS=https://你的域名,给 WebSocket 连接加 Origin 白名单校验,防止其他网站偷连你的实例 - 暂时没有域名、想先在本机验证整套组合,
Caddyfile里可以用:443配合自签证书,浏览器点过警告即可用
部署 Ignis 时哪些配置值得调?
PUID / PGID
容器以这两个 ID 写文件,默认 1000。宿主机用户 ID 不是 1000 就改成一致的,否则文件归属不对。NFS 或只读挂载下容器没法自动改归属,需要手动把文件夹 owner 设对。
vault 在 NAS 或其他挂载上
直接把宿主文件夹挂进 /vaults 下:
volumes: - ./vaults:/vaults - /mnt/nas/MyVault:/vaults/MyVaultvaults 里的符号链接只有目标在容器内存在时才会被跟随,挂载路径要保持和宿主机一致。
离线安装
首次运行容器需要联网下载 Obsidian。离线环境可以从 obsidian.md 手动下载 .deb,挂载进去并指定:
volumes: - ./obsidian.deb:/packages/obsidian.deb:ro environment: - OBSIDIAN_PACKAGE=/packages/obsidian.deb性能相关
WRITE_COALESCE_MS:快速写入防抖窗口,默认 0。vault 在 rclone/NFS/SMB 这类慢文件系统上时调高,比如500,能明显减少小文件写放大- 内容缓存默认 50 MB 的 LRU,无论 vault 多大内存都有上限,应用内设置可调
其他常用环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
PORT | 8080 | 服务监听端口 |
OBSIDIAN_VERSION | 1.12.7 | 首次下载的 Obsidian 版本,每个 release 锁定已知可用版本 |
AUTO_CREATE_DEFAULT | false | 没有 vault 时自动创建 “My Vault” |
WS_ORIGINS | 未设置 | WebSocket Origin 白名单,公网部署建议设置 |
完整变量表见官方环境变量文档10。
如何更新 Docker 容器?
两条命令:
docker compose pulldocker compose up -dvault、数据和设置都不会动。唯一要留意的是版本锁定机制:Obsidian 每次更新都可能破坏兼容层,所以 Ignis 每个 release 都会锁定一个自己验证过的 Obsidian 版本11。更新 Ignis 会跟着它切到对应版本;想抢先试新版 Obsidian,可以手动设 OBSIDIAN_VERSION,但官方不保证能正常跑。
它值不值得用?
回到开头那四条标准。Ignis 免费、自托管、数据完全在自己手里,唯一牺牲是部分依赖原生能力的插件用不了——如果你主力插件都是纯 API 的(Dataview、Templater、Excalidraw 这类都能跑),几乎无感。
对我个人来说,它解决的是最实际的场景:Docker 部署 + Tailscale,任何设备打开浏览器就能读、能写、能管理笔记,又能同时满足”私密、免费、好看、全平台”的没几个,Ignis 把 Obsidian 的最后一块拼图补上了。
Footnotes
-
Obsidian 官方论坛确认目前没有官方 Web 接口,https://forum.obsidian.md/t/is-there-a-web-interface-to-obsidian/89752 ↩
-
Obsidian 中文论坛对 Electron/Node API 无法在浏览器运行的技术分析,https://forum-zh.obsidian.md/t/topic/37634 ↩
-
VNC 方案代表:linuxserver/docker-obsidian,基于 KasmVNC 的远程桌面镜像,https://github.com/linuxserver/docker-obsidian ↩
-
Ignis 项目说明:兼容层实现 Electron API 让 Obsidian 在浏览器运行,https://github.com/Nystik-gh/ignis ↩
-
Ignis LICENSE,GNU Affero General Public License v3.0,https://github.com/Nystik-gh/ignis/blob/main/LICENSE ↩
-
Ignis 官方部署文档,https://ignis.thiefling.com/docs/server/deploy/ ↩
-
Tailscale Serve 官方文档:https://tailscale.com/docs/features/tailscale-serve ↩
-
Docker Hub nobbe/ignis 镜像说明:无内置认证、HTTPS 为功能必需,https://hub.docker.com/r/nobbe/ignis ↩
-
Ignis 仓库 Caddy + basic auth 示例,https://github.com/Nystik-gh/ignis/tree/main/apps/ignis-server/examples/caddy-basic-auth ↩
-
Ignis 官方环境变量文档,https://ignis.thiefling.com/docs/server/environment/ ↩
-
Ignis 官方更新文档(版本锁定机制),https://ignis.thiefling.com/docs/server/updating/ ↩
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!