用 Docker 搭建 SilverBullet Markdown 笔记库
从 Markdown 运维笔记入手部署 SilverBullet,固定镜像,完成多空间账号配置,并检查匿名权限和完整数据恢复。
文章目录
运维笔记通常混着几类东西:服务器入口、故障经过、配置片段和以后要查的命令。只放在聊天记录里,过一阵就找不到;只放在某台电脑上,换设备又要同步。SilverBullet 可以把这些内容放进浏览器里的笔记空间,底层仍保留 Markdown 文件,适合愿意自己维护数据的人。
部署时最需要想清楚的是笔记目录、访问权限,以及 VPS 故障后如何拿回文件。本文使用当前的多空间模式。旧教程中常见的 SB_USER 单空间配置已被官方列为旧模式选项,新安装先用 Dashboard 建立账号和空间。
先把服务留在本机端口
以下步骤适用于已安装 Docker Engine 与 Compose 的 Linux VPS。需要 SSH 登录权限;若要通过域名使用,还要准备 DNS 和 HTTPS 反向代理。先不开放应用端口,完成管理员初始化后再接入域名。
笔记实例的容量要把 Markdown、附件和备份分开计算。已有 Linux VPS 可以先复用,数据目录放在持久磁盘上;需要独立笔记服务器时,可以查看雨云云服务器,优惠码 KuZhuJi。选择支持 SSH 管理、可安装 Docker 的 Linux 实例,再按附件增长留出磁盘空间,备份另存到独立位置。
在 VPS 上建立目录并固定首次拉取的镜像:
mkdir -p ~/apps/silverbullet/data
cd ~/apps/silverbullet
umask 077
docker pull ghcr.io/silverbulletmd/silverbullet:latest
printf 'SILVERBULLET_IMAGE=%s\n' "$(docker image inspect --format '{{index .RepoDigests 0}}' ghcr.io/silverbulletmd/silverbullet:latest)" > .env
检查 .env,其中应当是完整的 仓库@sha256:…。这样重建容器时用的还是这次拉取的镜像。若拉取失败或没有得到摘要,先解决镜像访问问题,不要继续启动。官方还提供不带 Chromium 的 slim 镜像;本文使用默认镜像,不额外启用浏览器自动化功能。
保存为 compose.yml:
services:
silverbullet:
image: ${SILVERBULLET_IMAGE:?请先在.env中固定镜像}
restart: unless-stopped
ports:
- "127.0.0.1:3011:3000"
volumes:
- ./data:/data
/data 是服务器数据根目录,不要把它留在容器内部。当前模式中,这里保存服务器配置以及默认位置的空间;它不能再简单理解为“一个笔记文件夹”。
docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=100 silverbullet
在自己的电脑另开终端,把 user@VPS_IP 换成实际 SSH 账号和地址:
ssh -N -L 3011:127.0.0.1:3011 user@VPS_IP
浏览器打开 http://localhost:3011。空数据目录会进入初始化向导,先建立管理员账号,再建立第一个空间。目录由容器处理权限;遇到写入失败,先核对宿主目录所有者与日志,必要时按官方配置使用 PUID、PGID,不要用递归 chmod 777 解决。
用一份运维记录检验空间是否好用
可以先建“服务器维护”空间,写一页包含日期、变更目的、执行命令和结果的记录,再附一个无敏感信息的小文件。关闭页面重新打开,确认内容仍在;随后检查 VPS 的 data 目录,找到对应空间的 Markdown 与附件。
空间的地址由主机名和路径组成。接入正式域名后,在 Dashboard 中把空间绑定到实际地址,避免浏览器进入错误空间。私人笔记的匿名访问保留为 none,只给需要的人账号权限。
read 和 write 的区别不止能否改文字:官方文档说明,写权限也允许使用空间的相关能力。不要为方便协作给陌生人写权限;公开分享一页资料与开放整个笔记环境是两件需要分别配置的事。
接到 HTTPS 域名后,再检查一次匿名访问
若 Caddy 安装在 VPS 宿主机上,且 notes.example.com 的 DNS 已指向这台服务器,可以添加:
notes.example.com {
reverse_proxy 127.0.0.1:3011
}
替换域名,确认 80、443 端口可用,验证 Caddy 配置后再按当前服务方式重载。如果反向代理本身也在容器里,127.0.0.1 指向代理容器,不能照抄此上游;应把两者放到共同网络,使用服务名与容器端口。
域名打开正常后,用无痕窗口访问私人空间,确认未登录者看不到笔记;再用普通账号验证其实际权限。浏览器缓存、已登录会话都可能掩盖错误的访问设置。
备份整个数据根目录,恢复时先避开生产入口
备份前关闭编辑页面,并短暂停止服务,让文件处于稳定状态:
mkdir -p backups
docker compose stop silverbullet
sudo tar -czf "backups/silverbullet-$(date +%Y%m%d-%H%M%S).tar.gz" data
sudo chmod 600 backups/*.tar.gz
docker compose start silverbullet
另行保存 compose.yml、.env 和代理配置。压缩包包含笔记与账号相关配置,备份目录不要由网站对外提供,并把副本转移到另一台机器或独立存储。
恢复演练可在另一个目录、不同项目名和本机端口进行:解压备份,用原来的镜像摘要启动,检查登录、空间列表、Markdown 和附件。原来设置过的空间域名也会随配置恢复,应核对测试实例的绑定,防止把测试入口与正式地址混在一起。
升级前保留这份完整备份和旧镜像摘要。修改 .env 中的镜像后,先检查版本说明再重建;回退时同时考虑数据格式变化,不能只换回旧镜像就假定笔记环境已经恢复。
安装与目录说明见 官方 Docker 文档,账号、空间和访问级别见 Dashboard 文档。