SilverBullet 双实例部署说明

SilverBullet 双实例部署说明

当前是“私人 SilverBullet 写作 + 公开静态阅读”的架构:私人实例保留完整编辑器;公开域名不再加载 SilverBullet SPA,而是直接发布同步生成的静态 HTML。

架构

- 私人写作 公开阅读
域名 https://silver.hsfp.cn https://note.hsfp.cn / https://hsfp.cn / https://www.hsfp.cn
容器 silverbullet silverbullet-public(保留用于回滚,公开域名已不代理到它)
端口 172.17.0.1:3010 172.17.0.1:3011
认证 需要密码 不需要
浏览器载荷 完整 SilverBullet 编辑器 单个静态 HTML,无 JavaScript
数据 /root/.openclaw/workspace/memory /data/silverbullet-public/space → 渲染到 _site

发布 / 下架

在私人笔记顶部加入:

---
public: true
---

cron 每 5 分钟执行:

/data/docker-compose/silverbullet/sync-public.sh

也可以手动执行立即生效。脚本流程:

  1. 扫描私人 memory/ 中 frontmatter 含 public: true 的 Markdown。
  2. 复制到 /data/silverbullet-public/space/
  3. 删除已取消公开的 Markdown。
  4. 执行 /data/docker-compose/silverbullet/render-public.py
  5. 生成无 JavaScript 的静态站点到 /data/silverbullet-public/space/_site/

下架时删除 public: true 或改为 false,下一轮同步会同时删除公开 Markdown 和对应 HTML。

静态渲染器

/data/docker-compose/silverbullet/render-public.py 做的事:

  • 去掉 frontmatter;
  • 转换 [wikilink](/wikilink)[显示名](/%E9%A1%B5%E9%9D%A2)
  • 渲染标题、列表、表格、代码块、任务列表等常见 Markdown;
  • 海上飞棚.md 复制为首页 index.html
  • 生成统一的 404.html
  • 输出内联 CSS,不加载任何脚本。

2026-08-19 验证:公开页 HTML 约 5–28 KB;旧 SilverBullet client.js 约 895 KB,现在公开域名下直接 404。

Nginx

公开静态配置共用:

include /data/nginx/custom/silverbullet_public_static.conf;

实际文件:

  • note 域名:/root/docker-compose/nginx-proxy-manager/data/nginx/proxy_host/104.conf
  • apex/www 域名:/root/docker-compose/nginx-proxy-manager/data/nginx/custom/http.conf
  • 共用静态配置:/root/docker-compose/nginx-proxy-manager/data/nginx/custom/silverbullet_public_static.conf

公开域名现在的行为:

  • / → 静态首页;
  • /页面名 → 对应静态 HTML;
  • 未公开页面 → 404;
  • /.client/*/.fs*/.config/.ping 等 SilverBullet API → 404;
  • 响应带 Content-Security-Policy: script-src 'none'

私人站 silver.hsfp.cn 仍走原来的 SilverBullet 代理和登录,不受静态化影响。

常用维护

# 立即同步并重新渲染
/data/docker-compose/silverbullet/sync-public.sh

# 查看同步/渲染日志
tail -f /var/log/sb-public-sync.log

# 查看生成的静态页
find /data/silverbullet-public/space/_site -maxdepth 1 -type f

# 检查并重载 Nginx
docker exec nginx-proxy-manager-app-1 nginx -t
docker exec nginx-proxy-manager-app-1 nginx -s reload

域名验证 txt 文件(2026-09-04)

需要给 hsfp.cn/www.hsfp.cn 放域名归属验证文件(如 <32位hex>.txt)时,直接把文件放到 /data/silverbullet-public/space/ 根目录即可,不要放 _site/(每 5 分钟被 rmtree 重建):

  • render-public.py 会在每次渲染后把 space 根目录的 *.txt 拷进 _site
  • http.conf 的 80 端口 server 块为 ^/[0-9a-f]{32}\.txt$ 加了直出 location(不 301 跳 HTTPS,验证方不跟随跳转也能过),443 由 _site 静态目录直接命中;
  • 改完跑 sync-public.sh + nginx -s reload 即时生效;删除验证文件时删 space 根目录那份即可。

首个实例:f6a548644705ce800cf7147669da91ab.txt549a3d2b8c1ef91122834fb909afdcf052c16f53

回滚

本次切换前的备份后缀为 20260819-175005

  • /data/docker-compose/silverbullet/sync-public.sh.bak-static-20260819-175005
  • /root/docker-compose/nginx-proxy-manager/data/nginx/proxy_host/104.conf.bak-static-20260819-175005
  • /root/docker-compose/nginx-proxy-manager/data/nginx/custom/http.conf.bak-static-20260819-175005
  • /root/docker-compose/nginx-proxy-manager/data/nginx/custom/server_proxy.conf.bak-static-20260819-175005

恢复对应文件后执行 nginx -tnginx -s reload 即可回到公开只读 SilverBullet SPA。

已知限制

  • 仍不同步图片和附件。
  • SilverBullet 的 Space Lua、Live Query、动态组件不会在静态页执行。
  • [📎 transclusion](/transclusion) 目前只转成链接,不会嵌入目标页面全文。
  • Mermaid / Excalidraw 等需要前端运行时的内容不会渲染成交互图。