diff --git a/README.md b/README.md
index 6f90fb32..9a377b9d 100644
--- a/README.md
+++ b/README.md
@@ -126,7 +126,7 @@ make local.run
| [腾讯云](https://cloud.tencent.com/) | 可部署到腾讯云 COS、CDN、ECDN、EdgeOne、CLB、CSS 等服务 |
| [百度智能云](https://cloud.baidu.com/) | 可部署到百度智能云 CDN 等服务 |
| [华为云](https://www.huaweicloud.com/) | 可部署到华为云 CDN、ELB 等服务 |
-| [火山引擎](https://www.volcengine.com/) | 可部署到火山引擎 TOS、CDN、DCDN、CLB、Live 等服务 |
+| [火山引擎](https://www.volcengine.com/) | 可部署到火山引擎 TOS、CDN、DCDN、CLB、ImageX、Live 等服务 |
| [七牛云](https://www.qiniu.com/) | 可部署到七牛云 CDN、直播云等服务 |
| [多吉云](https://www.dogecloud.com/) | 可部署到多吉云 CDN |
| [优刻得](https://www.ucloud.cn/) | 可部署到优刻得 US3、UCDN 等服务 |
diff --git a/README_EN.md b/README_EN.md
index d5300b07..47c654f2 100644
--- a/README_EN.md
+++ b/README_EN.md
@@ -125,7 +125,7 @@ The following hosting providers are supported:
| [Tencent Cloud](https://www.tencentcloud.com/) | Supports deployment to Tencent Cloud COS, CDN, ECDN, EdgeOne, CLB, CSS |
| [Baidu AI Cloud](https://intl.cloud.baidu.com/) | Supports deployment to Baidu AI CLoud CDN |
| [Huawei Cloud](https://www.huaweicloud.com/) | Supports deployment to Huawei Cloud CDN, ELB |
-| [Volcengine](https://www.volcengine.com/) | Supports deployment to Volcengine TOS, CDN, DCDN, CLB, Live |
+| [Volcengine](https://www.volcengine.com/) | Supports deployment to Volcengine TOS, CDN, DCDN, CLB, ImageX, Live |
| [Qiniu Cloud](https://www.qiniu.com/) | Supports deployment to Qiniu Cloud CDN, Pili |
| [Doge Cloud](https://www.dogecloud.com/) | Supports deployment to Doge Cloud CDN |
| [BaoTa Panel](https://www.bt.cn/) | Supports deployment to BaoTa Panel sites |
diff --git a/go.mod b/go.mod
index d3280f69..18045029 100644
--- a/go.mod
+++ b/go.mod
@@ -40,7 +40,7 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1096
github.com/ucloud/ucloud-sdk-go v0.22.31
github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.9
- github.com/volcengine/volc-sdk-golang v1.0.194
+ github.com/volcengine/volc-sdk-golang v1.0.195
github.com/volcengine/volcengine-go-sdk v1.0.180
golang.org/x/crypto v0.33.0
golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac
@@ -62,6 +62,7 @@ require (
github.com/alibabacloud-go/tea-oss-sdk v1.1.3 // indirect
github.com/alibabacloud-go/tea-oss-utils v1.1.0 // indirect
github.com/alibabacloud-go/tea-utils/v2 v2.0.7 // indirect
+ github.com/avast/retry-go v3.0.0+incompatible // indirect
github.com/aws/aws-sdk-go-v2/service/route53 v1.48.1 // indirect
github.com/blinkbean/dingtalk v1.1.3 // indirect
github.com/emicklei/go-restful/v3 v3.12.1 // indirect
diff --git a/go.sum b/go.sum
index e9239294..a9edfa88 100644
--- a/go.sum
+++ b/go.sum
@@ -205,6 +205,7 @@ github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgI
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
+github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0=
github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
@@ -850,6 +851,8 @@ github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.9/go.mod h1:IrjK84IJJTuOZOTMv/P1
github.com/volcengine/volc-sdk-golang v1.0.23/go.mod h1:AfG/PZRUkHJ9inETvbjNifTDgut25Wbkm2QoYBTbvyU=
github.com/volcengine/volc-sdk-golang v1.0.194 h1:3o0INQzdtYJWvdGrtX02booCqPL5TsWSq2W1Ur7Bzlo=
github.com/volcengine/volc-sdk-golang v1.0.194/go.mod h1:u0VtPvlXWpXDTmc9IHkaW1q+5Jjwus4oAqRhNMDRInE=
+github.com/volcengine/volc-sdk-golang v1.0.195 h1:hKX4pBhmKcB3652BTdcAmtgizEPBnoQUpTM+j5blMA4=
+github.com/volcengine/volc-sdk-golang v1.0.195/go.mod h1:stZX+EPgv1vF4nZwOlEe8iGcriUPRBKX8zA19gXycOQ=
github.com/volcengine/volcengine-go-sdk v1.0.180 h1:lzcNlaxeGIUdXgDuVH7KJwZYZjIZzaCAYPDh91htU6U=
github.com/volcengine/volcengine-go-sdk v1.0.180/go.mod h1:gfEDc1s7SYaGoY+WH2dRrS3qiuDJMkwqyfXWCa7+7oA=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
diff --git a/internal/deployer/providers.go b/internal/deployer/providers.go
index a9878f8a..d6e149ed 100644
--- a/internal/deployer/providers.go
+++ b/internal/deployer/providers.go
@@ -41,6 +41,7 @@ import (
providerVolcEngineCDN "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-cdn"
providerVolcEngineCLB "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-clb"
providerVolcEngineDCDN "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-dcdn"
+ providerVolcEngineImageX "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-imagex"
providerVolcEngineLive "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-live"
providerVolcEngineTOS "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-tos"
providerWebhook "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/webhook"
@@ -515,7 +516,7 @@ func createDeployer(options *deployerOptions) (deployer.Deployer, logger.Logger,
}
}
- case domain.DeployProviderTypeVolcEngineCDN, domain.DeployProviderTypeVolcEngineCLB, domain.DeployProviderTypeVolcEngineDCDN, domain.DeployProviderTypeVolcEngineLive, domain.DeployProviderTypeVolcEngineTOS:
+ case domain.DeployProviderTypeVolcEngineCDN, domain.DeployProviderTypeVolcEngineCLB, domain.DeployProviderTypeVolcEngineDCDN, domain.DeployProviderTypeVolcEngineImageX, domain.DeployProviderTypeVolcEngineLive, domain.DeployProviderTypeVolcEngineTOS:
{
access := domain.AccessConfigForVolcEngine{}
if err := maps.Populate(options.ProviderAccessConfig, &access); err != nil {
@@ -549,6 +550,16 @@ func createDeployer(options *deployerOptions) (deployer.Deployer, logger.Logger,
}, logger)
return deployer, logger, err
+ case domain.DeployProviderTypeVolcEngineImageX:
+ deployer, err := providerVolcEngineImageX.NewWithLogger(&providerVolcEngineImageX.VolcEngineImageXDeployerConfig{
+ AccessKeyId: access.AccessKeyId,
+ AccessKeySecret: access.SecretAccessKey,
+ Region: maps.GetValueAsString(options.ProviderDeployConfig, "region"),
+ ServiceId: maps.GetValueAsString(options.ProviderDeployConfig, "serviceId"),
+ Domain: maps.GetValueAsString(options.ProviderDeployConfig, "domain"),
+ }, logger)
+ return deployer, logger, err
+
case domain.DeployProviderTypeVolcEngineLive:
deployer, err := providerVolcEngineLive.NewWithLogger(&providerVolcEngineLive.VolcEngineLiveDeployerConfig{
AccessKeyId: access.AccessKeyId,
diff --git a/internal/domain/provider.go b/internal/domain/provider.go
index 350b3926..30c9dab1 100644
--- a/internal/domain/provider.go
+++ b/internal/domain/provider.go
@@ -130,6 +130,7 @@ const (
DeployProviderTypeVolcEngineCDN = DeployProviderType("volcengine-cdn")
DeployProviderTypeVolcEngineCLB = DeployProviderType("volcengine-clb")
DeployProviderTypeVolcEngineDCDN = DeployProviderType("volcengine-dcdn")
+ DeployProviderTypeVolcEngineImageX = DeployProviderType("volcengine-imagex")
DeployProviderTypeVolcEngineLive = DeployProviderType("volcengine-live")
DeployProviderTypeVolcEngineTOS = DeployProviderType("volcengine-tos")
DeployProviderTypeWebhook = DeployProviderType("webhook")
diff --git a/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex.go b/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex.go
new file mode 100644
index 00000000..00102896
--- /dev/null
+++ b/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex.go
@@ -0,0 +1,147 @@
+package volcengineimagex
+
+import (
+ "context"
+ "errors"
+
+ xerrors "github.com/pkg/errors"
+ veBase "github.com/volcengine/volc-sdk-golang/base"
+ veImageX "github.com/volcengine/volc-sdk-golang/service/imagex/v2"
+
+ "github.com/usual2970/certimate/internal/pkg/core/deployer"
+ "github.com/usual2970/certimate/internal/pkg/core/logger"
+ "github.com/usual2970/certimate/internal/pkg/core/uploader"
+ uploaderp "github.com/usual2970/certimate/internal/pkg/core/uploader/providers/volcengine-certcenter"
+)
+
+type VolcEngineImageXDeployerConfig struct {
+ // 火山引擎 AccessKeyId。
+ AccessKeyId string `json:"accessKeyId"`
+ // 火山引擎 AccessKeySecret。
+ AccessKeySecret string `json:"accessKeySecret"`
+ // 火山引擎地域。
+ Region string `json:"region"`
+ // 服务 ID。
+ ServiceId string `json:"serviceId"`
+ // 自定义域名(不支持泛域名)。
+ Domain string `json:"domain"`
+}
+
+type VolcEngineImageXDeployer struct {
+ config *VolcEngineImageXDeployerConfig
+ logger logger.Logger
+ sdkClient *veImageX.Imagex
+ sslUploader uploader.Uploader
+}
+
+var _ deployer.Deployer = (*VolcEngineImageXDeployer)(nil)
+
+func New(config *VolcEngineImageXDeployerConfig) (*VolcEngineImageXDeployer, error) {
+ return NewWithLogger(config, logger.NewNilLogger())
+}
+
+func NewWithLogger(config *VolcEngineImageXDeployerConfig, logger logger.Logger) (*VolcEngineImageXDeployer, error) {
+ if config == nil {
+ return nil, errors.New("config is nil")
+ }
+
+ if logger == nil {
+ return nil, errors.New("logger is nil")
+ }
+
+ client, err := createSdkClient(config.AccessKeyId, config.AccessKeySecret, config.Region)
+ if err != nil {
+ return nil, xerrors.Wrap(err, "failed to create sdk client")
+ }
+
+ uploader, err := uploaderp.New(&uploaderp.VolcEngineCertCenterUploaderConfig{
+ AccessKeyId: config.AccessKeyId,
+ AccessKeySecret: config.AccessKeySecret,
+ Region: config.Region,
+ })
+ if err != nil {
+ return nil, xerrors.Wrap(err, "failed to create ssl uploader")
+ }
+
+ return &VolcEngineImageXDeployer{
+ logger: logger,
+ config: config,
+ sdkClient: client,
+ sslUploader: uploader,
+ }, nil
+}
+
+func (d *VolcEngineImageXDeployer) Deploy(ctx context.Context, certPem string, privkeyPem string) (*deployer.DeployResult, error) {
+ if d.config.ServiceId == "" {
+ return nil, errors.New("config `serviceId` is required")
+ }
+ if d.config.Domain == "" {
+ return nil, errors.New("config `domain` is required")
+ }
+
+ // 上传证书到证书中心
+ upres, err := d.sslUploader.Upload(ctx, certPem, privkeyPem)
+ if err != nil {
+ return nil, xerrors.Wrap(err, "failed to upload certificate file")
+ }
+
+ d.logger.Logt("certificate file uploaded", upres)
+
+ // 获取域名配置
+ // REF: https://www.volcengine.com/docs/508/9366
+ getDomainConfigReq := &veImageX.GetDomainConfigQuery{
+ ServiceID: d.config.ServiceId,
+ DomainName: d.config.Domain,
+ }
+ getDomainConfigResp, err := d.sdkClient.GetDomainConfig(context.TODO(), getDomainConfigReq)
+ if err != nil {
+ return nil, xerrors.Wrap(err, "failed to execute sdk request 'imagex.GetDomainConfig'")
+ } else {
+ d.logger.Logt("已获取域名配置", getDomainConfigResp)
+ }
+
+ // 更新 HTTPS 配置
+ // REF: https://www.volcengine.com/docs/508/66012
+ updateHttpsReq := &veImageX.UpdateHTTPSReq{
+ UpdateHTTPSQuery: &veImageX.UpdateHTTPSQuery{
+ ServiceID: d.config.ServiceId,
+ },
+ UpdateHTTPSBody: &veImageX.UpdateHTTPSBody{
+ Domain: getDomainConfigResp.Result.Domain,
+ HTTPS: &veImageX.UpdateHTTPSBodyHTTPS{
+ CertID: upres.CertId,
+ EnableHTTP2: getDomainConfigResp.Result.HTTPSConfig.EnableHTTP2,
+ EnableHTTPS: getDomainConfigResp.Result.HTTPSConfig.EnableHTTPS,
+ EnableOcsp: getDomainConfigResp.Result.HTTPSConfig.EnableOcsp,
+ TLSVersions: getDomainConfigResp.Result.HTTPSConfig.TLSVersions,
+ EnableForceRedirect: getDomainConfigResp.Result.HTTPSConfig.EnableForceRedirect,
+ ForceRedirectType: getDomainConfigResp.Result.HTTPSConfig.ForceRedirectType,
+ ForceRedirectCode: getDomainConfigResp.Result.HTTPSConfig.ForceRedirectCode,
+ },
+ },
+ }
+ updateHttpsResp, err := d.sdkClient.UpdateHTTPS(context.TODO(), updateHttpsReq)
+ if err != nil {
+ return nil, xerrors.Wrap(err, "failed to execute sdk request 'imagex.UpdateHttps'")
+ } else {
+ d.logger.Logt("已更新 HTTPS 配置", updateHttpsResp)
+ }
+
+ return &deployer.DeployResult{}, nil
+}
+
+func createSdkClient(accessKeyId, accessKeySecret, region string) (*veImageX.Imagex, error) {
+ var instance *veImageX.Imagex
+ if region == "" {
+ instance = veImageX.NewInstance()
+ } else {
+ instance = veImageX.NewInstanceWithRegion(region)
+ }
+
+ instance.SetCredential(veBase.Credentials{
+ AccessKeyID: accessKeyId,
+ SecretAccessKey: accessKeySecret,
+ })
+
+ return instance, nil
+}
diff --git a/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex_test.go b/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex_test.go
new file mode 100644
index 00000000..3e15eec8
--- /dev/null
+++ b/internal/pkg/core/deployer/providers/volcengine-imagex/volcengine_imagex_test.go
@@ -0,0 +1,85 @@
+package volcengineimagex_test
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "os"
+ "strings"
+ "testing"
+
+ provider "github.com/usual2970/certimate/internal/pkg/core/deployer/providers/volcengine-imagex"
+)
+
+var (
+ fInputCertPath string
+ fInputKeyPath string
+ fAccessKeyId string
+ fAccessKeySecret string
+ fRegion string
+ fServiceId string
+ fDomain string
+)
+
+func init() {
+ argsPrefix := "CERTIMATE_DEPLOYER_VOLCENGINEIMAGEX_"
+
+ flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
+ flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
+ flag.StringVar(&fAccessKeyId, argsPrefix+"ACCESSKEYID", "", "")
+ flag.StringVar(&fAccessKeySecret, argsPrefix+"ACCESSKEYSECRET", "", "")
+ flag.StringVar(&fRegion, argsPrefix+"REGION", "", "")
+ flag.StringVar(&fServiceId, argsPrefix+"SERVICEID", "", "")
+ flag.StringVar(&fDomain, argsPrefix+"DOMAIN", "", "")
+}
+
+/*
+Shell command to run this test:
+
+ go test -v ./volcengine_imagex_test.go -args \
+ --CERTIMATE_DEPLOYER_VOLCENGINEIMAGEX_INPUTCERTPATH="/path/to/your-input-cert.pem" \
+ --CERTIMATE_DEPLOYER_VOLCENGINEIMAGEX_INPUTKEYPATH="/path/to/your-input-key.pem" \
+ --CERTIMATE_DEPLOYER_VOLCENGINEIMAGEX_ACCESSKEYID="your-access-key-id" \
+ --CERTIMATE_DEPLOYER_VOLCENGINEIMAGEX_ACCESSKEYSECRET="your-access-key-secret" \
+ --CERTIMATE_DEPLOYER_VOLCENGINEIMAGEX_REGION="cn-north-1" \
+ --CERTIMATE_DEPLOYER_VOLCENGINEIMAGEX_SERVICEID="your-service-id" \
+ --CERTIMATE_DEPLOYER_VOLCENGINEIMAGEX_DOMAIN="example.com"
+*/
+func TestDeploy(t *testing.T) {
+ flag.Parse()
+
+ t.Run("Deploy", func(t *testing.T) {
+ t.Log(strings.Join([]string{
+ "args:",
+ fmt.Sprintf("INPUTCERTPATH: %v", fInputCertPath),
+ fmt.Sprintf("INPUTKEYPATH: %v", fInputKeyPath),
+ fmt.Sprintf("ACCESSKEYID: %v", fAccessKeyId),
+ fmt.Sprintf("ACCESSKEYSECRET: %v", fAccessKeySecret),
+ fmt.Sprintf("REGION: %v", fRegion),
+ fmt.Sprintf("SERVICEID: %v", fServiceId),
+ fmt.Sprintf("DOMAIN: %v", fDomain),
+ }, "\n"))
+
+ deployer, err := provider.New(&provider.VolcEngineImageXDeployerConfig{
+ AccessKeyId: fAccessKeyId,
+ AccessKeySecret: fAccessKeySecret,
+ Region: fRegion,
+ ServiceId: fServiceId,
+ Domain: fDomain,
+ })
+ if err != nil {
+ t.Errorf("err: %+v", err)
+ return
+ }
+
+ fInputCertData, _ := os.ReadFile(fInputCertPath)
+ fInputKeyData, _ := os.ReadFile(fInputKeyPath)
+ res, err := deployer.Deploy(context.Background(), string(fInputCertData), string(fInputKeyData))
+ if err != nil {
+ t.Errorf("err: %+v", err)
+ return
+ }
+
+ t.Logf("ok: %v", res)
+ })
+}
diff --git a/internal/pkg/core/deployer/providers/volcengine-tos/volcengine_tos_test.go b/internal/pkg/core/deployer/providers/volcengine-tos/volcengine_tos_test.go
index b70130c4..815d2f0d 100644
--- a/internal/pkg/core/deployer/providers/volcengine-tos/volcengine_tos_test.go
+++ b/internal/pkg/core/deployer/providers/volcengine-tos/volcengine_tos_test.go
@@ -63,6 +63,8 @@ func TestDeploy(t *testing.T) {
deployer, err := provider.New(&provider.VolcEngineTOSDeployerConfig{
AccessKeyId: fAccessKeyId,
AccessKeySecret: fAccessKeySecret,
+ Region: fRegion,
+ Bucket: fBucket,
Domain: fDomain,
})
if err != nil {
diff --git a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx
index 78d1b99d..6f4d1f4a 100644
--- a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx
+++ b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx
@@ -50,6 +50,7 @@ import DeployNodeConfigFormUCloudUS3Config from "./DeployNodeConfigFormUCloudUS3
import DeployNodeConfigFormVolcEngineCDNConfig from "./DeployNodeConfigFormVolcEngineCDNConfig.tsx";
import DeployNodeConfigFormVolcEngineCLBConfig from "./DeployNodeConfigFormVolcEngineCLBConfig.tsx";
import DeployNodeConfigFormVolcEngineDCDNConfig from "./DeployNodeConfigFormVolcEngineDCDNConfig.tsx";
+import DeployNodeConfigFormVolcEngineImageXConfig from "./DeployNodeConfigFormVolcEngineImageXConfig.tsx";
import DeployNodeConfigFormVolcEngineLiveConfig from "./DeployNodeConfigFormVolcEngineLiveConfig.tsx";
import DeployNodeConfigFormVolcEngineTOSConfig from "./DeployNodeConfigFormVolcEngineTOSConfig.tsx";
import DeployNodeConfigFormWebhookConfig from "./DeployNodeConfigFormWebhookConfig.tsx";
@@ -195,6 +196,8 @@ const DeployNodeConfigForm = forwardRef;
case DEPLOY_PROVIDERS.VOLCENGINE_DCDN:
return ;
+ case DEPLOY_PROVIDERS.VOLCENGINE_IMAGEX:
+ return ;
case DEPLOY_PROVIDERS.VOLCENGINE_LIVE:
return ;
case DEPLOY_PROVIDERS.VOLCENGINE_TOS:
diff --git a/ui/src/components/workflow/node/DeployNodeConfigFormVolcEngineImageXConfig.tsx b/ui/src/components/workflow/node/DeployNodeConfigFormVolcEngineImageXConfig.tsx
new file mode 100644
index 00000000..61f59e23
--- /dev/null
+++ b/ui/src/components/workflow/node/DeployNodeConfigFormVolcEngineImageXConfig.tsx
@@ -0,0 +1,91 @@
+import { useTranslation } from "react-i18next";
+import { Form, type FormInstance, Input } from "antd";
+import { createSchemaFieldRule } from "antd-zod";
+import { z } from "zod";
+
+import { validDomainName } from "@/utils/validators";
+
+type DeployNodeConfigFormVolcEngineImageXConfigFieldValues = Nullish<{
+ domain: string;
+}>;
+
+export type DeployNodeConfigFormVolcEngineImageXConfigProps = {
+ form: FormInstance;
+ formName: string;
+ disabled?: boolean;
+ initialValues?: DeployNodeConfigFormVolcEngineImageXConfigFieldValues;
+ onValuesChange?: (values: DeployNodeConfigFormVolcEngineImageXConfigFieldValues) => void;
+};
+
+const initFormModel = (): DeployNodeConfigFormVolcEngineImageXConfigFieldValues => {
+ return {};
+};
+
+const DeployNodeConfigFormVolcEngineImageXConfig = ({
+ form: formInst,
+ formName,
+ disabled,
+ initialValues,
+ onValuesChange,
+}: DeployNodeConfigFormVolcEngineImageXConfigProps) => {
+ const { t } = useTranslation();
+
+ const formSchema = z.object({
+ region: z
+ .string({ message: t("workflow_node.deploy.form.volcengine_imagex_region.placeholder") })
+ .nonempty(t("workflow_node.deploy.form.volcengine_imagex_region.placeholder"))
+ .trim(),
+ serviceId: z
+ .string({ message: t("workflow_node.deploy.form.volcengine_imagex_service_id.placeholder") })
+ .nonempty(t("workflow_node.deploy.form.volcengine_imagex_service_id.placeholder"))
+ .trim(),
+ domain: z
+ .string({ message: t("workflow_node.deploy.form.volcengine_imagex_domain.placeholder") })
+ .refine((v) => validDomainName(v), t("common.errmsg.domain_invalid")),
+ });
+ const formRule = createSchemaFieldRule(formSchema);
+
+ const handleFormChange = (_: unknown, values: z.infer) => {
+ onValuesChange?.(values);
+ };
+
+ return (
+ }
+ >
+
+
+
+ }
+ >
+
+
+
+ }
+ >
+
+
+
+ );
+};
+
+export default DeployNodeConfigFormVolcEngineImageXConfig;
diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts
index 1a3272cd..c6e92535 100644
--- a/ui/src/domain/provider.ts
+++ b/ui/src/domain/provider.ts
@@ -211,6 +211,7 @@ export const DEPLOY_PROVIDERS = Object.freeze({
VOLCENGINE_CDN: `${ACCESS_PROVIDERS.VOLCENGINE}-cdn`,
VOLCENGINE_CLB: `${ACCESS_PROVIDERS.VOLCENGINE}-clb`,
VOLCENGINE_DCDN: `${ACCESS_PROVIDERS.VOLCENGINE}-dcdn`,
+ VOLCENGINE_IMAGEX: `${ACCESS_PROVIDERS.VOLCENGINE}-imagex`,
VOLCENGINE_LIVE: `${ACCESS_PROVIDERS.VOLCENGINE}-live`,
VOLCENGINE_TOS: `${ACCESS_PROVIDERS.VOLCENGINE}-tos`,
WEBHOOK: `${ACCESS_PROVIDERS.WEBHOOK}`,
@@ -273,6 +274,7 @@ export const deployProvidersMap: Maphttps://console.volcengine.com/dcdn/dashboard",
+ "workflow_node.deploy.form.volcengine_imagex_region.label": "VolcEngine ImageX region",
+ "workflow_node.deploy.form.volcengine_imagex_region.placeholder": "Please enter VolcEngine ImageX region (e.g. cn-north-1)",
+ "workflow_node.deploy.form.volcengine_imagex_region.tooltip": "For more information, see https://www.volcengine.com/docs/508/23757",
+ "workflow_node.deploy.form.volcengine_imagex_service_id.label": "VolcEngine ImageX service ID",
+ "workflow_node.deploy.form.volcengine_imagex_service_id.placeholder": "Please enter VolcEngine ImageX service ID",
+ "workflow_node.deploy.form.volcengine_imagex_service_id.tooltip": "For more information, see https://console.volcengine.com/imagex",
+ "workflow_node.deploy.form.volcengine_imagex_domain.label": "VolcEngine ImageX domain",
+ "workflow_node.deploy.form.volcengine_imagex_domain.placeholder": "Please enter VolcEngine ImageX domain name",
+ "workflow_node.deploy.form.volcengine_imagex_domain.tooltip": "For more information, see https://console.volcengine.com/imagex",
"workflow_node.deploy.form.volcengine_live_domain.label": "VolcEngine Live streaming domain",
"workflow_node.deploy.form.volcengine_live_domain.placeholder": "Please enter VolcEngine Live streaming domain name",
"workflow_node.deploy.form.volcengine_live_domain.tooltip": "For more information, see https://console.volcengine.com/live",
diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json
index a4146670..42453b04 100644
--- a/ui/src/i18n/locales/zh/nls.provider.json
+++ b/ui/src/i18n/locales/zh/nls.provider.json
@@ -79,6 +79,7 @@
"provider.volcengine.clb": "火山引擎 - 负载均衡 CLB",
"provider.volcengine.dcdn": "火山引擎 - 全站加速 DCDN",
"provider.volcengine.dns": "火山引擎 - 云解析 DNS",
+ "provider.volcengine.imagex": "火山引擎 - 图片服务 ImageX",
"provider.volcengine.live": "火山引擎 - 视频直播 Live",
"provider.volcengine.tos": "火山引擎 - 对象存储 TOS",
"provider.webhook": "Webhook",
diff --git a/ui/src/i18n/locales/zh/nls.workflow.nodes.json b/ui/src/i18n/locales/zh/nls.workflow.nodes.json
index 705d8056..a4062398 100644
--- a/ui/src/i18n/locales/zh/nls.workflow.nodes.json
+++ b/ui/src/i18n/locales/zh/nls.workflow.nodes.json
@@ -403,11 +403,20 @@
"workflow_node.deploy.form.volcengine_dcdn_domain.label": "火山引擎 DCDN 加速域名(支持泛域名)",
"workflow_node.deploy.form.volcengine_dcdn_domain.placeholder": "请输入火山引擎 DCDN 加速域名",
"workflow_node.deploy.form.volcengine_dcdn_domain.tooltip": "这是什么?请参阅 https://console.volcengine.com/dcdn/dashboard
泛域名表示形式为:*.example.com",
+ "workflow_node.deploy.form.volcengine_imagex_region.label": "火山引擎 ImageX 服务地域",
+ "workflow_node.deploy.form.volcengine_imagex_region.placeholder": "请输入火山引擎 ImageX 服务地域(例如:cn-north-1)",
+ "workflow_node.deploy.form.volcengine_imagex_region.tooltip": "这是什么?请参阅 https://www.volcengine.com/docs/508/23757",
+ "workflow_node.deploy.form.volcengine_imagex_service_id.label": "火山引擎 TOS 服务 ID",
+ "workflow_node.deploy.form.volcengine_imagex_service_id.placeholder": "请输入火山引擎 TOS 服务 ID",
+ "workflow_node.deploy.form.volcengine_imagex_service_id.tooltip": "这是什么?请参阅 https://console.volcengine.com/imagex",
+ "workflow_node.deploy.form.volcengine_imagex_domain.label": "火山引擎 ImageX 绑定域名",
+ "workflow_node.deploy.form.volcengine_imagex_domain.placeholder": "请输入火山引擎 ImageX 绑定域名",
+ "workflow_node.deploy.form.volcengine_imagex_domain.tooltip": "这是什么?请参阅 see https://console.volcengine.com/imagex",
"workflow_node.deploy.form.volcengine_live_domain.label": "火山引擎视频直播流域名(支持泛域名)",
"workflow_node.deploy.form.volcengine_live_domain.placeholder": "请输入火山引擎视频直播流域名",
"workflow_node.deploy.form.volcengine_live_domain.tooltip": "这是什么?请参阅 https://console.volcengine.com/live
泛域名表示形式为:*.example.com",
"workflow_node.deploy.form.volcengine_tos_region.label": "火山引擎 TOS 服务地域",
- "workflow_node.deploy.form.volcengine_tos_region.placeholder": "请输入火山引擎 TOS 服务地域(例如:cn-beijing",
+ "workflow_node.deploy.form.volcengine_tos_region.placeholder": "请输入火山引擎 TOS 服务地域(例如:cn-beijing)",
"workflow_node.deploy.form.volcengine_tos_region.tooltip": "这是什么?请参阅 https://www.volcengine.com/docs/6349/107356",
"workflow_node.deploy.form.volcengine_tos_bucket.label": "火山引擎 TOS 存储桶名",
"workflow_node.deploy.form.volcengine_tos_bucket.placeholder": "请输入火山引擎 TOS 存储桶名",