feat: Optimize node synchronization logic (#9947)

Refs #9691
This commit is contained in:
ssongliu 2025-08-11 18:26:45 +08:00 committed by GitHub
parent f8f47b51e9
commit 4df0c3e461
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 118 additions and 83 deletions

View file

@ -120,11 +120,9 @@ func (u *BackupService) Create(req dto.BackupOperate) error {
if err := backupRepo.Create(&backup); err != nil {
return err
}
go func() {
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
}()
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
return nil
}
@ -179,12 +177,13 @@ func (u *BackupService) Delete(name string) error {
return buserr.New("ErrBackupInUsed")
}
go func() {
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
}()
return backupRepo.Delete(repo.WithByName(name))
if err := backupRepo.Delete(repo.WithByName(name)); err != nil {
return err
}
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
return nil
}
func (u *BackupService) Update(req dto.BackupOperate) error {
@ -241,11 +240,9 @@ func (u *BackupService) Update(req dto.BackupOperate) error {
if err := backupRepo.Save(&newBackup); err != nil {
return err
}
go func() {
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
}()
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
return nil
}
@ -285,11 +282,9 @@ func (u *BackupService) RefreshToken(req dto.OperateByName) error {
if err := backupRepo.Save(&backup); err != nil {
return err
}
go func() {
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
}()
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
return nil
}

View file

@ -118,14 +118,12 @@ func (u *ScriptService) Create(req dto.ScriptOperate) error {
if err := scriptRepo.Create(&itemData); err != nil {
return err
}
go func() {
if req.IsInteractive {
return
}
if err := xpack.Sync(constant.SyncScripts); err != nil {
global.LOG.Errorf("sync scripts to node failed, err: %v", err)
}
}()
if req.IsInteractive {
return nil
}
if err := xpack.Sync(constant.SyncScripts); err != nil {
global.LOG.Errorf("sync scripts to node failed, err: %v", err)
}
return nil
}
@ -139,11 +137,9 @@ func (u *ScriptService) Delete(req dto.OperateByIDs) error {
return err
}
}
go func() {
if err := xpack.Sync(constant.SyncScripts); err != nil {
global.LOG.Errorf("sync scripts to node failed, err: %v", err)
}
}()
if err := xpack.Sync(constant.SyncScripts); err != nil {
global.LOG.Errorf("sync scripts to node failed, err: %v", err)
}
return nil
}
@ -161,11 +157,9 @@ func (u *ScriptService) Update(req dto.ScriptOperate) error {
if err := scriptRepo.Update(req.ID, updateMap); err != nil {
return err
}
go func() {
if err := xpack.Sync(constant.SyncScripts); err != nil {
global.LOG.Errorf("sync scripts to node failed, err: %v", err)
}
}()
if err := xpack.Sync(constant.SyncScripts); err != nil {
global.LOG.Errorf("sync scripts to node failed, err: %v", err)
}
return nil
}
@ -245,11 +239,9 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error {
if err := global.DB.Model(&model.Setting{}).Where("key = ?", "ScriptVersion").Updates(map[string]interface{}{"value": string(versionRes)}).Error; err != nil {
return fmt.Errorf("update script version in db failed, err: %v", err)
}
go func() {
if err := xpack.Sync(constant.SyncScripts); err != nil {
global.LOG.Errorf("sync scripts to node failed, err: %v", err)
}
}()
if err := xpack.Sync(constant.SyncScripts); err != nil {
global.LOG.Errorf("sync scripts to node failed, err: %v", err)
}
return nil
}, nil)

View file

@ -142,11 +142,9 @@ func (u *SettingService) Update(key, value string) error {
case "UserName", "Password":
_ = global.SESSION.Clean()
case "Language":
go func() {
if err := xpack.Sync(constant.SyncLanguage); err != nil {
global.LOG.Errorf("sync language to node failed, err: %v", err)
}
}()
if err := xpack.Sync(constant.SyncLanguage); err != nil {
global.LOG.Errorf("sync language to node failed, err: %v", err)
}
}
return nil
@ -215,15 +213,13 @@ func (u *SettingService) UpdateProxy(req dto.ProxyUpdate) error {
if err := xpack.ProxyDocker(loadDockerProxy(req)); err != nil {
return err
}
go func() {
syncScope := constant.SyncSystemProxy
if req.WithDockerRestart {
syncScope = constant.SyncSystemProxyWithRestartDocker
}
if err := xpack.Sync(syncScope); err != nil {
global.LOG.Errorf("sync proxy to node failed, err: %v", err)
}
}()
syncScope := constant.SyncSystemProxy
if req.WithDockerRestart {
syncScope = constant.SyncSystemProxyWithRestartDocker
}
if err := xpack.Sync(syncScope); err != nil {
global.LOG.Errorf("sync proxy to node failed, err: %v", err)
}
return nil
}

