fix: Add custom timeout support for remote database (#9859)

This commit is contained in:
ssongliu 2025-08-05 15:54:48 +08:00 committed by GitHub
parent 9c5a6e3925
commit 37308b5c42
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 37 additions and 16 deletions

View file

@ -135,6 +135,7 @@ func (u *DatabaseService) CheckDatabase(req dto.DatabaseCreate) bool {
Address: req.Address, Address: req.Address,
Port: req.Port, Port: req.Port,
Password: req.Password, Password: req.Password,
Timeout: req.Timeout,
}) })
return err == nil return err == nil
case "mysql", "mariadb": case "mysql", "mariadb":
@ -186,6 +187,7 @@ func (u *DatabaseService) Create(req dto.DatabaseCreate) error {
Address: req.Address, Address: req.Address,
Port: req.Port, Port: req.Port,
Password: req.Password, Password: req.Password,
Timeout: req.Timeout,
}); err != nil { }); err != nil {
return err return err
} }
@ -286,6 +288,7 @@ func (u *DatabaseService) Update(req dto.DatabaseUpdate) error {
Address: req.Address, Address: req.Address,
Port: req.Port, Port: req.Port,
Password: req.Password, Password: req.Password,
Timeout: req.Timeout,
}); err != nil { }); err != nil {
return err return err
} }

View file

@ -2,6 +2,7 @@ package redis
import ( import (
"fmt" "fmt"
"time"
"github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/global"
"github.com/go-redis/redis" "github.com/go-redis/redis"
@ -11,6 +12,7 @@ type DBInfo struct {
Address string `json:"address"` Address string `json:"address"`
Port uint `json:"port"` Port uint `json:"port"`
Password string `json:"password"` Password string `json:"password"`
Timeout uint `json:"timeout"`
} }
func NewRedisClient(conn DBInfo) (*redis.Client, error) { func NewRedisClient(conn DBInfo) (*redis.Client, error) {
@ -18,6 +20,7 @@ func NewRedisClient(conn DBInfo) (*redis.Client, error) {
Addr: fmt.Sprintf("%s:%v", conn.Address, conn.Port), Addr: fmt.Sprintf("%s:%v", conn.Address, conn.Port),
Password: conn.Password, Password: conn.Password,
DB: 0, DB: 0,
DialTimeout: time.Duration(conn.Timeout) * time.Second,
}) })
if _, err := client.Ping().Result(); err != nil { if _, err := client.Ping().Result(); err != nil {

View file

@ -163,7 +163,7 @@ export const checkDatabase = (params: Database.DatabaseCreate) => {
request.rootCert = Base64.encode(request.rootCert); request.rootCert = Base64.encode(request.rootCert);
} }
return http.post<boolean>(`/databases/db/check`, request, TimeoutEnum.T_40S); return http.post<boolean>(`/databases/db/check`, request, TimeoutEnum.T_60S);
}; };
export const addDatabase = (params: Database.DatabaseCreate) => { export const addDatabase = (params: Database.DatabaseCreate) => {
let request = deepCopy(params) as Database.DatabaseCreate; let request = deepCopy(params) as Database.DatabaseCreate;
@ -173,7 +173,7 @@ export const addDatabase = (params: Database.DatabaseCreate) => {
request.rootCert = Base64.encode(request.rootCert); request.rootCert = Base64.encode(request.rootCert);
} }
return http.post(`/databases/db`, request, TimeoutEnum.T_40S); return http.post(`/databases/db`, request, TimeoutEnum.T_60S);
}; };
export const editDatabase = (params: Database.DatabaseUpdate) => { export const editDatabase = (params: Database.DatabaseUpdate) => {
let request = deepCopy(params) as Database.DatabaseCreate; let request = deepCopy(params) as Database.DatabaseCreate;
@ -183,7 +183,7 @@ export const editDatabase = (params: Database.DatabaseUpdate) => {
request.rootCert = Base64.encode(request.rootCert); request.rootCert = Base64.encode(request.rootCert);
} }
return http.post(`/databases/db/update`, request, TimeoutEnum.T_40S); return http.post(`/databases/db/update`, request, TimeoutEnum.T_60S);
}; };
export const deleteCheckDatabase = (id: number) => { export const deleteCheckDatabase = (id: number) => {
return http.post<Array<string>>(`/databases/db/del/check`, { id: id }); return http.post<Array<string>>(`/databases/db/del/check`, { id: id });

View file

@ -488,7 +488,6 @@ const message = {
passwordHelper: 'Unable to retrieve, please modify', passwordHelper: 'Unable to retrieve, please modify',
remote: 'Remote', remote: 'Remote',
remoteDB: 'Remote server | Remote servers', remoteDB: 'Remote server | Remote servers',
manageRemoteDB: 'Manage remote servers',
createRemoteDB: 'Bind @.lower:database.remoteDB', createRemoteDB: 'Bind @.lower:database.remoteDB',
unBindRemoteDB: 'Unbind @.lower:database.remoteDB', unBindRemoteDB: 'Unbind @.lower:database.remoteDB',
unBindForce: 'Force unbind', unBindForce: 'Force unbind',

View file

@ -474,7 +474,6 @@ const message = {
passwordHelper: '取得できない場合は変更してください', passwordHelper: '取得できない場合は変更してください',
remote: 'リモート', remote: 'リモート',
remoteDB: 'リモートサーバー|リモートサーバー', remoteDB: 'リモートサーバー|リモートサーバー',
manageRemoteDB: 'リモートDB',
createRemoteDB: 'リモートサーバーを追加', createRemoteDB: 'リモートサーバーを追加',
unBindRemoteDB: 'リモートサーバーのバインドを解除', unBindRemoteDB: 'リモートサーバーのバインドを解除',
unBindForce: '強制バインド', unBindForce: '強制バインド',

View file

@ -473,7 +473,6 @@ const message = {
passwordHelper: '불러올 없습니다. 수정해주세요.', passwordHelper: '불러올 없습니다. 수정해주세요.',
remote: '원격', remote: '원격',
remoteDB: '원격 서버 | 원격 서버들', remoteDB: '원격 서버 | 원격 서버들',
manageRemoteDB: '원격 DB 관리',
createRemoteDB: '원격 DB 바인딩', createRemoteDB: '원격 DB 바인딩',
unBindRemoteDB: '원격 DB 바인딩 해제', unBindRemoteDB: '원격 DB 바인딩 해제',
unBindForce: '강제 바인딩 해제', unBindForce: '강제 바인딩 해제',

View file

@ -485,7 +485,6 @@ const message = {
passwordHelper: 'Tidak dapat diambil, sila ubah', passwordHelper: 'Tidak dapat diambil, sila ubah',
remote: 'Jauh', remote: 'Jauh',
remoteDB: 'Pelayan jauh | Pelayan-pelayan jauh', remoteDB: 'Pelayan jauh | Pelayan-pelayan jauh',
manageRemoteDB: 'Pangkalan Data Jauh',
createRemoteDB: 'Kaitkan @.lower:database.remoteDB', createRemoteDB: 'Kaitkan @.lower:database.remoteDB',
unBindRemoteDB: 'Nyahkaitkan @.lower:database.remoteDB', unBindRemoteDB: 'Nyahkaitkan @.lower:database.remoteDB',
unBindForce: 'Paksa nyahkait', unBindForce: 'Paksa nyahkait',

View file

@ -482,7 +482,6 @@ const message = {
passwordHelper: 'Não é possível obter, por favor, modifique', passwordHelper: 'Não é possível obter, por favor, modifique',
remote: 'Remoto', remote: 'Remoto',
remoteDB: 'Servidor remoto | Servidores remotos', remoteDB: 'Servidor remoto | Servidores remotos',
manageRemoteDB: 'Gerenciar DB remoto',
createRemoteDB: 'Vincular @.lower:database.remoteDB', createRemoteDB: 'Vincular @.lower:database.remoteDB',
unBindRemoteDB: 'Desvincular @.lower:database.remoteDB', unBindRemoteDB: 'Desvincular @.lower:database.remoteDB',
unBindForce: 'Forçar desvinculação', unBindForce: 'Forçar desvinculação',

View file

@ -476,7 +476,6 @@ const message = {
passwordHelper: 'Невозможно получить, пожалуйста, измените', passwordHelper: 'Невозможно получить, пожалуйста, измените',
remote: 'Удаленный', remote: 'Удаленный',
remoteDB: 'Удаленный сервер | Удаленные серверы', remoteDB: 'Удаленный сервер | Удаленные серверы',
manageRemoteDB: 'Удаленная БД',
createRemoteDB: 'Привязать @.lower:database.remoteDB', createRemoteDB: 'Привязать @.lower:database.remoteDB',
unBindRemoteDB: 'Отвязать @.lower:database.remoteDB', unBindRemoteDB: 'Отвязать @.lower:database.remoteDB',
unBindForce: 'Принудительная отвязка', unBindForce: 'Принудительная отвязка',

View file

@ -494,7 +494,6 @@ const message = {
passwordHelper: 'Alınamıyor, lütfen değiştirin', passwordHelper: 'Alınamıyor, lütfen değiştirin',
remote: 'Uzak', remote: 'Uzak',
remoteDB: 'Uzak sunucu | Uzak sunucular', remoteDB: 'Uzak sunucu | Uzak sunucular',
manageRemoteDB: 'Uzak sunucuları yönet',
createRemoteDB: '@.lower:database.remoteDB Bağla', createRemoteDB: '@.lower:database.remoteDB Bağla',
unBindRemoteDB: '@.lower:database.remoteDB Bağlantısını Çöz', unBindRemoteDB: '@.lower:database.remoteDB Bağlantısını Çöz',
unBindForce: 'Zorla bağlantıyı çöz', unBindForce: 'Zorla bağlantıyı çöz',

View file

@ -472,7 +472,6 @@ const message = {
passwordHelper: '無法獲取密碼請修改', passwordHelper: '無法獲取密碼請修改',
remote: '遠程', remote: '遠程',
remoteDB: '遠程服務器', remoteDB: '遠程服務器',
manageRemoteDB: '管理遠程服務器',
createRemoteDB: '添加遠程服務器', createRemoteDB: '添加遠程服務器',
unBindRemoteDB: '解綁遠程服務器', unBindRemoteDB: '解綁遠程服務器',
unBindForce: '強制解綁', unBindForce: '強制解綁',

View file

@ -470,7 +470,6 @@ const message = {
passwordHelper: '无法获取密码请修改', passwordHelper: '无法获取密码请修改',
remote: '远程', remote: '远程',
remoteDB: '远程服务器', remoteDB: '远程服务器',
manageRemoteDB: '管理远程服务器',
createRemoteDB: '添加远程服务器', createRemoteDB: '添加远程服务器',
unBindRemoteDB: '解绑远程服务器', unBindRemoteDB: '解绑远程服务器',
unBindForce: '强制解绑', unBindForce: '强制解绑',

View file

@ -44,7 +44,7 @@
{{ $t('database.loadFromRemote') }} {{ $t('database.loadFromRemote') }}
</el-button> </el-button>
<el-button @click="goRemoteDB()" type="primary" plain> <el-button @click="goRemoteDB()" type="primary" plain>
{{ $t('database.manageRemoteDB') }} {{ $t('database.remoteDB') }}
</el-button> </el-button>
<el-dropdown> <el-dropdown>
<el-button type="primary" plain> <el-button type="primary" plain>

View file

@ -127,12 +127,14 @@ const onOpenDialog = async (
username: '', username: '',
password: '', password: '',
description: '', description: '',
timeout: 30,
}, },
) => { ) => {
let params = { let params = {
title, title,
rowData: { ...rowData }, rowData: { ...rowData },
}; };
params.rowData.timeout = 30;
dialogRef.value!.acceptParams(params); dialogRef.value!.acceptParams(params);
}; };

View file

@ -39,6 +39,16 @@
/> />
</el-form-item> </el-form-item>
<el-form-item :label="$t('database.timeout')" prop="timeout">
<el-input-number
class="p-w-200"
:min="1"
:precision="0"
step-strictly
:step="1"
v-model.number="dialogData.rowData!.timeout"
/>
</el-form-item>
<el-form-item :label="$t('commons.table.description')" prop="description"> <el-form-item :label="$t('commons.table.description')" prop="description">
<el-input clearable v-model.trim="dialogData.rowData!.description" /> <el-input clearable v-model.trim="dialogData.rowData!.description" />
</el-form-item> </el-form-item>

View file

@ -127,12 +127,14 @@ const onOpenDialog = async (
username: '-', username: '-',
password: '', password: '',
description: '', description: '',
timeout: 30,
}, },
) => { ) => {
let params = { let params = {
title, title,
rowData: { ...rowData }, rowData: { ...rowData },
}; };
params.rowData.timeout = 30;
dialogRef.value!.acceptParams(params); dialogRef.value!.acceptParams(params);
}; };

View file

@ -33,6 +33,16 @@
v-model.trim="dialogData.rowData!.password" v-model.trim="dialogData.rowData!.password"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="$t('database.timeout')" prop="timeout">
<el-input-number
class="p-w-200"
:min="1"
:precision="0"
step-strictly
:step="1"
v-model.number="dialogData.rowData!.timeout"
/>
</el-form-item>
<el-form-item :label="$t('commons.table.description')" prop="description"> <el-form-item :label="$t('commons.table.description')" prop="description">
<el-input clearable v-model.trim="dialogData.rowData!.description" /> <el-input clearable v-model.trim="dialogData.rowData!.description" />
</el-form-item> </el-form-item>