03 / 13
安装部署
GHCR 镜像、发行版二进制、源码构建与部署拓扑;compose 仅用于开发
运行形态
SupaCove 是单个 Go 二进制(内嵌前端)。运行期外部依赖只有两项;age 以 Go 库内置:
| 依赖 | 用途 | 版本要求 |
|---|---|---|
| PostgreSQL 客户端工具 | pg_dump / pg_restore | 14–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,并确保:
- 前端位于 HTTPS 反代之后(会话 cookie 带
Secure;纯 HTTP 下无法登录是 有意的 fail-closed 行为,除非显式SB_INSECURE_COOKIE=1,仅限本地)。 - 数据卷独立备份(它是主密钥所在地)。
升级
本页的安装命令是全新安装示例(因此使用
supacove-data卷)。从改名前的supabackup部署升级不能直接照抄这些命令:需先停止所有旧进程(server 与 CLI),并保留原来的supabackup-data卷 / systemd 数据目录——数据文件 会在新版本首次启动时自动迁移。完整须知见仓库 docs/deployment.md 的「从 supabackup 升级到 SupaCove」小节。
二进制自升级:停止 → 替换二进制/镜像 → 启动。启动时会自动迁移 SQLite schema,
并在迁移前按版本保留快照(pre-migrate snapshot)。停机撞上正在运行的备份时,该任务记为 interrupted 而非失败;满足续传条件(interrupted + 本地已提交 + 已记录远端意图 + 工件与 manifest
可读 + 目的地可用)的密文会在启动后续传。
最后更新