diff --git a/internal/deployer/huaweicloud_cdn.go b/internal/deployer/huaweicloud_cdn.go index b6429be3..bf87fb89 100644 --- a/internal/deployer/huaweicloud_cdn.go +++ b/internal/deployer/huaweicloud_cdn.go @@ -7,24 +7,53 @@ import ( "time" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/global" - cdn "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v2" - cdnModel "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v2/model" - cdnRegion "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v2/region" + hcCdn "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v2" + hcCdnModel "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v2/model" + hcCdnRegion "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v2/region" "github.com/usual2970/certimate/internal/domain" - uploader "github.com/usual2970/certimate/internal/pkg/core/uploader" + "github.com/usual2970/certimate/internal/pkg/core/uploader" "github.com/usual2970/certimate/internal/pkg/utils/cast" ) type HuaweiCloudCDNDeployer struct { option *DeployerOption infos []string + + sdkClient *hcCdn.CdnClient + sslUploader uploader.Uploader } func NewHuaweiCloudCDNDeployer(option *DeployerOption) (Deployer, error) { + access := &domain.HuaweiCloudAccess{} + if err := json.Unmarshal([]byte(option.Access), access); err != nil { + return nil, err + } + + client, err := (&HuaweiCloudCDNDeployer{}).createSdkClient( + option.DeployConfig.GetConfigAsString("region"), + access.AccessKeyId, + access.SecretAccessKey, + ) + if err != nil { + return nil, err + } + + // TODO: SCM 服务与 DNS 服务所支持的区域可能不一致,这里暂时不传而是使用默认值,仅支持华为云国内版 + uploader, err := uploader.NewHuaweiCloudSCMUploader(&uploader.HuaweiCloudSCMUploaderConfig{ + Region: "", + AccessKeyId: access.AccessKeyId, + SecretAccessKey: access.SecretAccessKey, + }) + if err != nil { + return nil, err + } + return &HuaweiCloudCDNDeployer{ - option: option, - infos: make([]string, 0), + option: option, + infos: make([]string, 0), + sdkClient: client, + sslUploader: uploader, }, nil } @@ -37,25 +66,12 @@ func (d *HuaweiCloudCDNDeployer) GetInfo() []string { } func (d *HuaweiCloudCDNDeployer) Deploy(ctx context.Context) error { - access := &domain.HuaweiCloudAccess{} - if err := json.Unmarshal([]byte(d.option.Access), access); err != nil { - return err - } - - // TODO: CDN 服务与 DNS 服务所支持的区域可能不一致,这里暂时不传而是使用默认值,仅支持华为云国内版 - client, err := d.createClient("", access.AccessKeyId, access.SecretAccessKey) - if err != nil { - return err - } - - d.infos = append(d.infos, toStr("SDK 客户端创建成功", nil)) - // 查询加速域名配置 // REF: https://support.huaweicloud.com/api-cdn/ShowDomainFullConfig.html - showDomainFullConfigReq := &cdnModel.ShowDomainFullConfigRequest{ + showDomainFullConfigReq := &hcCdnModel.ShowDomainFullConfigRequest{ DomainName: d.option.DeployConfig.GetConfigAsString("domain"), } - showDomainFullConfigResp, err := client.ShowDomainFullConfig(showDomainFullConfigReq) + showDomainFullConfigResp, err := d.sdkClient.ShowDomainFullConfig(showDomainFullConfigReq) if err != nil { return err } @@ -68,19 +84,10 @@ func (d *HuaweiCloudCDNDeployer) Deploy(ctx context.Context) error { updateDomainMultiCertificatesReqBodyContent := &huaweicloudCDNUpdateDomainMultiCertificatesRequestBodyContent{} updateDomainMultiCertificatesReqBodyContent.DomainName = d.option.DeployConfig.GetConfigAsString("domain") updateDomainMultiCertificatesReqBodyContent.HttpsSwitch = 1 - var updateDomainMultiCertificatesResp *cdnModel.UpdateDomainMultiCertificatesResponse + var updateDomainMultiCertificatesResp *hcCdnModel.UpdateDomainMultiCertificatesResponse if d.option.DeployConfig.GetConfigAsBool("useSCM") { - uploader, err := uploader.NewHuaweiCloudSCMUploader(&uploader.HuaweiCloudSCMUploaderConfig{ - Region: "", // TODO: SCM 服务与 DNS 服务所支持的区域可能不一致,这里暂时不传而是使用默认值,仅支持华为云国内版 - AccessKeyId: access.AccessKeyId, - SecretAccessKey: access.SecretAccessKey, - }) - if err != nil { - return err - } - // 上传证书到 SCM - uploadResult, err := uploader.Upload(ctx, d.option.Certificate.Certificate, d.option.Certificate.PrivateKey) + uploadResult, err := d.sslUploader.Upload(ctx, d.option.Certificate.Certificate, d.option.Certificate.PrivateKey) if err != nil { return err } @@ -102,7 +109,7 @@ func (d *HuaweiCloudCDNDeployer) Deploy(ctx context.Context) error { Https: updateDomainMultiCertificatesReqBodyContent, }, } - updateDomainMultiCertificatesResp, err = executeHuaweiCloudCDNUploadDomainMultiCertificates(client, updateDomainMultiCertificatesReq) + updateDomainMultiCertificatesResp, err = executeHuaweiCloudCDNUploadDomainMultiCertificates(d.sdkClient, updateDomainMultiCertificatesReq) if err != nil { return err } @@ -112,7 +119,11 @@ func (d *HuaweiCloudCDNDeployer) Deploy(ctx context.Context) error { return nil } -func (d *HuaweiCloudCDNDeployer) createClient(region, accessKeyId, secretAccessKey string) (*cdn.CdnClient, error) { +func (d *HuaweiCloudCDNDeployer) createSdkClient(region, accessKeyId, secretAccessKey string) (*hcCdn.CdnClient, error) { + if region == "" { + region = "cn-north-1" // CDN 服务默认区域:华北一北京 + } + auth, err := global.NewCredentialsBuilder(). WithAk(accessKeyId). WithSk(secretAccessKey). @@ -121,16 +132,12 @@ func (d *HuaweiCloudCDNDeployer) createClient(region, accessKeyId, secretAccessK return nil, err } - if region == "" { - region = "cn-north-1" // CDN 服务默认区域:华北一北京 - } - - hcRegion, err := cdnRegion.SafeValueOf(region) + hcRegion, err := hcCdnRegion.SafeValueOf(region) if err != nil { return nil, err } - hcClient, err := cdn.CdnClientBuilder(). + hcClient, err := hcCdn.CdnClientBuilder(). WithRegion(hcRegion). WithCredential(auth). SafeBuild() @@ -138,12 +145,12 @@ func (d *HuaweiCloudCDNDeployer) createClient(region, accessKeyId, secretAccessK return nil, err } - client := cdn.NewCdnClient(hcClient) + client := hcCdn.NewCdnClient(hcClient) return client, nil } type huaweicloudCDNUpdateDomainMultiCertificatesRequestBodyContent struct { - cdnModel.UpdateDomainMultiCertificatesRequestBodyContent `json:",inline"` + hcCdnModel.UpdateDomainMultiCertificatesRequestBodyContent `json:",inline"` SCMCertificateId *string `json:"scm_certificate_id,omitempty"` } @@ -156,20 +163,20 @@ type huaweicloudCDNUpdateDomainMultiCertificatesRequest struct { Body *huaweicloudCDNUpdateDomainMultiCertificatesRequestBody `json:"body,omitempty"` } -func executeHuaweiCloudCDNUploadDomainMultiCertificates(client *cdn.CdnClient, request *huaweicloudCDNUpdateDomainMultiCertificatesRequest) (*cdnModel.UpdateDomainMultiCertificatesResponse, error) { +func executeHuaweiCloudCDNUploadDomainMultiCertificates(client *hcCdn.CdnClient, request *huaweicloudCDNUpdateDomainMultiCertificatesRequest) (*hcCdnModel.UpdateDomainMultiCertificatesResponse, error) { // 华为云官方 SDK 中目前提供的字段缺失,这里暂时先需自定义请求 // 可能需要等之后 SDK 更新 - requestDef := cdn.GenReqDefForUpdateDomainMultiCertificates() + requestDef := hcCdn.GenReqDefForUpdateDomainMultiCertificates() if resp, err := client.HcClient.Sync(request, requestDef); err != nil { return nil, err } else { - return resp.(*cdnModel.UpdateDomainMultiCertificatesResponse), nil + return resp.(*hcCdnModel.UpdateDomainMultiCertificatesResponse), nil } } -func mergeHuaweiCloudCDNConfig(src *cdnModel.ConfigsGetBody, dest *huaweicloudCDNUpdateDomainMultiCertificatesRequestBodyContent) *huaweicloudCDNUpdateDomainMultiCertificatesRequestBodyContent { +func mergeHuaweiCloudCDNConfig(src *hcCdnModel.ConfigsGetBody, dest *huaweicloudCDNUpdateDomainMultiCertificatesRequestBodyContent) *huaweicloudCDNUpdateDomainMultiCertificatesRequestBodyContent { if src == nil { return dest } @@ -186,7 +193,7 @@ func mergeHuaweiCloudCDNConfig(src *cdnModel.ConfigsGetBody, dest *huaweicloudCD } if src.ForceRedirect != nil { - dest.ForceRedirectConfig = &cdnModel.ForceRedirect{} + dest.ForceRedirectConfig = &hcCdnModel.ForceRedirect{} if src.ForceRedirect.Status == "on" { dest.ForceRedirectConfig.Switch = 1 diff --git a/internal/pkg/core/uploader/uploader.go b/internal/pkg/core/uploader/uploader.go index 7694cfcf..87a4d633 100644 --- a/internal/pkg/core/uploader/uploader.go +++ b/internal/pkg/core/uploader/uploader.go @@ -9,13 +9,13 @@ type Uploader interface { // 上传证书。 // // 入参: - // - ctx: - // - certPem:证书 PEM 内容 - // - privkeyPem:私钥 PEM 内容 + // - ctx:上下文。 + // - certPem:证书 PEM 内容。 + // - privkeyPem:私钥 PEM 内容。 // // 出参: - // - res: - // - err: + // - res:上传结果。 + // - err: 错误。 Upload(ctx context.Context, certPem string, privkeyPem string) (res *UploadResult, err error) } diff --git a/internal/pkg/core/uploader/uploader_aliyun_cas.go b/internal/pkg/core/uploader/uploader_aliyun_cas.go index 95ef9c57..64d2e94c 100644 --- a/internal/pkg/core/uploader/uploader_aliyun_cas.go +++ b/internal/pkg/core/uploader/uploader_aliyun_cas.go @@ -26,8 +26,12 @@ type AliyunCASUploader struct { sdkRuntime *util.RuntimeOptions } -func NewAliyunCASUploader(config *AliyunCASUploaderConfig) (*AliyunCASUploader, error) { - client, err := (&AliyunCASUploader{config: config}).createSdkClient() +func NewAliyunCASUploader(config *AliyunCASUploaderConfig) (Uploader, error) { + client, err := (&AliyunCASUploader{}).createSdkClient( + config.Region, + config.AccessKeyId, + config.AccessKeySecret, + ) if err != nil { return nil, fmt.Errorf("failed to create sdk client: %w", err) } @@ -98,11 +102,11 @@ func (u *AliyunCASUploader) Upload(ctx context.Context, certPem string, privkeyP if listUserCertificateOrderResp.Body.CertificateOrderList == nil || len(listUserCertificateOrderResp.Body.CertificateOrderList) < int(listUserCertificateOrderLimit) { break - } - - listUserCertificateOrderPage += 1 - if listUserCertificateOrderPage > 99 { // 避免死循环 - break + } else { + listUserCertificateOrderPage += 1 + if listUserCertificateOrderPage > 99 { // 避免死循环 + break + } } } @@ -129,10 +133,7 @@ func (u *AliyunCASUploader) Upload(ctx context.Context, certPem string, privkeyP }, nil } -func (u *AliyunCASUploader) createSdkClient() (*cas20200407.Client, error) { - region := u.config.Region - accessKeyId := u.config.AccessKeyId - accessKeySecret := u.config.AccessKeySecret +func (u *AliyunCASUploader) createSdkClient(region, accessKeyId, accessKeySecret string) (*cas20200407.Client, error) { if region == "" { region = "cn-hangzhou" // CAS 服务默认区域:华东一杭州 } diff --git a/internal/pkg/core/uploader/uploader_huaweicloud_elb.go b/internal/pkg/core/uploader/uploader_huaweicloud_elb.go index 859b844a..5eb60d88 100644 --- a/internal/pkg/core/uploader/uploader_huaweicloud_elb.go +++ b/internal/pkg/core/uploader/uploader_huaweicloud_elb.go @@ -26,8 +26,12 @@ type HuaweiCloudELBUploader struct { sdkClient *hcElb.ElbClient } -func NewHuaweiCloudELBUploader(config *HuaweiCloudELBUploaderConfig) (*HuaweiCloudELBUploader, error) { - client, err := (&HuaweiCloudELBUploader{config: config}).createSdkClient() +func NewHuaweiCloudELBUploader(config *HuaweiCloudELBUploaderConfig) (Uploader, error) { + client, err := (&HuaweiCloudELBUploader{}).createSdkClient( + config.Region, + config.AccessKeyId, + config.SecretAccessKey, + ) if err != nil { return nil, fmt.Errorf("failed to create sdk client: %w", err) } @@ -87,12 +91,12 @@ func (u *HuaweiCloudELBUploader) Upload(ctx context.Context, certPem string, pri if listCertificatesResp.Certificates == nil || len(*listCertificatesResp.Certificates) < int(listCertificatesLimit) { break - } - - listCertificatesMarker = listCertificatesResp.PageInfo.NextMarker - listCertificatesPage++ - if listCertificatesPage >= 9 { // 避免死循环 - break + } else { + listCertificatesMarker = listCertificatesResp.PageInfo.NextMarker + listCertificatesPage++ + if listCertificatesPage >= 9 { // 避免死循环 + break + } } } @@ -125,10 +129,7 @@ func (u *HuaweiCloudELBUploader) Upload(ctx context.Context, certPem string, pri }, nil } -func (u *HuaweiCloudELBUploader) createSdkClient() (*hcElb.ElbClient, error) { - region := u.config.Region - accessKeyId := u.config.AccessKeyId - secretAccessKey := u.config.SecretAccessKey +func (u *HuaweiCloudELBUploader) createSdkClient(region, accessKeyId, secretAccessKey string) (*hcElb.ElbClient, error) { if region == "" { region = "cn-north-4" // ELB 服务默认区域:华北四北京 } diff --git a/internal/pkg/core/uploader/uploader_huaweicloud_scm.go b/internal/pkg/core/uploader/uploader_huaweicloud_scm.go index f397ca29..30864a48 100644 --- a/internal/pkg/core/uploader/uploader_huaweicloud_scm.go +++ b/internal/pkg/core/uploader/uploader_huaweicloud_scm.go @@ -25,8 +25,12 @@ type HuaweiCloudSCMUploader struct { sdkClient *hcScm.ScmClient } -func NewHuaweiCloudSCMUploader(config *HuaweiCloudSCMUploaderConfig) (*HuaweiCloudSCMUploader, error) { - client, err := (&HuaweiCloudSCMUploader{config: config}).createSdkClient() +func NewHuaweiCloudSCMUploader(config *HuaweiCloudSCMUploaderConfig) (Uploader, error) { + client, err := (&HuaweiCloudSCMUploader{}).createSdkClient( + config.Region, + config.AccessKeyId, + config.SecretAccessKey, + ) if err != nil { return nil, fmt.Errorf("failed to create sdk client: %w", err) } @@ -99,12 +103,12 @@ func (u *HuaweiCloudSCMUploader) Upload(ctx context.Context, certPem string, pri if listCertificatesResp.Certificates == nil || len(*listCertificatesResp.Certificates) < int(listCertificatesLimit) { break - } - - listCertificatesOffset += listCertificatesLimit - listCertificatesPage += 1 - if listCertificatesPage > 99 { // 避免死循环 - break + } else { + listCertificatesOffset += listCertificatesLimit + listCertificatesPage += 1 + if listCertificatesPage > 99 { // 避免死循环 + break + } } } @@ -133,10 +137,7 @@ func (u *HuaweiCloudSCMUploader) Upload(ctx context.Context, certPem string, pri }, nil } -func (u *HuaweiCloudSCMUploader) createSdkClient() (*hcScm.ScmClient, error) { - region := u.config.Region - accessKeyId := u.config.AccessKeyId - secretAccessKey := u.config.SecretAccessKey +func (u *HuaweiCloudSCMUploader) createSdkClient(region, accessKeyId, secretAccessKey string) (*hcScm.ScmClient, error) { if region == "" { region = "cn-north-4" // SCM 服务默认区域:华北四北京 } diff --git a/internal/pkg/core/uploader/uploader_tencentcloud_ssl.go b/internal/pkg/core/uploader/uploader_tencentcloud_ssl.go index e099fe1a..2a34e5e6 100644 --- a/internal/pkg/core/uploader/uploader_tencentcloud_ssl.go +++ b/internal/pkg/core/uploader/uploader_tencentcloud_ssl.go @@ -23,8 +23,12 @@ type TencentCloudSSLUploader struct { sdkClient *tcSsl.Client } -func NewTencentCloudSSLUploader(config *TencentCloudSSLUploaderConfig) (*TencentCloudSSLUploader, error) { - client, err := (&TencentCloudSSLUploader{config: config}).createSdkClient() +func NewTencentCloudSSLUploader(config *TencentCloudSSLUploaderConfig) (Uploader, error) { + client, err := (&TencentCloudSSLUploader{}).createSdkClient( + config.Region, + config.SecretId, + config.SecretKey, + ) if err != nil { return nil, fmt.Errorf("failed to create sdk client: %w", err) } @@ -73,10 +77,7 @@ func (u *TencentCloudSSLUploader) Upload(ctx context.Context, certPem string, pr }, nil } -func (u *TencentCloudSSLUploader) createSdkClient() (*tcSsl.Client, error) { - region := u.config.Region - secretId := u.config.SecretId - secretKey := u.config.SecretKey +func (u *TencentCloudSSLUploader) createSdkClient(region, secretId, secretKey string) (*tcSsl.Client, error) { if region == "" { region = "ap-guangzhou" // SSL 服务默认区域:广州 } diff --git a/internal/pkg/utils/x509/x509.go b/internal/pkg/utils/x509/x509.go index ca467478..5bc3f287 100644 --- a/internal/pkg/utils/x509/x509.go +++ b/internal/pkg/utils/x509/x509.go @@ -12,8 +12,8 @@ import ( // - certPem: 证书 PEM 内容。 // // 出参: -// - cert: -// - err: +// - cert: x509.Certificate 对象。 +// - err: 错误。 func ParseCertificateFromPEM(certPem string) (cert *x509.Certificate, err error) { pemData := []byte(certPem) diff --git a/ui/src/components/certimate/DeployToAliyunOSS.tsx b/ui/src/components/certimate/DeployToAliyunOSS.tsx index 7a79da2c..160cd5a6 100644 --- a/ui/src/components/certimate/DeployToAliyunOSS.tsx +++ b/ui/src/components/certimate/DeployToAliyunOSS.tsx @@ -64,15 +64,15 @@ const DeployToAliyunOSS = () => { }); const bucketSchema = z.string().min(1, { - message: t("domain.deployment.form.oss_bucket.placeholder"), + message: t("domain.deployment.form.aliyun_oss_bucket.placeholder"), }); return (
- + { @@ -91,9 +91,9 @@ const DeployToAliyunOSS = () => {
- + { diff --git a/ui/src/components/certimate/DeployToHuaweiCloudCDN.tsx b/ui/src/components/certimate/DeployToHuaweiCloudCDN.tsx index 4e61c652..738fd4a9 100644 --- a/ui/src/components/certimate/DeployToHuaweiCloudCDN.tsx +++ b/ui/src/components/certimate/DeployToHuaweiCloudCDN.tsx @@ -37,6 +37,23 @@ const DeployToHuaweiCloudCDN = () => { return (
+
+ + { + const newData = produce(data, (draft) => { + draft.config ??= {}; + draft.config.region = e.target.value; + }); + setDeploy(newData); + }} + /> +
{error?.domain}
+
+
{ }); const bucketSchema = z.string().min(1, { - message: t("domain.deployment.form.cos_region.placeholder"), + message: t("domain.deployment.form.tencent_cos_region.placeholder"), }); return (
- + { @@ -91,9 +91,9 @@ const DeployToTencentCOS = () => {
- + { diff --git a/ui/src/i18n/locales/en/nls.domain.json b/ui/src/i18n/locales/en/nls.domain.json index 98d7dcce..4bd4b837 100644 --- a/ui/src/i18n/locales/en/nls.domain.json +++ b/ui/src/i18n/locales/en/nls.domain.json @@ -54,12 +54,18 @@ "domain.deployment.form.access.label": "Access Configuration", "domain.deployment.form.access.placeholder": "Please select provider authorization configuration", "domain.deployment.form.access.list": "Provider Authorization Configurations", - "domain.deployment.form.cos_region.label": "Region", - "domain.deployment.form.cos_region.placeholder": "Please enter region, e.g. ap-guangzhou", - "domain.deployment.form.cos_bucket.label": "Bucket", - "domain.deployment.form.cos_bucket.placeholder": "Please enter bucket, e.g. example-1250000000", "domain.deployment.form.domain.label": "Deploy to domain (Single domain only, not wildcard domain)", "domain.deployment.form.domain.placeholder": "Please enter domain to be deployed", + "domain.deployment.form.aliyun_oss_endpoint.label": "Endpoint", + "domain.deployment.form.aliyun_oss_endpoint.placeholder": "Please enter endpoint", + "domain.deployment.form.aliyun_oss_bucket.label": "Bucket", + "domain.deployment.form.aliyun_oss_bucket.placeholder": "Please enter bucket", + "domain.deployment.form.tencent_cos_region.label": "Region", + "domain.deployment.form.tencent_cos_region.placeholder": "Please enter region (e.g. ap-guangzhou)", + "domain.deployment.form.tencent_cos_bucket.label": "Bucket", + "domain.deployment.form.tencent_cos_bucket.placeholder": "Please enter bucket", + "domain.deployment.form.huaweicloud_elb_region.label": "Region", + "domain.deployment.form.huaweicloud_elb_region.placeholder": "Please enter region (e.g. cn-north-1)", "domain.deployment.form.ssh_key_path.label": "Private Key Save Path", "domain.deployment.form.ssh_key_path.placeholder": "Please enter private key save path", "domain.deployment.form.ssh_cert_path.label": "Certificate Save Path", @@ -68,10 +74,6 @@ "domain.deployment.form.ssh_pre_command.placeholder": "Command to be executed before deploying the certificate", "domain.deployment.form.ssh_command.label": "Command", "domain.deployment.form.ssh_command.placeholder": "Please enter command", - "domain.deployment.form.oss_endpoint.label": "Endpoint", - "domain.deployment.form.oss_endpoint.placeholder": "Please enter endpoint", - "domain.deployment.form.oss_bucket.label": "Bucket", - "domain.deployment.form.oss_bucket.placeholder": "Please enter bucket", "domain.deployment.form.k8s_namespace.label": "Namespace", "domain.deployment.form.k8s_namespace.placeholder": "Please enter namespace", "domain.deployment.form.k8s_secret_name.label": "Secret Name", diff --git a/ui/src/i18n/locales/zh/nls.domain.json b/ui/src/i18n/locales/zh/nls.domain.json index 861b9259..9a670d1d 100644 --- a/ui/src/i18n/locales/zh/nls.domain.json +++ b/ui/src/i18n/locales/zh/nls.domain.json @@ -54,12 +54,18 @@ "domain.deployment.form.access.label": "授权配置", "domain.deployment.form.access.placeholder": "请选择授权配置", "domain.deployment.form.access.list": "服务商授权配置列表", - "domain.deployment.form.cos_region.label": "region", - "domain.deployment.form.cos_region.placeholder": "请输入 region, 如 ap-guangzhou", - "domain.deployment.form.cos_bucket.label": "存储桶", - "domain.deployment.form.cos_bucket.placeholder": "请输入存储桶名, 如 example-1250000000", "domain.deployment.form.domain.label": "部署到域名(仅支持单个域名;不支持泛域名)", "domain.deployment.form.domain.placeholder": "请输入部署到的域名", + "domain.deployment.form.aliyun_oss_endpoint.label": "Endpoint", + "domain.deployment.form.aliyun_oss_endpoint.placeholder": "请输入 Endpoint", + "domain.deployment.form.aliyun_oss_bucket.label": "存储桶", + "domain.deployment.form.aliyun_oss_bucket.placeholder": "请输入存储桶名", + "domain.deployment.form.tencent_cos_region.label": "地域", + "domain.deployment.form.tencent_cos_region.placeholder": "请输入地域(如 ap-guangzhou)", + "domain.deployment.form.tencent_cos_bucket.label": "存储桶", + "domain.deployment.form.tencent_cos_bucket.placeholder": "请输入存储桶名", + "domain.deployment.form.huaweicloud_elb_region.label": "地域", + "domain.deployment.form.huaweicloud_elb_region.placeholder": "请输入地域(如 cn-north-1)", "domain.deployment.form.ssh_key_path.label": "私钥保存路径", "domain.deployment.form.ssh_key_path.placeholder": "请输入私钥保存路径", "domain.deployment.form.ssh_cert_path.label": "证书保存路径", @@ -68,10 +74,6 @@ "domain.deployment.form.ssh_pre_command.placeholder": "在部署证书前执行的命令", "domain.deployment.form.ssh_command.label": "命令", "domain.deployment.form.ssh_command.placeholder": "请输入要执行的命令", - "domain.deployment.form.oss_endpoint.label": "Endpoint", - "domain.deployment.form.oss_endpoint.placeholder": "请输入 Endpoint", - "domain.deployment.form.oss_bucket.label": "存储桶", - "domain.deployment.form.oss_bucket.placeholder": "请输入存储桶名", "domain.deployment.form.k8s_namespace.label": "命名空间", "domain.deployment.form.k8s_namespace.placeholder": "请输入 K8S 命名空间", "domain.deployment.form.k8s_secret_name.label": "Secret 名称",