diff --git a/backend/app/dto/response/app.go b/backend/app/dto/response/app.go index 11fbd9a41..96bb0cf77 100644 --- a/backend/app/dto/response/app.go +++ b/backend/app/dto/response/app.go @@ -77,6 +77,7 @@ type AppService struct { Label string `json:"label"` Value string `json:"value"` Config interface{} `json:"config"` + From string `json:"from"` } type AppParam struct { diff --git a/backend/app/service/app_install.go b/backend/app/service/app_install.go index fe956a970..eae439ad3 100644 --- a/backend/app/service/app_install.go +++ b/backend/app/service/app_install.go @@ -428,7 +428,7 @@ func (a *AppInstallService) SyncAll(systemInit bool) error { func (a *AppInstallService) GetServices(key string) ([]response.AppService, error) { var res []response.AppService if DatabaseKeys[key] > 0 { - dbs, _ := databaseRepo.GetList(databaseRepo.WithByFrom("local"), commonRepo.WithByType(key)) + dbs, _ := databaseRepo.GetList(commonRepo.WithByType(key)) if len(dbs) == 0 { return res, nil } @@ -447,6 +447,9 @@ func (a *AppInstallService) GetServices(key string) ([]response.AppService, erro _ = json.Unmarshal([]byte(install.Param), ¶mMap) } service.Config = paramMap + service.From = constant.AppResourceLocal + } else { + service.From = constant.AppResourceRemote } res = append(res, service) } diff --git a/backend/app/service/app_utils.go b/backend/app/service/app_utils.go index ef8b0d912..ea6e08a41 100644 --- a/backend/app/service/app_utils.go +++ b/backend/app/service/app_utils.go @@ -200,9 +200,13 @@ func createLink(ctx context.Context, app model.App, appInstall *model.AppInstall } if !reflect.DeepEqual(dbConfig, dto.AppDatabase{}) && dbConfig.ServiceName != "" { - dbInstall, err := appInstallRepo.GetFirst(appInstallRepo.WithServiceName(dbConfig.ServiceName)) - if err != nil { - return err + hostName := params["PANEL_DB_HOST_NAME"] + if hostName == nil || hostName.(string) == "" { + return nil + } + database, _ := databaseRepo.Get(commonRepo.WithByName(hostName.(string))) + if database.ID == 0 { + return nil } var resourceId uint if dbConfig.DbName != "" && dbConfig.DbUser != "" && dbConfig.Password != "" { @@ -217,11 +221,11 @@ func createLink(ctx context.Context, app model.App, appInstall *model.AppInstall var createMysql dto.MysqlDBCreate createMysql.Name = dbConfig.DbName createMysql.Username = dbConfig.DbUser - createMysql.Database = dbInstall.Name + createMysql.Database = database.Name createMysql.Format = "utf8mb4" createMysql.Permission = "%" createMysql.Password = dbConfig.Password - createMysql.From = "local" + createMysql.From = database.From mysqldb, err := NewIMysqlService().Create(ctx, createMysql) if err != nil { return err @@ -232,8 +236,13 @@ func createLink(ctx context.Context, app model.App, appInstall *model.AppInstall var installResource model.AppInstallResource installResource.ResourceId = resourceId installResource.AppInstallId = appInstall.ID - installResource.LinkId = dbInstall.ID - installResource.Key = dbInstall.App.Key + if database.AppInstallID > 0 { + installResource.LinkId = database.AppInstallID + } else { + installResource.LinkId = database.ID + } + installResource.Key = database.Type + installResource.From = database.From if err := appInstallResourceRepo.Create(ctx, &installResource); err != nil { return err } diff --git a/backend/app/service/backup_app.go b/backend/app/service/backup_app.go index 979a5b8a6..f3b1bdb4a 100644 --- a/backend/app/service/backup_app.go +++ b/backend/app/service/backup_app.go @@ -173,31 +173,36 @@ func handleAppRecover(install *model.AppInstall, recoverFile string, isRollback newEnvFile := "" resources, _ := appInstallResourceRepo.GetBy(appInstallResourceRepo.WithAppInstallId(install.ID)) for _, resource := range resources { - if resource.From != "local" { - continue - } - resourceApp, err := appInstallRepo.GetFirst(commonRepo.WithByID(resource.LinkId)) - if err != nil { - return err - } - if resource.Key == "mysql" || resource.Key == "mariadb" { - mysqlInfo, err := appInstallRepo.LoadBaseInfo(resource.Key, resourceApp.Name) + var database model.Database + switch resource.From { + case constant.AppResourceRemote: + database, err = databaseRepo.Get(commonRepo.WithByID(resource.LinkId)) if err != nil { return err } + case constant.AppResourceLocal: + resourceApp, err := appInstallRepo.GetFirst(commonRepo.WithByID(resource.LinkId)) + if err != nil { + return err + } + database, err = databaseRepo.Get(databaseRepo.WithAppInstallID(resourceApp.ID), commonRepo.WithByType(resource.Key), databaseRepo.WithByFrom(constant.AppResourceLocal), commonRepo.WithByName(resourceApp.Name)) + if err != nil { + return err + } + } + if database.Type == "mysql" || database.Type == "mariadb" { db, err := mysqlRepo.Get(commonRepo.WithByID(resource.ResourceId)) if err != nil { return err } - - newDB, envMap, err := reCreateDB(db.ID, resourceApp, oldInstall.Env) + newDB, envMap, err := reCreateDB(db.ID, database, oldInstall.Env) if err != nil { return err } oldHost := fmt.Sprintf("\"PANEL_DB_HOST\":\"%v\"", envMap["PANEL_DB_HOST"].(string)) - newHost := fmt.Sprintf("\"PANEL_DB_HOST\":\"%v\"", mysqlInfo.ServiceName) + newHost := fmt.Sprintf("\"PANEL_DB_HOST\":\"%v\"", database.Address) oldInstall.Env = strings.ReplaceAll(oldInstall.Env, oldHost, newHost) - envMap["PANEL_DB_HOST"] = mysqlInfo.ServiceName + envMap["PANEL_DB_HOST"] = database.Address newEnvFile, err = coverEnvJsonToStr(oldInstall.Env) if err != nil { return err @@ -252,10 +257,10 @@ func handleAppRecover(install *model.AppInstall, recoverFile string, isRollback return nil } -func reCreateDB(dbID uint, app model.AppInstall, oldEnv string) (*model.DatabaseMysql, map[string]interface{}, error) { +func reCreateDB(dbID uint, database model.Database, oldEnv string) (*model.DatabaseMysql, map[string]interface{}, error) { mysqlService := NewIMysqlService() ctx := context.Background() - _ = mysqlService.Delete(ctx, dto.MysqlDBDelete{ID: dbID, Database: app.Name, Type: app.App.Key, DeleteBackup: false, ForceDelete: true}) + _ = mysqlService.Delete(ctx, dto.MysqlDBDelete{ID: dbID, Database: database.Name, Type: database.Type, DeleteBackup: false, ForceDelete: true}) envMap := make(map[string]interface{}) if err := json.Unmarshal([]byte(oldEnv), &envMap); err != nil { @@ -266,8 +271,8 @@ func reCreateDB(dbID uint, app model.AppInstall, oldEnv string) (*model.Database oldPassword, _ := envMap["PANEL_DB_USER_PASSWORD"].(string) createDB, err := mysqlService.Create(context.Background(), dto.MysqlDBCreate{ Name: oldName, - From: "local", - Database: app.Name, + From: database.From, + Database: database.Name, Format: "utf8mb4", Username: oldUser, Password: oldPassword, @@ -276,6 +281,5 @@ func reCreateDB(dbID uint, app model.AppInstall, oldEnv string) (*model.Database if err != nil { return nil, envMap, err } - return createDB, envMap, nil } diff --git a/frontend/src/api/interface/app.ts b/frontend/src/api/interface/app.ts index 589908798..58f60ee6a 100644 --- a/frontend/src/api/interface/app.ts +++ b/frontend/src/api/interface/app.ts @@ -84,6 +84,7 @@ export namespace App { export interface ServiceParam { label: ''; value: ''; + from?: ''; } export interface AppInstall { @@ -168,6 +169,7 @@ export namespace App { label: string; value: string; config?: Object; + from?: string; } export interface VersionDetail { diff --git a/frontend/src/views/app-store/detail/params/index.vue b/frontend/src/views/app-store/detail/params/index.vue index bce021313..2b6e8ae1a 100644 --- a/frontend/src/views/app-store/detail/params/index.vue +++ b/frontend/src/views/app-store/detail/params/index.vue @@ -79,7 +79,13 @@ :key="service.label" :value="service.value" :label="service.label" - > + > + {{ service.label }} + + {{ $t('database.local') }} + {{ $t('database.remote') }} + +