View file

@ -102,13 +102,19 @@ DownloadPackage: "Downloading script library package"
AnalyticCompletion: "Analysis completed, now syncing to database..."
Node: "Node"
SyncNode: "Sync node data"
SyncNode: "Sync data to node {{ .name }}"
LocalName: "'local' name is only used for system local identification"
SyncPackageData: "Package sync data [{{ .detail }}]"
SyncPackageData: "Package sync data"
SyncPackageEncrypt: "Data package encryption"
SyncRequest: "Request node sync API"
SyncFailedRetry: "Node data sync timeout (attempt {{ .index }}), retrying..."
SyncFailed: "Sync failed, please manually sync in the node list!"
SyncSystemProxy: "System Proxy Settings"
SyncScripts: "Script Library"
SyncBackupAccounts: "Backup Accounts"
SyncAlertSetting: "Alert Settings"
SyncCustomApp: "Custom App"
SyncLanguage: "System Language"
#upgrade node
NodeUpgrade: "Upgrade node {{ .name }}"

View file

@ -103,13 +103,19 @@ DownloadPackage: "スクリプトライブラリパッケージをダウンロ
AnalyticCompletion: "解析が完了しました、データベースに同期しています..."
Node: "ノード"
SyncNode: "ノードデータ同期"
SyncNode: "データをノード {{ .name }} に同期"
LocalName: "'local'名称はシステムのローカル識別のみに使用されます"
SyncPackageData: "同期データのパッケージ化 [{{ .detail }}]"
SyncPackageData: "同期データのパッケージ化"
SyncPackageEncrypt: "データパッケージの暗号化"
SyncRequest: "ード同期APIをリクエスト"
SyncFailedRetry: "ノードデータ同期タイムアウト ({{ .index }}回目)、再試行中..."
SyncFailed: "同期に失敗しました、ノードリストで手動同期してください!"
SyncSystemProxy: "システムプロキシ設定"
SyncScripts: "スクリプトライブラリ"
SyncBackupAccounts: "バックアップアカウント"
SyncAlertSetting: "アラート設定"
SyncCustomApp: "カスタムアプリ"
SyncLanguage: "システム言語"
#upgrade node
NodeUpgrade: "{{ .name }} ノードのアップグレード"

View file

@ -102,13 +102,19 @@ DownloadPackage: "스크립트 라이브러리 패키지 다운로드 중"
AnalyticCompletion: "분석 완료, 데이터베이스에 동기화 중..."
Node: "노드"
SyncNode: "노드 데이터 동기화"
SyncNode: "데이터를 노드 {{ .name }}(으)로 동기화"
LocalName: "'local' 이름은 시스템 로컬 식별 전용으로 사용됩니다"
SyncPackageData: "동기화 데이터 패키징 [{{ .detail }}]"
SyncPackageData: "동기화 데이터 패키징"
SyncPackageEncrypt: "데이터 패키지 암호화"
SyncRequest: "노드 동기화 API 요청"
SyncFailedRetry: "노드 데이터 동기화 시간 초과 ({{ .index }}번째 시도), 재시도 중..."
SyncFailed: "동기화 실패, 노드 목록에서 수동 동기화를 실행하세요!"
SyncSystemProxy: "시스템 프록시 설정"
SyncScripts: "스크립트 라이브러리"
SyncBackupAccounts: "백업 계정"
SyncAlertSetting: "알림 설정"
SyncCustomApp: "사용자 정의 앱"
SyncLanguage: "시스템 언어"
#upgrade node
NodeUpgrade: "{{ .name }} 노드 업그레이드"

View file

