220 lines
6.0 KiB
Markdown
220 lines
6.0 KiB
Markdown
# Silverbullet 部署指南
|
||
|
||
> 2026-08-05 记录。目标:在远程 Linux 服务器上用 Docker 部署自托管笔记服务,实现"随时随地在任意设备用浏览器查看编辑笔记"。
|
||
|
||
---
|
||
|
||
## 背景与选型
|
||
|
||
**需求**:远程服务器部署,随时随地任意设备查看、编辑笔记。
|
||
|
||
**选型结论**:Silverbullet(浏览器直接编辑 + Linux/Docker)。
|
||
|
||
### 为什么选 Silverbullet
|
||
|
||
- 任何设备浏览器打开网址即可**查看 + 编辑**,无需安装 App
|
||
- 支持 `[[]]` 双链、反向链接(**与 Obsidian 语法兼容**,现有笔记可直接用)
|
||
- 笔记是纯 Markdown 文件,存在服务器目录,备份 = 复制文件夹
|
||
- PWA 支持,手机浏览器可离线编辑
|
||
- Docker 一条命令部署,开源
|
||
|
||
### 备选:code-server(VS Code Web)
|
||
|
||
如果更想要完整 VS Code 体验,用 codercom/code-server。缺点:移动端体验差、无双链支持。**先用 Silverbullet,不够再补。**
|
||
|
||
---
|
||
|
||
## 一、服务器部署
|
||
|
||
### 创建 docker-compose.yml
|
||
|
||
```yaml
|
||
services:
|
||
silverbullet:
|
||
image: ghcr.io/silverbulletmd/silverbullet:latest
|
||
container_name: silverbullet
|
||
restart: unless-stopped
|
||
ports:
|
||
- "3000:3000"
|
||
volumes:
|
||
- ./space:/space # 笔记存储目录,备份就是复制这个文件夹
|
||
environment:
|
||
- SB_USER=admin:改成你的强密码 # 登录认证,必填!
|
||
```
|
||
|
||
### 启动
|
||
|
||
```bash
|
||
docker compose up -d
|
||
```
|
||
|
||
访问 `http://服务器IP:3000` → 输入 admin/密码 → 完成。
|
||
|
||
### 常用环境变量
|
||
|
||
| 变量 | 说明 | 默认 |
|
||
|---|---|---|
|
||
| `SB_FOLDER` | Markdown 文件目录 | `/space` |
|
||
| `SB_PORT` | 内部端口 | `3000` |
|
||
| `SB_USER` | Basic auth(`user:pass`) | 无认证 |
|
||
| `SB_AUTH_TOKEN` | Bearer token API 访问 | 无 |
|
||
| `SB_READ_ONLY` | 只读模式 | `0` |
|
||
|
||
---
|
||
|
||
## 二、迁移现有笔记
|
||
|
||
本机笔记在 `d:\onedrive\note`(Windows),用 Git Bash 一次性传到服务器:
|
||
|
||
```bash
|
||
# 服务器上先建目录
|
||
ssh user@server "mkdir -p /path/to/space"
|
||
|
||
# rsync 上传(排除 Obsidian 配置目录,Silverbullet 用不上)
|
||
rsync -avP --exclude ".obsidian" "/d/onedrive/note/" user@server:/path/to/space/
|
||
```
|
||
|
||
---
|
||
|
||
## 三、HTTPS + 域名(强烈建议)
|
||
|
||
裸 HTTP 下密码明文传输,不安全。用 Caddy 做反向代理 + 自动 TLS 证书(Let's Encrypt)。
|
||
|
||
### 前提条件
|
||
|
||
- 一个已备案/可用的域名,如 `notes.yourdomain.com`
|
||
- 域名 A 记录已指向服务器公网 IP
|
||
- 服务器 80 和 443 端口未被占用(云服务器需在安全组放行这两个端口)
|
||
|
||
### 整合后的 docker-compose.yml
|
||
|
||
将 Caddy 和 Silverbullet 放在同一个 compose 文件中,让它们共享同一个 Docker 网络,容器间用服务名互相访问:
|
||
|
||
```yaml
|
||
services:
|
||
silverbullet:
|
||
image: ghcr.io/silverbulletmd/silverbullet:latest
|
||
container_name: silverbullet
|
||
restart: unless-stopped
|
||
volumes:
|
||
- ./space:/space
|
||
environment:
|
||
- SB_USER=admin:改成你的强密码
|
||
# 不暴露 ports,只允许 Caddy 通过内部网络访问
|
||
|
||
caddy:
|
||
image: caddy:latest
|
||
container_name: caddy
|
||
restart: unless-stopped
|
||
ports:
|
||
- "80:80"
|
||
- "443:443"
|
||
volumes:
|
||
- ./Caddyfile:/etc/caddy/Caddyfile
|
||
- caddy_data:/data # 证书和密钥持久化,避免重启重新申请
|
||
- caddy_config:/config # Caddy 自身配置
|
||
|
||
volumes:
|
||
caddy_data:
|
||
caddy_config:
|
||
```
|
||
|
||
> **关键**:`caddy_data` 和 `caddy_config` 用 named volume 而非 bind mount,避免权限问题,且证书重启不丢失。
|
||
|
||
### Caddyfile 配置
|
||
|
||
在 `docker-compose.yml` 同级目录创建 `Caddyfile`(纯文本,无后缀):
|
||
|
||
```caddyfile
|
||
# 基础版:自动 HTTPS + 反向代理
|
||
notes.yourdomain.com {
|
||
reverse_proxy silverbullet:3000
|
||
}
|
||
```
|
||
|
||
**常用增强配置**:
|
||
|
||
```caddyfile
|
||
notes.yourdomain.com {
|
||
# 反向代理
|
||
reverse_proxy silverbullet:3000
|
||
|
||
# 访问日志(排查问题时打开)
|
||
log {
|
||
output file /var/log/caddy/access.log
|
||
}
|
||
|
||
# 限制请求体大小(上传大文件时调大)
|
||
request_body {
|
||
max_size 50MB
|
||
}
|
||
|
||
# 安全头(可选)
|
||
header {
|
||
X-Content-Type-Options nosniff
|
||
X-Frame-Options DENY
|
||
-Server
|
||
}
|
||
}
|
||
```
|
||
|
||
### 启动与验证
|
||
|
||
```bash
|
||
# 启动
|
||
docker compose up -d
|
||
|
||
# 查看 Caddy 日志(确认证书申请是否成功)
|
||
docker compose logs caddy -f
|
||
```
|
||
|
||
正常日志中应能看到类似 `certificate obtained successfully` 的输出。然后浏览器访问 `https://notes.yourdomain.com` 即可。
|
||
|
||
### 排错
|
||
|
||
| 问题 | 检查项 |
|
||
|---|---|
|
||
| 证书申请失败 | 确认域名 A 记录已生效(`dig notes.yourdomain.com` 或 `nslookup`),且 80 端口能从公网访问 |
|
||
| 502 Bad Gateway | `docker compose ps` 确认 silverbullet 容器在运行;确认 Caddyfile 中 `reverse_proxy` 的目标容器名与 compose 中 service 名一致 |
|
||
| 端口被占用 | 如果服务器已有 nginx/apache,先停掉再启 Caddy,或让 Caddy 监听其他端口 |
|
||
| 国内服务器 | 80/443 端口需备案;若无备案可用非标端口 + DNS 验证,但 Caddy 默认 HTTP-01 验证仍需 80 端口可达 |
|
||
|
||
> 无域名临时方案:frp / 路由侠等内网穿透工具把 3000 端口暴露出去。
|
||
|
||
---
|
||
|
||
## 四、数据备份
|
||
|
||
笔记是纯 Markdown → 备份 = 压缩目录:
|
||
|
||
```bash
|
||
# 手动备份
|
||
tar czf notes-backup-$(date +%F).tar.gz /path/to/space/
|
||
|
||
# cron 定时备份 + 保留最近 7 份
|
||
0 3 * * * tar czf /backup/notes-$(date +%F).tar.gz /path/to/space/ && ls -t /backup/notes-*.tar.gz | tail -n +8 | xargs rm -f
|
||
```
|
||
|
||
---
|
||
|
||
## 五、使用方式转变(关键)
|
||
|
||
选浏览器编辑 → **服务器目录成为唯一权威版本**,本地 OneDrive 降级为离线备份:
|
||
|
||
| 场景 | 操作 |
|
||
|---|---|
|
||
| 日常编辑 | 浏览器打开 Silverbullet,直接改服务器文件 |
|
||
| 本地离线备份 | `rsync user@server:/path/to/space/ /d/onedrive/note/` |
|
||
| 多设备 | 全部走浏览器,无需装任何东西 |
|
||
|
||
---
|
||
|
||
## 相关链接
|
||
|
||
- [[大模型架构基础]] — 本笔记库的正式学习内容
|
||
- [[AI编译器现状与前景]] — 技术趋势分析
|
||
|
||
---
|
||
|
||
*最后更新:2026-08-05*
|