rollbook

module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 11, 2026 License: Apache-2.0

README

Rollbook 清册

Rollbook 是面向家庭与小企业的自建服务和资产清册。请只在可信内网运行。

本地运行

需要 Go 1.24 或更新版本。

go test ./...
export ROLLBOOK_AUTH_PEPPER='<在部署环境中设置至少 32 字节的随机值>'
go run ./cmd/rollbook bootstrap-user owner
go run ./cmd/rollbook serve

默认监听 127.0.0.1:8080,数据库写入 ./data/rollbook.db。bootstrap-user 只允许创建首个用户,密码从终端读取。访问 / 可打开清册网页,/healthz 返回 ok。网页登录的会话 Cookie 默认带 Secure,实际访问需要 HTTPS 反向代理。环境变量 ROLLBOOK_LISTEN_ADDR 和 ROLLBOOK_DB_PATH 可修改监听地址与数据库路径。首次启动自动迁移;再次启动不会重复执行已应用的迁移。数据库使用 WAL、外键约束和 FTS5。

REST /api/ 与 Streamable HTTP /mcp 使用 Authorization: Bearer <key>;网页使用用户会话。启动服务或创建首用户须设置至少 32 字节的 ROLLBOOK_AUTH_PEPPER,或使用 ROLLBOOK_AUTH_PEPPER_FILE 指向密钥文件;两者不能同时设置。文件内容按原始字节读取,不裁剪换行。该值应保存在部署环境中,不要提交到仓库。网页可搜索、浏览站点/主机/网段、查看服务和两层拓扑、审核提议,并管理 key。key 生成后只显示一次。MCP 支持 initialize、tools/list、tools/call 的 JSON 响应模式,工具调用与 REST 共用应用服务和权限检查。check_versions 由直接写 key 或网页用户手动触发;服务启动后补查过期项,并每小时扫描一次,确保成功记录不超过 24 小时未检查。