@ -102,13 +102,19 @@ DownloadPackage: "Muat turun pakej pustaka skrip"
AnalyticCompletion: "Analisis selesai, sedang menyegerakkan ke pangkalan data..."
Node: "Nod"
SyncNode: "Segerakkan data nod"
SyncNode: "Selaraskan data ke nod {{ .name }}"
LocalName: "Nama 'local' hanya digunakan untuk pengenalpastian tempatan sistem"
SyncPackageData: "Pakej data segerak [{{ .detail }}]"
SyncPackageData: "Pakej data segerak"
SyncPackageEncrypt: "Enkripsi pakej data"
SyncRequest: "Permintaan API segerak nod"
SyncFailedRetry: "Segerakan data nod tamat masa (percubaan ke-{{ .index }}), mencuba semula..."
SyncFailed: "Segerakan gagal, sila segerakkan secara manual dalam senarai nod!"
SyncSystemProxy: "Tetapan Proksi Sistem"
SyncScripts: "Pustaka Skrip"
SyncBackupAccounts: "Akaun Sandaran"
SyncAlertSetting: "Tetapan Amaran"
SyncCustomApp: "Aplikasi Tersuai"
SyncLanguage: "Bahasa Sistem"
#upgrade node
NodeUpgrade: "Naik taraf node {{ .name }}"

View file

@ -102,13 +102,19 @@ DownloadPackage: "Baixando pacote da biblioteca de scripts"
AnalyticCompletion: "Análise concluída, agora sincronizando com o banco de dados..."
Node: "Nó"
SyncNode: "Sincronizar dados do nó"
SyncNode: "Sincronizar dados para o nó {{ .name }}"
LocalName: "O nome 'local' é usado apenas para identificação local do sistema"
SyncPackageData: "Empacotar dados de sincronização [{{ .detail }}]"
SyncPackageData: "Empacotar dados de sincronização"
SyncPackageEncrypt: "Criptografia de pacote de dados"
SyncRequest: "Solicitar API de sincronização de nó"
SyncFailedRetry: "Tempo esgotado na sincronização de dados do nó (tentativa {{ .index }}), tentando novamente..."
SyncFailed: "Falha na sincronização, por favor sincronize manualmente na lista de nós!"
SyncSystemProxy: "Configurações de Proxy do Sistema"
SyncScripts: "Biblioteca de Scripts"
SyncBackupAccounts: "Contas de Backup"
SyncAlertSetting: "Configurações de Alerta"
SyncCustomApp: "Aplicativo Personalizado"
SyncLanguage: "Idioma do Sistema"
#upgrade node
NodeUpgrade: "Atualizar nó {{ .name }}"

View file

@ -102,13 +102,19 @@ DownloadPackage: "Загрузка архива библиотеки скрип
AnalyticCompletion: "Анализ завершён, начинается синхронизация с базой данных..."
Node: "Узел"
SyncNode: "Синхронизация данных узла"
SyncNode: "Синхронизировать данные с узлом {{ .name }}"
LocalName: "Имя 'local' используется только для локальной идентификации в системе"
SyncPackageData: "Упаковка данных синхронизации [{{ .detail }}]"
SyncPackageData: "Упаковка данных синхронизации"
SyncPackageEncrypt: "Шифрование пакета данных"
SyncRequest: "Запрос API синхронизации узла"
SyncFailedRetry: "Таймаут синхронизации данных узла (попытка {{ .index }}), повторная попытка..."
SyncFailed: "Ошибка синхронизации, выполните ручную синхронизацию в списке узлов!"
SyncSystemProxy: "Настройки системного прокси"
SyncScripts: "Библиотека скриптов"
SyncBackupAccounts: "Резервные аккаунты"
SyncAlertSetting: "Настройки оповещений"
SyncCustomApp: "Пользовательское приложение"
SyncLanguage: "Язык системы"
#upgrade node
NodeUpgrade: "Обновление узла {{ .name }}"

View file

