feat(ops): 新增 TamaBox backup 命令,同时备份数据库与 R2 图片
此前没有任何备份手段,而站点的图片全在 Cloudflare R2、数据库只存 key/URL —— 只备份 DB 的话,恢复后 key 指向的图片若已不在 R2(bucket 误删 / 账号丢失 / 图片被清理),页面就全是裂图。 新增 TamaBox backup --output <dir>: - 数据库:pg_dump 全量导出(schema + data,标准恢复格式),密码经 PGPASSWORD 环境变量传递避免出现在 ps 进程参数里 - 图片:从 R2 下载 tamabox 站全部图片,保持原 key 路径,并写 images-manifest.json (key → size → md5)用于恢复后完整性校验 - --db-only / --images-only 分开关 R2 访问方式的坑:storage.GetS3Client 的 endpoint 带 /<bucket> 后缀,对 GetObject/PutObject 恰好可用,但 ListObjectsV2 会把 URL 拼成 /<bucket>/<bucket> 而 404 NoSuchKey。备份脚本独立构造客户端(剥离 endpoint 的 bucket 后缀 + UsePathStyle),List prefix="tamabox/" 后用完整 key 下载 —— 这是 R2 上 List 唯一稳定可用的姿势。 实测:db-only 导出 46KB(21 表全含 schema_migrations);images-only 下载的文件 大小与 R2 List 返回完全一致,路径保持 tamabox/ 结构。
This commit is contained in:
@@ -29,6 +29,7 @@ func main() {
|
||||
cmd.Unrestrict,
|
||||
cmd.HidePublic,
|
||||
cmd.Honeypot,
|
||||
cmd.Backup,
|
||||
}
|
||||
if err := app.Run(os.Args); err != nil {
|
||||
logrus.WithError(err).Fatal("Failed to start application")
|
||||
|
||||
Reference in New Issue
Block a user