CLI 通过 ROLLBOOK_URL(默认 http://127.0.0.1:8080)和 ROLLBOOK_KEY 连接同一 REST API:

rollbook search Overleaf
rollbook get service:overleaf
rollbook update service:overleaf 1 '{"name":"Overleaf 2"}' '修正名称'

上游版本检查

在服务的 upstream_json 中配置一个上游,并为服务建立版本记录(首次检查也会自动创建空白版本记录):

{"provider":"github_releases","repository":"owner/repo"}
{"provider":"docker_hub","image":"namespace/image"}
{"provider":"endoflife_date","product":"go"}

只使用固定公开 API 域名,标识符不接受 URL。Docker Hub 从最多 100 个标签中选择最高的纯数字版本,忽略 latest 等别名;GitHub 取最新正式 Release;endoflife.date 使用 v1 API 的最新 release。版本比较只接受 v1.2.3 这类数字格式,无法判断的版本显示“待人工确认”。上游错误和最近尝试时间另存,不覆盖上次成功值,也不改当前版本、固定版本理由或清册 rev。网页“有新版本”页提供手动重查;REST 为 POST /api/versions/check,MCP 为 check_versions。GHCR 暂不支持。

Docker Compose 部署

宿主机需要 Docker Engine 和 Compose 插件。默认镜像是 ghcr.io/cosmogao/rollbook:${ROLLBOOK_VERSION};试运行可用 latest,正式部署请在 .env 固定已验证的 vX.Y.Z。在仓库目录运行:

cp .env.example .env
mkdir -p secrets
umask 077
openssl rand -hex 32 | tr -d '\n' > secrets/auth_pepper
docker compose up -d
docker compose ps
curl -fsS http://127.0.0.1:8080/healthz

docker compose ps 的 rollbook 应变为 healthy,健康接口返回 ok。secret-init 一次性读取本地 secrets/auth_pepper,把密钥复制到仅 UID 10001 可读的 rollbook-secret 卷,服务从 /run/secrets/auth_pepper 读取;原文件保持 0600。此文件与 .env 均被 Git 和 Docker 构建忽略。密钥至少 32 字节,必须长期保存,重建容器或升级时继续使用同一文件;换密钥可能使现有凭据失效。请勿在 .env 中另设 ROLLBOOK_AUTH_PEPPER。

创建首个用户,按提示在终端输入至少 12 字符的密码:

docker compose run --rm -it rollbook bootstrap-user owner
# 已运行的服务也可使用:
docker compose exec rollbook rollbook bootstrap-user owner

两条命令二选一。再次执行会报告用户已存在,不会覆盖密码。容器监听 8080,Compose 默认只把宿主机 127.0.0.1:8080 暴露给本机反向代理;在代理上配置 HTTPS 后访问网页。网页会话与 CSRF Cookie 默认带 Secure。若必须在可信内网直接用 HTTP 访问,把 .env 中 ROLLBOOK_BIND_ADDR 设为内网接口地址,并把 ROLLBOOK_ALLOW_INSECURE_HTTP 设为 true 后运行 docker compose up -d。此时页面显示 HTTP 模式提示、日志发出警告,Cookie 不带 Secure。**HTTP 模式下口令和 key 会在网络中明文传输,只能在可信内网使用。**不要把此端口直接暴露到公网。

数据库、WAL 与默认的 rollbook-latest.yaml 均位于 /data,由 Compose 的 rollbook-data 卷持久化。docker compose down && docker compose up -d 不会删除卷;不要使用 down -v。启动后及每 24 小时写一次完整 YAML 备份。需要把 YAML 备份放在独立卷时,在 .env 设 ROLLBOOK_BACKUP_DIR=/backups;Compose 已为 /backups 提供持久卷。自行替换成宿主机绑定目录时,数据库目录与独立备份目录都要持久化,且应由容器内固定的 10001:10001 用户读写,例如:

sudo mkdir -p /srv/rollbook/data /srv/rollbook/backups
sudo chown -R 10001:10001 /srv/rollbook/data /srv/rollbook/backups

然后在 compose.yaml 将相应卷映射改为 /srv/rollbook/data:/data 和 /srv/rollbook/backups:/backups。密钥文件保持仅部署管理员可读;初始化后的密钥卷在服务中只读挂载。独立备份卷仅保存最新一份 YAML,应定期复制到其他安全位置。

升级和回退

升级前,先备份 .env、密钥文件、数据库整个 /data 卷,以及启用独立备份目录时的 /backups 卷。完整 YAML 含密码与 key 的哈希,也要按敏感数据保存。SQLite 使用 WAL;做文件级快照时先 docker compose stop rollbook,把数据库文件及 -wal、-shm 一同复制,再启动。可用宿主机卷快照工具,或停机后用以下命令复制容器数据:

docker compose stop rollbook
mkdir -p snapshot-data snapshot-backups
docker compose cp rollbook:/data/. ./snapshot-data/
docker compose cp rollbook:/backups/. ./snapshot-backups/
docker compose start rollbook

确认备份可读后,编辑 .env 的 ROLLBOOK_VERSION 为新版本(如 v1.2.3),执行 docker compose pull && docker compose up -d,再检查 docker compose ps、/healthz 和登录。启动会自动运行尚未应用的数据库迁移;每个版本只执行一次,已记录的迁移不会在重启时重复执行。不要在同一数据库上同时运行新旧版本。

**数据库迁移可能不可逆。**如果新版本无法使用,先停服务,把 /data 恢复成升级前的完整文件级快照,再把 .env 的版本改回旧版并 docker compose up -d;不能只改镜像 tag 后让旧程序直接读取已迁移的数据库。若只用 YAML 备份恢复,还须确认旧版本支持其 schema_version,且应保留原有用户凭据与密钥。完整卷快照是回退的首选。

GitHub Actions 在 PR 上运行测试、vet 和镜像构建;main 推送发布 main 与 sha-<短提交号>,语义版本 tag 推送发布 vX.Y.Z、X.Y、latest,均含 amd64 和 arm64。发布工作流不部署服务。

备份与恢复

服务启动时及每 24 小时在 ROLLBOOK_BACKUP_DIR 指定目录原子写入 rollbook-latest.yaml(0600);未设置时使用数据库目录。网页的「备份与恢复」可下载清册或完整备份、提交 YAML 并查看预览计数;批准后恢复会清除所有会话,需重新登录。完整备份含密码与 key 的哈希,请按敏感文件管理。

CLI 使用 ROLLBOOK_KEY:rollbook export > catalog.yaml 下载清册;rollbook import catalog.yaml 校验并提交待确认导入,网页用户批准后才会恢复。只读 key 可以导出,提议/直接写 key 可以提交导入,任何 key 都无法下载完整备份或批准恢复。未知 schema_version 和校验不通过的文件会被拒绝,旧数据库保持不变。

Directories

Path Synopsis
cmd
rollbook command
internal
catalog
Package catalog owns catalog persistence and relation validation.
Package catalog owns catalog persistence and relation validation.
db
httpapi
Package httpapi exposes the catalog through a single authenticated operation dispatcher.
Package httpapi exposes the catalog through a single authenticated operation dispatcher.
mcp
Package mcp implements the stateless JSON response mode of Streamable HTTP.
Package mcp implements the stateless JSON response mode of Streamable HTTP.
search
Package search provides FTS and relation-aware catalog browsing.
Package search provides FTS and relation-aware catalog browsing.
versioncheck
Package versioncheck fetches upstream release metadata without changing inventory state.
Package versioncheck fetches upstream release metadata without changing inventory state.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL