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
也可以手动执行立即生效。脚本流程:
- 扫描私人
memory/中 frontmatter 含public: true的 Markdown。 - 复制到
/data/silverbullet-public/space/。 - 删除已取消公开的 Markdown。
- 执行
/data/docker-compose/silverbullet/render-public.py。 - 生成无 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.txt → 549a3d2b8c1ef91122834fb909afdcf052c16f53。
回滚
本次切换前的备份后缀为 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 -t 和 nginx -s reload 即可回到公开只读 SilverBullet SPA。
已知限制
- 仍不同步图片和附件。
- SilverBullet 的 Space Lua、Live Query、动态组件不会在静态页执行。
[📎 transclusion](/transclusion)目前只转成链接,不会嵌入目标页面全文。- Mermaid / Excalidraw 等需要前端运行时的内容不会渲染成交互图。