diff --git a/agent/app/dto/database.go b/agent/app/dto/database.go index 455695377..f08ae3e0e 100644 --- a/agent/app/dto/database.go +++ b/agent/app/dto/database.go @@ -281,14 +281,15 @@ type DatabaseItem struct { } type DatabaseCreate struct { - Name string `json:"name" validate:"required,max=256"` - Type string `json:"type" validate:"required"` - From string `json:"from" validate:"required,oneof=local remote"` - Version string `json:"version" validate:"required"` - Address string `json:"address"` - Port uint `json:"port"` - Username string `json:"username" validate:"required"` - Password string `json:"password"` + Name string `json:"name" validate:"required,max=256"` + Type string `json:"type" validate:"required"` + From string `json:"from" validate:"required,oneof=local remote"` + Version string `json:"version" validate:"required"` + Address string `json:"address"` + Port uint `json:"port"` + InitialDB string `json:"initialDB"` + Username string `json:"username" validate:"required"` + Password string `json:"password"` SSL bool `json:"ssl"` RootCert string `json:"rootCert"` diff --git a/agent/app/model/database.go b/agent/app/model/database.go index b6f0a0bb9..9770c7eaf 100644 --- a/agent/app/model/database.go +++ b/agent/app/model/database.go @@ -9,6 +9,7 @@ type Database struct { From string `json:"from" gorm:"not null"` Address string `json:"address" gorm:"not null"` Port uint `json:"port" gorm:"not null"` + InitialDB string `json:"initialDB"` Username string `json:"username"` Password string `json:"password"` diff --git a/agent/app/service/database.go b/agent/app/service/database.go index 648ddeca4..24c0ecd9e 100644 --- a/agent/app/service/database.go +++ b/agent/app/service/database.go @@ -122,12 +122,13 @@ func (u *DatabaseService) CheckDatabase(req dto.DatabaseCreate) bool { switch req.Type { case constant.AppPostgresql: _, err := postgresql.NewPostgresqlClient(pgclient.DBInfo{ - From: "remote", - Address: req.Address, - Port: req.Port, - Username: req.Username, - Password: req.Password, - Timeout: req.Timeout, + From: "remote", + Address: req.Address, + Port: req.Port, + InitialDB: req.InitialDB, + Username: req.Username, + Password: req.Password, + Timeout: req.Timeout, }) return err == nil case constant.AppRedis: diff --git a/agent/init/migration/migrate.go b/agent/init/migration/migrate.go index 208dee796..9adf68fb7 100644 --- a/agent/init/migration/migrate.go +++ b/agent/init/migration/migrate.go @@ -52,6 +52,7 @@ func InitAgentDB() { migrations.UpdateCronJob, migrations.UpdateTensorrtLLM, migrations.AddIptablesFilterRuleTable, + migrations.UpdateDatabase, }) if err := m.Migrate(); err != nil { global.LOG.Error(err) diff --git a/agent/init/migration/migrations/init.go b/agent/init/migration/migrations/init.go index 651cd1bf0..03eb0f763 100644 --- a/agent/init/migration/migrations/init.go +++ b/agent/init/migration/migrations/init.go @@ -705,3 +705,10 @@ var UpdateTensorrtLLM = &gormigrate.Migration{ return tx.AutoMigrate(&model.TensorRTLLM{}) }, } + +var UpdateDatabase = &gormigrate.Migration{ + ID: "20251117-update-database", + Migrate: func(tx *gorm.DB) error { + return tx.AutoMigrate(&model.Database{}) + }, +} diff --git a/agent/utils/postgresql/client.go b/agent/utils/postgresql/client.go index e9888ee6b..2a653455a 100644 --- a/agent/utils/postgresql/client.go +++ b/agent/utils/postgresql/client.go @@ -33,7 +33,10 @@ func NewPostgresqlClient(conn client.DBInfo) (PostgresqlClient, error) { } escapedUsername := url.QueryEscape(conn.Username) escapedPassword := url.QueryEscape(conn.Password) - connArgs := fmt.Sprintf("postgres://%s:%s@%s:%d/postgres?sslmode=disable", escapedUsername, escapedPassword, conn.Address, conn.Port) + if len(conn.InitialDB) == 0 { + conn.InitialDB = escapedUsername + } + connArgs := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable", escapedUsername, escapedPassword, conn.Address, conn.Port, conn.InitialDB) db, err := sql.Open("pgx", connArgs) if err != nil { return nil, err diff --git a/agent/utils/postgresql/client/info.go b/agent/utils/postgresql/client/info.go index ee04e56b7..5db3a4344 100644 --- a/agent/utils/postgresql/client/info.go +++ b/agent/utils/postgresql/client/info.go @@ -5,13 +5,14 @@ import ( ) type DBInfo struct { - From string `json:"from"` - Database string `json:"database"` - Address string `json:"address"` - Port uint `json:"port"` - Username string `json:"userName"` - Password string `json:"password"` - AppKey string `json:"appKey"` + From string `json:"from"` + Database string `json:"database"` + Address string `json:"address"` + Port uint `json:"port"` + InitialDB string `json:"initialDB"` + Username string `json:"userName"` + Password string `json:"password"` + AppKey string `json:"appKey"` Timeout uint `json:"timeout"` // second } diff --git a/agent/utils/postgresql/client/local.go b/agent/utils/postgresql/client/local.go index 9919c1da1..1b6f178b1 100644 --- a/agent/utils/postgresql/client/local.go +++ b/agent/utils/postgresql/client/local.go @@ -199,7 +199,7 @@ func (r *Local) SyncDB() ([]SyncDBInfo, error) { } for _, line := range lines { itemLine := strings.TrimLeft(line, " ") - if len(itemLine) == 0 || itemLine == "postgres" || itemLine == "template1" || itemLine == "template0" || itemLine == r.Username { + if len(itemLine) == 0 || itemLine == "template1" || itemLine == "template0" || itemLine == r.Username { continue } datas = append(datas, SyncDBInfo{Name: itemLine, From: "local", PostgresqlName: r.Database}) diff --git a/agent/utils/postgresql/client/remote.go b/agent/utils/postgresql/client/remote.go index e88de80e4..6e7c64fd7 100644 --- a/agent/utils/postgresql/client/remote.go +++ b/agent/utils/postgresql/client/remote.go @@ -215,7 +215,7 @@ func (r *Remote) SyncDB() ([]SyncDBInfo, error) { if err := rows.Scan(&dbName); err != nil { continue } - if len(dbName) == 0 || dbName == "postgres" || dbName == "template1" || dbName == "template0" || dbName == r.User { + if len(dbName) == 0 || dbName == "template1" || dbName == "template0" || dbName == r.User { continue } datas = append(datas, SyncDBInfo{Name: dbName, From: r.From, PostgresqlName: r.Database}) diff --git a/frontend/src/api/interface/database.ts b/frontend/src/api/interface/database.ts index bde7151d9..c04f86332 100644 --- a/frontend/src/api/interface/database.ts +++ b/frontend/src/api/interface/database.ts @@ -274,6 +274,7 @@ export namespace Database { from: string; address: string; port: number; + initialDB: string; username: string; password: string; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 72e503155..1b8a1609b 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -537,6 +537,7 @@ const message = { caCert: 'CA certificate', hasCA: 'Has CA certificate', skipVerify: 'Ignore certificate validity check', + initialDB: 'Initial Database', formatHelper: 'The current database character set is {0}, the character set inconsistency may cause recovery failure', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index b0c66b248..222636846 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -541,6 +541,8 @@ const message = { caCert: 'Certificado CA', hasCA: 'Posee certificado CA', skipVerify: 'Omitir la verificación de validez del certificado', + initialDB: 'Base de Datos Inicial', + formatHelper: 'El conjunto de caracteres actual de la base de datos es {0}, la inconsistencia de conjuntos puede causar errores al recuperar', dropHelper: 'Puede arrastrar y soltar el archivo aquí o', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 21194661f..8eb1e4df2 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -525,6 +525,7 @@ const message = { caCert: '証明書として', hasCA: 'CA証明書があります', skipVerify: '証明書の有効性チェックを無視します', + initialDB: '初期データベース', formatHelper: '現在のデータベース文字セットは{0}です。文字セットの矛盾は回復の故障を引き起こす可能性があります', dropHelper: 'ここでアップロードされたファイルをドラッグアンドドロップするか、', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index c74ae60f5..044244ba8 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -523,6 +523,7 @@ const message = { caCert: 'CA 인증서', hasCA: 'CA 인증서 있음', skipVerify: '인증서 유효성 검사 무시', + initialDB: '초기 데이터베이스', formatHelper: '현재 데이터베이스 문자셋은 {0} 입니다. 문자셋 불일치로 인해 복구에 실패할 수 있습니다.', dropHelper: '여기에 업로드한 파일을 드래그 앤 드롭하거나', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 9460339a3..53004fc47 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -536,6 +536,7 @@ const message = { caCert: 'Sijil CA', hasCA: 'Mempunyai sijil CA', skipVerify: 'Abaikan pemeriksaan kesahihan sijil', + initialDB: 'Pangkalan Data Awal', formatHelper: 'Set aksara pangkalan data semasa adalah {0}, ketidakkonsistenan set aksara mungkin menyebabkan kegagalan pemulihan.', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index ad2733ce4..081bae442 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -534,6 +534,7 @@ const message = { caCert: 'Certificado CA', hasCA: 'Possui certificado CA', skipVerify: 'Ignorar verificação de validade do certificado', + initialDB: 'Banco de Dados Inicial', formatHelper: 'O conjunto de caracteres atual do banco de dados é {0}, a inconsistência no conjunto de caracteres pode causar falha na recuperação', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 995160fb0..08225deee 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -528,6 +528,7 @@ const message = { caCert: 'Сертификат CA', hasCA: 'Есть сертификат CA', skipVerify: 'Игнорировать проверку действительности сертификата', + initialDB: 'Исходная База Данных', formatHelper: 'Текущая кодировка базы данных - {0}, несоответствие кодировок может привести к ошибке восстановления', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 0fc41f2e1..b09c69896 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -543,6 +543,8 @@ const message = { caCert: 'CA sertifikası', hasCA: 'CA sertifikası var', skipVerify: 'Sertifika geçerlilik kontrolünü yoksay', + initialDB: 'Başlangıç Veritabanı', + formatHelper: 'Mevcut veritabanı karakter seti {0}, karakter seti tutarsızlığı kurtarma işleminin başarısız olmasına neden olabilir', dropHelper: 'Yüklenen dosyayı buraya sürükleyip bırakabilir veya', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index a052e7d91..2d448a24c 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -516,6 +516,7 @@ const message = { hasCA: '擁有 CA 證書', caCert: 'CA 證書', skipVerify: '忽略校驗證書可用性檢測', + initialDB: '初始資料庫', formatHelper: '目前資料庫字元集為 {0},字元集不一致可能導致復原失敗', dropHelper: '將上傳文件拖曳到此處,或者', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 059fd5d77..55504ed39 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -517,6 +517,7 @@ const message = { hasCA: '拥有 CA 证书', caCert: 'CA 证书', skipVerify: '忽略校验证书可用性检测', + initialDB: '初始数据库', formatHelper: '当前数据库字符集为 {0},字符集不一致可能导致恢复失败', dropHelper: '将上传文件拖拽到此处,或者', diff --git a/frontend/src/views/database/postgresql/remote/operate/index.vue b/frontend/src/views/database/postgresql/remote/operate/index.vue index 57b618bcb..5ff32d6ab 100644 --- a/frontend/src/views/database/postgresql/remote/operate/index.vue +++ b/frontend/src/views/database/postgresql/remote/operate/index.vue @@ -25,6 +25,9 @@ + + + {{ $t('database.pgUserHelper') }}