refactor: 移除备份恢复功能(API/CLI/手册)
日志数据的保留与安全由对象存储 + 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:
1 parent
e07fe55c86
commit
f87fb4b2b3
11 files changed
+34
-552
No files matched your search
+4
-61
@@ -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
|
||||
|
||||
Reference in new issue
Block a user