feat(provider): add ProjectName support for volcengine services

This commit is contained in:
Fu Diwei
2026-06-04 01:14:21 +08:00
committed by RHQYZ
parent 38a7014822
commit ee30f63717
29 changed files with 91 additions and 8 deletions
@@ -19,6 +19,7 @@ func init() {
provider, err := volcenginealb.NewDeployer(&volcenginealb.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
Region: xmaps.GetString(options.ProviderExtendedConfig, "region"),
DeployTarget: xmaps.GetString(options.ProviderExtendedConfig, "deployTarget"),
LoadbalancerId: xmaps.GetString(options.ProviderExtendedConfig, "loadbalancerId"),
@@ -19,6 +19,7 @@ func init() {
provider, err := volcengineapig.NewDeployer(&volcengineapig.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
Region: xmaps.GetString(options.ProviderExtendedConfig, "region"),
DomainMatchPattern: xmaps.GetString(options.ProviderExtendedConfig, "domainMatchPattern"),
Domain: xmaps.GetString(options.ProviderExtendedConfig, "domain"),
@@ -19,6 +19,7 @@ func init() {
provider, err := volcenginecdn.NewDeployer(&volcenginecdn.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
DomainMatchPattern: xmaps.GetString(options.ProviderExtendedConfig, "domainMatchPattern"),
Domain: xmaps.GetString(options.ProviderExtendedConfig, "domain"),
})
@@ -19,6 +19,7 @@ func init() {
provider, err := volcenginecertcenter.NewDeployer(&volcenginecertcenter.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
Region: xmaps.GetString(options.ProviderExtendedConfig, "region"),
})
return provider, err
@@ -19,6 +19,7 @@ func init() {
provider, err := volcengineclb.NewDeployer(&volcengineclb.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
Region: xmaps.GetString(options.ProviderExtendedConfig, "region"),
DeployTarget: xmaps.GetString(options.ProviderExtendedConfig, "deployTarget"),
LoadbalancerId: xmaps.GetString(options.ProviderExtendedConfig, "loadbalancerId"),
@@ -19,6 +19,7 @@ func init() {
provider, err := volcenginedcdn.NewDeployer(&volcenginedcdn.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
DomainMatchPattern: xmaps.GetString(options.ProviderExtendedConfig, "domainMatchPattern"),
Domain: xmaps.GetString(options.ProviderExtendedConfig, "domain"),
})
@@ -19,6 +19,7 @@ func init() {
provider, err := volcengineimagex.NewDeployer(&volcengineimagex.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
Region: xmaps.GetString(options.ProviderExtendedConfig, "region"),
ServiceId: xmaps.GetString(options.ProviderExtendedConfig, "serviceId"),
Domain: xmaps.GetString(options.ProviderExtendedConfig, "domain"),
@@ -19,6 +19,7 @@ func init() {
provider, err := volcenginelive.NewDeployer(&volcenginelive.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
DomainMatchPattern: xmaps.GetString(options.ProviderExtendedConfig, "domainMatchPattern"),
Domain: xmaps.GetString(options.ProviderExtendedConfig, "domain"),
})
@@ -19,6 +19,7 @@ func init() {
provider, err := volcenginetos.NewDeployer(&volcenginetos.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
Region: xmaps.GetString(options.ProviderExtendedConfig, "region"),
Bucket: xmaps.GetString(options.ProviderExtendedConfig, "bucket"),
Domain: xmaps.GetString(options.ProviderExtendedConfig, "domain"),
@@ -19,6 +19,7 @@ func init() {
provider, err := volcenginevod.NewDeployer(&volcenginevod.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
SpaceName: xmaps.GetString(options.ProviderExtendedConfig, "spaceName"),
DomainMatchPattern: xmaps.GetString(options.ProviderExtendedConfig, "domainMatchPattern"),
DomainType: xmaps.GetString(options.ProviderExtendedConfig, "domainType"),
@@ -19,6 +19,7 @@ func init() {
provider, err := volcenginewaf.NewDeployer(&volcenginewaf.DeployerConfig{
AccessKeyId: credentials.AccessKeyId,
AccessKeySecret: credentials.SecretAccessKey,
ProjectName: credentials.ProjectName,
Region: xmaps.GetString(options.ProviderExtendedConfig, "region"),
AccessMode: xmaps.GetString(options.ProviderExtendedConfig, "accessMode"),
Domain: xmaps.GetString(options.ProviderExtendedConfig, "domain"),
+1
View File
@@ -620,6 +620,7 @@ type AccessConfigForVercel struct {
type AccessConfigForVolcEngine struct {
AccessKeyId string `json:"accessKeyId"`
SecretAccessKey string `json:"secretAccessKey"`
ProjectName string `json:"projectName,omitempty"`
}
type AccessConfigForVultr struct {
@@ -23,6 +23,8 @@ type CertmgrConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
}
type Certmgr struct {
@@ -5,6 +5,7 @@ import (
"fmt"
"log/slog"
"github.com/samber/lo"
ve "github.com/volcengine/volcengine-go-sdk/volcengine"
vesession "github.com/volcengine/volcengine-go-sdk/volcengine/session"
@@ -17,6 +18,8 @@ type CertmgrConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 火山引擎地域。
Region string `json:"region"`
}
@@ -58,6 +61,7 @@ func (c *Certmgr) Upload(ctx context.Context, certPEM, privkeyPEM string) (*cert
// 上传证书
// REF: https://www.volcengine.com/docs/6638/1365580
importCertificateReq := &vecertificateservice.ImportCertificateInput{
ProjectName: lo.EmptyableToPtr(c.config.ProjectName),
CertificateInfo: &vecertificateservice.CertificateInfoForImportCertificateInput{
CertificateChain: ve.String(certPEM),
PrivateKey: ve.String(privkeyPEM),
@@ -7,6 +7,7 @@ import (
"strings"
"time"
"github.com/samber/lo"
velive "github.com/volcengine/volc-sdk-golang/service/live/v20230101"
ve "github.com/volcengine/volcengine-go-sdk/volcengine"
@@ -19,6 +20,8 @@ type CertmgrConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
}
type Certmgr struct {
@@ -57,6 +60,7 @@ func (c *Certmgr) Upload(ctx context.Context, certPEM, privkeyPEM string) (*cert
// 查询证书列表,避免重复上传
// REF: https://www.volcengine.com/docs/6469/1186278#%E6%9F%A5%E8%AF%A2%E8%AF%81%E4%B9%A6%E5%88%97%E8%A1%A8
listCertReq := &velive.ListCertV2Body{}
listCertReq.ProjectName = lo.EmptyableToPtr(c.config.ProjectName)
listCertResp, err := c.sdkClient.ListCertV2(ctx, listCertReq)
c.logger.Debug("sdk request 'live.ListCertV2'", slog.Any("request", listCertReq), slog.Any("response", listCertResp))
if err != nil {
@@ -93,7 +97,8 @@ func (c *Certmgr) Upload(ctx context.Context, certPEM, privkeyPEM string) (*cert
// 上传新证书
// REF: https://www.volcengine.com/docs/6469/1186278#%E6%B7%BB%E5%8A%A0%E8%AF%81%E4%B9%A6
createCertReq := &velive.CreateCertBody{
CertName: ve.String(certName),
ProjectName: lo.EmptyableToPtr(c.config.ProjectName),
CertName: ve.String(certName),
Rsa: velive.CreateCertBodyRsa{
Prikey: privkeyPEM,
Pubkey: certPEM,
@@ -21,6 +21,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 火山引擎地域。
Region string `json:"region"`
// 部署目标。
@@ -58,6 +60,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
Region: config.Region,
})
if err != nil {
@@ -139,6 +142,7 @@ func (d *Deployer) deployToLoadbalancer(ctx context.Context, cloudCertId string)
}
describeListenersReq := &vealb.DescribeListenersInput{
ProjectName: lo.EmptyableToPtr(d.config.ProjectName),
LoadBalancerId: ve.String(d.config.LoadbalancerId),
Protocol: ve.String("HTTPS"),
PageNumber: ve.Int64(int64(describeListenersPageNumber)),
@@ -22,6 +22,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 火山引擎地域。
Region string `json:"region"`
// 域名匹配模式。
@@ -53,6 +55,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
Region: config.Region,
})
if err != nil {
@@ -7,6 +7,7 @@ import (
"log/slog"
"strings"
"github.com/samber/lo"
ve "github.com/volcengine/volcengine-go-sdk/volcengine"
vesession "github.com/volcengine/volcengine-go-sdk/volcengine/session"
@@ -22,6 +23,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 域名匹配模式。
// 零值时默认值 [DOMAIN_MATCH_PATTERN_EXACT]。
DomainMatchPattern string `json:"domainMatchPattern,omitempty"`
@@ -51,6 +54,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
})
if err != nil {
return nil, fmt.Errorf("could not create certmgr: %w", err)
@@ -168,6 +172,7 @@ func (d *Deployer) getMatchedDomainsByWildcard(ctx context.Context, wildcardDoma
}
listCdnDomainsReq := &vecdn.ListCdnDomainsInput{
Project: lo.EmptyableToPtr(d.config.ProjectName),
Domain: ve.String(strings.TrimPrefix(wildcardDomain, "*.")),
Status: ve.String("online"),
PageNum: ve.Int64(int64(listCdnDomainsPageNum)),
@@ -15,6 +15,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 火山引擎地域。
Region string `json:"region"`
}
@@ -35,6 +37,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
Region: config.Region,
})
if err != nil {
@@ -20,6 +20,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 火山引擎地域。
Region string `json:"region"`
// 部署目标。
@@ -54,6 +56,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
Region: config.Region,
})
if err != nil {
@@ -22,6 +22,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 火山引擎地域。
Region string `json:"region"`
// 域名匹配模式。
@@ -53,6 +55,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
Region: config.Region,
})
if err != nil {
@@ -162,7 +165,7 @@ func (d *Deployer) getAllDomains(ctx context.Context) ([]string, error) {
domains := make([]string, 0)
// 查询域名配置列表
// https://www.volcengine.com/docs/6559/1171745
// REF: https://www.volcengine.com/docs/6559/1171745
listDomainConfigPageNumber := 1
listDomainConfigPageSize := 100
for {
@@ -173,8 +176,9 @@ func (d *Deployer) getAllDomains(ctx context.Context) ([]string, error) {
}
listDomainConfigReq := &vedcdn.ListDomainConfigInput{
PageNumber: ve.Int32(int32(listDomainConfigPageNumber)),
PageSize: ve.Int32(int32(listDomainConfigPageSize)),
ProjectName: lo.IfF(d.config.ProjectName != "", func() []*string { return ve.StringSlice([]string{d.config.ProjectName}) }).Else(nil),
PageNumber: ve.Int32(int32(listDomainConfigPageNumber)),
PageSize: ve.Int32(int32(listDomainConfigPageSize)),
}
listDomainConfigResp, err := d.sdkClient.ListDomainConfigWithContext(ctx, listDomainConfigReq)
d.logger.Debug("sdk request 'dcdn.ListDomainConfig'", slog.Any("request", listDomainConfigReq), slog.Any("response", listDomainConfigResp))
@@ -18,6 +18,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 火山引擎地域。
Region string `json:"region"`
// 服务 ID。
@@ -48,6 +50,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
Region: config.Region,
})
if err != nil {
@@ -22,6 +22,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 域名匹配模式。
// 零值时默认值 [DOMAIN_MATCH_PATTERN_EXACT]。
DomainMatchPattern string `json:"domainMatchPattern,omitempty"`
@@ -50,6 +52,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
})
if err != nil {
return nil, fmt.Errorf("could not create certmgr: %w", err)
@@ -17,6 +17,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 火山引擎地域。
Region string `json:"region"`
// 存储桶名。
@@ -47,6 +49,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
Region: config.Region,
})
if err != nil {
@@ -24,6 +24,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 点播空间名称。
SpaceName string `json:"spaceName"`
// 域名匹配模式。
@@ -56,6 +58,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
})
if err != nil {
return nil, fmt.Errorf("could not create certmgr: %w", err)
@@ -21,6 +21,8 @@ type DeployerConfig struct {
AccessKeyId string `json:"accessKeyId"`
// 火山引擎 AccessKeySecret。
AccessKeySecret string `json:"accessKeySecret"`
// 火山引擎项目名称。
ProjectName string `json:"projectName,omitempty"`
// 火山引擎地域。
Region string `json:"region"`
// WAF 接入模式。
@@ -51,6 +53,7 @@ func NewDeployer(config *DeployerConfig) (*Deployer, error) {
pcertmgr, err := certmgrimpl.NewCertmgr(&certmgrimpl.CertmgrConfig{
AccessKeyId: config.AccessKeyId,
AccessKeySecret: config.AccessKeySecret,
ProjectName: config.ProjectName,
Region: config.Region,
})
if err != nil {
@@ -106,6 +109,7 @@ func (d *Deployer) deployWithCNAME(ctx context.Context, cloudCertId string) erro
// 查询云 WAF 实例防护网站信息
// REF: https://www.volcengine.com/docs/6511/1214827
listDomainReq := &vewaf.ListDomainInput{
ProjectName: lo.EmptyableToPtr(d.config.ProjectName),
Region: ve.String(d.config.Region),
Domain: ve.String(d.config.Domain),
AccurateQuery: ve.Int32(1),
@@ -124,6 +128,7 @@ func (d *Deployer) deployWithCNAME(ctx context.Context, cloudCertId string) erro
// REF: https://www.volcengine.com/docs/6511/1214835
domainInfo := listDomainResp.Data[0]
updateDomainReq := &vewaf.UpdateDomainInput{
ProjectName: lo.EmptyableToPtr(d.config.ProjectName),
Region: ve.String(d.config.Region),
Domain: ve.String(d.config.Domain),
AccessMode: ve.Int32(10),
@@ -36,6 +36,16 @@ const AccessConfigFormFieldsProviderVolcEngine = () => {
>
<Input.Password autoComplete="new-password" placeholder={t("access.form.volcengine_secret_access_key.placeholder")} />
</Form.Item>
<Form.Item
name={[parentNamePath, "projectName"]}
initialValue={initialValues.projectName}
label={t("access.form.volcengine_project_name.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.volcengine_project_name.tooltip") }}></span>}
>
<Input allowClear placeholder={t("access.form.volcengine_project_name.placeholder")} />
</Form.Item>
</>
);
};
@@ -53,6 +63,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType<typeof getI18n> }) =
return z.object({
accessKeyId: z.string().nonempty(),
secretAccessKey: z.string().nonempty(),
projectName: z.string().nullish(),
});
};
+7 -2
View File
@@ -1388,12 +1388,17 @@
"volcengine_access_key_id": {
"label": "VolcEngine AccessKeyID",
"placeholder": "Please enter VolcEngine AccessKeyID",
"tooltip": "For more information, see <a href=\"https://www.volcengine.com/docs/6291/216571\" target=\"_blank\">https://www.volcengine.com/docs/6291/216571</a>"
"tooltip": "For more information, see <a href=\"https://www.volcengine.com/docs/6291/65568\" target=\"_blank\">https://www.volcengine.com/docs/6291/65568</a>"
},
"volcengine_secret_access_key": {
"label": "VolcEngine SecretAccessKey",
"placeholder": "Please enter VolcEngine SecretAccessKey",
"tooltip": "For more information, see <a href=\"https://www.volcengine.com/docs/6291/216571\" target=\"_blank\">https://www.volcengine.com/docs/6291/216571</a>"
"tooltip": "For more information, see <a href=\"https://www.volcengine.com/docs/6291/65568\" target=\"_blank\">https://www.volcengine.com/docs/6291/65568</a>"
},
"volcengine_project_name": {
"label": "VolcEngine project ID",
"placeholder": "Please enter VolcEngine project ID",
"tooltip": "For more information, see <a href=\"https://www.volcengine.com/docs/6649/94336\" target=\"_blank\">https://www.volcengine.com/docs/6649/94336</a>"
},
"vultr_api_key": {
"label": "Vultr API key",
+7 -2
View File
@@ -1385,12 +1385,17 @@
"volcengine_access_key_id": {
"label": "火山引擎 AccessKeyID",
"placeholder": "请输入火山引擎 AccessKeyID",
"tooltip": "这是什么?请参阅 <a href=\"https://www.volcengine.com/docs/6291/216571\" target=\"_blank\">https://www.volcengine.com/docs/6291/216571</a>"
"tooltip": "这是什么?请参阅 <a href=\"https://www.volcengine.com/docs/6291/65568\" target=\"_blank\">https://www.volcengine.com/docs/6291/65568</a>"
},
"volcengine_secret_access_key": {
"label": "火山引擎 SecretAccessKey",
"placeholder": "请输入火山引擎 SecretAccessKey",
"tooltip": "这是什么?请参阅 <a href=\"https://www.volcengine.com/docs/6291/216571\" target=\"_blank\">https://www.volcengine.com/docs/6291/216571</a>"
"tooltip": "这是什么?请参阅 <a href=\"https://www.volcengine.com/docs/6291/65568\" target=\"_blank\">https://www.volcengine.com/docs/6291/65568</a>"
},
"volcengine_project_name": {
"label": "火山引擎项目名称(可选)",
"placeholder": "请输入火山引擎项目名称",
"tooltip": "这是什么?请参阅 <a href=\"https://www.volcengine.com/docs/6649/94336\" target=\"_blank\">https://www.volcengine.com/docs/6649/94336</a>"
},
"vultr_api_key": {
"label": "Vultr API Key",