跳到正文
SupaCove文档

03 / 13

安装部署

GHCR 镜像、发行版二进制、源码构建与部署拓扑;compose 仅用于开发

运行形态

SupaCove 是单个 Go 二进制(内嵌前端)。运行期外部依赖只有两项;age 以 Go 库内置:

依赖用途版本要求
PostgreSQL 客户端工具pg_dump / pg_restore14–18(镜像内置;二进制部署装本机)
age(算法库)加解密服务内置 Go 库 filippo.io/age,不需要 age CLI
S3 兼容对象存储远端提交(可选但推荐)S3 / R2 / B2 / MinIO

预构建制品(推荐)

两种官方发行渠道,每个 v* 标签在完整 CI 门禁通过后同时发布:

GHCR 容器镜像(linux/amd64 + linux/arm64,标签 <版本号> 与 latest):

docker run -d -p 8080:8080 -v supacove-data:/app/data \
  ghcr.io/web-casa/supacove:latest

镜像自带 PostgreSQL 客户端矩阵 14–18,宿主机无需安装 pg_dump;以非 root(UID 10001)运行。生产 compose 示例与环境变量表见仓库 docs/deployment.md。

Release 独立二进制(linux/darwin × amd64/arm64,tar.gz + SHA256SUMS): Web 控制台与 SQLite 控制面全部内嵌,无需 Docker;唯一外部依赖是本机 pg_dump(macOS 上 brew install postgresql@17 并把 keg-only 的 bin 目录 加入 PATH,Debian/Ubuntu 装 postgresql-client-17;客户端 major 需 ≥ 源库 major)。systemd 示例与升级步骤同样见 docs/deployment.md 的「二进制发行版」。

本地构建镜像(可选)

docker build --target runtime -t supacove:<tag> .

发布用的 runtime 就是 Dockerfile 的默认(最后)stage;ADR-004 的实验 镜像(含内嵌 PostgreSQL 服务端)在单独的 Dockerfile.spike 里,不会发布。

源码构建

# 需要 Node 22(控制台前端);Go 最终生效版本须 1.26.9+(与 go.mod 一致;
# 本地工具链更旧且允许自动下载时 GOTOOLCHAIN 会拉取满足版本,否则编译失败)
make build     # = frontend + backend:先构建控制台并嵌入,再产出 bin/supacove

单独 make backend 只编译 Go:未经 make frontend 嵌入控制台时,实例会对 页面请求返回 503。源码部署必须走 make build。

目录与权限

  • SB_DATA_DIR(默认 ./data,镜像内为 /app/data):主密钥、元数据库、暂存区。 期望 0700。UID 10001 仅容器镜像成立;源码/systemd 部署由运行用户决定, 请让该用户独占数据目录。
  • 主密钥文件 0600、拒绝符号链接;age 私钥不放在数据目录。

docker compose:仅开发

仓库自带的 compose.yaml 内置 SB_INSECURE_COOKIE=1 与固定开发口令, 并拉起开发用 PostgreSQL/MinIO——只用于本地试用。生产请自建 compose 或 systemd,并确保:

  1. 前端位于 HTTPS 反代之后(会话 cookie 带 Secure;纯 HTTP 下无法登录是 有意的 fail-closed 行为,除非显式 SB_INSECURE_COOKIE=1,仅限本地)。
  2. 数据卷独立备份(它是主密钥所在地)。

升级

本页的安装命令是全新安装示例(因此使用 supacove-data 卷)。从改名前的 supabackup 部署升级不能直接照抄这些命令:需先停止所有旧进程(server 与 CLI),并保留原来的 supabackup-data 卷 / systemd 数据目录——数据文件 会在新版本首次启动时自动迁移。完整须知见仓库 docs/deployment.md 的「从 supabackup 升级到 SupaCove」小节。

二进制自升级:停止 → 替换二进制/镜像 → 启动。启动时会自动迁移 SQLite schema, 并在迁移前按版本保留快照(pre-migrate snapshot)。停机撞上正在运行的备份时,该任务记为 interrupted 而非失败;满足续传条件(interrupted + 本地已提交 + 已记录远端意图 + 工件与 manifest 可读 + 目的地可用)的密文会在启动后续传。

最后更新

本页目录