不是 VNC!Obsidian 网页版来了:Docker 自托管 Ignis 部署教程

2404 字
12 分钟
不是 VNC!Obsidian 网页版来了:Docker 自托管 Ignis 部署教程

TL;DR: Obsidian 官方没有网页版,想在浏览器里用完整 Obsidian 有两个办法: VNC/KasmVNC 远程桌面(重、卡、体验差)或者用 Ignis——一个把 Electron API 在浏览器里重写出来的兼容层,让 Obsidian 原生跑在网页里,vault 留在你自己的服务器上。用 Docker Compose 三分钟能起一个实例,数据全在自己手里,配合 Tailscale 或反向代理,任何设备打开浏览器就能读写笔记。项目 Docker 镜像为 nobbe/ignis,开源免费(AGPL v3)。

我为什么想要一个能远程访问的笔记应用?#

先交代一下背景。我对笔记应用有几条硬标准:

  1. 好看,主题丰富,可扩展,社区够大
  2. 笔记有私密性,本地优先
  3. 免费最好(不强求)
  4. 全平台,尤其要有 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

Obsidian-Ignis-screenshot
Obsidian-Ignis-screenshot

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 一个子文件夹
./dataIgnis 状态:服务端插件配置、同步配置
obsidian-appObsidian 缓存,容器重建时不重复下载

然后启动:

Terminal window
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、不需要域名、不用动路由器。

  1. 服务器和你的设备都安装 Tailscale,登录同一个账号,并启用 ‌MagicDNS‌,否则无法生成可访问的域名。
  2. 服务器上运行 tailscale serve --bg 8080,把 Ignis 包装成 HTTPS 站点(首次运行时会自动完成 HTTPS 证书配置,无需额外操作)
  3. 浏览器打开它生成的 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:

Terminal window
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/MyVault

vaults 里的符号链接只有目标在容器内存在时才会被跟随,挂载路径要保持和宿主机一致。

离线安装#

首次运行容器需要联网下载 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 多大内存都有上限,应用内设置可调

其他常用环境变量#

变量默认值说明
PORT8080服务监听端口
OBSIDIAN_VERSION1.12.7首次下载的 Obsidian 版本,每个 release 锁定已知可用版本
AUTO_CREATE_DEFAULTfalse没有 vault 时自动创建 “My Vault”
WS_ORIGINS未设置WebSocket Origin 白名单,公网部署建议设置

完整变量表见官方环境变量文档10

如何更新 Docker 容器?#

两条命令:

Terminal window
docker compose pull
docker compose up -d

vault、数据和设置都不会动。唯一要留意的是版本锁定机制:Obsidian 每次更新都可能破坏兼容层,所以 Ignis 每个 release 都会锁定一个自己验证过的 Obsidian 版本11。更新 Ignis 会跟着它切到对应版本;想抢先试新版 Obsidian,可以手动设 OBSIDIAN_VERSION,但官方不保证能正常跑。

它值不值得用?#

回到开头那四条标准。Ignis 免费、自托管、数据完全在自己手里,唯一牺牲是部分依赖原生能力的插件用不了——如果你主力插件都是纯 API 的(Dataview、Templater、Excalidraw 这类都能跑),几乎无感。

对我个人来说,它解决的是最实际的场景:Docker 部署 + Tailscale,任何设备打开浏览器就能读、能写、能管理笔记,又能同时满足”私密、免费、好看、全平台”的没几个,Ignis 把 Obsidian 的最后一块拼图补上了。


Footnotes#

  1. Obsidian 官方论坛确认目前没有官方 Web 接口,https://forum.obsidian.md/t/is-there-a-web-interface-to-obsidian/89752

  2. Obsidian 中文论坛对 Electron/Node API 无法在浏览器运行的技术分析,https://forum-zh.obsidian.md/t/topic/37634

  3. VNC 方案代表:linuxserver/docker-obsidian,基于 KasmVNC 的远程桌面镜像,https://github.com/linuxserver/docker-obsidian

  4. Ignis 项目说明:兼容层实现 Electron API 让 Obsidian 在浏览器运行,https://github.com/Nystik-gh/ignis

  5. Ignis LICENSE,GNU Affero General Public License v3.0,https://github.com/Nystik-gh/ignis/blob/main/LICENSE

  6. Ignis 官方部署文档,https://ignis.thiefling.com/docs/server/deploy/

  7. Tailscale Serve 官方文档:https://tailscale.com/docs/features/tailscale-serve

  8. Docker Hub nobbe/ignis 镜像说明:无内置认证、HTTPS 为功能必需,https://hub.docker.com/r/nobbe/ignis

  9. Ignis 仓库 Caddy + basic auth 示例,https://github.com/Nystik-gh/ignis/tree/main/apps/ignis-server/examples/caddy-basic-auth

  10. Ignis 官方环境变量文档,https://ignis.thiefling.com/docs/server/environment/

  11. Ignis 官方更新文档(版本锁定机制),https://ignis.thiefling.com/docs/server/updating/

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
不是 VNC!Obsidian 网页版来了:Docker 自托管 Ignis 部署教程
https://blog.moewah.com/posts/ignis-obsidian-docker-deploy/
作者
MoeWah
发布于
2026-08-07
许可协议
CC BY-NC-SA 4.0
相关文章 智能推荐
1
Docker-Compose 自部署 Umami 网站分析工具
私有化部署 如何快速部署 Umami 网站分析工具?本文详解 Docker Compose 自部署全流程,包含环境检查、YML 文件配置及数据库设置,10 分钟完成零配置部署。适合开发者和运维人员,轻松实现网站流量数据的私有化分析,避免 Google Analytics 隐私问题。
2
Docker-compose 自部署个人代码托管服务:Gitea 极简搭建指南
私有化部署 如何用Docker-compose快速搭建个人代码托管平台?本文详解Gitea的极简部署方案,解决私有化代码管理、避免GitHub依赖问题,提供从环境配置到服务启动的完整实战指南。
3
Docker Volume 与 Bind Mount 怎么选?区别、性能对比、双向迁移实战
虚拟化与运维 Docker Volume 和 Bind Mount 有什么区别?性能差距大吗?一文讲透数据卷与绑定挂载的管理边界、适用场景与迁移便捷性,附双向转换完整命令:卷迁宿主机目录、目录转数据卷,全部实测可抄。数据库用卷、开发热重载用绑定挂载,自部署选型不再纠结。
4
Docker-Compose 自部署 MinIO S3 对象存储服务
私有化部署 如何用Docker Compose快速部署MinIO S3对象存储?本文详细拆解环境准备、配置文件编写及启动验证全流程,手把手指导你搭建私有化数据存储平台。支持Lobe-Chat、思源笔记等应用的S3兼容数据同步,确保高效安全的数据管理。
5
Gitea Webhook 自动部署:零依赖实现 Astro 博客多端同步发布
私有化部署 如何在多个地方(家里、公司)推送代码后实现博客自动构建?本文分享基于 Gitea Webhook 的零依赖解决方案,重点解决 Astro 博客多端同步发布的痛点,助你实现代码一推,博客自动更新的理想工作流。
随机文章 随机推荐

评论区

Profile Image of the Author

关于作者

MoeWah

我是 MoeWah,喵斯基部落的作者。一个折腾自托管、群晖 NAS、虚拟化运维与 SEO/GEO 实践的独立博主,10 年以上的企业站运维与SEO优化经验,文章来自真实部署与踩坑记录。为自己记录,为同路人分享。
专题
分类
站点统计
文章
205
分类
9
标签
449
总字数
413,413
运行时长
0
最后活动
0 天前

目录