@ -99,14 +99,21 @@ ScriptSyncSkip: "Mevcut betik kütüphanesi zaten en son sürüm!"
DownloadData: "Betik kütüphanesi dosyası data.yaml indiriliyor"
DownloadPackage: "Betik kütüphanesi paketi indiriliyor"
AnalyticCompletion: "Analiz tamamlandı, şimdi veritabanına senkronize ediliyor..."
Node: "Düğüm"
SyncNode: "Düğüm verilerini senkronize et"
SyncNode: "Verileri {{ .name }} düğümüne senkronize et"
LocalName: "'local' adı yalnızca sistem yerel tanımlaması için kullanılır"
SyncPackageData: "Paket senkronizasyon verisi [{{ .detail }}]"
SyncPackageData: "Paket senkronizasyon verisi"
SyncPackageEncrypt: "Veri paketi şifreleme"
SyncRequest: "Düğüm senkronizasyon API'si isteği"
SyncFailedRetry: "Düğüm veri senkronizasyonu zaman aşımı (deneme {{ .index }}), yeniden deneniyor..."
SyncFailed: "Senkronizasyon başarısız, lütfen düğüm listesinde manuel senkronize edin!"
SyncSystemProxy: "Sistem Vekil Sunucu Ayarları"
SyncScripts: "Komut Dosyası Kütüphanesi"
SyncBackupAccounts: "Yedek Hesaplar"
SyncAlertSetting: "Uyarı Ayarları"
SyncCustomApp: "Özel Uygulama"
SyncLanguage: "Sistem Dili"
#upgrade node
NodeUpgrade: "Düğümü yükselt {{ .name }}"

View file

@ -103,13 +103,19 @@ AnalyticCompletion: "解析成功,現在開始同步到資料庫..."
#sync node
Node: "節點"
SyncNode: "同步節點資料"
SyncNode: "同步數據到節點 {{ .name }}"
LocalName: "'local' 名稱僅用於系統本機標識"
SyncPackageData: "打包同步資料 [{{ .detail }}]"
SyncPackageData: "打包同步資料"
SyncPackageEncrypt: "封包加密"
SyncRequest: "請求節點同步介面"
SyncFailedRetry: "第 {{ .index }} 次同步節點資料失敗逾時,正在重試..."
SyncFailed: "同步失敗,請在節點列表中手動同步!"
SyncSystemProxy: "系統代理配置"
SyncScripts: "腳本庫"
SyncBackupAccounts: "備份帳號"
SyncAlertSetting: "告警設置"
SyncCustomApp: "自定義應用"
SyncLanguage: "系統語言"
#upgrade node
NodeUpgrade: "升級節點 {{ .name }}"

View file

@ -103,13 +103,20 @@ AnalyticCompletion: "解析成功,现在开始同步到数据库..."
#sync node
Node: "节点"
SyncNode: "同步节点数据"
SyncNode: "同步数据到节点 {{ .name }}"
LocalName: "local 名称仅用于系统本机标识"
SyncPackageData: "打包同步数据 [{{ .detail }}]"
SyncPackageData: "打包同步数据"
SyncPackageEncrypt: "数据包加密"
SyncRequest: "请求节点同步接口"
SyncFailedRetry: "第 {{ .index }} 次同步节点数据失败超时,正在重试..."
SyncFailed: "同步失败,请在节点列表中手动同步!"
SyncSystemProxy: "系统代理配置"
SyncScripts: "脚本库"
SyncBackupAccounts: "备份账号"
SyncAlertSetting: "告警设置"
SyncCustomApp: "自定义应用"
SyncLanguage: "系统语言"
#upgrade node
NodeUpgrade: "升级节点 {{ .name }}"

View file

@ -56,10 +56,8 @@ func (b *backup) Run() {
varsItem, _ := json.Marshal(varMap)
_ = global.DB.Model(&model.BackupAccount{}).Where("id = ?", backupItem.ID).Updates(map[string]interface{}{"vars": string(varsItem)}).Error
global.LOG.Infof("Refresh %s-%s access_token successful!", backupItem.Type, backupItem.Name)
go func() {
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
}()
if err := xpack.Sync(constant.SyncBackupAccounts); err != nil {
global.LOG.Errorf("sync backup account to node failed, err: %v", err)
}
}
}

View file

@ -703,7 +703,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
.then(() => {
loading.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
emit('search');
drawerVisible.value = false;
})
.catch(() => {
@ -715,7 +714,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
.then(() => {
loading.value = false;
MsgSuccess(i18n.global.t('commons.msg.operationSuccess'));
emit('search');
drawerVisible.value = false;
})
.catch(() => {