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

View file

@ -2,6 +2,7 @@ package redis
import (
"fmt"
"time"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/go-redis/redis"
@ -11,13 +12,15 @@ type DBInfo struct {
Address string `json:"address"`
Port uint `json:"port"`
Password string `json:"password"`
Timeout uint `json:"timeout"`
}
func NewRedisClient(conn DBInfo) (*redis.Client, error) {
client := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%v", conn.Address, conn.Port),
Password: conn.Password,
DB: 0,
Addr: fmt.Sprintf("%s:%v", conn.Address, conn.Port),
Password: conn.Password,
DB: 0,
DialTimeout: time.Duration(conn.Timeout) * time.Second,
})
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);
}
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) => {
let request = deepCopy(params) as Database.DatabaseCreate;
@ -173,7 +173,7 @@ export const addDatabase = (params: Database.DatabaseCreate) => {
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) => {
let request = deepCopy(params) as Database.DatabaseCreate;
@ -183,7 +183,7 @@ export const editDatabase = (params: Database.DatabaseUpdate) => {
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) => {
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',
remote: 'Remote',
remoteDB: 'Remote server | Remote servers',
manageRemoteDB: 'Manage remote servers',
createRemoteDB: 'Bind @.lower:database.remoteDB',
unBindRemoteDB: 'Unbind @.lower:database.remoteDB',
unBindForce: 'Force unbind',

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -39,6 +39,16 @@
/>
</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-input clearable v-model.trim="dialogData.rowData!.description" />
</el-form-item>

View file

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

View file

@ -33,6 +33,16 @@
v-model.trim="dialogData.rowData!.password"
/>
</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-input clearable v-model.trim="dialogData.rowData!.description" />
</el-form-item>