diff --git a/README.md b/README.md index 5bedcad..4ed0eab 100644 --- a/README.md +++ b/README.md @@ -564,6 +564,7 @@ nginx -t && nginx -s reload baihu server # 以前台方式启动面板的后台进程服务(面板启动指令) baihu reposync # 供定时任务调用,将远程 Git 仓库的高级特性同步到本地目录中 baihu resetpwd # 交互式重置系统 admin 账号密码(密码丢失时可通过进入终端重置) +baihu restore # 使用本地的 .zip 备份压缩包文件,一条命令直接全量恢复系统数据 ``` 终端执行 `baihu` 会直接打印内置支持的高级命令帮助列表。 diff --git a/cmd/cmd.go b/cmd/cmd.go index 708cb17..0d4769b 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -3,6 +3,7 @@ package cmd import ( "github.com/engigu/baihu-panel/cmd/reposync" "github.com/engigu/baihu-panel/cmd/resetpwd" + "github.com/engigu/baihu-panel/cmd/restore" ) // CommandHandler 定义命令执行函数 @@ -12,4 +13,5 @@ type CommandHandler func(args []string) var Handlers = map[string]CommandHandler{ "reposync": reposync.Run, "resetpwd": resetpwd.Run, + "restore": restore.Run, } diff --git a/cmd/restore/restore.go b/cmd/restore/restore.go new file mode 100644 index 0000000..5d24319 --- /dev/null +++ b/cmd/restore/restore.go @@ -0,0 +1,45 @@ +package restore + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/engigu/baihu-panel/internal/bootstrap" + "github.com/engigu/baihu-panel/internal/services" +) + +func Run(args []string) { + if len(args) < 1 { + fmt.Println("用法: baihu restore ") + os.Exit(1) + } + + backupFile := args[0] + absPath, err := filepath.Abs(backupFile) + if err != nil { + fmt.Printf("文件路径解析失败: %v\n", err) + os.Exit(1) + } + + if _, err := os.Stat(absPath); os.IsNotExist(err) { + fmt.Printf("错误: 备份文件 '%s' 不存在\n", absPath) + os.Exit(1) + } + + // 必须初始化环境与数据库才能恢复数据 + bootstrap.InitBasic() + + backupService := services.NewBackupService() + fmt.Printf("正在从 '%s' 恢复系统数据,请勿强制中断...\n", absPath) + err = backupService.Restore(absPath) + if err != nil { + fmt.Printf("恢复备份失败: %v\n", err) + os.Exit(1) + } + + fmt.Println("--------------------------------------------------") + fmt.Println("系统备份恢复成功!") + fmt.Println("注意:部分设定可能需要重启后台服务后才能完全生效。") + fmt.Println("--------------------------------------------------") +} diff --git a/internal/constant/commands.go b/internal/constant/commands.go index 0cf6715..7aa9001 100644 --- a/internal/constant/commands.go +++ b/internal/constant/commands.go @@ -20,4 +20,8 @@ var Commands = []CommandInfo{ Name: "resetpwd", Description: "重置 admin 用户密码(需要二次确认)", }, + { + Name: "restore", + Description: "从本地 zip 文件中全量恢复系统级备份数据", + }, }