Compare commits

..
Author SHA1 Message Date
ssongliu c5dfcae38b feat(ai): add model deployment naming help translations (#14341) 2026-11-08 15:56:26 +08:00
20 changed files with 138 additions and 152 deletions
+35 -8
View File
@@ -2,6 +2,7 @@ package client
import (
"context"
"crypto/tls"
"encoding/json"
"errors"
"fmt"
@@ -10,6 +11,8 @@ import (
"os"
"path"
"strings"
"github.com/go-resty/resty/v2"
)
type aliClient struct {
@@ -55,7 +58,10 @@ func (a aliClient) Delete(pathItem string) (bool, error) {
if err != nil {
return false, err
}
client := newALIHTTPClient()
client := resty.New()
client.SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
})
data := map[string]interface{}{
"drive_id": a.driveID,
"file_id": fileInfo.FileID,
@@ -102,7 +108,10 @@ func (a aliClient) Upload(ctx context.Context, src, target string) (bool, error)
"size": fileInfo.Size(),
"check_name_mode": "auto_rename",
}
client := newALIHTTPClient()
client := resty.New()
client.SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
})
url := "https://api.alipan.com/v2/file/create"
resp, err := client.R().
@@ -137,7 +146,10 @@ func (a aliClient) Download(src, target string) (bool, error) {
if err != nil {
return false, err
}
client := newALIHTTPClient()
client := resty.New()
client.SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
})
if fileInfo.Size > 100*1024*1024 {
return false, fmt.Errorf("The translation file %s exceeds 100MB, please download it through the client.", src)
}
@@ -254,7 +266,10 @@ func (a aliClient) loadDirWithPath(path string) ([]fileInfo, error) {
}
func (a aliClient) loadFileWithParentID(parentID string) ([]fileInfo, error) {
client := newALIHTTPClient()
client := resty.New()
client.SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
})
data := map[string]interface{}{
"drive_id": a.driveID,
"fields": "*",
@@ -323,7 +338,10 @@ func (a aliClient) mkdirWithPath(target string) (string, error) {
}
func (a aliClient) mkdir(parentID, name string) (string, error) {
client := newALIHTTPClient()
client := resty.New()
client.SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
})
data := map[string]interface{}{
"drive_id": a.driveID,
"name": name,
@@ -454,7 +472,10 @@ func (a aliClient) handleDownload(uri string, target string) error {
}
func (a *aliClient) completeUpload(ctx context.Context, uploadID, fileID string) error {
client := newALIHTTPClient()
client := resty.New()
client.SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
})
data := map[string]interface{}{
"drive_id": a.driveID,
"upload_id": uploadID,
@@ -483,7 +504,10 @@ type tokenResp struct {
}
func loadToken(refresh_token string) (string, error) {
client := newALIHTTPClient()
client := resty.New()
client.SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
})
data := map[string]interface{}{
"grant_type": "refresh_token",
"refresh_token": refresh_token,
@@ -512,7 +536,10 @@ func RefreshALIToken(varMap map[string]interface{}) (string, error) {
if len(refresh_token) == 0 {
return "", errors.New("no such refresh token find in db")
}
client := newALIHTTPClient()
client := resty.New()
client.SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
})
data := map[string]interface{}{
"grant_type": "refresh_token",
"refresh_token": refresh_token,
+10 -4
View File
@@ -2,8 +2,10 @@ package client
import (
"context"
"crypto/tls"
"fmt"
"io"
"net/http"
"os"
"strings"
@@ -27,10 +29,14 @@ func NewMinIoClient(vars map[string]interface{}) (*minIoClient, error) {
return nil, buserr.WithDetail("ErrInvalidParams", "ssl", fmt.Errorf("no such proto in ssl: %s", ssl))
}
secure := ssl == "https"
transport, err := newStorageHTTPTransport(vars)
if err != nil {
return nil, err
secure := false
tlsConfig := &tls.Config{}
if ssl == "https" {
secure = true
tlsConfig.InsecureSkipVerify = true
}
var transport http.RoundTripper = &http.Transport{
TLSClientConfig: tlsConfig,
}
client, err := minio.New(strings.ReplaceAll(endpoint, ssl+"://", ""), &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
+10 -4
View File
@@ -2,6 +2,8 @@ package client
import (
"context"
"crypto/tls"
"net/http"
"os"
"strings"
"time"
@@ -46,10 +48,14 @@ func NewS3Client(vars map[string]interface{}) (*s3Client, error) {
}
ssl := strings.Split(endpoint, ":")[0]
secure := ssl == "https"
transport, err := newStorageHTTPTransport(vars)
if err != nil {
return nil, err
secure := false
tlsConfig := &tls.Config{}
if ssl == "https" {
secure = true
tlsConfig.InsecureSkipVerify = true
}
var transport http.RoundTripper = &http.Transport{
TLSClientConfig: tlsConfig,
}
endpoint = strings.TrimPrefix(endpoint, ssl+"://")
-57
View File
@@ -1,57 +0,0 @@
package client
import (
"bytes"
"crypto/tls"
"crypto/x509"
"encoding/pem"
"errors"
"fmt"
"net/http"
"github.com/go-resty/resty/v2"
)
func newStorageHTTPTransport(vars map[string]interface{}) (*http.Transport, error) {
config := &tls.Config{}
value, exists := vars["caCertPEM"]
if !exists || value == nil {
return &http.Transport{TLSClientConfig: config}, nil
}
certificatePEM, ok := value.(string)
if !ok {
return nil, errors.New("caCertPEM must be a PEM certificate string")
}
rest := bytes.TrimSpace([]byte(certificatePEM))
if len(rest) == 0 {
return &http.Transport{TLSClientConfig: config}, nil
}
roots, err := x509.SystemCertPool()
if err != nil {
roots = x509.NewCertPool()
}
for len(rest) > 0 {
if !bytes.HasPrefix(rest, []byte("-----BEGIN CERTIFICATE-----")) {
return nil, errors.New("caCertPEM must contain only PEM certificates")
}
block, remaining := pem.Decode(rest)
if block == nil || block.Type != "CERTIFICATE" || len(block.Headers) != 0 {
return nil, errors.New("caCertPEM contains an invalid PEM certificate")
}
if bytes.Count(rest[:len(rest)-len(remaining)], []byte("-----BEGIN CERTIFICATE-----")) != 1 {
return nil, errors.New("caCertPEM contains an invalid PEM certificate")
}
certificate, err := x509.ParseCertificate(block.Bytes)
if err != nil {
return nil, fmt.Errorf("caCertPEM contains an invalid certificate: %w", err)
}
roots.AddCert(certificate)
rest = bytes.TrimSpace(remaining)
}
config.RootCAs = roots
return &http.Transport{TLSClientConfig: config}, nil
}
func newALIHTTPClient() *resty.Client {
return resty.New().SetTLSClientConfig(&tls.Config{})
}
+9 -3
View File
@@ -2,10 +2,13 @@ package client
import (
"context"
"crypto/tls"
"fmt"
"io"
"net/http"
"os"
"path"
"strings"
"github.com/1Panel-dev/1Panel/agent/constant"
"github.com/1Panel-dev/1Panel/agent/utils/cloud_storage/client/helper/webdav"
@@ -36,9 +39,12 @@ func newWebDAVClient(ctx context.Context, vars map[string]interface{}) (*webDAVC
url = address
}
client := webdav.NewClient(url, username, password)
transport, err := newStorageHTTPTransport(vars)
if err != nil {
return nil, err
tlsConfig := &tls.Config{}
if strings.HasPrefix(address, "https") {
tlsConfig.InsecureSkipVerify = true
}
var transport http.RoundTripper = &http.Transport{
TLSClientConfig: tlsConfig,
}
client.SetTransport(transport)
if err := client.ConnectWithContext(ctx); err != nil {
+4 -5
View File
@@ -35,7 +35,10 @@ func RefreshALIToken(varMap map[string]interface{}) (string, error) {
if len(refresh_token) == 0 {
return "", errors.New("no such refresh token find in db")
}
client := newALITokenHTTPClient()
client := resty.New()
client.SetTLSClientConfig(&tls.Config{
InsecureSkipVerify: true,
})
data := map[string]interface{}{
"grant_type": "refresh_token",
"refresh_token": refresh_token,
@@ -59,10 +62,6 @@ func RefreshALIToken(varMap map[string]interface{}) (string, error) {
return respItem.RefreshToken, nil
}
func newALITokenHTTPClient() *resty.Client {
return resty.New().SetTLSClientConfig(&tls.Config{})
}
func RefreshToken(grantType string, tokenType string, varMap map[string]interface{}) (string, error) {
data := url.Values{}
isCN := loadParamFromVars("isCN", varMap)
+1 -10
View File
@@ -3,7 +3,6 @@ package ssh
import (
"bufio"
"crypto/tls"
"crypto/x509"
"encoding/base64"
"fmt"
"net"
@@ -21,25 +20,17 @@ type HTTPProxyDialer struct {
}
func HTTPDial(dialer HTTPProxyDialer, network, addr string) (net.Conn, error) {
return dialHTTPProxy(dialer, network, addr, nil)
}
func dialHTTPProxy(dialer HTTPProxyDialer, network, addr string, rootCAs *x509.CertPool) (net.Conn, error) {
var conn net.Conn
var err error
global.LOG.Debugf("Dialing HTTP proxy %s for %s", dialer.URL, addr)
dialer.URL = strings.TrimPrefix(dialer.URL, dialer.Type+"://")
if dialer.Type == "https" {
host, _, splitErr := net.SplitHostPort(dialer.URL)
if splitErr != nil {
return nil, splitErr
}
conn, err = tls.DialWithDialer(
&net.Dialer{Timeout: 30 * time.Second},
network,
dialer.URL,
&tls.Config{RootCAs: rootCAs, ServerName: host},
&tls.Config{InsecureSkipVerify: true},
)
} else {
conn, err = net.DialTimeout(network, dialer.URL, 30*time.Second)
+6 -3
View File
@@ -1147,6 +1147,12 @@ const message = {
serviceAddressHelper:
'Use the container address for container apps and the external address for host or external apps.',
externalAddress: 'External address',
deploymentNameHelper:
'Application instance name, used for the installation directory and fixed after creation. Set an alias to change the display name.',
deploymentAliasHelper:
'Optional display name for the list. Leave empty to use the application name. Changing only the alias does not restart the container.',
deploymentContainerNameHelper:
'Docker container name. Defaults to the application name and can be set separately. Changing it recreates the container.',
imageVersion: 'Image version',
deployments: 'Model deployment',
files: 'Model preparation',
@@ -3870,9 +3876,6 @@ const message = {
'If a cloud provider is compatible with the S3 protocol, you can directly use Amazon S3 for backup. ',
domain: 'Accelerate domain',
backupAccount: 'Backup account | Backup accounts',
backupCACert: 'CA certificate (PEM)',
backupCACertHelp:
'Leave empty to use system CAs. For self-hosted HTTPS storage, paste its CA certificate. Certificate verification remains enabled.',
loadBucket: 'Get bucket',
accountName: 'Account name',
accountKey: 'Account key',
+6 -3
View File
@@ -1150,6 +1150,12 @@ const message = {
serviceAddressHelper:
'Use la dirección del contenedor para sus aplicaciones y la dirección externa para aplicaciones del host o externas.',
externalAddress: 'Dirección externa',
deploymentNameHelper:
'Nombre de la instancia, usado en el directorio de instalación y fijo tras crearla. Configure un alias para cambiar el nombre mostrado.',
deploymentAliasHelper:
'Nombre opcional para la lista. Si se deja vacío, se muestra el nombre de la aplicación. Cambiar solo el alias no reinicia el contenedor.',
deploymentContainerNameHelper:
'Nombre del contenedor Docker. Por defecto coincide con la aplicación y puede configurarse por separado. Cambiarlo vuelve a crear el contenedor.',
imageVersion: 'Versión de la imagen',
deployments: 'Despliegue de modelos',
files: 'Preparación de modelos',
@@ -3947,9 +3953,6 @@ const message = {
'Si un proveedor de nube es compatible con el protocolo S3, puedes usar Amazon S3 directamente para el respaldo. ',
domain: 'Dominio de aceleración',
backupAccount: 'Cuenta de respaldo | Cuentas de respaldo',
backupCACert: 'Certificado CA (PEM)',
backupCACertHelp:
'Déjelo vacío para usar las CA del sistema. Para almacenamiento HTTPS propio, pegue su certificado CA. La verificación de certificados permanece activa.',
loadBucket: 'Obtener bucket',
accountName: 'Nombre de la cuenta',
accountKey: 'Clave de la cuenta',
+6 -3
View File
@@ -1128,6 +1128,12 @@ const message = {
serviceAddressHelper:
'برای برنامه‌های کانتینری از آدرس کانتینر و برای برنامه‌های میزبان یا خارجی از آدرس خارجی استفاده کنید.',
externalAddress: 'آدرس خارجی',
deploymentNameHelper:
'نام نمونهٔ برنامه برای پوشهٔ نصب استفاده می\u200cشود و پس از ایجاد قابل تغییر نیست. برای تغییر نام نمایشی، نام مستعار تعیین کنید.',
deploymentAliasHelper:
'نام نمایشی اختیاری برای فهرست. اگر خالی باشد، نام برنامه نمایش داده می\u200cشود. تغییر فقط نام مستعار، کانتینر را راه\u200cاندازی مجدد نمی\u200cکند.',
deploymentContainerNameHelper:
'نام کانتینر Docker به\u200cطور پیش\u200cفرض همان نام برنامه است و جداگانه قابل تنظیم است. تغییر آن کانتینر را دوباره ایجاد می\u200cکند.',
imageVersion: 'نسخه ایمیج',
deployments: 'استقرار مدل',
files: 'آماده‌سازی مدل',
@@ -3830,9 +3836,6 @@ const message = {
'اگر یک ارائه‌دهنده ابری با پروتکل S3 سازگار است، می‌توانید مستقیماً از آمازون S3 برای پشتیبان‌گیری استفاده کنید.',
domain: 'دامنه شتاب‌دهنده',
backupAccount: 'حساب پشتیبان | حساب‌های پشتیبان',
backupCACert: 'گواهی CA (PEM)',
backupCACertHelp:
'برای استفاده از CAهای سیستم خالی بگذارید. برای فضای ذخیره‌سازی HTTPS خودمیزبان، گواهی CA را وارد کنید. اعتبارسنجی گواهی همیشه فعال است.',
loadBucket: 'دریافت سطل',
accountName: 'نام حساب',
accountKey: 'کلید حساب',
+6 -3
View File
@@ -1133,6 +1133,12 @@ const message = {
serviceAddressHelper:
'コンテナ内のアプリにはコンテナアドレスを、ホスト上または外部のアプリには外部アドレスを使用してください。',
externalAddress: '外部アクセスアドレス',
deploymentNameHelper:
'アプリのインスタンス名です。インストール先ディレクトリに使用され、作成後は変更できません。表示名を変更するには別名を設定してください。',
deploymentAliasHelper:
'一覧の表示名(任意)。空欄の場合はアプリ名を表示します。別名のみの変更ではコンテナは再起動しません。',
deploymentContainerNameHelper:
'Docker コンテナ名です。初期値はアプリ名で、個別に設定できます。変更するとコンテナが再作成されます。',
imageVersion: 'イメージバージョン',
deployments: 'モデルデプロイ',
files: 'モデル準備',
@@ -3822,9 +3828,6 @@ const message = {
'理論的には、クラウドプロバイダーがS3プロトコルに対応していれば、現行のAmazon S3クラウドストレージを使ってバックアップできます。具体的な設定については、',
domain: 'ドメインを加速します',
backupAccount: 'バックアップアカウント|バックアップアカウント',
backupCACert: 'CA 証明書(PEM)',
backupCACertHelp:
'空欄の場合はシステムの CA を使用します。自前の HTTPS ストレージには CA 証明書を貼り付けてください。証明書の検証は常に有効です。',
loadBucket: 'バケツを入手してください',
accountName: 'アカウント名',
accountKey: 'アカウントキー',
+6 -3
View File
@@ -1120,6 +1120,12 @@ const message = {
serviceAPIHelper: '이 서비스는 OpenAI 호환 API를 제공합니다.',
serviceAddressHelper: '컨테이너 앱에는 컨테이너 주소를, 호스트 또는 외부 앱에는 외부 주소를 사용하세요.',
externalAddress: '외부 접속 주소',
deploymentNameHelper:
'앱 인스턴스 이름으로, 설치 디렉터리에 사용되며 생성 후 변경할 수 없습니다. 표시 이름을 바꾸려면 별칭을 설정하세요.',
deploymentAliasHelper:
'목록에 표시할 이름입니다(선택 사항). 비워 두면 앱 이름을 표시합니다. 별칭만 변경하면 컨테이너가 재시작되지 않습니다.',
deploymentContainerNameHelper:
'Docker 컨테이너 이름입니다. 기본값은 앱 이름이며 별도로 설정할 수 있습니다. 변경하면 컨테이너가 다시 생성됩니다.',
imageVersion: '이미지 버전',
deployments: '모델 배포',
files: '모델 준비',
@@ -3764,9 +3770,6 @@ const message = {
backupAlert: 'S3 프로토콜을 지원하는 클라우드 공급자는 Amazon S3 를 사용하여 백업할 수 있습니다.',
domain: '가속 도메인',
backupAccount: '백업 계정 | 백업 계정',
backupCACert: 'CA 인증서(PEM)',
backupCACertHelp:
'비워 두면 시스템 CA를 사용합니다. 자체 호스팅 HTTPS 저장소의 CA 인증서를 붙여 넣으세요. 인증서 검증은 항상 활성화됩니다.',
loadBucket: '버킷 가져오기',
accountName: '계정 이름',
accountKey: '계정 키',
+6 -3
View File
@@ -1114,6 +1114,12 @@ const message = {
serviceAPIHelper: 'ບໍລິການນີ້ໃຫ້ API ທີ່ເຂົ້າກັນໄດ້ກັບ OpenAI.',
serviceAddressHelper: 'ແອັບໃນຄອນເທນເນີໃຊ້ທີ່ຢູ່ຄອນເທນເນີ; ແອັບໃນໂຮສ ຫຼື ພາຍນອກໃຊ້ທີ່ຢູ່ພາຍນອກ.',
externalAddress: 'ທີ່ຢູ່ພາຍນອກ',
deploymentNameHelper:
'ຊື່ອິນສະແຕນຂອງແອັບ ໃຊ້ສຳລັບໂຟນເດີຕິດຕັ້ງ ແລະ ປ່ຽນບໍ່ໄດ້ຫຼັງສ້າງ. ຕັ້ງຊື່ຫຼິ້ນເພື່ອປ່ຽນຊື່ທີ່ສະແດງ.',
deploymentAliasHelper:
'ຊື່ສະແດງໃນລາຍການ ບໍ່ບັງຄັບ. ຖ້າປະວ່າງຈະໃຊ້ຊື່ແອັບ. ການປ່ຽນພຽງຊື່ຫຼິ້ນຈະບໍ່ເລີ່ມຄອນເທນເນີໃໝ່.',
deploymentContainerNameHelper:
'ຊື່ຄອນເທນເນີ Docker ເລີ່ມຕົ້ນເປັນຊື່ແອັບ ແລະ ຕັ້ງແຍກໄດ້. ການປ່ຽນຊື່ນີ້ຈະສ້າງຄອນເທນເນີໃໝ່.',
imageVersion: 'ເວີຊັນອິມເມຈ',
deployments: 'ການນຳໃຊ້ໂມເດວ',
files: 'ການກະກຽມໂມເດວ',
@@ -3754,9 +3760,6 @@ const message = {
backupAlert: 'ຫາກຜູ້ໃຫ້ບໍລິການຄລາວຮອງຮັບໂປຣໂຕຄໍ S3, ທ່ານສາມາດໃຊ້ Amazon S3 ໃນການສຳຮອງຂໍ້ມູນໄດ້ໂດຍກົງ.',
domain: 'ໂດເມນເລັ່ງຄວາມໄວ',
backupAccount: 'ບັນຊີສຳຮອງ',
backupCACert: 'ໃບຢັ້ງຢືນ CA (PEM)',
backupCACertHelp:
'ປ່ອຍວ່າງເພື່ອໃຊ້ CA ຂອງລະບົບ. ສຳລັບບ່ອນເກັບຂໍ້ມູນ HTTPS ທີ່ໂຮສເອງ ໃຫ້ວາງໃບຢັ້ງຢືນ CA. ການກວດສອບໃບຢັ້ງຢືນຈະເປີດຢູ່ສະເໝີ.',
loadBucket: 'ຮັບ Bucket',
accountName: 'ຊື່ບັນຊີ',
accountKey: 'Account key',
+6 -3
View File
@@ -1159,6 +1159,12 @@ const message = {
serviceAddressHelper:
'Gunakan alamat bekas untuk aplikasi dalam bekas dan alamat luaran untuk aplikasi hos atau luaran.',
externalAddress: 'Alamat luaran',
deploymentNameHelper:
'Nama instans aplikasi, digunakan untuk direktori pemasangan dan tidak boleh diubah selepas penciptaan. Tetapkan alias untuk mengubah nama paparan.',
deploymentAliasHelper:
'Nama paparan pilihan untuk senarai. Biarkan kosong untuk menggunakan nama aplikasi. Mengubah alias sahaja tidak memulakan semula kontena.',
deploymentContainerNameHelper:
'Nama kontena Docker. Secara lalai sama dengan nama aplikasi dan boleh ditetapkan secara berasingan. Mengubahnya akan mencipta semula kontena.',
imageVersion: 'Versi imej',
deployments: 'Pengerahan model',
files: 'Penyediaan model',
@@ -3913,9 +3919,6 @@ const message = {
'Jika penyedia awan serasi dengan protokol S3, anda boleh menggunakan Amazon S3 secara langsung untuk sandaran.',
domain: 'Domain pemecutan',
backupAccount: 'Akaun sandaran | Akaun sandaran',
backupCACert: 'Sijil CA (PEM)',
backupCACertHelp:
'Biarkan kosong untuk menggunakan CA sistem. Untuk storan HTTPS yang dihos sendiri, tampal sijil CA. Pengesahan sijil sentiasa diaktifkan.',
loadBucket: 'Dapatkan baldi',
accountName: 'Nama akaun',
accountKey: 'Kunci akaun',
+6 -3
View File
@@ -1154,6 +1154,12 @@ const message = {
serviceAddressHelper:
'Use o endereço do contêiner para aplicativos em contêineres e o endereço externo para aplicativos do host ou externos.',
externalAddress: 'Endereço externo',
deploymentNameHelper:
'Nome da instância, usado no diretório de instalação e fixo após a criação. Defina um alias para alterar o nome exibido.',
deploymentAliasHelper:
'Nome opcional para a lista. Deixe vazio para usar o nome do aplicativo. Alterar apenas o alias não reinicia o contêiner.',
deploymentContainerNameHelper:
'Nome do contêiner Docker. Por padrão, usa o nome do aplicativo e pode ser definido separadamente. Alterá-lo recria o contêiner.',
imageVersion: 'Versão da imagem',
deployments: 'Implantação de modelos',
files: 'Preparação de modelos',
@@ -3918,9 +3924,6 @@ const message = {
'Se um provedor de nuvem for compatível com o protocolo S3, você pode usar diretamente o Amazon S3 para backup.',
domain: 'Domínio de aceleração',
backupAccount: 'Conta de backup | Contas de backup',
backupCACert: 'Certificado de CA (PEM)',
backupCACertHelp:
'Deixe em branco para usar as CAs do sistema. Para armazenamento HTTPS próprio, cole o certificado da CA. A verificação de certificados permanece ativa.',
loadBucket: 'Obter bucket',
accountName: 'Nome da conta',
accountKey: 'Chave da conta',
+6 -3
View File
@@ -1147,6 +1147,12 @@ const message = {
serviceAddressHelper:
'Для приложений в контейнерах используйте адрес контейнера, для приложений на хосте или вне его — внешний адрес.',
externalAddress: 'Внешний адрес',
deploymentNameHelper:
'Имя экземпляра приложения используется для каталога установки и не меняется после создания. Для отображения другого имени задайте псевдоним.',
deploymentAliasHelper:
'Необязательное имя для списка. Если пусто, отображается имя приложения. Изменение только псевдонима не перезапускает контейнер.',
deploymentContainerNameHelper:
'Имя контейнера Docker. По умолчанию совпадает с именем приложения, но задаётся отдельно. При изменении контейнер создаётся заново.',
imageVersion: 'Версия образа',
deployments: 'Развертывание моделей',
files: 'Подготовка моделей',
@@ -3892,9 +3898,6 @@ const message = {
'Если облачный провайдер совместим с протоколом S3, вы можете напрямую использовать Amazon S3 для резервного копирования.',
domain: 'Домен ускорения',
backupAccount: 'Аккаунт резервного копирования | Аккаунты резервного копирования',
backupCACert: 'Сертификат CA (PEM)',
backupCACertHelp:
'Оставьте поле пустым, чтобы использовать системные CA. Для собственного HTTPS-хранилища вставьте сертификат CA. Проверка сертификатов всегда включена.',
loadBucket: 'Получить корзину',
accountName: 'Имя аккаунта',
accountKey: 'Ключ аккаунта',
+6 -3
View File
@@ -1155,6 +1155,12 @@ const message = {
serviceAddressHelper:
'Konteyner uygulamaları için konteyner adresini, ana makine veya harici uygulamalar için harici adresi kullanın.',
externalAddress: 'Harici adres',
deploymentNameHelper:
'Uygulama örneğinin adı, kurulum dizininde kullanılır ve oluşturulduktan sonra değiştirilemez. Görünen adı değiştirmek için takma ad belirleyin.',
deploymentAliasHelper:
'Listede gösterilecek isteğe bağlı ad. Boş bırakılırsa uygulama adı kullanılır. Yalnızca takma adı değiştirmek konteyneri yeniden başlatmaz.',
deploymentContainerNameHelper:
'Docker konteyner adı. Varsayılan olarak uygulama adı kullanılır ve ayrı ayarlanabilir. Değiştirilirse konteyner yeniden oluşturulur.',
imageVersion: 'İmaj sürümü',
deployments: 'Model dağıtımı',
files: 'Model hazırlığı',
@@ -3918,9 +3924,6 @@ const message = {
'Bir bulut sağlayıcısı S3 protokolüyle uyumluysa, yedekleme için doğrudan Amazon S3 kullanılabilir.',
domain: 'Hızlandırma alanı',
backupAccount: 'Yedekleme hesabı | Yedekleme hesapları',
backupCACert: 'CA sertifikası (PEM)',
backupCACertHelp:
"Sistem CA'larını kullanmak için boş bırakın. Kendi HTTPS depolamanız için CA sertifikasını yapıştırın. Sertifika doğrulaması her zaman etkindir.",
loadBucket: 'Kova al',
accountName: 'Hesap adı',
accountKey: 'Hesap anahtarı',
+5 -2
View File
@@ -1074,6 +1074,11 @@ const message = {
serviceAPIHelper: '此服務提供 OpenAI 相容介面。',
serviceAddressHelper: '容器內應用程式使用容器位址,本機或外部應用程式使用外部位址。',
externalAddress: '外部存取位址',
deploymentNameHelper: '應用程式執行個體名稱,用於安裝目錄,建立後無法修改。如需調整顯示名稱,請設定別名。',
deploymentAliasHelper:
'選填,用於清單顯示,可隨時修改;留空時顯示應用程式名稱。僅修改別名不會重新啟動容器。',
deploymentContainerNameHelper:
'Docker 容器名稱,預設與應用程式名稱相同,可另外設定。修改後會重新建立容器。',
imageVersion: '映像版本',
deployments: '模型部署',
files: '模型準備',
@@ -3617,8 +3622,6 @@ const message = {
backupAlert: '理論上只要雲廠商相容 S3 協議,就可以用現有的亞馬遜 S3 雲端儲存來備份,詳細設定請參考 ',
domain: '加速域名',
backupAccount: '備份帳號',
backupCACert: 'CA 憑證(PEM)',
backupCACertHelp: '留空時使用系統信任的 CA。自架 HTTPS 儲存服務可貼上 CA 憑證,憑證驗證始終開啟。',
loadBucket: '取得桶',
accountName: '帳戶名稱',
accountKey: '帳戶金鑰',
+3 -2
View File
@@ -1087,6 +1087,9 @@ const message = {
serviceAPIHelper: '该服务提供 OpenAI 兼容接口。',
serviceAddressHelper: '容器内应用使用容器地址,本机或外部应用使用外部地址。',
externalAddress: '外部访问地址',
deploymentNameHelper: '应用实例名称,用于安装目录,创建后不可修改。需要调整展示名称时,请设置别名。',
deploymentAliasHelper: '选填,用于列表展示,可随时修改;留空时显示应用名称。仅修改别名不会重启容器。',
deploymentContainerNameHelper: 'Docker 容器名称,默认与应用名称相同,可单独设置。修改后会重新创建容器。',
imageVersion: '镜像版本',
deployments: '模型部署',
files: '模型准备',
@@ -3643,8 +3646,6 @@ const message = {
backupAlert: '理论上只要云厂商兼容 S3 协议,就可以用现有的亚马逊 S3 云存储来备份,具体配置参考',
domain: '加速域名',
backupAccount: '备份账号',
backupCACert: 'CA 证书(PEM)',
backupCACertHelp: '留空时使用系统信任的 CA。自建 HTTPS 存储可粘贴其 CA 证书,证书校验始终开启。',
loadBucket: '获取桶',
accountName: '账户名称',
accountKey: '账户密钥',
@@ -184,15 +184,6 @@
</template>
</el-input>
</el-form-item>
<el-form-item v-if="supportsCustomCA" :label="$t('setting.backupCACert')" prop="varsJson.caCertPEM">
<el-input
v-model="dialogData.rowData!.varsJson['caCertPEM']"
type="textarea"
:rows="5"
:spellcheck="false"
/>
<span class="input-help">{{ $t('setting.backupCACertHelp') }}</span>
</el-form-item>
<el-form-item v-if="hasAccessKey()" label="Bucket" prop="bucket" :rules="Rules.requiredInput">
<el-checkbox v-model="dialogData.rowData!.bucketInput" :label="$t('container.input')" />
<el-input clearable v-if="dialogData.rowData!.bucketInput" v-model="dialogData.rowData!.bucket" />
@@ -461,27 +452,10 @@ const dialogData = ref<DialogProps>({
title: '',
});
const supportsCustomCA = computed(() => {
const row = dialogData.value.rowData;
if (!row) return false;
if (row.type === 'S3' || row.type === 'MINIO') return domainProto.value === 'https';
return row.type === 'WebDAV' && /^https:\/\//i.test(String(row.varsJson?.['address'] || '').trim());
});
const formWatcher = computed(() => {
const { type, isPublic, accessKey, bucket, credential, backupPath, bucketInput, varsJson } =
dialogData.value.rowData || {};
return {
type,
isPublic,
accessKey,
bucket,
credential,
backupPath,
bucketInput,
varsJson,
protocol: domainProto.value,
};
return { type, isPublic, accessKey, bucket, credential, backupPath, bucketInput, varsJson };
});
const startWatcher = () => {
if (stopWatch.value) {