refactor: 移除备份恢复功能(API/CLI/手册)
CI / Backend (go vet + test) (push) Canceled after 0s
CI / Frontend (lint + build + test) (push) Canceled after 0s

日志数据的保留与安全由对象存储 + Loki retention 承担,平台侧整库备份恢复价值有限:
删除 services/backup.go、/system/{backup,restore,restore/apply,backups} 路由与 handler、
CLI backup/restore 子命令、前端 api 方法与类型;自检所需的 dataDirPath/密钥指纹并入 selfcheck;
用户手册删备份章节并修正 FAQ 升级建议;CHANGELOG 记录移除。
This commit is contained in:
opsx committed 2026-10-29 14:48:25 +08:00
1 parent e07fe55c86
commit f87fb4b2b3
11 files changed
+34 -552

No files matched your search

+4 -61
View File
@@ -39,79 +39,22 @@ func fileExists(path string) bool {
// runCLI 提供不依赖 Web 的运维命令(备份 CronJob、恢复、自检都走它)。
//
// lokistack backup --output /app/data/backups/xxx.tar.gz
// lokistack restore <备份包路径> # 校验 + 立即应用(会先备份当前 DB)
// lokistack self-check # 打印 JSON 自检结果
func runCLI(args []string) {
switch args[0] {
case "backup":
out := ""
for i := 1; i < len(args); i++ {
if args[i] == "--output" && i+1 < len(args) {
out = args[i+1]
}
}
if out == "" {
out = "/app/data/backups/lokistack-" + time.Now().Format("20060102-150405") + ".tar.gz"
}
if err := os.MkdirAll(filepath.Dir(out), 0o700); err != nil {
fmt.Fprintf(os.Stderr, "创建备份目录失败: %v\n", err)
os.Exit(1)
}
f, err := os.Create(out)
if err != nil {
fmt.Fprintf(os.Stderr, "创建备份文件失败: %v\n", err)
os.Exit(1)
}
defer f.Close()
m, err := services.CreateBackup(f)
if err != nil {
fmt.Fprintf(os.Stderr, "备份失败: %v\n", err)
os.Exit(1)
}
fmt.Printf("备份完成: %s\n记录数: %d\n密钥指纹: %s\n", out, m.RecordCount, m.KeyFP)
case "restore":
if len(args) < 2 {
fmt.Fprintln(os.Stderr, "用法: lokistack restore <备份包.tar.gz>")
os.Exit(1)
}
f, err := os.Open(args[1])
if err != nil {
fmt.Fprintf(os.Stderr, "打开备份失败: %v\n", err)
os.Exit(1)
}
defer f.Close()
res, err := services.ValidateAndStageBackup(f)
if err != nil {
fmt.Fprintf(os.Stderr, "校验失败: %v\n", err)
os.Exit(1)
}
if res.Warning != "" {
fmt.Fprintf(os.Stderr, "⚠️ %s\n", res.Warning)
}
path, err := services.ApplyStagedBackup()
if err != nil {
fmt.Fprintf(os.Stderr, "应用失败: %v\n", err)
os.Exit(1)
}
fmt.Printf("恢复完成: %s(备份 %d 条记录)\n请重启平台进程使新数据生效。\n", path, res.RowsInBackup)
case "self-check":
b, _ := json.MarshalIndent(services.SelfCheck(), "", " ")
fmt.Println(string(b))
out, _ := json.MarshalIndent(services.SelfCheck(), "", " ")
fmt.Println(string(out))
case "version":
fmt.Printf("%s (commit %s, built %s)\n", version, gitCommit, buildTime)
default:
fmt.Fprintf(os.Stderr, "未知命令 %q。可用: backup / restore / self-check / version\n", args[0])
fmt.Fprintf(os.Stderr, "未知命令 %q。可用: self-check / version\n", args[0])
os.Exit(1)
}
}
func main() {
// 运维命令行:支持在容器/CronJob 里不经 Web 完成备份/恢复/自检
// 运维命令行:容器/CronJob 里不经 Web 完成自检与版本查询
if len(os.Args) > 1 {
runCLI(os.Args[1:])
return