From 08e2a70206ab5a9ebf3c2ed41d8a3d72516d81dd Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Fri, 7 Mar 2025 15:43:58 +0800 Subject: [PATCH] fix: Fix the display exception problem when the database application does not exist (#8094) --- agent/app/dto/backup.go | 2 + agent/app/service/backup_app.go | 16 ++++---- agent/app/service/backup_record.go | 4 +- agent/app/service/backup_runtime.go | 39 +++++++++--------- agent/app/service/backup_website.go | 41 +++++++++---------- agent/app/service/cronjob_backup.go | 2 +- frontend/src/components/log/task/index.vue | 2 - frontend/src/lang/modules/en.ts | 1 - frontend/src/lang/modules/ja.ts | 1 - frontend/src/lang/modules/ko.ts | 1 - frontend/src/lang/modules/ms.ts | 1 - frontend/src/lang/modules/pt-br.ts | 1 - frontend/src/lang/modules/ru.ts | 1 - frontend/src/lang/modules/zh-Hant.ts | 1 - frontend/src/lang/modules/zh.ts | 1 - frontend/src/views/database/mysql/index.vue | 38 ++++++++--------- .../src/views/database/postgresql/index.vue | 38 ++++++++--------- frontend/src/views/database/redis/index.vue | 28 +++++-------- 18 files changed, 95 insertions(+), 123 deletions(-) diff --git a/agent/app/dto/backup.go b/agent/app/dto/backup.go index b8ce3b23f..be95bbe44 100644 --- a/agent/app/dto/backup.go +++ b/agent/app/dto/backup.go @@ -107,6 +107,8 @@ type SearchForSize struct { DetailName string `json:"detailName"` Info string `json:"info"` CronjobID uint `json:"cronjobID"` + OrderBy string `json:"orderBy"` + Order string `json:"order"` } type RecordFileSize struct { ID uint `json:"id"` diff --git a/agent/app/service/backup_app.go b/agent/app/service/backup_app.go index 7ce6023f6..d57c31378 100644 --- a/agent/app/service/backup_app.go +++ b/agent/app/service/backup_app.go @@ -202,6 +202,13 @@ func handleAppRecover(install *model.AppInstall, parentTask *task.Task, recoverF recoverApp := func(t *task.Task) error { fileOp := files.NewFileOp() + if !isRollback { + rollbackFile = path.Join(global.Dir.TmpDir, fmt.Sprintf("app/%s_%s.tar.gz", install.Name, time.Now().Format(constant.DateTimeSlimLayout))) + if err := handleAppBackup(install, nil, path.Dir(rollbackFile), path.Base(rollbackFile), "", "", ""); err != nil { + t.Log(fmt.Sprintf("backup app %s for rollback before recover failed, err: %v", install.Name, err)) + } + } + if err := fileOp.TarGzExtractPro(recoverFile, path.Dir(recoverFile), secret); err != nil { return err } @@ -226,13 +233,6 @@ func handleAppRecover(install *model.AppInstall, parentTask *task.Task, recoverF return errors.New(i18n.GetMsgByKey("AppAttributesNotMatch")) } - if !isRollback { - rollbackFile = path.Join(global.Dir.TmpDir, fmt.Sprintf("app/%s_%s.tar.gz", install.Name, time.Now().Format(constant.DateTimeSlimLayout))) - if err := handleAppBackup(install, nil, path.Dir(rollbackFile), path.Base(rollbackFile), "", "", ""); err != nil { - t.Log(fmt.Sprintf("backup app %s for rollback before recover failed, err: %v", install.Name, err)) - } - } - newEnvFile := "" resources, _ := appInstallResourceRepo.GetBy(appInstallResourceRepo.WithAppInstallId(install.ID)) for _, resource := range resources { @@ -348,7 +348,7 @@ func handleAppRecover(install *model.AppInstall, parentTask *task.Task, recoverF } if !isOk { t.Log(i18n.GetMsgByKey("RecoverFailedStartRollBack")) - if err := handleAppRecover(install, t, rollbackFile, true, secret, ""); err != nil { + if err := handleAppRecover(install, t, rollbackFile, true, "", ""); err != nil { t.LogFailedWithErr(i18n.GetMsgByKey("Rollback"), err) return } diff --git a/agent/app/service/backup_record.go b/agent/app/service/backup_record.go index 1d0bfacdf..5e498fb66 100644 --- a/agent/app/service/backup_record.go +++ b/agent/app/service/backup_record.go @@ -206,7 +206,7 @@ func (u *BackupRecordService) LoadRecordSize(req dto.SearchForSize) ([]dto.Recor var list []backupSizeHelper switch req.Type { case "snapshot": - _, records, err := snapshotRepo.Page(req.Page, req.PageSize, repo.WithByLikeName(req.Info)) + _, records, err := snapshotRepo.Page(req.Page, req.PageSize, repo.WithByLikeName(req.Info), repo.WithOrderRuleBy(req.OrderBy, req.Order)) if err != nil { return nil, err } @@ -214,7 +214,7 @@ func (u *BackupRecordService) LoadRecordSize(req dto.SearchForSize) ([]dto.Recor list = append(list, backupSizeHelper{ID: item.ID, DownloadID: item.DownloadAccountID, FilePath: fmt.Sprintf("system_snapshot/%s.tar.gz", item.Name)}) } case "cronjob": - _, records, err := backupRepo.PageRecord(req.Page, req.PageSize, backupRepo.WithByCronID(req.CronjobID)) + _, records, err := backupRepo.PageRecord(req.Page, req.PageSize, repo.WithOrderBy("created_at desc"), backupRepo.WithByCronID(req.CronjobID)) if err != nil { return nil, err } diff --git a/agent/app/service/backup_runtime.go b/agent/app/service/backup_runtime.go index e60ae4a72..dab7d6749 100644 --- a/agent/app/service/backup_runtime.go +++ b/agent/app/service/backup_runtime.go @@ -46,6 +46,25 @@ func handleRuntimeBackup(runtime *model.Runtime, backupDir, fileName string, exc func handleRuntimeRecover(runtime *model.Runtime, recoverFile string, isRollback bool, secret string) error { isOk := false + if !isRollback { + rollbackFile := path.Join(global.Dir.TmpDir, fmt.Sprintf("runtime/%s_%s.tar.gz", runtime.Name, time.Now().Format(constant.DateTimeSlimLayout))) + if err := handleRuntimeBackup(runtime, path.Dir(rollbackFile), path.Base(rollbackFile), "", secret); err != nil { + return fmt.Errorf("backup runtime %s for rollback before recover failed, err: %v", runtime.Name, err) + } + defer func() { + if !isOk { + global.LOG.Info("recover failed, start to rollback now") + if err := handleRuntimeRecover(runtime, rollbackFile, true, ""); err != nil { + global.LOG.Errorf("rollback runtime %s from %s failed, err: %v", runtime.Name, rollbackFile, err) + return + } + global.LOG.Infof("rollback runtime %s from %s successful", runtime.Name, rollbackFile) + _ = os.RemoveAll(rollbackFile) + } else { + _ = os.RemoveAll(rollbackFile) + } + }() + } fileOp := files.NewFileOp() if err := fileOp.TarGzExtractPro(recoverFile, path.Dir(recoverFile), secret); err != nil { return err @@ -71,26 +90,6 @@ func handleRuntimeRecover(runtime *model.Runtime, recoverFile string, isRollback return errors.New("the current backup file does not match the application") } - if !isRollback { - rollbackFile := path.Join(global.Dir.TmpDir, fmt.Sprintf("runtime/%s_%s.tar.gz", runtime.Name, time.Now().Format(constant.DateTimeSlimLayout))) - if err := handleRuntimeBackup(runtime, path.Dir(rollbackFile), path.Base(rollbackFile), "", secret); err != nil { - return fmt.Errorf("backup runtime %s for rollback before recover failed, err: %v", runtime.Name, err) - } - defer func() { - if !isOk { - global.LOG.Info("recover failed, start to rollback now") - if err := handleRuntimeRecover(runtime, rollbackFile, true, secret); err != nil { - global.LOG.Errorf("rollback runtime %s from %s failed, err: %v", runtime.Name, rollbackFile, err) - return - } - global.LOG.Infof("rollback runtime %s from %s successful", runtime.Name, rollbackFile) - _ = os.RemoveAll(rollbackFile) - } else { - _ = os.RemoveAll(rollbackFile) - } - }() - } - newEnvFile, err := coverEnvJsonToStr(runtime.Env) if err != nil { return err diff --git a/agent/app/service/backup_website.go b/agent/app/service/backup_website.go index 58c4b119f..da38de27b 100644 --- a/agent/app/service/backup_website.go +++ b/agent/app/service/backup_website.go @@ -78,6 +78,26 @@ func handleWebsiteRecover(website *model.Website, recoverFile string, isRollback return err } recoverTask.AddSubTask(task.GetTaskName(website.PrimaryDomain, task.TaskRecover, task.TaskScopeWebsite), func(t *task.Task) error { + isOk := false + if !isRollback { + rollbackFile := path.Join(global.Dir.TmpDir, fmt.Sprintf("website/%s_%s.tar.gz", website.Alias, time.Now().Format(constant.DateTimeSlimLayout))) + if err := handleWebsiteBackup(website, path.Dir(rollbackFile), path.Base(rollbackFile), "", "", ""); err != nil { + return fmt.Errorf("backup website %s for rollback before recover failed, err: %v", website.Alias, err) + } + defer func() { + if !isOk { + t.LogStart(i18n.GetMsgByKey("Rollback")) + if err := handleWebsiteRecover(website, rollbackFile, true, "", taskID); err != nil { + t.LogFailedWithErr(i18n.GetMsgByKey("Rollback"), err) + return + } + t.LogSuccess(i18n.GetMsgByKey("Rollback")) + _ = os.RemoveAll(rollbackFile) + } else { + _ = os.RemoveAll(rollbackFile) + } + }() + } fileOp := files.NewFileOp() tmpPath := strings.ReplaceAll(recoverFile, ".tar.gz", "") t.Log(i18n.GetWithName("DeCompressFile", recoverFile)) @@ -112,27 +132,6 @@ func handleWebsiteRecover(website *model.Website, recoverFile string, isRollback } } - isOk := false - if !isRollback { - rollbackFile := path.Join(global.Dir.TmpDir, fmt.Sprintf("website/%s_%s.tar.gz", website.Alias, time.Now().Format(constant.DateTimeSlimLayout))) - if err := handleWebsiteBackup(website, path.Dir(rollbackFile), path.Base(rollbackFile), "", "", ""); err != nil { - return fmt.Errorf("backup website %s for rollback before recover failed, err: %v", website.Alias, err) - } - defer func() { - if !isOk { - t.LogStart(i18n.GetMsgByKey("Rollback")) - if err := handleWebsiteRecover(website, rollbackFile, true, "", taskID); err != nil { - t.LogFailedWithErr(i18n.GetMsgByKey("Rollback"), err) - return - } - t.LogSuccess(i18n.GetMsgByKey("Rollback")) - _ = os.RemoveAll(rollbackFile) - } else { - _ = os.RemoveAll(rollbackFile) - } - }() - } - nginxInfo, err := appInstallRepo.LoadBaseInfo(constant.AppOpenresty, "") if err != nil { return err diff --git a/agent/app/service/cronjob_backup.go b/agent/app/service/cronjob_backup.go index 4350eb3e9..619eb4768 100644 --- a/agent/app/service/cronjob_backup.go +++ b/agent/app/service/cronjob_backup.go @@ -154,7 +154,7 @@ func (u *CronjobService) handleDirectory(cronjob model.Cronjob, startTime time.T fileOp := files.NewFileOp() if cronjob.IsDir { - if err := fileOp.TarGzCompressPro(true, cronjob.SourceDir, path.Join(backupDir, fileName), cronjob.ExclusionRules, cronjob.Secret); err != nil { + if err := fileOp.TarGzCompressPro(true, cronjob.SourceDir, path.Join(backupDir, fileName), cronjob.Secret, cronjob.ExclusionRules); err != nil { return err } } else { diff --git a/frontend/src/components/log/task/index.vue b/frontend/src/components/log/task/index.vue index f3c73e2f3..7c901b2d8 100644 --- a/frontend/src/components/log/task/index.vue +++ b/frontend/src/components/log/task/index.vue @@ -54,8 +54,6 @@ const openWithTaskID = (id: string, tail: boolean) => { } open.value = true; bus.emit('refreshTask', true); - - console.log('11111'); }; const openWithResourceID = (taskType: string, taskOperate: string, resourceID: number) => { diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 7caf5a148..20053abaf 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -3126,7 +3126,6 @@ const message = { favicon: 'Website Icon', faviconHelper: 'Website icon (recommended image size: 16px*16px)', reUpload: 'Choose File', - supportType: 'Only JPG, PNG, JPEG, and GIF files are supported.', setDefault: 'Restore Default', setHelper: 'The current settings will be saved. Do you want to continue?', setDefaultHelper: 'All panel settings will be restored to default. Do you want to continue?', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index d4f338848..cf15ca720 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -2935,7 +2935,6 @@ const message = { favicon: 'ウェブサイトアイコン', faviconHelper: 'ウェブサイトアイコン(推奨画像サイズ:16px*16px)', reUpload: 'ファイルを選択', - supportType: 'JPG、PNG、JPEG、GIFファイルのみサポートされています。', setDefault: 'デフォルトに戻す', setHelper: '現在の設定が保存されます。続けますか?', setDefaultHelper: 'すべてのパネル設定がデフォルトに戻されます。続けますか?', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 561d41246..f60721d82 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -2890,7 +2890,6 @@ const message = { favicon: '웹사이트 아이콘', faviconHelper: '웹사이트 아이콘 (권장 이미지 크기: 16px*16px)', reUpload: '파일 선택', - supportType: 'JPG, PNG, JPEG, 및 GIF 파일만 지원됩니다.', setDefault: '기본값 복원', setHelper: '현재 설정이 저장됩니다. 계속하시겠습니까?', setDefaultHelper: '모든 패널 설정이 기본값으로 복원됩니다. 계속하시겠습니까?', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index e9103f96a..7dd4c67ba 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -3005,7 +3005,6 @@ const message = { favicon: 'Ikon Laman Web', faviconHelper: 'Ikon laman web (saiz imej yang disarankan: 16px*16px)', reUpload: 'Pilih Fail', - supportType: 'Hanya fail JPG, PNG, JPEG, dan GIF yang disokong.', setDefault: 'Pulihkan Tetapan Asal', setHelper: 'Tetapan semasa akan disimpan. Adakah anda ingin meneruskan?', setDefaultHelper: 'Semua tetapan panel akan dikembalikan ke asal. Adakah anda ingin meneruskan?', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 66fa73c60..71d36707a 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -3008,7 +3008,6 @@ const message = { favicon: 'Ícone do Site', faviconHelper: 'Ícone do site (tamanho recomendado da imagem: 16px*16px)', reUpload: 'Selecionar Arquivo', - supportType: 'Apenas arquivos JPG, PNG, JPEG e GIF são suportados.', setDefault: 'Restaurar Padrão', setHelper: 'As configurações atuais serão salvas. Deseja continuar?', setDefaultHelper: 'Todas as configurações do painel serão restauradas para o padrão. Deseja continuar?', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 81a3128eb..763730904 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -2998,7 +2998,6 @@ const message = { favicon: 'Иконка Сайта', faviconHelper: 'Иконка сайта (рекомендуемый размер изображения: 16px*16px)', reUpload: 'Выбрать Файл', - supportType: 'Поддерживаются только файлы JPG, PNG, JPEG и GIF.', setDefault: 'Восстановить По Умолчанию', setHelper: 'Текущие настройки будут сохранены. Вы хотите продолжить?', setDefaultHelper: 'Все настройки панели будут восстановлены по умолчанию. Вы хотите продолжить?', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index a7c5c7ec9..9802d3b3c 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -2897,7 +2897,6 @@ const message = { favicon: '網站圖標', faviconHelper: '網站圖標 (建議圖片大小為: 16px*16px)', reUpload: '選擇文件', - supportType: '只能上傳 jpg/png/jpeg/gif 文件!', setDefault: '復原預設', setHelper: '即將儲存目前介面設定內容,是否繼續?', setDefaultHelper: '即將復原所有界面設定到初始狀態,是否繼續?', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index be4d1e665..0ff3465e9 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -2880,7 +2880,6 @@ const message = { favicon: '网站图标', faviconHelper: '网站图标 (建议图片大小为: 16px*16px)', reUpload: '选择文件', - supportType: '只能上传 jpg/png/jpeg/gif 文件!', setHelper: '即将保存当前界面设置内容,是否继续?', setDefaultHelper: '即将恢复所有界面设置到初始状态,是否继续?', }, diff --git a/frontend/src/views/database/mysql/index.vue b/frontend/src/views/database/mysql/index.vue index 8d72ded78..3aa28af0c 100644 --- a/frontend/src/views/database/mysql/index.vue +++ b/frontend/src/views/database/mysql/index.vue @@ -101,8 +101,9 @@ - -