diff --git a/agent/app/dto/snapshot.go b/agent/app/dto/snapshot.go index 29d8642e3..fd19b1126 100644 --- a/agent/app/dto/snapshot.go +++ b/agent/app/dto/snapshot.go @@ -23,6 +23,7 @@ type SnapshotCreate struct { BackupData []DataTree `json:"backupData"` PanelData []DataTree `json:"panelData"` + WithDockerConf bool `json:"withDockerConf"` WithMonitorData bool `json:"withMonitorData"` WithLoginLog bool `json:"withLoginLog"` WithOperationLog bool `json:"withOperationLog"` @@ -37,6 +38,7 @@ type SnapshotData struct { BackupData []DataTree `json:"backupData"` PanelData []DataTree `json:"panelData"` + WithDockerConf bool `json:"withDockerConf"` WithMonitorData bool `json:"withMonitorData"` WithLoginLog bool `json:"withLoginLog"` WithOperationLog bool `json:"withOperationLog"` diff --git a/agent/app/model/snapshot.go b/agent/app/model/snapshot.go index afb4610e7..8a4801c9c 100644 --- a/agent/app/model/snapshot.go +++ b/agent/app/model/snapshot.go @@ -15,9 +15,11 @@ type Snapshot struct { TaskRecoverID string `json:"taskRecoverID"` TaskRollbackID string `json:"taskRollbackID"` - AppData string `json:"appData"` - PanelData string `json:"panelData"` - BackupData string `json:"backupData"` + AppData string `json:"appData"` + PanelData string `json:"panelData"` + BackupData string `json:"backupData"` + + WithDockerConf bool `json:"withDockerConf"` WithMonitorData bool `json:"withMonitorData"` WithLoginLog bool `json:"withLoginLog"` WithOperationLog bool `json:"withOperationLog"` diff --git a/agent/app/service/snapshot.go b/agent/app/service/snapshot.go index e94b33676..486a82a76 100644 --- a/agent/app/service/snapshot.go +++ b/agent/app/service/snapshot.go @@ -110,6 +110,7 @@ func (u *SnapshotService) LoadSnapshotData() (dto.SnapshotData, error) { if err != nil { return data, err } + data.WithDockerConf = true data.PanelData, err = loadPanelFile(fileOp) if err != nil { return data, err diff --git a/agent/app/service/snapshot_create.go b/agent/app/service/snapshot_create.go index bb47e3712..565e7c2b2 100644 --- a/agent/app/service/snapshot_create.go +++ b/agent/app/service/snapshot_create.go @@ -51,6 +51,7 @@ func (u *SnapshotService) SnapshotCreate(parentTask *task.Task, req dto.Snapshot AppData: string(appItem), PanelData: string(panelItem), BackupData: string(backupItem), + WithDockerConf: req.WithDockerConf, WithMonitorData: req.WithMonitorData, WithLoginLog: req.WithLoginLog, WithOperationLog: req.WithOperationLog, @@ -148,7 +149,7 @@ func handleSnapshot(req dto.SnapshotCreate, taskItem *task.Task, jobID, retry, t if len(req.InterruptStep) == 0 || req.InterruptStep == "SnapBaseInfo" { taskItem.AddSubTaskWithAliasAndOps( "SnapBaseInfo", - func(t *task.Task) error { return snapBaseData(itemHelper, baseDir) }, + func(t *task.Task) error { return snapBaseData(itemHelper, baseDir, req.WithDockerConf) }, nil, int(retry), time.Duration(timeout)*time.Second, ) req.InterruptStep = "" @@ -287,7 +288,7 @@ func loadDbConn(snap *snapHelper, targetDir string, req dto.SnapshotCreate) erro return nil } -func snapBaseData(snap snapHelper, targetDir string) error { +func snapBaseData(snap snapHelper, targetDir string, withDockerConf bool) error { snap.Task.Log("---------------------- 2 / 8 ----------------------") snap.Task.LogStart(i18n.GetMsgByKey("SnapBaseInfo")) @@ -324,11 +325,13 @@ func snapBaseData(snap snapHelper, targetDir string) error { return err } - if snap.FileOp.Stat(constant.DaemonJsonPath) { - err = snap.FileOp.CopyFile(constant.DaemonJsonPath, targetDir) - snap.Task.LogWithStatus(i18n.GetWithName("SnapCopy", constant.DaemonJsonPath), err) - if err != nil { - return err + if withDockerConf { + if snap.FileOp.Stat(constant.DaemonJsonPath) { + err = snap.FileOp.CopyFile(constant.DaemonJsonPath, targetDir) + snap.Task.LogWithStatus(i18n.GetWithName("SnapCopy", constant.DaemonJsonPath), err) + if err != nil { + return err + } } } diff --git a/agent/app/service/snapshot_recover.go b/agent/app/service/snapshot_recover.go index 7d94d765f..61b0f0a20 100644 --- a/agent/app/service/snapshot_recover.go +++ b/agent/app/service/snapshot_recover.go @@ -392,14 +392,10 @@ func recoverBaseData(src string, itemHelper *snapRecoverHelper) error { return err } - daemonJsonPath := constant.DaemonJsonPath - _, errSrc := os.Stat(path.Join(src, "daemon.json")) - _, errPath := os.Stat(daemonJsonPath) - if os.IsNotExist(errSrc) && os.IsNotExist(errPath) { + if !itemHelper.FileOp.Stat(path.Join(src, "daemon.json")) { itemHelper.Task.Log(i18n.GetMsgByKey("RecoverDaemonJsonEmpty")) return nil - } - if errSrc == nil { + } else { err = itemHelper.FileOp.CopyFile(path.Join(src, "daemon.json"), "/etc/docker") itemHelper.Task.Log(i18n.GetMsgByKey("RecoverDaemonJson")) if err != nil { diff --git a/agent/app/service/snapshot_rollback.go b/agent/app/service/snapshot_rollback.go index c5472d6de..a58b1dfa2 100644 --- a/agent/app/service/snapshot_rollback.go +++ b/agent/app/service/snapshot_rollback.go @@ -78,7 +78,10 @@ func (u *SnapshotService) SnapshotRollback(req dto.SnapshotRecover) error { taskItem.AddSubTask( i18n.GetWithName("SnapCopy", constant.DaemonJsonPath), func(t *task.Task) error { - return FileOp.CopyFile(path.Join(baseDir, "daemon.json"), "/etc/docker") + if FileOp.Stat(path.Join(baseDir, "daemon.json")) { + return FileOp.CopyFile(path.Join(baseDir, "daemon.json"), "/etc/docker") + } + return nil }, nil, ) diff --git a/agent/init/migration/migrations/init.go b/agent/init/migration/migrations/init.go index d38ce61c7..4e980199c 100644 --- a/agent/init/migration/migrations/init.go +++ b/agent/init/migration/migrations/init.go @@ -337,7 +337,7 @@ var UpdatePHPRuntime = &gormigrate.Migration{ }, } var AddSnapshotIgnore = &gormigrate.Migration{ - ID: "20250627-add-snapshot-ignore", + ID: "20250628-add-snapshot-ignore", Migrate: func(tx *gorm.DB) error { return tx.AutoMigrate( &model.Snapshot{}, diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 5c758a2bf..f04b19b43 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1828,6 +1828,7 @@ const message = { systemLog: 'Retain System Log', taskLog: 'Retain Task Log', monitorData: 'Retain Monitoring Data', + dockerConf: 'Retain Docker Configuration', selectAllImage: 'Backup All Application Images', logLabel: 'Log', agentLabel: 'Node Configuration', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 3b229dbd0..e8dd78691 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -1749,6 +1749,7 @@ const message = { systemLog: 'システムログを保持', taskLog: 'タスクログを保持', monitorData: '監視データを保持', + dockerConf: 'Docker設定保持', selectAllImage: 'すべてのアプリイメージをバックアップ', logLabel: 'ログ', agentLabel: 'ノード設定', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 4ea60dc7a..094861c84 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -1722,6 +1722,7 @@ const message = { systemLog: '시스템 로그 유지', taskLog: '작업 로그 유지', monitorData: '모니터링 데이터 유지', + dockerConf: 'Docker 설정', selectAllImage: '모든 앱 이미지를 백업', logLabel: '로그', agentLabel: '노드 설정', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index a1baa9dcf..ce842c49a 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -1805,6 +1805,7 @@ const message = { systemLog: 'Simpan log sistem', taskLog: 'Simpan log tugas', monitorData: 'Simpan data pemantauan', + dockerConf: 'Simpan Konfigurasi Docker', selectAllImage: 'Simpan semua imej aplikasi', logLabel: 'Log', agentLabel: 'Konfigurasi Nod', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 8130b1247..74e611292 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -1790,6 +1790,7 @@ const message = { systemLog: 'Manter logs do sistema', taskLog: 'Manter logs de tarefas', monitorData: 'Manter dados de monitoramento', + dockerConf: 'Manter Configuração do Docker', selectAllImage: 'Fazer backup de todas as imagens de aplicativos', logLabel: 'Log', agentLabel: 'Configuração do Nó', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 66b7ed7a1..10dfd3de6 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -1787,6 +1787,7 @@ const message = { systemLog: 'Сохранять системный журнал', taskLog: 'Сохранять журнал задач', monitorData: 'Сохранять данные мониторинга', + dockerConf: 'Сохранять Конфигурация Docker', selectAllImage: 'Резервное копирование всех образов приложений', logLabel: 'Журнал', agentLabel: 'Конфигурация узла', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 2b43fa468..199d1a729 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -1638,6 +1638,7 @@ const message = { systemLog: '保留系統日誌', taskLog: '保留任務日誌', monitorData: '保留監控數據', + dockerConf: '保留 Docker 配置', selectAllImage: '備份所有應用鏡像', logLabel: '日誌', agentLabel: '節點配置', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index f1bbe8db5..2f969e351 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1629,6 +1629,7 @@ const message = { stepBackupData: '备份数据', stepOtherData: '其他数据', monitorData: '监控数据', + dockerConf: 'Docker 配置', selectAllImage: '备份所有应用镜像', logLabel: '日志', agentLabel: '节点配置', diff --git a/frontend/src/views/cronjob/cronjob/record/index.vue b/frontend/src/views/cronjob/cronjob/record/index.vue index e9e37101e..357d240ed 100644 --- a/frontend/src/views/cronjob/cronjob/record/index.vue +++ b/frontend/src/views/cronjob/cronjob/record/index.vue @@ -134,11 +134,13 @@ {{ $t('commons.table.interval') }} - - {{ currentRecord?.interval }} ms - - - {{ currentRecord?.interval! / 1000 }} s + + + {{ currentRecord?.interval }} ms + + + {{ currentRecord?.interval! / 1000 }} s + diff --git a/frontend/src/views/setting/snapshot/create/index.vue b/frontend/src/views/setting/snapshot/create/index.vue index e01641ed8..1c46a0fe6 100644 --- a/frontend/src/views/setting/snapshot/create/index.vue +++ b/frontend/src/views/setting/snapshot/create/index.vue @@ -126,6 +126,9 @@ +
+ +
@@ -195,6 +198,7 @@ const form = reactive({ secret: '', backupAllImage: false, + withDockerConf: true, withLoginLog: false, withOperationLog: false, withSystemLog: false,