refactor(provider): normalize provider names for 1panel, baotapanel, baotapanelgo, baotawaf, cdnfly, cpanel, netlify, ratpanel, safeline

This commit is contained in:
Fu Diwei
2025-12-30 14:01:31 +08:00
committed by RHQYZ
parent 91889e18c3
commit 56451b4d24
51 changed files with 916 additions and 453 deletions
@@ -5,18 +5,18 @@ import (
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core/deployer"
opsite "github.com/certimate-go/certimate/pkg/core/deployer/providers/1panel-site"
onepanel "github.com/certimate-go/certimate/pkg/core/deployer/providers/1panel"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
Registries.MustRegister(domain.DeploymentProviderType1PanelSite, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
Registries.MustRegister(domain.DeploymentProviderType1Panel, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
credentials := domain.AccessConfigFor1Panel{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := opsite.NewDeployer(&opsite.DeployerConfig{
provider, err := onepanel.NewDeployer(&onepanel.DeployerConfig{
ServerUrl: credentials.ServerUrl,
ApiVersion: credentials.ApiVersion,
ApiKey: credentials.ApiKey,
@@ -8,18 +8,18 @@ import (
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core/deployer"
baotapanelsite "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotapanel-site"
baotapanel "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotapanel"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
Registries.MustRegister(domain.DeploymentProviderTypeBaotaPanelSite, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
Registries.MustRegister(domain.DeploymentProviderTypeBaotaPanel, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
credentials := domain.AccessConfigForBaotaPanel{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := baotapanelsite.NewDeployer(&baotapanelsite.DeployerConfig{
provider, err := baotapanel.NewDeployer(&baotapanel.DeployerConfig{
ServerUrl: credentials.ServerUrl,
ApiKey: credentials.ApiKey,
AllowInsecureConnections: credentials.AllowInsecureConnections,
@@ -8,18 +8,18 @@ import (
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core/deployer"
baotapanelgosite "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotapanelgo-site"
baotapanelgo "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotapanelgo"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
Registries.MustRegister(domain.DeploymentProviderTypeBaotaPanelGoSite, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
Registries.MustRegister(domain.DeploymentProviderTypeBaotaPanelGo, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
credentials := domain.AccessConfigForBaotaPanelGo{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := baotapanelgosite.NewDeployer(&baotapanelgosite.DeployerConfig{
provider, err := baotapanelgo.NewDeployer(&baotapanelgo.DeployerConfig{
ServerUrl: credentials.ServerUrl,
ApiKey: credentials.ApiKey,
AllowInsecureConnections: credentials.AllowInsecureConnections,
@@ -8,18 +8,18 @@ import (
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core/deployer"
baotawafsite "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotawaf-site"
baotawaf "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotawaf"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
Registries.MustRegister(domain.DeploymentProviderTypeBaotaWAFSite, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
Registries.MustRegister(domain.DeploymentProviderTypeBaotaWAF, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
credentials := domain.AccessConfigForBaotaWAF{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := baotawafsite.NewDeployer(&baotawafsite.DeployerConfig{
provider, err := baotawaf.NewDeployer(&baotawaf.DeployerConfig{
ServerUrl: credentials.ServerUrl,
ApiKey: credentials.ApiKey,
AllowInsecureConnections: credentials.AllowInsecureConnections,
@@ -5,22 +5,23 @@ import (
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core/deployer"
opsite "github.com/certimate-go/certimate/pkg/core/deployer/providers/cpanel-site"
"github.com/certimate-go/certimate/pkg/core/deployer/providers/cpanel"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
Registries.MustRegister(domain.DeploymentProviderTypeCPanelSite, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
Registries.MustRegister(domain.DeploymentProviderTypeCPanel, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
credentials := domain.AccessConfigForCPanel{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := opsite.NewDeployer(&opsite.DeployerConfig{
provider, err := cpanel.NewDeployer(&cpanel.DeployerConfig{
ServerUrl: credentials.ServerUrl,
Username: credentials.Username,
ApiToken: credentials.ApiToken,
AllowInsecureConnections: credentials.AllowInsecureConnections,
ResourceType: xmaps.GetString(options.ProviderExtendedConfig, "resourceType"),
Domain: xmaps.GetString(options.ProviderExtendedConfig, "domain"),
})
return provider, err
@@ -5,20 +5,21 @@ import (
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core/deployer"
netlifysite "github.com/certimate-go/certimate/pkg/core/deployer/providers/netlify-site"
netlify "github.com/certimate-go/certimate/pkg/core/deployer/providers/netlify"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
Registries.MustRegister(domain.DeploymentProviderTypeNetlifySite, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
Registries.MustRegister(domain.DeploymentProviderTypeNetlify, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
credentials := domain.AccessConfigForNetlify{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := netlifysite.NewDeployer(&netlifysite.DeployerConfig{
ApiToken: credentials.ApiToken,
SiteId: xmaps.GetString(options.ProviderExtendedConfig, "siteId"),
provider, err := netlify.NewDeployer(&netlify.DeployerConfig{
ApiToken: credentials.ApiToken,
ResourceType: xmaps.GetString(options.ProviderExtendedConfig, "resourceType"),
SiteId: xmaps.GetString(options.ProviderExtendedConfig, "siteId"),
})
return provider, err
})
@@ -8,22 +8,23 @@ import (
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core/deployer"
ratpanelsite "github.com/certimate-go/certimate/pkg/core/deployer/providers/ratpanel-site"
ratpanel "github.com/certimate-go/certimate/pkg/core/deployer/providers/ratpanel"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
Registries.MustRegister(domain.DeploymentProviderTypeRatPanelSite, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
Registries.MustRegister(domain.DeploymentProviderTypeRatPanel, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
credentials := domain.AccessConfigForRatPanel{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := ratpanelsite.NewDeployer(&ratpanelsite.DeployerConfig{
provider, err := ratpanel.NewDeployer(&ratpanel.DeployerConfig{
ServerUrl: credentials.ServerUrl,
AccessTokenId: credentials.AccessTokenId,
AccessToken: credentials.AccessToken,
AllowInsecureConnections: credentials.AllowInsecureConnections,
ResourceType: xmaps.GetString(options.ProviderExtendedConfig, "resourceType"),
SiteNames: lo.Filter(strings.Split(xmaps.GetString(options.ProviderExtendedConfig, "siteNames"), ";"), func(s string, _ int) bool { return s != "" }),
})
return provider, err
@@ -5,18 +5,18 @@ import (
"github.com/certimate-go/certimate/internal/domain"
"github.com/certimate-go/certimate/pkg/core/deployer"
safelinesite "github.com/certimate-go/certimate/pkg/core/deployer/providers/safeline-site"
"github.com/certimate-go/certimate/pkg/core/deployer/providers/safeline"
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
)
func init() {
Registries.MustRegister(domain.DeploymentProviderTypeSafeLineSite, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
Registries.MustRegister(domain.DeploymentProviderTypeSafeLine, func(options *ProviderFactoryOptions) (deployer.Provider, error) {
credentials := domain.AccessConfigForSafeLine{}
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
}
provider, err := safelinesite.NewDeployer(&safelinesite.DeployerConfig{
provider, err := safeline.NewDeployer(&safeline.DeployerConfig{
ServerUrl: credentials.ServerUrl,
ApiToken: credentials.ApiToken,
AllowInsecureConnections: credentials.AllowInsecureConnections,
+8 -8
View File
@@ -252,8 +252,8 @@ type DeploymentProviderType string
NOTICE: If you add new constant, please keep ASCII order.
*/
const (
DeploymentProviderType1Panel = DeploymentProviderType(AccessProviderType1Panel)
DeploymentProviderType1PanelConsole = DeploymentProviderType(AccessProviderType1Panel + "-console")
DeploymentProviderType1PanelSite = DeploymentProviderType(AccessProviderType1Panel + "-site")
DeploymentProviderTypeAliyunALB = DeploymentProviderType(AccessProviderTypeAliyun + "-alb")
DeploymentProviderTypeAliyunAPIGW = DeploymentProviderType(AccessProviderTypeAliyun + "-apigw")
DeploymentProviderTypeAliyunCAS = DeploymentProviderType(AccessProviderTypeAliyun + "-cas")
@@ -280,17 +280,17 @@ const (
DeploymentProviderTypeBaiduCloudCDN = DeploymentProviderType(AccessProviderTypeBaiduCloud + "-cdn")
DeploymentProviderTypeBaiduCloudCert = DeploymentProviderType(AccessProviderTypeBaiduCloud + "-cert")
DeploymentProviderTypeBaishanCDN = DeploymentProviderType(AccessProviderTypeBaishan + "-cdn")
DeploymentProviderTypeBaotaPanel = DeploymentProviderType(AccessProviderTypeBaotaPanel)
DeploymentProviderTypeBaotaPanelConsole = DeploymentProviderType(AccessProviderTypeBaotaPanel + "-console")
DeploymentProviderTypeBaotaPanelSite = DeploymentProviderType(AccessProviderTypeBaotaPanel + "-site")
DeploymentProviderTypeBaotaPanelGo = DeploymentProviderType(AccessProviderTypeBaotaPanelGo)
DeploymentProviderTypeBaotaPanelGoConsole = DeploymentProviderType(AccessProviderTypeBaotaPanelGo + "-console")
DeploymentProviderTypeBaotaPanelGoSite = DeploymentProviderType(AccessProviderTypeBaotaPanelGo + "-site")
DeploymentProviderTypeBaotaWAF = DeploymentProviderType(AccessProviderTypeBaotaWAF)
DeploymentProviderTypeBaotaWAFConsole = DeploymentProviderType(AccessProviderTypeBaotaWAF + "-console")
DeploymentProviderTypeBaotaWAFSite = DeploymentProviderType(AccessProviderTypeBaotaWAF + "-site")
DeploymentProviderTypeBunnyCDN = DeploymentProviderType(AccessProviderTypeBunny + "-cdn")
DeploymentProviderTypeBytePlusCDN = DeploymentProviderType(AccessProviderTypeBytePlus + "-cdn")
DeploymentProviderTypeCacheFly = DeploymentProviderType(AccessProviderTypeCacheFly)
DeploymentProviderTypeCdnfly = DeploymentProviderType(AccessProviderTypeCdnfly)
DeploymentProviderTypeCPanelSite = DeploymentProviderType(AccessProviderTypeCPanel + "-site")
DeploymentProviderTypeCPanel = DeploymentProviderType(AccessProviderTypeCPanel)
DeploymentProviderTypeCTCCCloudAO = DeploymentProviderType(AccessProviderTypeCTCCCloud + "-ao")
DeploymentProviderTypeCTCCCloudCDN = DeploymentProviderType(AccessProviderTypeCTCCCloud + "-cdn")
DeploymentProviderTypeCTCCCloudCMS = DeploymentProviderType(AccessProviderTypeCTCCCloud + "-cms")
@@ -318,15 +318,15 @@ const (
DeploymentProviderTypeLeCDN = DeploymentProviderType(AccessProviderTypeLeCDN)
DeploymentProviderTypeLocal = DeploymentProviderType(AccessProviderTypeLocal)
DeploymentProviderTypeMohuaMVH = DeploymentProviderType(AccessProviderTypeMohua + "-mvh")
DeploymentProviderTypeNetlifySite = DeploymentProviderType(AccessProviderTypeNetlify + "-site")
DeploymentProviderTypeNetlify = DeploymentProviderType(AccessProviderTypeNetlify)
DeploymentProviderTypeProxmoxVE = DeploymentProviderType(AccessProviderTypeProxmoxVE)
DeploymentProviderTypeQiniuCDN = DeploymentProviderType(AccessProviderTypeQiniu + "-cdn")
DeploymentProviderTypeQiniuKodo = DeploymentProviderType(AccessProviderTypeQiniu + "-kodo")
DeploymentProviderTypeQiniuPili = DeploymentProviderType(AccessProviderTypeQiniu + "-pili")
DeploymentProviderTypeRainYunRCDN = DeploymentProviderType(AccessProviderTypeRainYun + "-rcdn")
DeploymentProviderTypeRatPanel = DeploymentProviderType(AccessProviderTypeRatPanel)
DeploymentProviderTypeRatPanelConsole = DeploymentProviderType(AccessProviderTypeRatPanel + "-console")
DeploymentProviderTypeRatPanelSite = DeploymentProviderType(AccessProviderTypeRatPanel + "-site")
DeploymentProviderTypeSafeLineSite = DeploymentProviderType(AccessProviderTypeSafeLine + "-site")
DeploymentProviderTypeSafeLine = DeploymentProviderType(AccessProviderTypeSafeLine)
DeploymentProviderTypeSSH = DeploymentProviderType(AccessProviderTypeSSH)
DeploymentProviderTypeTencentCloudCDN = DeploymentProviderType(AccessProviderTypeTencentCloud + "-cdn")
DeploymentProviderTypeTencentCloudCLB = DeploymentProviderType(AccessProviderTypeTencentCloud + "-clb")
+261
View File
@@ -0,0 +1,261 @@
package migrations
import (
"github.com/go-viper/mapstructure/v2"
"github.com/pocketbase/pocketbase/core"
m "github.com/pocketbase/pocketbase/migrations"
)
func init() {
m.Register(func(app core.App) error {
tracer := NewTracer("v0.4.13")
tracer.Printf("go ...")
// adapt to new workflow data structure
{
walker := &mWorkflowGraphWalker{}
walker.Define(func(node *mWorkflowNode) (_changed bool, _err error) {
_changed = false
_err = nil
if node.Type != "bizDeploy" {
return
}
if node.Data == nil {
return
}
if _, ok := node.Data["config"]; ok {
nodeCfg := node.Data["config"].(map[string]any)
provider := nodeCfg["provider"]
switch provider {
case "1panel-site":
{
nodeCfg["provider"] = "1panel"
_changed = true
return
}
case "baotapanel-site":
{
nodeCfg["provider"] = "baotapanel"
node.Data["config"] = nodeCfg
_changed = true
return
}
case "baotapanelgo-site":
{
nodeCfg["provider"] = "baotapanelgo"
node.Data["config"] = nodeCfg
_changed = true
return
}
case "baotawaf-site":
{
nodeCfg["provider"] = "baotawaf"
node.Data["config"] = nodeCfg
_changed = true
return
}
case "cdnfly":
{
if nodeCfg["providerConfig"] != nil {
providerCfg := nodeCfg["providerConfig"].(map[string]any)
if providerCfg["resourceType"] == "site" {
providerCfg["resourceType"] = "website"
nodeCfg["providerConfig"] = providerCfg
node.Data["config"] = nodeCfg
_changed = true
return
}
}
}
case "cpanel-site":
{
if nodeCfg["providerConfig"] != nil {
providerCfg := nodeCfg["providerConfig"].(map[string]any)
providerCfg["resourceType"] = "website"
nodeCfg["providerConfig"] = providerCfg
}
nodeCfg["provider"] = "cpanel"
node.Data["config"] = nodeCfg
_changed = true
return
}
case "netlify-site":
{
if nodeCfg["providerConfig"] != nil {
providerCfg := nodeCfg["providerConfig"].(map[string]any)
providerCfg["resourceType"] = "website"
nodeCfg["providerConfig"] = providerCfg
}
nodeCfg["provider"] = "netlify"
node.Data["config"] = nodeCfg
_changed = true
return
}
case "ratpanel-site":
{
if nodeCfg["providerConfig"] != nil {
providerCfg := nodeCfg["providerConfig"].(map[string]any)
providerCfg["resourceType"] = "website"
nodeCfg["providerConfig"] = providerCfg
}
nodeCfg["provider"] = "ratpanel"
node.Data["config"] = nodeCfg
_changed = true
return
}
case "safeline-site":
{
nodeCfg["provider"] = "safeline"
_changed = true
return
}
}
}
return
})
// update collection `workflow`
// - migrate field `graphDraft` / `graphContent`
{
collection, err := app.FindCollectionByNameOrId("tovyif5ax6j62ur")
if err != nil {
return err
}
records, err := app.FindAllRecords(collection)
if err != nil {
return err
}
for _, record := range records {
changed := false
if record.GetRaw("graphDraft") != nil {
graph := make(map[string]any)
if err := record.UnmarshalJSONField("graphDraft", &graph); err != nil {
return err
}
if _, ok := graph["nodes"]; ok {
nodes := make([]*mWorkflowNode, 0)
if err := mapstructure.Decode(graph["nodes"], &nodes); err != nil {
return err
}
nodesChanged, err := walker.Visit(nodes)
if err != nil {
return err
} else if nodesChanged {
graph["nodes"] = nodes
record.Set("graphDraft", graph)
changed = true
}
}
}
if record.GetRaw("graphContent") != nil {
graph := make(map[string]any)
if err := record.UnmarshalJSONField("graphContent", &graph); err != nil {
return err
}
if _, ok := graph["nodes"]; ok {
nodes := make([]*mWorkflowNode, 0)
if err := mapstructure.Decode(graph["nodes"], &nodes); err != nil {
return err
}
nodesChanged, err := walker.Visit(nodes)
if err != nil {
return err
} else if nodesChanged {
graph["nodes"] = nodes
record.Set("graphContent", graph)
changed = true
}
}
}
if changed {
if err := app.Save(record); err != nil {
return err
}
tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name)
}
}
}
// update collection `workflow_run`
// - migrate field `graph`
{
collection, err := app.FindCollectionByNameOrId("qjp8lygssgwyqyz")
if err != nil {
return err
}
records, err := app.FindAllRecords(collection)
if err != nil {
return err
}
for _, record := range records {
changed := false
if record.GetRaw("graph") != nil {
graph := make(map[string]any)
if err := record.UnmarshalJSONField("graph", &graph); err != nil {
return err
}
if _, ok := graph["nodes"]; ok {
nodes := make([]*mWorkflowNode, 0)
if err := mapstructure.Decode(graph["nodes"], &nodes); err != nil {
return err
}
nodesChanged, err := walker.Visit(nodes)
if err != nil {
return err
} else if nodesChanged {
graph["nodes"] = nodes
record.Set("graph", graph)
changed = true
}
}
}
if changed {
if err := app.Save(record); err != nil {
return err
}
tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name)
}
}
}
}
tracer.Printf("done")
return nil
}, func(app core.App) error {
return nil
})
}
@@ -1,4 +1,4 @@
package onepanelsite
package onepanel
import (
"context"
@@ -1,4 +1,4 @@
package onepanelsite_test
package onepanel_test
import (
"context"
@@ -8,7 +8,7 @@ import (
"strings"
"testing"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/1panel-site"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/1panel"
)
var (
@@ -34,13 +34,13 @@ func init() {
/*
Shell command to run this test:
go test -v ./1panel_site_test.go -args \
--1PANELSITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--1PANELSITE_INPUTKEYPATH="/path/to/your-input-key.pem" \
--1PANELSITE_SERVERURL="http://127.0.0.1:20410" \
--1PANELSITE_APIVERSION="v1" \
--1PANELSITE_APIKEY="your-api-key" \
--1PANELSITE_WEBSITEID="your-website-id"
go test -v ./1panel_test.go -args \
--1PANEL_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--1PANEL_INPUTKEYPATH="/path/to/your-input-key.pem" \
--1PANEL_SERVERURL="http://127.0.0.1:20410" \
--1PANEL_APIVERSION="v1" \
--1PANEL_APIKEY="your-api-key" \
--1PANEL_WEBSITEID="your-website-id"
*/
func TestDeploy(t *testing.T) {
flag.Parse()
@@ -1,4 +1,4 @@
package onepanelsite
package onepanel
const (
// 资源类型:替换指定网站的证书。
@@ -1,4 +1,4 @@
package baotapanelsite
package baotapanel
import (
"context"
@@ -1,4 +1,4 @@
package baotapanelsite_test
package baotapanel_test
import (
"context"
@@ -8,7 +8,7 @@ import (
"strings"
"testing"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotapanel-site"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotapanel"
)
var (
@@ -21,7 +21,7 @@ var (
)
func init() {
argsPrefix := "BAOTAPANELSITE_"
argsPrefix := "BAOTAPANEL_"
flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
@@ -34,13 +34,13 @@ func init() {
/*
Shell command to run this test:
go test -v ./baotapanel_site_test.go -args \
--BAOTAPANELSITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--BAOTAPANELSITE_INPUTKEYPATH="/path/to/your-input-key.pem" \
--BAOTAPANELSITE_SERVERURL="http://127.0.0.1:8888" \
--BAOTAPANELSITE_APIKEY="your-api-key" \
--BAOTAPANELSITE_SITETYPE="php" \
--BAOTAPANELSITE_SITENAME="your-site-name"
go test -v ./baotapanel_test.go -args \
--BAOTAPANEL_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--BAOTAPANEL_INPUTKEYPATH="/path/to/your-input-key.pem" \
--BAOTAPANEL_SERVERURL="http://127.0.0.1:8888" \
--BAOTAPANEL_APIKEY="your-api-key" \
--BAOTAPANEL_SITETYPE="php" \
--BAOTAPANEL_SITENAME="your-site-name"
*/
func TestDeploy(t *testing.T) {
flag.Parse()
@@ -1,4 +1,4 @@
package baotapanelgosite
package baotapanelgo
import (
"context"
@@ -1,4 +1,4 @@
package baotapanelgosite_test
package baotapanelgo_test
import (
"context"
@@ -8,7 +8,7 @@ import (
"strings"
"testing"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotapanelgo-site"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotapanelgo"
)
var (
@@ -21,7 +21,7 @@ var (
)
func init() {
argsPrefix := "BAOTAPANELGOSITE_"
argsPrefix := "BAOTAPANELGO_"
flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
@@ -34,13 +34,13 @@ func init() {
/*
Shell command to run this test:
go test -v ./baotapanelgo_site_test.go -args \
--BAOTAPANELGOSITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--BAOTAPANELGOSITE_INPUTKEYPATH="/path/to/your-input-key.pem" \
--BAOTAPANELGOSITE_SERVERURL="http://127.0.0.1:8888" \
--BAOTAPANELGOSITE_APIKEY="your-api-key" \
--BAOTAPANELGOSITE_SITETYPE="your-site-type" \
--BAOTAPANELGOSITE_SITENAME="your-site-name"
go test -v ./baotapanelgo_test.go -args \
--BAOTAPANELGO_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--BAOTAPANELGO_INPUTKEYPATH="/path/to/your-input-key.pem" \
--BAOTAPANELGO_SERVERURL="http://127.0.0.1:8888" \
--BAOTAPANELGO_APIKEY="your-api-key" \
--BAOTAPANELGO_SITETYPE="your-site-type" \
--BAOTAPANELGO_SITENAME="your-site-name"
*/
func TestDeploy(t *testing.T) {
flag.Parse()
@@ -1,4 +1,4 @@
package baotapanelwaf
package baotawaf
import (
"context"
@@ -1,4 +1,4 @@
package baotapanelwaf_test
package baotawaf_test
import (
"context"
@@ -8,7 +8,7 @@ import (
"strings"
"testing"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotawaf-site"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/baotawaf"
)
var (
@@ -21,7 +21,7 @@ var (
)
func init() {
argsPrefix := "BAOTAWAFSITE_"
argsPrefix := "BAOTAWAF_"
flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
@@ -34,13 +34,13 @@ func init() {
/*
Shell command to run this test:
go test -v ./baotawaf_site_test.go -args \
--BAOTAWAFSITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--BAOTAWAFSITE_INPUTKEYPATH="/path/to/your-input-key.pem" \
--BAOTAWAFSITE_SERVERURL="http://127.0.0.1:8888" \
--BAOTAWAFSITE_APIKEY="your-api-key" \
--BAOTAWAFSITE_SITENAME="your-site-name" \
--BAOTAWAFSITE_SITEPORT=443
go test -v ./baotawaf_test.go -args \
--BAOTAWAF_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--BAOTAWAF_INPUTKEYPATH="/path/to/your-input-key.pem" \
--BAOTAWAF_SERVERURL="http://127.0.0.1:8888" \
--BAOTAWAF_APIKEY="your-api-key" \
--BAOTAWAF_SITENAME="your-site-name" \
--BAOTAWAF_SITEPORT=443
*/
func TestDeploy(t *testing.T) {
flag.Parse()
+2 -2
View File
@@ -27,7 +27,7 @@ type DeployerConfig struct {
// 部署资源类型。
ResourceType string `json:"resourceType"`
// 网站 ID。
// 部署资源类型为 [RESOURCE_TYPE_SITE] 时必填。
// 部署资源类型为 [RESOURCE_TYPE_WEBSITE] 时必填。
SiteId string `json:"siteId,omitempty"`
// 证书 ID。
// 部署资源类型为 [RESOURCE_TYPE_CERTIFICATE] 时必填。
@@ -70,7 +70,7 @@ func (d *Deployer) SetLogger(logger *slog.Logger) {
func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*deployer.DeployResult, error) {
// 根据部署资源类型决定部署方式
switch d.config.ResourceType {
case RESOURCE_TYPE_SITE:
case RESOURCE_TYPE_WEBSITE:
if err := d.deployToSite(ctx, certPEM, privkeyPEM); err != nil {
return nil, err
}
+1 -1
View File
@@ -2,7 +2,7 @@ package cdnfly
const (
// 资源类型:替换指定网站的证书。
RESOURCE_TYPE_SITE = "site"
RESOURCE_TYPE_WEBSITE = "website"
// 资源类型:替换指定证书。
RESOURCE_TYPE_CERTIFICATE = "certificate"
)
@@ -0,0 +1,6 @@
package cpanel
const (
// 资源类型:替换指定网站的证书。
RESOURCE_TYPE_WEBSITE = "website"
)
@@ -1,4 +1,4 @@
package cpanelsite
package cpanel
import (
"context"
@@ -23,8 +23,11 @@ type DeployerConfig struct {
ApiToken string `json:"apiToken"`
// 是否允许不安全的连接。
AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"`
// 部署资源类型。
ResourceType string `json:"resourceType"`
// 网站域名(不支持泛域名)。
Domain string `json:"domain"`
// 部署资源类型为 [RESOURCE_TYPE_WEBSITE] 时必填。
Domain string `json:"domain,omitempty"`
}
type Deployer struct {
@@ -61,14 +64,29 @@ func (d *Deployer) SetLogger(logger *slog.Logger) {
}
func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*deployer.DeployResult, error) {
// 根据部署资源类型决定部署方式
switch d.config.ResourceType {
case RESOURCE_TYPE_WEBSITE:
if err := d.deployToWebsite(ctx, certPEM, privkeyPEM); err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("unsupported resource type '%s'", d.config.ResourceType)
}
return &deployer.DeployResult{}, nil
}
func (d *Deployer) deployToWebsite(ctx context.Context, certPEM, privkeyPEM string) error {
if d.config.Domain == "" {
return nil, errors.New("config `domain` is required")
return errors.New("config `domain` is required")
}
// 提取服务器证书和中间证书
serverCertPEM, intermediaCertPEM, err := xcert.ExtractCertificatesFromPEM(certPEM)
if err != nil {
return nil, fmt.Errorf("failed to extract certs: %w", err)
return fmt.Errorf("failed to extract certs: %w", err)
}
// 安装 SSL 证书
@@ -82,10 +100,10 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep
sslInstallSSLResp, err := d.sdkClient.SSLInstallSSL(sslInstallSSLReq)
d.logger.Debug("sdk request 'SSL.install_ssl'", slog.Any("request", sslInstallSSLReq), slog.Any("response", sslInstallSSLResp))
if err != nil {
return nil, fmt.Errorf("failed to execute sdk request 'SSL.install_ssl': %w", err)
return fmt.Errorf("failed to execute sdk request 'SSL.install_ssl': %w", err)
}
return &deployer.DeployResult{}, nil
return nil
}
func createSDKClient(serverUrl, username, apiToken string, skipTlsVerify bool) (*cpanelsdk.Client, error) {
@@ -1,4 +1,4 @@
package cpanelsite_test
package cpanel_test
import (
"context"
@@ -8,7 +8,7 @@ import (
"strings"
"testing"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/cpanel-site"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/cpanel"
)
var (
@@ -21,7 +21,7 @@ var (
)
func init() {
argsPrefix := "CPANELSITE_"
argsPrefix := "CPANEL_"
flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
@@ -34,13 +34,13 @@ func init() {
/*
Shell command to run this test:
go test -v ./cpanel_site_test.go -args \
--CPANELSITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--CPANELSITE_INPUTKEYPATH="/path/to/your-input-key.pem" \
--CPANELSITE_SERVERURL="http://127.0.0.1:2082" \
--CPANELSITE_USERNAME="your-username" \
--CPANELSITE_APITOKEN="your-api-token" \
--CPANELSITE_DOMAIN="example.com"
go test -v ./cpanel_test.go -args \
--CPANEL_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--CPANEL_INPUTKEYPATH="/path/to/your-input-key.pem" \
--CPANEL_SERVERURL="http://127.0.0.1:2082" \
--CPANEL_USERNAME="your-username" \
--CPANEL_APITOKEN="your-api-token" \
--CPANEL_DOMAIN="example.com"
*/
func TestDeploy(t *testing.T) {
flag.Parse()
@@ -61,6 +61,7 @@ func TestDeploy(t *testing.T) {
Username: fUsername,
ApiToken: fApiToken,
AllowInsecureConnections: true,
ResourceType: provider.RESOURCE_TYPE_WEBSITE,
Domain: fDomain,
})
if err != nil {
@@ -0,0 +1,6 @@
package netlify
const (
// 资源类型:替换指定网站的证书。
RESOURCE_TYPE_WEBSITE = "website"
)
@@ -1,4 +1,4 @@
package netlifysite
package netlify
import (
"context"
@@ -14,8 +14,11 @@ import (
type DeployerConfig struct {
// netlify API Token。
ApiToken string `json:"apiToken"`
// 部署资源类型。
ResourceType string `json:"resourceType"`
// netlify 网站 ID。
SiteId string `json:"siteId"`
// 部署资源类型为 [RESOURCE_TYPE_WEBSITE] 时必填。
SiteId string `json:"siteId,omitempty"`
}
type Deployer struct {
@@ -52,14 +55,29 @@ func (d *Deployer) SetLogger(logger *slog.Logger) {
}
func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*deployer.DeployResult, error) {
// 根据部署资源类型决定部署方式
switch d.config.ResourceType {
case RESOURCE_TYPE_WEBSITE:
if err := d.deployToWebsite(ctx, certPEM, privkeyPEM); err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("unsupported resource type '%s'", d.config.ResourceType)
}
return &deployer.DeployResult{}, nil
}
func (d *Deployer) deployToWebsite(ctx context.Context, certPEM, privkeyPEM string) error {
if d.config.SiteId == "" {
return nil, errors.New("config `siteId` is required")
return errors.New("config `siteId` is required")
}
// 提取服务器证书和中间证书
serverCertPEM, intermediaCertPEM, err := xcert.ExtractCertificatesFromPEM(certPEM)
if err != nil {
return nil, fmt.Errorf("failed to extract certs: %w", err)
return fmt.Errorf("failed to extract certs: %w", err)
}
// 上传网站证书
@@ -72,10 +90,10 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep
provisionSiteTLSCertificateResp, err := d.sdkClient.ProvisionSiteTLSCertificate(d.config.SiteId, provisionSiteTLSCertificateReq)
d.logger.Debug("sdk request 'netlify.provisionSiteTLSCertificate'", slog.String("siteId", d.config.SiteId), slog.Any("request", provisionSiteTLSCertificateReq), slog.Any("response", provisionSiteTLSCertificateResp))
if err != nil {
return nil, fmt.Errorf("failed to execute sdk request 'netlify.provisionSiteTLSCertificate': %w", err)
return fmt.Errorf("failed to execute sdk request 'netlify.provisionSiteTLSCertificate': %w", err)
}
return &deployer.DeployResult{}, nil
return nil
}
func createSDKClient(apiToken string) (*netlifysdk.Client, error) {
@@ -1,4 +1,4 @@
package netlifysite_test
package netlify_test
import (
"context"
@@ -8,7 +8,7 @@ import (
"strings"
"testing"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/netlify-site"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/netlify"
)
var (
@@ -19,7 +19,7 @@ var (
)
func init() {
argsPrefix := "NETLIFYSITE_"
argsPrefix := "NETLIFY_"
flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
@@ -30,11 +30,11 @@ func init() {
/*
Shell command to run this test:
go test -v ./netlify_site_test.go -args \
--NETLIFYSITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--NETLIFYSITE_INPUTKEYPATH="/path/to/your-input-key.pem" \
--NETLIFYSITE_APITOKEN="your-api-token" \
--NETLIFYSITE_SITEID="your-site-id"
go test -v ./netlify_test.go -args \
--NETLIFY_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--NETLIFY_INPUTKEYPATH="/path/to/your-input-key.pem" \
--NETLIFY_APITOKEN="your-api-token" \
--NETLIFY_SITEID="your-site-id"
*/
func TestDeploy(t *testing.T) {
flag.Parse()
@@ -49,8 +49,9 @@ func TestDeploy(t *testing.T) {
}, "\n"))
provider, err := provider.NewDeployer(&provider.DeployerConfig{
ApiToken: fApiToken,
SiteId: fSiteId,
ApiToken: fApiToken,
ResourceType: provider.RESOURCE_TYPE_WEBSITE,
SiteId: fSiteId,
})
if err != nil {
t.Errorf("err: %+v", err)
@@ -0,0 +1,6 @@
package ratpanel
const (
// 资源类型:替换指定网站的证书。
RESOURCE_TYPE_WEBSITE = "website"
)
@@ -1,4 +1,4 @@
package ratpanelsite
package ratpanel
import (
"context"
@@ -20,8 +20,11 @@ type DeployerConfig struct {
AccessToken string `json:"accessToken"`
// 是否允许不安全的连接。
AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"`
// 部署资源类型。
ResourceType string `json:"resourceType"`
// 网站名称。
SiteNames []string `json:"siteNames"`
// 部署资源类型为 [RESOURCE_TYPE_WEBSITE] 时必填。
SiteNames []string `json:"siteNames,omitempty"`
}
type Deployer struct {
@@ -58,8 +61,23 @@ func (d *Deployer) SetLogger(logger *slog.Logger) {
}
func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*deployer.DeployResult, error) {
// 根据部署资源类型决定部署方式
switch d.config.ResourceType {
case RESOURCE_TYPE_WEBSITE:
if err := d.deployToWebsite(ctx, certPEM, privkeyPEM); err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("unsupported resource type '%s'", d.config.ResourceType)
}
return &deployer.DeployResult{}, nil
}
func (d *Deployer) deployToWebsite(ctx context.Context, certPEM, privkeyPEM string) error {
if len(d.config.SiteNames) == 0 {
return nil, errors.New("config `siteNames` is required")
return errors.New("config `siteNames` is required")
}
// 遍历更新站点证书
@@ -67,7 +85,7 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep
for _, siteName := range d.config.SiteNames {
select {
case <-ctx.Done():
return nil, ctx.Err()
return ctx.Err()
default:
if err := d.updateSiteCertificate(ctx, siteName, certPEM, privkeyPEM); err != nil {
errs = append(errs, err)
@@ -75,10 +93,10 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep
}
}
if len(errs) > 0 {
return nil, errors.Join(errs...)
return errors.Join(errs...)
}
return &deployer.DeployResult{}, nil
return nil
}
func (d *Deployer) updateSiteCertificate(ctx context.Context, siteName string, certPEM, privkeyPEM string) error {
@@ -1,4 +1,4 @@
package ratpanelsite_test
package ratpanel_test
import (
"context"
@@ -8,7 +8,7 @@ import (
"strings"
"testing"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/ratpanel-site"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/ratpanel"
)
var (
@@ -21,7 +21,7 @@ var (
)
func init() {
argsPrefix := "RATPANELSITE_"
argsPrefix := "RATPANEL_"
flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
@@ -34,13 +34,13 @@ func init() {
/*
Shell command to run this test:
go test -v ./ratpanel_site_test.go -args \
--RATPANELSITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--RATPANELSITE_INPUTKEYPATH="/path/to/your-input-key.pem" \
--RATPANELSITE_SERVERURL="http://127.0.0.1:8888" \
--RATPANELSITE_ACCESSTOKENID="your-access-token-id" \
--RATPANELSITE_ACCESSTOKEN="your-access-token" \
--RATPANELSITE_SITENAME="your-site-name"
go test -v ./ratpanel_test.go -args \
--RATPANEL_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--RATPANEL_INPUTKEYPATH="/path/to/your-input-key.pem" \
--RATPANEL_SERVERURL="http://127.0.0.1:8888" \
--RATPANEL_ACCESSTOKENID="your-access-token-id" \
--RATPANEL_ACCESSTOKEN="your-access-token" \
--RATPANEL_SITENAME="your-site-name"
*/
func TestDeploy(t *testing.T) {
flag.Parse()
@@ -61,6 +61,7 @@ func TestDeploy(t *testing.T) {
AccessTokenId: fAccessTokenId,
AccessToken: fAccessToken,
AllowInsecureConnections: true,
ResourceType: provider.RESOURCE_TYPE_WEBSITE,
SiteNames: []string{fSiteName},
})
if err != nil {
@@ -1,4 +1,4 @@
package safelinesite
package safeline
const (
// 资源类型:替换指定证书。
@@ -1,4 +1,4 @@
package safelinesite
package safeline
import (
"context"
@@ -1,4 +1,4 @@
package safelinesite_test
package safeline_test
import (
"context"
@@ -8,7 +8,7 @@ import (
"strings"
"testing"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/safeline-site"
provider "github.com/certimate-go/certimate/pkg/core/deployer/providers/safeline"
)
var (
@@ -20,7 +20,7 @@ var (
)
func init() {
argsPrefix := "SAFELINESITE_"
argsPrefix := "SAFELINE_"
flag.StringVar(&fInputCertPath, argsPrefix+"INPUTCERTPATH", "", "")
flag.StringVar(&fInputKeyPath, argsPrefix+"INPUTKEYPATH", "", "")
@@ -32,12 +32,12 @@ func init() {
/*
Shell command to run this test:
go test -v ./safeline_site_test.go -args \
--SAFELINESITE_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--SAFELINESITE_INPUTKEYPATH="/path/to/your-input-key.pem" \
--SAFELINESITE_SERVERURL="http://127.0.0.1:9443" \
--SAFELINESITE_APITOKEN="your-api-token" \
--SAFELINESITE_CERTIFICATEID="your-certificate-id"
go test -v ./safeline_test.go -args \
--SAFELINE_INPUTCERTPATH="/path/to/your-input-cert.pem" \
--SAFELINE_INPUTKEYPATH="/path/to/your-input-key.pem" \
--SAFELINE_SERVERURL="http://127.0.0.1:9443" \
--SAFELINE_APITOKEN="your-api-token" \
--SAFELINE_CERTIFICATEID="your-certificate-id"
*/
func TestDeploy(t *testing.T) {
flag.Parse()
@@ -2,8 +2,8 @@
import { DEPLOYMENT_PROVIDERS, type DeploymentProviderType } from "@/domain/provider";
import BizDeployNodeConfigFieldsProvider1Panel from "./BizDeployNodeConfigFieldsProvider1Panel.tsx";
import BizDeployNodeConfigFieldsProvider1PanelConsole from "./BizDeployNodeConfigFieldsProvider1PanelConsole";
import BizDeployNodeConfigFieldsProvider1PanelSite from "./BizDeployNodeConfigFieldsProvider1PanelSite";
import BizDeployNodeConfigFieldsProviderAliyunALB from "./BizDeployNodeConfigFieldsProviderAliyunALB";
import BizDeployNodeConfigFieldsProviderAliyunAPIGW from "./BizDeployNodeConfigFieldsProviderAliyunAPIGW";
import BizDeployNodeConfigFieldsProviderAliyunCAS from "./BizDeployNodeConfigFieldsProviderAliyunCAS";
@@ -29,15 +29,15 @@ import BizDeployNodeConfigFieldsProviderBaiduCloudAppBLB from "./BizDeployNodeCo
import BizDeployNodeConfigFieldsProviderBaiduCloudBLB from "./BizDeployNodeConfigFieldsProviderBaiduCloudBLB";
import BizDeployNodeConfigFieldsProviderBaiduCloudCDN from "./BizDeployNodeConfigFieldsProviderBaiduCloudCDN";
import BizDeployNodeConfigFieldsProviderBaishanCDN from "./BizDeployNodeConfigFieldsProviderBaishanCDN";
import BizDeployNodeConfigFieldsProviderBaotaPanel from "./BizDeployNodeConfigFieldsProviderBaotaPanel.tsx";
import BizDeployNodeConfigFieldsProviderBaotaPanelConsole from "./BizDeployNodeConfigFieldsProviderBaotaPanelConsole";
import BizDeployNodeConfigFieldsProviderBaotaPanelGo from "./BizDeployNodeConfigFieldsProviderBaotaPanelGo.tsx";
import BizDeployNodeConfigFieldsProviderBaotaPanelGoConsole from "./BizDeployNodeConfigFieldsProviderBaotaPanelGoConsole";
import BizDeployNodeConfigFieldsProviderBaotaPanelGoSite from "./BizDeployNodeConfigFieldsProviderBaotaPanelGoSite";
import BizDeployNodeConfigFieldsProviderBaotaPanelSite from "./BizDeployNodeConfigFieldsProviderBaotaPanelSite";
import BizDeployNodeConfigFieldsProviderBaotaWAFSite from "./BizDeployNodeConfigFieldsProviderBaotaWAFSite";
import BizDeployNodeConfigFieldsProviderBaotaWAF from "./BizDeployNodeConfigFieldsProviderBaotaWAF.tsx";
import BizDeployNodeConfigFieldsProviderBunnyCDN from "./BizDeployNodeConfigFieldsProviderBunnyCDN";
import BizDeployNodeConfigFieldsProviderBytePlusCDN from "./BizDeployNodeConfigFieldsProviderBytePlusCDN";
import BizDeployNodeConfigFieldsProviderCdnfly from "./BizDeployNodeConfigFieldsProviderCdnfly";
import BizDeployNodeConfigFieldsProviderCPanelSite from "./BizDeployNodeConfigFieldsProviderCPanelSite";
import BizDeployNodeConfigFieldsProviderCPanel from "./BizDeployNodeConfigFieldsProviderCPanel.tsx";
import BizDeployNodeConfigFieldsProviderCTCCCloudAO from "./BizDeployNodeConfigFieldsProviderCTCCCloudAO";
import BizDeployNodeConfigFieldsProviderCTCCCloudCDN from "./BizDeployNodeConfigFieldsProviderCTCCCloudCDN";
import BizDeployNodeConfigFieldsProviderCTCCCloudELB from "./BizDeployNodeConfigFieldsProviderCTCCCloudELB";
@@ -62,14 +62,14 @@ import BizDeployNodeConfigFieldsProviderKubernetesSecret from "./BizDeployNodeCo
import BizDeployNodeConfigFieldsProviderLeCDN from "./BizDeployNodeConfigFieldsProviderLeCDN";
import BizDeployNodeConfigFieldsProviderLocal from "./BizDeployNodeConfigFieldsProviderLocal";
import BizDeployNodeConfigFieldsProviderMohuaMVH from "./BizDeployNodeConfigFieldsProviderMohuaMVH";
import BizDeployNodeConfigFieldsProviderNetlifySite from "./BizDeployNodeConfigFieldsProviderNetlifySite";
import BizDeployNodeConfigFieldsProviderNetlify from "./BizDeployNodeConfigFieldsProviderNetlify.tsx";
import BizDeployNodeConfigFieldsProviderProxmoxVE from "./BizDeployNodeConfigFieldsProviderProxmoxVE";
import BizDeployNodeConfigFieldsProviderQiniuCDN from "./BizDeployNodeConfigFieldsProviderQiniuCDN";
import BizDeployNodeConfigFieldsProviderQiniuKodo from "./BizDeployNodeConfigFieldsProviderQiniuKodo";
import BizDeployNodeConfigFieldsProviderQiniuPili from "./BizDeployNodeConfigFieldsProviderQiniuPili";
import BizDeployNodeConfigFieldsProviderRainYunRCDN from "./BizDeployNodeConfigFieldsProviderRainYunRCDN";
import BizDeployNodeConfigFieldsProviderRatPanelSite from "./BizDeployNodeConfigFieldsProviderRatPanelSite";
import BizDeployNodeConfigFieldsProviderSafeLineSite from "./BizDeployNodeConfigFieldsProviderSafeLineSite";
import BizDeployNodeConfigFieldsProviderRatPanel from "./BizDeployNodeConfigFieldsProviderRatPanel.tsx";
import BizDeployNodeConfigFieldsProviderSafeLine from "./BizDeployNodeConfigFieldsProviderSafeLine.tsx";
import BizDeployNodeConfigFieldsProviderSSH from "./BizDeployNodeConfigFieldsProviderSSH";
import BizDeployNodeConfigFieldsProviderTencentCloudCDN from "./BizDeployNodeConfigFieldsProviderTencentCloudCDN";
import BizDeployNodeConfigFieldsProviderTencentCloudCLB from "./BizDeployNodeConfigFieldsProviderTencentCloudCLB";
@@ -114,7 +114,7 @@ const providerComponentMap: Partial<Record<DeploymentProviderType, React.Compone
NOTICE: If you add new child component, please keep ASCII order.
*/
[DEPLOYMENT_PROVIDERS["1PANEL_CONSOLE"]]: BizDeployNodeConfigFieldsProvider1PanelConsole,
[DEPLOYMENT_PROVIDERS["1PANEL_SITE"]]: BizDeployNodeConfigFieldsProvider1PanelSite,
[DEPLOYMENT_PROVIDERS["1PANEL"]]: BizDeployNodeConfigFieldsProvider1Panel,
[DEPLOYMENT_PROVIDERS.ALIYUN_ALB]: BizDeployNodeConfigFieldsProviderAliyunALB,
[DEPLOYMENT_PROVIDERS.ALIYUN_APIGW]: BizDeployNodeConfigFieldsProviderAliyunAPIGW,
[DEPLOYMENT_PROVIDERS.ALIYUN_CAS]: BizDeployNodeConfigFieldsProviderAliyunCAS,
@@ -141,14 +141,14 @@ const providerComponentMap: Partial<Record<DeploymentProviderType, React.Compone
[DEPLOYMENT_PROVIDERS.BAIDUCLOUD_CDN]: BizDeployNodeConfigFieldsProviderBaiduCloudCDN,
[DEPLOYMENT_PROVIDERS.BAISHAN_CDN]: BizDeployNodeConfigFieldsProviderBaishanCDN,
[DEPLOYMENT_PROVIDERS.BAOTAPANEL_CONSOLE]: BizDeployNodeConfigFieldsProviderBaotaPanelConsole,
[DEPLOYMENT_PROVIDERS.BAOTAPANEL_SITE]: BizDeployNodeConfigFieldsProviderBaotaPanelSite,
[DEPLOYMENT_PROVIDERS.BAOTAPANEL]: BizDeployNodeConfigFieldsProviderBaotaPanel,
[DEPLOYMENT_PROVIDERS.BAOTAPANELGO_CONSOLE]: BizDeployNodeConfigFieldsProviderBaotaPanelGoConsole,
[DEPLOYMENT_PROVIDERS.BAOTAPANELGO_SITE]: BizDeployNodeConfigFieldsProviderBaotaPanelGoSite,
[DEPLOYMENT_PROVIDERS.BAOTAWAF_SITE]: BizDeployNodeConfigFieldsProviderBaotaWAFSite,
[DEPLOYMENT_PROVIDERS.BAOTAPANELGO]: BizDeployNodeConfigFieldsProviderBaotaPanelGo,
[DEPLOYMENT_PROVIDERS.BAOTAWAF]: BizDeployNodeConfigFieldsProviderBaotaWAF,
[DEPLOYMENT_PROVIDERS.BUNNY_CDN]: BizDeployNodeConfigFieldsProviderBunnyCDN,
[DEPLOYMENT_PROVIDERS.BYTEPLUS_CDN]: BizDeployNodeConfigFieldsProviderBytePlusCDN,
[DEPLOYMENT_PROVIDERS.CDNFLY]: BizDeployNodeConfigFieldsProviderCdnfly,
[DEPLOYMENT_PROVIDERS.CPANEL_SITE]: BizDeployNodeConfigFieldsProviderCPanelSite,
[DEPLOYMENT_PROVIDERS.CPANEL]: BizDeployNodeConfigFieldsProviderCPanel,
[DEPLOYMENT_PROVIDERS.CTCCCLOUD_AO]: BizDeployNodeConfigFieldsProviderCTCCCloudAO,
[DEPLOYMENT_PROVIDERS.CTCCCLOUD_CDN]: BizDeployNodeConfigFieldsProviderCTCCCloudCDN,
[DEPLOYMENT_PROVIDERS.CTCCCLOUD_ELB]: BizDeployNodeConfigFieldsProviderCTCCCloudELB,
@@ -173,14 +173,14 @@ const providerComponentMap: Partial<Record<DeploymentProviderType, React.Compone
[DEPLOYMENT_PROVIDERS.LECDN]: BizDeployNodeConfigFieldsProviderLeCDN,
[DEPLOYMENT_PROVIDERS.LOCAL]: BizDeployNodeConfigFieldsProviderLocal,
[DEPLOYMENT_PROVIDERS.MOHUA_MVH]: BizDeployNodeConfigFieldsProviderMohuaMVH,
[DEPLOYMENT_PROVIDERS.NETLIFY_SITE]: BizDeployNodeConfigFieldsProviderNetlifySite,
[DEPLOYMENT_PROVIDERS.NETLIFY]: BizDeployNodeConfigFieldsProviderNetlify,
[DEPLOYMENT_PROVIDERS.PROXMOXVE]: BizDeployNodeConfigFieldsProviderProxmoxVE,
[DEPLOYMENT_PROVIDERS.QINIU_CDN]: BizDeployNodeConfigFieldsProviderQiniuCDN,
[DEPLOYMENT_PROVIDERS.QINIU_KODO]: BizDeployNodeConfigFieldsProviderQiniuKodo,
[DEPLOYMENT_PROVIDERS.QINIU_PILI]: BizDeployNodeConfigFieldsProviderQiniuPili,
[DEPLOYMENT_PROVIDERS.RAINYUN_RCDN]: BizDeployNodeConfigFieldsProviderRainYunRCDN,
[DEPLOYMENT_PROVIDERS.RATPANEL_SITE]: BizDeployNodeConfigFieldsProviderRatPanelSite,
[DEPLOYMENT_PROVIDERS.SAFELINE_SITE]: BizDeployNodeConfigFieldsProviderSafeLineSite,
[DEPLOYMENT_PROVIDERS.RATPANEL]: BizDeployNodeConfigFieldsProviderRatPanel,
[DEPLOYMENT_PROVIDERS.SAFELINE]: BizDeployNodeConfigFieldsProviderSafeLine,
[DEPLOYMENT_PROVIDERS.SSH]: BizDeployNodeConfigFieldsProviderSSH,
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CDN]: BizDeployNodeConfigFieldsProviderTencentCloudCDN,
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CLB]: BizDeployNodeConfigFieldsProviderTencentCloudCLB,
@@ -13,7 +13,7 @@ const RESOURCE_TYPE_CERTIFICATE = "certificate" as const;
const WEBSITE_MATCH_PATTERN_SPECIFIED = "specified" as const;
const WEBSITE_MATCH_PATTERN_CERTSAN = "certsan" as const;
const BizDeployNodeConfigFieldsProvider1PanelSite = () => {
const BizDeployNodeConfigFieldsProvider1Panel = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
@@ -32,12 +32,12 @@ const BizDeployNodeConfigFieldsProvider1PanelSite = () => {
<Form.Item
name={[parentNamePath, "nodeName"]}
initialValue={initialValues.nodeName}
label={t("workflow_node.deploy.form.1panel_site_node_name.label")}
extra={t("workflow_node.deploy.form.1panel_site_node_name.help")}
label={t("workflow_node.deploy.form.1panel_node_name.label")}
extra={t("workflow_node.deploy.form.1panel_node_name.help")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.1panel_site_node_name.tooltip") }}></span>}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.1panel_node_name.tooltip") }}></span>}
>
<Input allowClear placeholder={t("workflow_node.deploy.form.1panel_site_node_name.placeholder")} />
<Input allowClear placeholder={t("workflow_node.deploy.form.1panel_node_name.placeholder")} />
</Form.Item>
<Form.Item
@@ -49,7 +49,7 @@ const BizDeployNodeConfigFieldsProvider1PanelSite = () => {
<Select
options={[RESOURCE_TYPE_WEBSITE, RESOURCE_TYPE_CERTIFICATE].map((s) => ({
value: s,
label: t(`workflow_node.deploy.form.1panel_site_resource_type.option.${s}.label`),
label: t(`workflow_node.deploy.form.1panel_resource_type.option.${s}.label`),
}))}
placeholder={t("workflow_node.deploy.form.shared_resource_type.placeholder")}
/>
@@ -59,10 +59,10 @@ const BizDeployNodeConfigFieldsProvider1PanelSite = () => {
<Form.Item
name={[parentNamePath, "websiteMatchPattern"]}
initialValue={initialValues.websiteMatchPattern}
label={t("workflow_node.deploy.form.1panel_site_website_match_pattern.label")}
label={t("workflow_node.deploy.form.1panel_website_match_pattern.label")}
extra={
fieldWebsiteMatchPattern === WEBSITE_MATCH_PATTERN_CERTSAN ? (
<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.1panel_site_website_match_pattern.help_certsan") }}></span>
<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.1panel_website_match_pattern.help_certsan") }}></span>
) : (
void 0
)
@@ -72,7 +72,7 @@ const BizDeployNodeConfigFieldsProvider1PanelSite = () => {
<Radio.Group
options={[WEBSITE_MATCH_PATTERN_SPECIFIED, WEBSITE_MATCH_PATTERN_CERTSAN].map((s) => ({
key: s,
label: t(`workflow_node.deploy.form.1panel_site_website_match_pattern.option.${s}.label`),
label: t(`workflow_node.deploy.form.1panel_website_match_pattern.option.${s}.label`),
value: s,
}))}
/>
@@ -82,11 +82,11 @@ const BizDeployNodeConfigFieldsProvider1PanelSite = () => {
<Form.Item
name={[parentNamePath, "websiteId"]}
initialValue={initialValues.websiteId}
label={t("workflow_node.deploy.form.1panel_site_website_id.label")}
label={t("workflow_node.deploy.form.1panel_website_id.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.1panel_site_website_id.tooltip") }}></span>}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.1panel_website_id.tooltip") }}></span>}
>
<Input type="number" placeholder={t("workflow_node.deploy.form.1panel_site_website_id.placeholder")} />
<Input type="number" placeholder={t("workflow_node.deploy.form.1panel_website_id.placeholder")} />
</Form.Item>
</Show>
</Show>
@@ -95,11 +95,11 @@ const BizDeployNodeConfigFieldsProvider1PanelSite = () => {
<Form.Item
name={[parentNamePath, "certificateId"]}
initialValue={initialValues.certificateId}
label={t("workflow_node.deploy.form.1panel_site_certificate_id.label")}
label={t("workflow_node.deploy.form.1panel_certificate_id.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.1panel_site_certificate_id.tooltip") }}></span>}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.1panel_certificate_id.tooltip") }}></span>}
>
<Input type="number" placeholder={t("workflow_node.deploy.form.1panel_site_certificate_id.placeholder")} />
<Input type="number" placeholder={t("workflow_node.deploy.form.1panel_certificate_id.placeholder")} />
</Form.Item>
</Show>
</>
@@ -137,7 +137,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
if (!res.success) {
ctx.addIssue({
code: "custom",
message: t("workflow_node.deploy.form.1panel_site_website_id.placeholder"),
message: t("workflow_node.deploy.form.1panel_website_id.placeholder"),
path: ["websiteId"],
});
}
@@ -147,7 +147,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
} else {
ctx.addIssue({
code: "custom",
message: t("workflow_node.deploy.form.1panel_site_website_match_pattern.placeholder"),
message: t("workflow_node.deploy.form.1panel_website_match_pattern.placeholder"),
path: ["websiteMatchPattern"],
});
}
@@ -160,7 +160,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
if (!res.success) {
ctx.addIssue({
code: "custom",
message: t("workflow_node.deploy.form.1panel_site_certificate_id.placeholder"),
message: t("workflow_node.deploy.form.1panel_certificate_id.placeholder"),
path: ["websiteId"],
});
}
@@ -170,7 +170,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProvider1PanelSite, {
const _default = Object.assign(BizDeployNodeConfigFieldsProvider1Panel, {
getInitialValues,
getSchema,
});
@@ -10,7 +10,7 @@ import { useFormNestedFieldsContext } from "./_context";
const MULTIPLE_INPUT_SEPARATOR = ";";
const BizDeployNodeConfigFieldsProviderBaotaPanelSite = () => {
const BizDeployNodeConfigFieldsProviderBaotaPanel = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
@@ -23,7 +23,7 @@ const BizDeployNodeConfigFieldsProviderBaotaPanelSite = () => {
return (
<>
<Form.Item>
<Tips message={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.baotapanel_site.guide") }}></span>} />
<Tips message={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.baotapanel.guide") }}></span>} />
</Form.Item>
<Form.Item
@@ -86,7 +86,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProviderBaotaPanelSite, {
const _default = Object.assign(BizDeployNodeConfigFieldsProviderBaotaPanel, {
getInitialValues,
getSchema,
});
@@ -9,7 +9,7 @@ import { useFormNestedFieldsContext } from "./_context";
const MULTIPLE_INPUT_SEPARATOR = ";";
const BizDeployNodeConfigFieldsProviderBaotaPanelGoSite = () => {
const BizDeployNodeConfigFieldsProviderBaotaPanelGo = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
@@ -81,7 +81,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProviderBaotaPanelGoSite, {
const _default = Object.assign(BizDeployNodeConfigFieldsProviderBaotaPanelGo, {
getInitialValues,
getSchema,
});
@@ -10,7 +10,7 @@ import { useFormNestedFieldsContext } from "./_context";
const MULTIPLE_INPUT_SEPARATOR = ";";
const BizDeployNodeConfigFieldsProviderBaotaWAFSite = () => {
const BizDeployNodeConfigFieldsProviderBaotaWAF = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
@@ -76,7 +76,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProviderBaotaWAFSite, {
const _default = Object.assign(BizDeployNodeConfigFieldsProviderBaotaWAF, {
getInitialValues,
getSchema,
});
@@ -0,0 +1,94 @@
import { getI18n, useTranslation } from "react-i18next";
import { Form, Input, Select } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import Show from "@/components/Show";
import { isDomain } from "@/utils/validator";
import { useFormNestedFieldsContext } from "./_context";
const RESOURCE_TYPE_WEBSITE = "website" as const;
const BizDeployNodeConfigFieldsProviderCPanel = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
const formSchema = z.object({
[parentNamePath]: getSchema({ i18n }),
});
const formRule = createSchemaFieldRule(formSchema);
const formInst = Form.useFormInstance();
const initialValues = getInitialValues();
const fieldResourceType = Form.useWatch([parentNamePath, "resourceType"], formInst);
return (
<>
<Form.Item
name={[parentNamePath, "resourceType"]}
initialValue={initialValues.resourceType}
label={t("workflow_node.deploy.form.shared_resource_type.label")}
rules={[formRule]}
>
<Select
options={[RESOURCE_TYPE_WEBSITE].map((s) => ({
value: s,
label: t(`workflow_node.deploy.form.cpanel_resource_type.option.${s}.label`),
}))}
placeholder={t("workflow_node.deploy.form.shared_resource_type.placeholder")}
/>
</Form.Item>
<Show when={fieldResourceType === RESOURCE_TYPE_WEBSITE}>
<Form.Item
name={[parentNamePath, "domain"]}
initialValue={initialValues.domain}
label={t("workflow_node.deploy.form.cpanel_domain.label")}
rules={[formRule]}
>
<Input placeholder={t("workflow_node.deploy.form.cpanel_domain.placeholder")} />
</Form.Item>
</Show>
</>
);
};
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
resourceType: RESOURCE_TYPE_WEBSITE,
domain: "",
};
};
const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> }) => {
const { t } = i18n;
return z
.object({
resourceType: z.literal(RESOURCE_TYPE_WEBSITE, t("workflow_node.deploy.form.cpanel_resource_type.placeholder")),
domain: z.string().nullish(),
})
.superRefine((values, ctx) => {
switch (values.resourceType) {
case RESOURCE_TYPE_WEBSITE:
{
if (!isDomain(values.domain!)) {
ctx.addIssue({
code: "custom",
message: t("workflow_node.deploy.form.cpanel_domain.placeholder"),
path: ["domain"],
});
}
}
break;
}
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProviderCPanel, {
getInitialValues,
getSchema,
});
export default _default;
@@ -1,51 +0,0 @@
import { getI18n, useTranslation } from "react-i18next";
import { Form, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { useFormNestedFieldsContext } from "./_context";
const BizDeployNodeConfigFieldsProviderCPanelSite = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
const formSchema = z.object({
[parentNamePath]: getSchema({ i18n }),
});
const formRule = createSchemaFieldRule(formSchema);
const initialValues = getInitialValues();
return (
<>
<Form.Item
name={[parentNamePath, "domain"]}
initialValue={initialValues.domain}
label={t("workflow_node.deploy.form.cpanel_site_domain.label")}
rules={[formRule]}
>
<Input placeholder={t("workflow_node.deploy.form.cpanel_site_domain.placeholder")} />
</Form.Item>
</>
);
};
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
domain: "",
};
};
const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> }) => {
const { t } = i18n;
return z.object({
domain: z.string().nonempty(t("workflow_node.deploy.form.cpanel_site_domain.placeholder")),
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProviderCPanelSite, {
getInitialValues,
getSchema,
});
export default _default;
@@ -7,7 +7,7 @@ import Show from "@/components/Show";
import { useFormNestedFieldsContext } from "./_context";
const RESOURCE_TYPE_SITE = "site" as const;
const RESOURCE_TYPE_WEBSITE = "website" as const;
const RESOURCE_TYPE_CERTIFICATE = "certificate" as const;
const BizDeployNodeConfigFieldsProviderCdnfly = () => {
@@ -32,7 +32,7 @@ const BizDeployNodeConfigFieldsProviderCdnfly = () => {
rules={[formRule]}
>
<Select
options={[RESOURCE_TYPE_SITE, RESOURCE_TYPE_CERTIFICATE].map((s) => ({
options={[RESOURCE_TYPE_WEBSITE, RESOURCE_TYPE_CERTIFICATE].map((s) => ({
value: s,
label: t(`workflow_node.deploy.form.cdnfly_resource_type.option.${s}.label`),
}))}
@@ -40,7 +40,7 @@ const BizDeployNodeConfigFieldsProviderCdnfly = () => {
/>
</Form.Item>
<Show when={fieldResourceType === RESOURCE_TYPE_SITE}>
<Show when={fieldResourceType === RESOURCE_TYPE_WEBSITE}>
<Form.Item
name={[parentNamePath, "siteId"]}
initialValue={initialValues.siteId}
@@ -69,7 +69,7 @@ const BizDeployNodeConfigFieldsProviderCdnfly = () => {
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
resourceType: RESOURCE_TYPE_SITE,
resourceType: RESOURCE_TYPE_WEBSITE,
};
};
@@ -78,13 +78,13 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
return z
.object({
resourceType: z.literal([RESOURCE_TYPE_SITE, RESOURCE_TYPE_CERTIFICATE], t("workflow_node.deploy.form.shared_resource_type.placeholder")),
resourceType: z.literal([RESOURCE_TYPE_WEBSITE, RESOURCE_TYPE_CERTIFICATE], t("workflow_node.deploy.form.shared_resource_type.placeholder")),
siteId: z.union([z.string(), z.number().int()]).nullish(),
certificateId: z.union([z.string(), z.number().int()]).nullish(),
})
.superRefine((values, ctx) => {
switch (values.resourceType) {
case RESOURCE_TYPE_SITE:
case RESOURCE_TYPE_WEBSITE:
{
const res = z.preprocess((v) => Number(v), z.number().int().positive()).safeParse(values.siteId);
if (!res.success) {
@@ -0,0 +1,95 @@
import { getI18n, useTranslation } from "react-i18next";
import { Form, Input, Select } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import Show from "@/components/Show";
import { useFormNestedFieldsContext } from "./_context";
const RESOURCE_TYPE_WEBSITE = "website" as const;
const BizDeployNodeConfigFieldsProviderNetlify = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
const formSchema = z.object({
[parentNamePath]: getSchema({ i18n }),
});
const formRule = createSchemaFieldRule(formSchema);
const formInst = Form.useFormInstance();
const initialValues = getInitialValues();
const fieldResourceType = Form.useWatch([parentNamePath, "resourceType"], formInst);
return (
<>
<Form.Item
name={[parentNamePath, "resourceType"]}
initialValue={initialValues.resourceType}
label={t("workflow_node.deploy.form.shared_resource_type.label")}
rules={[formRule]}
>
<Select
options={[RESOURCE_TYPE_WEBSITE].map((s) => ({
value: s,
label: t(`workflow_node.deploy.form.netlify_resource_type.option.${s}.label`),
}))}
placeholder={t("workflow_node.deploy.form.shared_resource_type.placeholder")}
/>
</Form.Item>
<Show when={fieldResourceType === RESOURCE_TYPE_WEBSITE}>
<Form.Item
name={[parentNamePath, "siteId"]}
initialValue={initialValues.siteId}
label={t("workflow_node.deploy.form.netlify_site_id.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.netlify_site_id.tooltip") }}></span>}
>
<Input placeholder={t("workflow_node.deploy.form.netlify_site_id.placeholder")} />
</Form.Item>
</Show>
</>
);
};
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
resourceType: RESOURCE_TYPE_WEBSITE,
siteId: "",
};
};
const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> }) => {
const { t } = i18n;
return z
.object({
resourceType: z.literal(RESOURCE_TYPE_WEBSITE, t("workflow_node.deploy.form.cpanel_resource_type.placeholder")),
siteId: z.string().nullish(),
})
.superRefine((values, ctx) => {
switch (values.resourceType) {
case RESOURCE_TYPE_WEBSITE:
{
const res = z.string().nonempty().safeParse(values.siteId);
if (!res.success) {
ctx.addIssue({
code: "custom",
message: t("workflow_node.deploy.form.netlify_site_id.placeholder"),
path: ["siteId"],
});
}
}
break;
}
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProviderNetlify, {
getInitialValues,
getSchema,
});
export default _default;
@@ -1,52 +0,0 @@
import { getI18n, useTranslation } from "react-i18next";
import { Form, Input } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { useFormNestedFieldsContext } from "./_context";
const BizDeployNodeConfigFieldsProviderNetlifySite = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
const formSchema = z.object({
[parentNamePath]: getSchema({ i18n }),
});
const formRule = createSchemaFieldRule(formSchema);
const initialValues = getInitialValues();
return (
<>
<Form.Item
name={[parentNamePath, "siteId"]}
initialValue={initialValues.siteId}
label={t("workflow_node.deploy.form.netlify_site_id.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.netlify_site_id.tooltip") }}></span>}
>
<Input placeholder={t("workflow_node.deploy.form.netlify_site_id.placeholder")} />
</Form.Item>
</>
);
};
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
siteId: "",
};
};
const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> }) => {
const { t } = i18n;
return z.object({
siteId: z.string().nonempty(t("workflow_node.deploy.form.netlify_site_id.placeholder")),
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProviderNetlifySite, {
getInitialValues,
getSchema,
});
export default _default;
@@ -0,0 +1,111 @@
import { getI18n, useTranslation } from "react-i18next";
import { Form, Select } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import MultipleSplitValueInput from "@/components/MultipleSplitValueInput";
import Show from "@/components/Show";
import { useFormNestedFieldsContext } from "./_context";
const RESOURCE_TYPE_WEBSITE = "website" as const;
const MULTIPLE_INPUT_SEPARATOR = ";";
const BizDeployNodeConfigFieldsProviderRatPanel = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
const formSchema = z.object({
[parentNamePath]: getSchema({ i18n }),
});
const formRule = createSchemaFieldRule(formSchema);
const formInst = Form.useFormInstance();
const initialValues = getInitialValues();
const fieldResourceType = Form.useWatch([parentNamePath, "resourceType"], formInst);
return (
<>
<Form.Item
name={[parentNamePath, "resourceType"]}
initialValue={initialValues.resourceType}
label={t("workflow_node.deploy.form.shared_resource_type.label")}
rules={[formRule]}
>
<Select
options={[RESOURCE_TYPE_WEBSITE].map((s) => ({
value: s,
label: t(`workflow_node.deploy.form.ratpanel_resource_type.option.${s}.label`),
}))}
placeholder={t("workflow_node.deploy.form.shared_resource_type.placeholder")}
/>
</Form.Item>
<Show when={fieldResourceType === RESOURCE_TYPE_WEBSITE}>
<Form.Item
name={[parentNamePath, "siteNames"]}
initialValue={initialValues.siteNames}
label={t("workflow_node.deploy.form.ratpanel_site_names.label")}
extra={t("workflow_node.deploy.form.ratpanel_site_names.help")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.ratpanel_site_names.tooltip") }}></span>}
>
<MultipleSplitValueInput
modalTitle={t("workflow_node.deploy.form.ratpanel_site_names.multiple_input_modal.title")}
placeholder={t("workflow_node.deploy.form.ratpanel_site_names.placeholder")}
placeholderInModal={t("workflow_node.deploy.form.ratpanel_site_names.multiple_input_modal.placeholder")}
separator={MULTIPLE_INPUT_SEPARATOR}
splitOptions={{ removeEmpty: true, trimSpace: true }}
/>
</Form.Item>
</Show>
</>
);
};
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
resourceType: RESOURCE_TYPE_WEBSITE,
siteNames: "",
};
};
const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> }) => {
const { t } = i18n;
return z
.object({
resourceType: z.literal(RESOURCE_TYPE_WEBSITE, t("workflow_node.deploy.form.cpanel_resource_type.placeholder")),
siteNames: z.string().nullish(),
})
.superRefine((values, ctx) => {
switch (values.resourceType) {
case RESOURCE_TYPE_WEBSITE:
{
const schema = z
.string()
.nonempty()
.refine((v) => {
if (!v) return false;
return v.split(MULTIPLE_INPUT_SEPARATOR).every((s) => !!s.trim());
});
if (!schema.safeParse(values.siteNames).success) {
ctx.addIssue({
code: "custom",
message: t("workflow_node.deploy.form.ratpanel_site_names.placeholder"),
path: ["siteNames"],
});
}
}
break;
}
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProviderRatPanel, {
getInitialValues,
getSchema,
});
export default _default;
@@ -1,71 +0,0 @@
import { getI18n, useTranslation } from "react-i18next";
import { Form } from "antd";
import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import MultipleSplitValueInput from "@/components/MultipleSplitValueInput";
import { useFormNestedFieldsContext } from "./_context";
const MULTIPLE_INPUT_SEPARATOR = ";";
const BizDeployNodeConfigFieldsProviderRatPanelSite = () => {
const { i18n, t } = useTranslation();
const { parentNamePath } = useFormNestedFieldsContext();
const formSchema = z.object({
[parentNamePath]: getSchema({ i18n }),
});
const formRule = createSchemaFieldRule(formSchema);
const initialValues = getInitialValues();
return (
<>
<Form.Item
name={[parentNamePath, "siteNames"]}
initialValue={initialValues.siteNames}
label={t("workflow_node.deploy.form.ratpanel_site_names.label")}
extra={t("workflow_node.deploy.form.ratpanel_site_names.help")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.ratpanel_site_names.tooltip") }}></span>}
>
<MultipleSplitValueInput
modalTitle={t("workflow_node.deploy.form.ratpanel_site_names.multiple_input_modal.title")}
placeholder={t("workflow_node.deploy.form.ratpanel_site_names.placeholder")}
placeholderInModal={t("workflow_node.deploy.form.ratpanel_site_names.multiple_input_modal.placeholder")}
separator={MULTIPLE_INPUT_SEPARATOR}
splitOptions={{ removeEmpty: true, trimSpace: true }}
/>
</Form.Item>
</>
);
};
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
siteNames: "",
};
};
const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> }) => {
const { t } = i18n;
return z.object({
siteNames: z
.string()
.nonempty(t("workflow_node.deploy.form.ratpanel_site_names.placeholder"))
.refine(
(v) => {
if (!v) return false;
return v.split(MULTIPLE_INPUT_SEPARATOR).every((s) => !!s.trim());
},
{ error: t("workflow_node.deploy.form.ratpanel_site_names.placeholder") }
),
});
};
const _default = Object.assign(BizDeployNodeConfigFieldsProviderRatPanelSite, {
getInitialValues,
getSchema,
});
export default _default;
@@ -33,7 +33,7 @@ const BizDeployNodeConfigFieldsProviderSafeLine = () => {
<Select
options={[RESOURCE_TYPE_CERTIFICATE].map((s) => ({
value: s,
label: t(`workflow_node.deploy.form.safeline_site_resource_type.option.${s}.label`),
label: t(`workflow_node.deploy.form.safeline_resource_type.option.${s}.label`),
}))}
placeholder={t("workflow_node.deploy.form.shared_resource_type.placeholder")}
/>
@@ -43,11 +43,11 @@ const BizDeployNodeConfigFieldsProviderSafeLine = () => {
<Form.Item
name={[parentNamePath, "certificateId"]}
initialValue={initialValues.certificateId}
label={t("workflow_node.deploy.form.safeline_site_certificate_id.label")}
label={t("workflow_node.deploy.form.safeline_certificate_id.label")}
rules={[formRule]}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.safeline_site_certificate_id.tooltip") }}></span>}
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.safeline_certificate_id.tooltip") }}></span>}
>
<Input type="number" placeholder={t("workflow_node.deploy.form.safeline_site_certificate_id.placeholder")} />
<Input type="number" placeholder={t("workflow_node.deploy.form.safeline_certificate_id.placeholder")} />
</Form.Item>
</Show>
</>
@@ -76,7 +76,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
if (!res.success) {
ctx.addIssue({
code: "custom",
message: t("workflow_node.deploy.form.safeline_site_certificate_id.placeholder"),
message: t("workflow_node.deploy.form.safeline_certificate_id.placeholder"),
path: ["certificateId"],
});
}
+16 -16
View File
@@ -536,8 +536,8 @@ export const acmeHttp01ProvidersMap: Map<ACMEHttp01Provider["type"] | string, AC
NOTICE: If you add new constant, please keep ASCII order.
*/
export const DEPLOYMENT_PROVIDERS = Object.freeze({
["1PANEL"]: `${ACCESS_PROVIDERS["1PANEL"]}`,
["1PANEL_CONSOLE"]: `${ACCESS_PROVIDERS["1PANEL"]}-console`,
["1PANEL_SITE"]: `${ACCESS_PROVIDERS["1PANEL"]}-site`,
ALIYUN_ALB: `${ACCESS_PROVIDERS.ALIYUN}-alb`,
ALIYUN_APIGW: `${ACCESS_PROVIDERS.ALIYUN}-apigw`,
ALIYUN_CAS: `${ACCESS_PROVIDERS.ALIYUN}-cas`,
@@ -564,17 +564,17 @@ export const DEPLOYMENT_PROVIDERS = Object.freeze({
BAIDUCLOUD_CDN: `${ACCESS_PROVIDERS.BAIDUCLOUD}-cdn`,
BAIDUCLOUD_CERT: `${ACCESS_PROVIDERS.BAIDUCLOUD}-cert`,
BAISHAN_CDN: `${ACCESS_PROVIDERS.BAISHAN}-cdn`,
BAOTAPANEL: `${ACCESS_PROVIDERS.BAOTAPANEL}`,
BAOTAPANEL_CONSOLE: `${ACCESS_PROVIDERS.BAOTAPANEL}-console`,
BAOTAPANEL_SITE: `${ACCESS_PROVIDERS.BAOTAPANEL}-site`,
BAOTAPANELGO: `${ACCESS_PROVIDERS.BAOTAPANELGO}`,
BAOTAPANELGO_CONSOLE: `${ACCESS_PROVIDERS.BAOTAPANELGO}-console`,
BAOTAPANELGO_SITE: `${ACCESS_PROVIDERS.BAOTAPANELGO}-site`,
BAOTAWAF: `${ACCESS_PROVIDERS.BAOTAWAF}`,
BAOTAWAF_CONSOLE: `${ACCESS_PROVIDERS.BAOTAWAF}-console`,
BAOTAWAF_SITE: `${ACCESS_PROVIDERS.BAOTAWAF}-site`,
BUNNY_CDN: `${ACCESS_PROVIDERS.BUNNY}-cdn`,
BYTEPLUS_CDN: `${ACCESS_PROVIDERS.BYTEPLUS}-cdn`,
CACHEFLY: `${ACCESS_PROVIDERS.CACHEFLY}`,
CDNFLY: `${ACCESS_PROVIDERS.CDNFLY}`,
CPANEL_SITE: `${ACCESS_PROVIDERS.CPANEL}-site`,
CPANEL: `${ACCESS_PROVIDERS.CPANEL}`,
CTCCCLOUD_AO: `${ACCESS_PROVIDERS.CTCCCLOUD}-ao`,
CTCCCLOUD_CDN: `${ACCESS_PROVIDERS.CTCCCLOUD}-cdn`,
CTCCCLOUD_CMS: `${ACCESS_PROVIDERS.CTCCCLOUD}-cms`,
@@ -602,15 +602,15 @@ export const DEPLOYMENT_PROVIDERS = Object.freeze({
LECDN: `${ACCESS_PROVIDERS.LECDN}`,
LOCAL: `${ACCESS_PROVIDERS.LOCAL}`,
MOHUA_MVH: `${ACCESS_PROVIDERS.MOHUA}-mvh`,
NETLIFY_SITE: `${ACCESS_PROVIDERS.NETLIFY}-site`,
NETLIFY: `${ACCESS_PROVIDERS.NETLIFY}`,
PROXMOXVE: `${ACCESS_PROVIDERS.PROXMOXVE}`,
QINIU_CDN: `${ACCESS_PROVIDERS.QINIU}-cdn`,
QINIU_KODO: `${ACCESS_PROVIDERS.QINIU}-kodo`,
QINIU_PILI: `${ACCESS_PROVIDERS.QINIU}-pili`,
RAINYUN_RCDN: `${ACCESS_PROVIDERS.RAINYUN}-rcdn`,
RATPANEL: `${ACCESS_PROVIDERS.RATPANEL}`,
RATPANEL_CONSOLE: `${ACCESS_PROVIDERS.RATPANEL}-console`,
RATPANEL_SITE: `${ACCESS_PROVIDERS.RATPANEL}-site`,
SAFELINE_SITE: `${ACCESS_PROVIDERS.SAFELINE}-site`,
SAFELINE: `${ACCESS_PROVIDERS.SAFELINE}`,
SSH: `${ACCESS_PROVIDERS.SSH}`,
TENCENTCLOUD_CDN: `${ACCESS_PROVIDERS.TENCENTCLOUD}-cdn`,
TENCENTCLOUD_CLB: `${ACCESS_PROVIDERS.TENCENTCLOUD}-clb`,
@@ -771,25 +771,25 @@ export const deploymentProvidersMap: Map<DeploymentProvider["type"] | string, De
[DEPLOYMENT_PROVIDERS.CACHEFLY, "provider.cachefly", DEPLOYMENT_CATEGORIES.CDN],
[DEPLOYMENT_PROVIDERS.GCORE_CDN, "provider.gcore_cdn", DEPLOYMENT_CATEGORIES.CDN],
[DEPLOYMENT_PROVIDERS.MOHUA_MVH, "provider.mohua_mvh", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.NETLIFY_SITE, "provider.netlify_site", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.NETLIFY, "provider.netlify", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.CDNFLY, "provider.cdnfly", DEPLOYMENT_CATEGORIES.CDN],
[DEPLOYMENT_PROVIDERS.FLEXCDN, "provider.flexcdn", DEPLOYMENT_CATEGORIES.CDN],
[DEPLOYMENT_PROVIDERS.GOEDGE, "provider.goedge", DEPLOYMENT_CATEGORIES.CDN],
[DEPLOYMENT_PROVIDERS.LECDN, "provider.lecdn", DEPLOYMENT_CATEGORIES.CDN],
[DEPLOYMENT_PROVIDERS["1PANEL_SITE"], "provider.1panel_site", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS["1PANEL"], "provider.1panel", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS["1PANEL_CONSOLE"], "provider.1panel_console", DEPLOYMENT_CATEGORIES.OTHER],
[DEPLOYMENT_PROVIDERS.BAOTAPANEL_SITE, "provider.baotapanel_site", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.BAOTAPANEL, "provider.baotapanel.abbr", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.BAOTAPANEL_CONSOLE, "provider.baotapanel_console", DEPLOYMENT_CATEGORIES.OTHER],
[DEPLOYMENT_PROVIDERS.BAOTAPANELGO_SITE, "provider.baotapanelgo_site", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.BAOTAPANELGO, "provider.baotapanelgo.abbr", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.BAOTAPANELGO_CONSOLE, "provider.baotapanelgo_console", DEPLOYMENT_CATEGORIES.OTHER],
[DEPLOYMENT_PROVIDERS.RATPANEL_SITE, "provider.ratpanel_site", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.RATPANEL, "provider.ratpanel.abbr", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.RATPANEL_CONSOLE, "provider.ratpanel_console", DEPLOYMENT_CATEGORIES.OTHER],
[DEPLOYMENT_PROVIDERS.BAOTAWAF_SITE, "provider.baotawaf_site", DEPLOYMENT_CATEGORIES.FIREWALL],
[DEPLOYMENT_PROVIDERS.BAOTAWAF, "provider.baotawaf.abbr", DEPLOYMENT_CATEGORIES.FIREWALL],
[DEPLOYMENT_PROVIDERS.BAOTAWAF_CONSOLE, "provider.baotawaf_console", DEPLOYMENT_CATEGORIES.OTHER],
[DEPLOYMENT_PROVIDERS.SAFELINE_SITE, "provider.safeline_site", DEPLOYMENT_CATEGORIES.FIREWALL],
[DEPLOYMENT_PROVIDERS.SAFELINE, "provider.safeline", DEPLOYMENT_CATEGORIES.FIREWALL],
[DEPLOYMENT_PROVIDERS.APISIX, "provider.apisix", DEPLOYMENT_CATEGORIES.APIGATEWAY],
[DEPLOYMENT_PROVIDERS.KONG, "provider.kong", DEPLOYMENT_CATEGORIES.APIGATEWAY],
[DEPLOYMENT_PROVIDERS.CPANEL_SITE, "provider.cpanel_site", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.CPANEL, "provider.cpanel", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.DOKPLOY, "provider.dokploy", DEPLOYMENT_CATEGORIES.WEBSITE],
[DEPLOYMENT_PROVIDERS.PROXMOXVE, "provider.proxmoxve", DEPLOYMENT_CATEGORIES.OTHER],
] satisfies Array<[DeploymentProviderType, string, DeploymentCategoryType, "builtin"] | [DeploymentProviderType, string, DeploymentCategoryType]>
+4 -8
View File
@@ -1,7 +1,6 @@
{
"provider.1panel": "1Panel",
"provider.1panel_console": "1Panel - Console itself",
"provider.1panel_site": "1Panel - Website",
"provider.35cn": "35.cn",
"provider.51dnscom": "51DNS.com",
"provider.acmeca": "ACME Custom CA Endpoint",
@@ -48,14 +47,14 @@
"provider.baishan": "Baishan",
"provider.baishan_cdn": "Baishan - CDN (Content Delivery Network)",
"provider.baotapanel": "aaPanel (aka BaotaPanel)",
"provider.baotapanel.abbr": "aaPanel",
"provider.baotapanel_console": "aaPanel - Console itself",
"provider.baotapanel_site": "aaPanel - Website",
"provider.baotapanelgo": "aaPanel WinGo (aka BaotaPanel WinGo)",
"provider.baotapanelgo.abbr": "aaPanel WinGo",
"provider.baotapanelgo_console": "aaPanel WinGo - Console itself",
"provider.baotapanelgo_site": "aaPanel WinGo - Website",
"provider.baotawaf": "aaWAF (aka BaotaWAF)",
"provider.baotawaf.abbr": "aaWAF",
"provider.baotawaf_console": "aaWAF - Console itself",
"provider.baotawaf_site": "aaWAF - Website",
"provider.bookmyname": "BookMyName",
"provider.bunny": "Bunny",
"provider.bunny_cdn": "Bunny - CDN (Content Delivery Network)",
@@ -69,7 +68,6 @@
"provider.cmcccloud_dns": "China Mobile ECloud - DNS",
"provider.constellix": "Constellix",
"provider.cpanel": "cPanel",
"provider.cpanel_site": "cPanel - Website",
"provider.ctcccloud": "China Telecom StateCloud",
"provider.ctcccloud_ao": "China Telecom StateCloud - AccessOne",
"provider.ctcccloud_cdn": "China Telecom StateCloud - CDN (Content Delivery Network)",
@@ -142,7 +140,6 @@
"provider.namesilo": "NameSilo",
"provider.netcup": "netcup",
"provider.netlify": "Netlify",
"provider.netlify_site": "Netlify - Site",
"provider.ovhcloud": "OVHcloud",
"provider.ns1": "NS1 (IBM NS1 Connect)",
"provider.porkbun": "Porkbun",
@@ -157,12 +154,11 @@
"provider.rainyun": "Rain Yun",
"provider.rainyun_rcdn": "Rain Yun - RCDN (Content Delivery Network)",
"provider.ratpanel": "AcePanel (aka RatPanel)",
"provider.ratpanel.abbr": "AcePanel",
"provider.ratpanel_console": "AcePanel - Console itself",
"provider.ratpanel_site": "AcePanel - Website",
"provider.rfc2136": "RFC 2136: Dynamic DNS Updates",
"provider.s3": "Object storage (S3-compatible)",
"provider.safeline": "SafeLine",
"provider.safeline_site": "SafeLine - Website",
"provider.sectigo": "Sectigo",
"provider.slackbot": "Slack Bot",
"provider.spaceship": "Spaceship",
+30 -27
View File
@@ -228,24 +228,24 @@
"workflow_node.deploy.form.shared_domain_match_pattern.option.certsan.label": "via Certificate",
"workflow_node.deploy.form.shared_domain_match_pattern.help_wildcard": "Notes: For the sites which support wildcard resolution, an <strong>exact match</strong> of a wildcard domain only includes the site itself, does not include its subdomains.",
"workflow_node.deploy.form.shared_script_command.vartips": "Supported variables: <br><ol style=\"list-style: disc;\"><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_CERTIFICATE_PATH}</strong>: <br>The path of the certificate file, same as the value of the form related field.</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_CERTIFICATE_SERVER_PATH}</strong>: <br>The path of the server certificate file, same as the value of the form related field.</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_CERTIFICATE_INTERMEDIA_PATH}</strong>: <br>The path of the intermediate CA certificate file, same as the value of the form related field.</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_PRIVATEKEY_PATH}</strong>: <br>The path of the private key file, same as the value of the form related field.</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_PFX_PASSWORD}</strong>: <br>The PFX password, same as the value of the form related field.</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_JKS_ALIAS}</strong>: <br>The JKS alias, same as the value of the form related field.</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_JKS_KEYPASS}</strong>: <br>The JKS key password, same as the value of the form related field.</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_JKS_STOREPASS}</strong>: <br>The JKS store password, same as the value of the form related field.</li></ol>",
"workflow_node.deploy.form.1panel_node_name.label": "1Panel node name (Optional)",
"workflow_node.deploy.form.1panel_node_name.placeholder": "Please enter 1Panel node name",
"workflow_node.deploy.form.1panel_node_name.help": "Notes: Only used for 1Panel v2+.",
"workflow_node.deploy.form.1panel_node_name.tooltip": "You can find it on 1Panel dashboard.",
"workflow_node.deploy.form.1panel_resource_type.option.website.label": "Website",
"workflow_node.deploy.form.1panel_resource_type.option.certificate.label": "Certificate",
"workflow_node.deploy.form.1panel_website_match_pattern.label": "Website match pattern",
"workflow_node.deploy.form.1panel_website_match_pattern.placeholder": "Please select website match pattern",
"workflow_node.deploy.form.1panel_website_match_pattern.option.specified.label": "Specified ID",
"workflow_node.deploy.form.1panel_website_match_pattern.option.certsan.label": "via Certificate",
"workflow_node.deploy.form.1panel_website_match_pattern.help_certsan": "Notes: The website name should be a domain name and include SSL configurations.",
"workflow_node.deploy.form.1panel_website_id.label": "1Panel website ID",
"workflow_node.deploy.form.1panel_website_id.placeholder": "Please enter 1Panel website ID",
"workflow_node.deploy.form.1panel_website_id.tooltip": "You can find it on 1Panel dashboard.",
"workflow_node.deploy.form.1panel_certificate_id.label": "1Panel certificate ID",
"workflow_node.deploy.form.1panel_certificate_id.placeholder": "Please enter 1Panel certificate ID",
"workflow_node.deploy.form.1panel_certificate_id.tooltip": "You can find it on 1Panel dashboard.",
"workflow_node.deploy.form.1panel_console_auto_restart.label": "Auto restart 1Panel after deployment",
"workflow_node.deploy.form.1panel_site_node_name.label": "1Panel node name (Optional)",
"workflow_node.deploy.form.1panel_site_node_name.placeholder": "Please enter 1Panel node name",
"workflow_node.deploy.form.1panel_site_node_name.help": "Notes: Only used for 1Panel v2+.",
"workflow_node.deploy.form.1panel_site_node_name.tooltip": "You can find it on 1Panel dashboard.",
"workflow_node.deploy.form.1panel_site_resource_type.option.website.label": "Website",
"workflow_node.deploy.form.1panel_site_resource_type.option.certificate.label": "Certificate",
"workflow_node.deploy.form.1panel_site_website_match_pattern.label": "Website match pattern",
"workflow_node.deploy.form.1panel_site_website_match_pattern.placeholder": "Please select website match pattern",
"workflow_node.deploy.form.1panel_site_website_match_pattern.option.specified.label": "Specified ID",
"workflow_node.deploy.form.1panel_site_website_match_pattern.option.certsan.label": "via Certificate",
"workflow_node.deploy.form.1panel_site_website_match_pattern.help_certsan": "Notes: The website name should be a domain name and include SSL configurations.",
"workflow_node.deploy.form.1panel_site_website_id.label": "1Panel website ID",
"workflow_node.deploy.form.1panel_site_website_id.placeholder": "Please enter 1Panel website ID",
"workflow_node.deploy.form.1panel_site_website_id.tooltip": "You can find it on 1Panel dashboard.",
"workflow_node.deploy.form.1panel_site_certificate_id.label": "1Panel certificate ID",
"workflow_node.deploy.form.1panel_site_certificate_id.placeholder": "Please enter 1Panel certificate ID",
"workflow_node.deploy.form.1panel_site_certificate_id.tooltip": "You can find it on 1Panel dashboard.",
"workflow_node.deploy.form.aliyun_alb_region.label": "Alibaba Cloud region",
"workflow_node.deploy.form.aliyun_alb_region.placeholder": "Please enter Alibaba Cloud ALB region (e.g. cn-hangzhou)",
"workflow_node.deploy.form.aliyun_alb_region.tooltip": "For more information, see <a href=\"https://www.alibabacloud.com/help/en/slb/application-load-balancer/product-overview/supported-regions-and-zones\" target=\"_blank\">https://www.alibabacloud.com/help/en/slb/application-load-balancer/product-overview/supported-regions-and-zones</a>",
@@ -467,9 +467,7 @@
"workflow_node.deploy.form.baishan_cdn_certificate_id.label": "Baishan Cloud CDN certificate ID",
"workflow_node.deploy.form.baishan_cdn_certificate_id.placeholder": "Please enter Baishan Cloud CDN certificate ID",
"workflow_node.deploy.form.baishan_cdn_certificate_id.tooltip": "For more information, see <a href=\"https://cdnx.console.baishan.com/#/cdn/cert\" target=\"_blank\">https://cdnx.console.baishan.com/#/cdn/cert</a>",
"workflow_node.deploy.form.baotapanel_console.guide": "Requires aaPanel v8.3+ or higher.",
"workflow_node.deploy.form.baotapanel_console_auto_restart.label": "Auto restart aaPanel after deployment",
"workflow_node.deploy.form.baotapanel_site.guide": "Requires aaPanel v8.3 or higher.",
"workflow_node.deploy.form.baotapanel.guide": "Requires aaPanel v8.3 or higher.",
"workflow_node.deploy.form.baotapanel_site_type.label": "aaPanel website type",
"workflow_node.deploy.form.baotapanel_site_type.placeholder": "Please select aaPanel website type",
"workflow_node.deploy.form.baotapanel_site_type.option.php.label": "PHP sites",
@@ -481,6 +479,8 @@
"workflow_node.deploy.form.baotapanel_site_names.tooltip": "You can find it on aaPanel dashboard.",
"workflow_node.deploy.form.baotapanel_site_names.multiple_input_modal.title": "Change aaPanel website names",
"workflow_node.deploy.form.baotapanel_site_names.multiple_input_modal.placeholder": "Please enter aaPanel website name",
"workflow_node.deploy.form.baotapanel_console.guide": "Requires aaPanel v8.3+ or higher.",
"workflow_node.deploy.form.baotapanel_console_auto_restart.label": "Auto restart aaPanel after deployment",
"workflow_node.deploy.form.baotapanelgo_site_type.label": "aaPanel WinGo website type",
"workflow_node.deploy.form.baotapanelgo_site_type.placeholder": "Please select aaPanel WinGo website type",
"workflow_node.deploy.form.baotapanelgo_site_type.option.php.label": "PHP Project",
@@ -515,7 +515,7 @@
"workflow_node.deploy.form.bunny_cdn_hostname.tooltip": "What is this? See <a href=\"https://dash.bunny.net/cdn\" target=\"_blank\">https://dash.bunny.net/cdn</a>",
"workflow_node.deploy.form.byteplus_cdn_domain.label": "BytePlus CDN domain",
"workflow_node.deploy.form.byteplus_cdn_domain.placeholder": "Please enter BytePlus CDN domain name",
"workflow_node.deploy.form.cdnfly_resource_type.option.site.label": "Site",
"workflow_node.deploy.form.cdnfly_resource_type.option.website.label": "Website",
"workflow_node.deploy.form.cdnfly_resource_type.option.certificate.label": "Certificate",
"workflow_node.deploy.form.cdnfly_site_id.label": "Cdnfly website ID",
"workflow_node.deploy.form.cdnfly_site_id.placeholder": "Please enter Cdnfly website ID",
@@ -523,8 +523,9 @@
"workflow_node.deploy.form.cdnfly_certificate_id.label": "Cdnfly certificate ID",
"workflow_node.deploy.form.cdnfly_certificate_id.placeholder": "Please enter Cdnfly certificate ID",
"workflow_node.deploy.form.cdnfly_certificate_id.tooltip": "You can find it on Cdnfly dashboard.",
"workflow_node.deploy.form.cpanel_site_domain.label": "cPanel website domain",
"workflow_node.deploy.form.cpanel_site_domain.placeholder": "Please enter cPanel website domain",
"workflow_node.deploy.form.cpanel_resource_type.option.website.label": "Website",
"workflow_node.deploy.form.cpanel_domain.label": "cPanel website domain",
"workflow_node.deploy.form.cpanel_domain.placeholder": "Please enter cPanel website domain",
"workflow_node.deploy.form.ctcccloud_ao_domain.label": "CTCC StateCloud AccessOne domain",
"workflow_node.deploy.form.ctcccloud_ao_domain.placeholder": "Please enter CTCC StateCloud AccessOne domain name",
"workflow_node.deploy.form.ctcccloud_cdn_domain.label": "CTCC StateCloud CDN domain",
@@ -724,6 +725,7 @@
"workflow_node.deploy.form.mohua_mvh_domain_id.label": "Mohua Cloud virtual host domain ID",
"workflow_node.deploy.form.mohua_mvh_domain_id.placeholder": "Please enter Mohua Cloud virtual host domain ID",
"workflow_node.deploy.form.mohua_mvh_domain_id.tooltip": "For more information, see <a href=\"https://cloud.mhjz1.cn/service?groupid=328&language=english\" target=\"_blank\">https://cloud.mhjz1.cn/service?groupid=328&language=english</a>",
"workflow_node.deploy.form.netlify_resource_type.option.website.label": "Website",
"workflow_node.deploy.form.netlify_site_id.label": "Netlify website ID",
"workflow_node.deploy.form.netlify_site_id.placeholder": "Please enter Netlify website ID",
"workflow_node.deploy.form.netlify_site_id.tooltip": "For more information, see <a href=\"https://docs.netlify.com/api/get-started/#get-site\" target=\"_blank\">https://docs.netlify.com/api/get-started/#get-site</a>",
@@ -751,6 +753,7 @@
"workflow_node.deploy.form.rainyun_rcdn_certificate_id.label": "Rain Yun RCDN certificate ID",
"workflow_node.deploy.form.rainyun_rcdn_certificate_id.placeholder": "Please enter Rain Yun RCDN certificate ID",
"workflow_node.deploy.form.rainyun_rcdn_certificate_id.tooltip": "For more information, see <a href=\"https://app.rainyun.com/apps/ssl/list\" target=\"_blank\">https://app.rainyun.com/apps/ssl/list</a>",
"workflow_node.deploy.form.ratpanel_resource_type.option.website.label": "Website",
"workflow_node.deploy.form.ratpanel_site_names.label": "AcePanel website names",
"workflow_node.deploy.form.ratpanel_site_names.placeholder": "Please enter AcePanel website names (separated by semicolons)",
"workflow_node.deploy.form.ratpanel_site_names.errmsg.invalid": "Please enter a valid AcePanel website name",
@@ -758,10 +761,10 @@
"workflow_node.deploy.form.ratpanel_site_names.tooltip": "You can find it on AcePanel dashboard.",
"workflow_node.deploy.form.ratpanel_site_names.multiple_input_modal.title": "Change AcePanel website names",
"workflow_node.deploy.form.ratpanel_site_names.multiple_input_modal.placeholder": "Please enter AcePanel website name",
"workflow_node.deploy.form.safeline_site_resource_type.option.certificate.label": "Certificate",
"workflow_node.deploy.form.safeline_site_certificate_id.label": "SafeLine certificate ID",
"workflow_node.deploy.form.safeline_site_certificate_id.placeholder": "Please enter SafeLine certificate ID",
"workflow_node.deploy.form.safeline_site_certificate_id.tooltip": "You can find it on SafeLine dashboard.",
"workflow_node.deploy.form.safeline_resource_type.option.certificate.label": "Certificate",
"workflow_node.deploy.form.safeline_certificate_id.label": "SafeLine certificate ID",
"workflow_node.deploy.form.safeline_certificate_id.placeholder": "Please enter SafeLine certificate ID",
"workflow_node.deploy.form.safeline_certificate_id.tooltip": "You can find it on SafeLine dashboard.",
"workflow_node.deploy.form.ssh_format.label": "File format",
"workflow_node.deploy.form.ssh_format.placeholder": "Please select file format",
"workflow_node.deploy.form.ssh_format.option.pem.label": "PEM (*.pem, *.crt, *.key)",
+4 -8
View File
@@ -1,7 +1,6 @@
{
"provider.1panel": "1Panel",
"provider.1panel_console": "1Panel - 面板自身",
"provider.1panel_site": "1Panel - 网站",
"provider.35cn": "三五互联",
"provider.51dnscom": "帝恩思(51DNS",
"provider.acmeca": "ACME 自定义 CA 端点",
@@ -48,14 +47,14 @@
"provider.baishan": "白山云",
"provider.baishan_cdn": "白山云 - 内容分发网络 CDN",
"provider.baotapanel": "宝塔面板(又名:aaPanel",
"provider.baotapanel.abbr": "宝塔面板",
"provider.baotapanel_console": "宝塔面板 - 面板自身",
"provider.baotapanel_site": "宝塔面板 - 网站",
"provider.baotapanelgo": "宝塔面板极速版(又名:aaPanel WinGo",
"provider.baotapanelgo.abbr": "宝塔面板极速版",
"provider.baotapanelgo_console": "宝塔面板极速版 - 面板自身",
"provider.baotapanelgo_site": "宝塔面板极速版 - 网站",
"provider.baotawaf": "堡塔云 WAF(又名:aaWAF",
"provider.baotawaf.abbr": "堡塔云 WAF",
"provider.baotawaf_console": "堡塔云 WAF - 面板自身",
"provider.baotawaf_site": "堡塔云 WAF - 网站",
"provider.bookmyname": "BookMyName",
"provider.bunny": "Bunny",
"provider.bunny_cdn": "Bunny - 内容分发网络 CDN",
@@ -69,7 +68,6 @@
"provider.cmcccloud_dns": "移动云 - 云解析 DNS",
"provider.constellix": "Constellix",
"provider.cpanel": "cPanel",
"provider.cpanel_site": "cPanel - 网站",
"provider.ctcccloud": "天翼云",
"provider.ctcccloud_ao": "天翼云 - 边缘安全加速平台 AccessOne",
"provider.ctcccloud_cdn": "天翼云 - 内容分发网络 CDN",
@@ -142,7 +140,6 @@
"provider.namesilo": "NameSilo",
"provider.netcup": "netcup",
"provider.netlify": "Netlify",
"provider.netlify_site": "Netlify - 网站",
"provider.ns1": "NS1 (IBM NS1 Connect)",
"provider.ovhcloud": "OVHcloud",
"provider.porkbun": "Porkbun",
@@ -157,12 +154,11 @@
"provider.rainyun": "雨云",
"provider.rainyun_rcdn": "雨云 - 雨盾 CDN",
"provider.ratpanel": "耗子面板(又名:AcePanel",
"provider.ratpanel.abbr": "耗子面板",
"provider.ratpanel_console": "耗子面板 - 面板自身",
"provider.ratpanel_site": "耗子面板 - 网站",
"provider.rfc2136": "RFC 2136: Dynamic DNS Updates",
"provider.s3": "对象存储(S3 兼容)",
"provider.safeline": "雷池",
"provider.safeline_site": "雷池 - 网站",
"provider.sectigo": "Sectigo",
"provider.slackbot": "Slack 机器人",
"provider.spaceship": "Spaceship",
+30 -27
View File
@@ -227,24 +227,24 @@
"workflow_node.deploy.form.shared_domain_match_pattern.option.certsan.label": "根据证书自动匹配",
"workflow_node.deploy.form.shared_domain_match_pattern.help_wildcard": "注意:对于支持泛解析的站点,<strong>精确匹配</strong>一个泛域名仅包含该站点本身、不包括相关子域名站点。",
"workflow_node.deploy.form.shared_script_command.vartips": "支持的变量:<br><ol style=\"list-style: disc;\"><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_CERTIFICATE_PATH}</strong><br>证书文件路径,等同于表单中相应字段的值。</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_CERTIFICATE_SERVER_PATH}</strong><br>证书文件(仅含服务器证书)路径,等同于表单中相应字段的值。</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_CERTIFICATE_INTERMEDIA_PATH}</strong><br>证书文件(仅含中间证书)路径,等同于表单中相应字段的值。</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_PRIVATEKEY_PATH}</strong><br>私钥文件路径,等同于表单中相应字段的值。</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_PFX_PASSWORD}</strong><br>PFX 导出密码,等同于表单中相应字段的值。</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_JKS_ALIAS}</strong><br>JKS 别名,等同于表单中相应字段的值。</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_JKS_KEYPASS}</strong><br>JKS 私钥访问口令,等同于表单中相应字段的值。</li><li><strong>${CERTIMATE_DEPLOYER_CMDVAR_JKS_STOREPASS}</strong><br>JKS 密钥库存储口令,等同于表单中相应字段的值。</li></ol>",
"workflow_node.deploy.form.1panel_node_name.label": "1Panel 子节点名称(可选)",
"workflow_node.deploy.form.1panel_node_name.placeholder": "请输入 1Panel 子节点名称",
"workflow_node.deploy.form.1panel_node_name.help": "提示:仅 1Panel v2+ 需要填写。不填写时,将替换主控节点证书;否则,将替换被控节点证书。",
"workflow_node.deploy.form.1panel_node_name.tooltip": "请登录 1Panel 面板查看",
"workflow_node.deploy.form.1panel_resource_type.option.website.label": "部署到指定网站",
"workflow_node.deploy.form.1panel_resource_type.option.certificate.label": "替换指定证书",
"workflow_node.deploy.form.1panel_website_match_pattern.label": "网站匹配模式",
"workflow_node.deploy.form.1panel_website_match_pattern.placeholder": "请选择部署网站匹配模式",
"workflow_node.deploy.form.1panel_website_match_pattern.option.specified.label": "指定 ID",
"workflow_node.deploy.form.1panel_website_match_pattern.option.certsan.label": "根据证书自动匹配",
"workflow_node.deploy.form.1panel_website_match_pattern.help_certsan": "注意:网站名称需要为域名、且包含开启了 SSL 的域名配置。",
"workflow_node.deploy.form.1panel_website_id.label": "1Panel 网站 ID",
"workflow_node.deploy.form.1panel_website_id.placeholder": "请输入 1Panel 网站 ID",
"workflow_node.deploy.form.1panel_website_id.tooltip": "请登录 1Panel 面板查看",
"workflow_node.deploy.form.1panel_certificate_id.label": "1Panel 证书 ID",
"workflow_node.deploy.form.1panel_certificate_id.placeholder": "请输入 1Panel 证书 ID",
"workflow_node.deploy.form.1panel_certificate_id.tooltip": "请登录 1Panel 面板查看",
"workflow_node.deploy.form.1panel_console_auto_restart.label": "部署后自动重启 1Panel 服务",
"workflow_node.deploy.form.1panel_site_node_name.label": "1Panel 子节点名称(可选)",
"workflow_node.deploy.form.1panel_site_node_name.placeholder": "请输入 1Panel 子节点名称",
"workflow_node.deploy.form.1panel_site_node_name.help": "提示:仅 1Panel v2+ 需要填写。不填写时,将替换主控节点证书;否则,将替换被控节点证书。",
"workflow_node.deploy.form.1panel_site_node_name.tooltip": "请登录 1Panel 面板查看",
"workflow_node.deploy.form.1panel_site_resource_type.option.website.label": "部署到指定网站",
"workflow_node.deploy.form.1panel_site_resource_type.option.certificate.label": "替换指定证书",
"workflow_node.deploy.form.1panel_site_website_match_pattern.label": "网站匹配模式",
"workflow_node.deploy.form.1panel_site_website_match_pattern.placeholder": "请选择部署网站匹配模式",
"workflow_node.deploy.form.1panel_site_website_match_pattern.option.specified.label": "指定 ID",
"workflow_node.deploy.form.1panel_site_website_match_pattern.option.certsan.label": "根据证书自动匹配",
"workflow_node.deploy.form.1panel_site_website_match_pattern.help_certsan": "注意:网站名称需要为域名、且包含开启了 SSL 的域名配置。",
"workflow_node.deploy.form.1panel_site_website_id.label": "1Panel 网站 ID",
"workflow_node.deploy.form.1panel_site_website_id.placeholder": "请输入 1Panel 网站 ID",
"workflow_node.deploy.form.1panel_site_website_id.tooltip": "请登录 1Panel 面板查看",
"workflow_node.deploy.form.1panel_site_certificate_id.label": "1Panel 证书 ID",
"workflow_node.deploy.form.1panel_site_certificate_id.placeholder": "请输入 1Panel 证书 ID",
"workflow_node.deploy.form.1panel_site_certificate_id.tooltip": "请登录 1Panel 面板查看",
"workflow_node.deploy.form.aliyun_alb_region.label": "阿里云服务地域",
"workflow_node.deploy.form.aliyun_alb_region.placeholder": "请输入阿里云 ALB 服务地域(例如:cn-hangzhou",
"workflow_node.deploy.form.aliyun_alb_region.tooltip": "这是什么?请参阅 <a href=\"https://help.aliyun.com/zh/slb/application-load-balancer/product-overview/supported-regions-and-zones\" target=\"_blank\">https://help.aliyun.com/zh/slb/application-load-balancer/product-overview/supported-regions-and-zones</a>",
@@ -466,9 +466,7 @@
"workflow_node.deploy.form.baishan_cdn_certificate_id.label": "白山云 CDN 证书 ID",
"workflow_node.deploy.form.baishan_cdn_certificate_id.placeholder": "请输入白山云 CDN 证书 ID",
"workflow_node.deploy.form.baishan_cdn_certificate_id.tooltip": "这是什么?请参阅 <a href=\"https://cdnx.console.baishan.com/#/cdn/cert\" target=\"_blank\">https://cdnx.console.baishan.com/#/cdn/cert</a>",
"workflow_node.deploy.form.baotapanel_console.guide": "需要宝塔面板 v8.3 或更高版本。",
"workflow_node.deploy.form.baotapanel_console_auto_restart.label": "部署后自动重启宝塔面板服务",
"workflow_node.deploy.form.baotapanel_site.guide": "需要宝塔面板 v8.3 或更高版本。",
"workflow_node.deploy.form.baotapanel.guide": "需要宝塔面板 v8.3 或更高版本。",
"workflow_node.deploy.form.baotapanel_site_type.label": "宝塔面板网站类型",
"workflow_node.deploy.form.baotapanel_site_type.placeholder": "请选择宝塔面板网站类型",
"workflow_node.deploy.form.baotapanel_site_type.option.php.label": "PHP",
@@ -480,6 +478,8 @@
"workflow_node.deploy.form.baotapanel_site_names.tooltip": "请登录宝塔面板查看",
"workflow_node.deploy.form.baotapanel_site_names.multiple_input_modal.title": "修改宝塔面板网站名称",
"workflow_node.deploy.form.baotapanel_site_names.multiple_input_modal.placeholder": "请输入宝塔面板网站名称",
"workflow_node.deploy.form.baotapanel_console.guide": "需要宝塔面板 v8.3 或更高版本。",
"workflow_node.deploy.form.baotapanel_console_auto_restart.label": "部署后自动重启宝塔面板服务",
"workflow_node.deploy.form.baotapanelgo_site_type.label": "宝塔面板极速版网站类型",
"workflow_node.deploy.form.baotapanelgo_site_type.placeholder": "请选择宝塔面板极速版网站类型",
"workflow_node.deploy.form.baotapanelgo_site_type.option.php.label": "PHP 项目",
@@ -514,7 +514,7 @@
"workflow_node.deploy.form.bunny_cdn_hostname.tooltip": "这是什么?请参阅 <a href=\"https://dash.bunny.net/cdn\" target=\"_blank\">https://dash.bunny.net/cdn</a>",
"workflow_node.deploy.form.byteplus_cdn_domain.label": "BytePlus CDN 域名",
"workflow_node.deploy.form.byteplus_cdn_domain.placeholder": "请输入 BytePlus CDN 域名",
"workflow_node.deploy.form.cdnfly_resource_type.option.site.label": "部署到指定网站",
"workflow_node.deploy.form.cdnfly_resource_type.option.website.label": "部署到指定网站",
"workflow_node.deploy.form.cdnfly_resource_type.option.certificate.label": "替换指定证书",
"workflow_node.deploy.form.cdnfly_site_id.label": "Cdnfly 网站 ID",
"workflow_node.deploy.form.cdnfly_site_id.placeholder": "请输入 Cdnfly 网站 ID",
@@ -522,8 +522,9 @@
"workflow_node.deploy.form.cdnfly_certificate_id.label": "Cdnfly 证书 ID",
"workflow_node.deploy.form.cdnfly_certificate_id.placeholder": "请输入 Cdnfly 证书 ID",
"workflow_node.deploy.form.cdnfly_certificate_id.tooltip": "请登录 Cdnfly 控制台查看",
"workflow_node.deploy.form.cpanel_site_domain.label": "cPanel 网站域名",
"workflow_node.deploy.form.cpanel_site_domain.placeholder": "请输入 cPanel 网站域名",
"workflow_node.deploy.form.cpanel_resource_type.option.website.label": "部署到指定网站",
"workflow_node.deploy.form.cpanel_domain.label": "cPanel 网站域名",
"workflow_node.deploy.form.cpanel_domain.placeholder": "请输入 cPanel 网站域名",
"workflow_node.deploy.form.ctcccloud_ao_domain.label": "天翼云 AccessOne 加速域名",
"workflow_node.deploy.form.ctcccloud_ao_domain.placeholder": "请输入天翼云 AccessOne 加速域名",
"workflow_node.deploy.form.ctcccloud_cdn_domain.label": "天翼云 CDN 加速域名",
@@ -722,6 +723,7 @@
"workflow_node.deploy.form.mohua_mvh_domain_id.label": "嘿华云虚拟主机域名 ID",
"workflow_node.deploy.form.mohua_mvh_domain_id.placeholder": "请输入嘿华云虚拟主机域名 ID",
"workflow_node.deploy.form.mohua_mvh_domain_id.tooltip": "这是什么?请参阅 <a href=\"https://cloud.mhjz1.cn/service?groupid=328\" target=\"_blank\">https://cloud.mhjz1.cn/service?groupid=328</a>",
"workflow_node.deploy.form.netlify_resource_type.option.website.label": "部署到指定网站",
"workflow_node.deploy.form.netlify_site_id.label": "Netlify 网站 ID",
"workflow_node.deploy.form.netlify_site_id.placeholder": "请输入 netlify 网站 ID",
"workflow_node.deploy.form.netlify_site_id.tooltip": "这是什么?请参阅 <a href=\"https://docs.netlify.com/api/get-started/#get-site\" target=\"_blank\">https://docs.netlify.com/api/get-started/#get-site</a>",
@@ -749,6 +751,7 @@
"workflow_node.deploy.form.rainyun_rcdn_certificate_id.label": "雨云 RCDN 证书 ID",
"workflow_node.deploy.form.rainyun_rcdn_certificate_id.placeholder": "请输入雨云 RCDN 证书 ID",
"workflow_node.deploy.form.rainyun_rcdn_certificate_id.tooltip": "这是什么?请参阅 <a href=\"https://app.rainyun.com/apps/ssl/list\" target=\"_blank\">https://app.rainyun.com/apps/ssl/list</a>",
"workflow_node.deploy.form.ratpanel_resource_type.option.website.label": "部署到指定网站",
"workflow_node.deploy.form.ratpanel_site_names.label": "耗子面板网站名称",
"workflow_node.deploy.form.ratpanel_site_names.placeholder": "请输入耗子面板网站名称(多个值请用半角分号隔开)",
"workflow_node.deploy.form.ratpanel_site_names.errmsg.invalid": "请输入正确的耗子面板网站名称",
@@ -756,10 +759,10 @@
"workflow_node.deploy.form.ratpanel_site_names.tooltip": "请登录耗子面板查看",
"workflow_node.deploy.form.ratpanel_site_names.multiple_input_modal.title": "修改耗子面板网站名称",
"workflow_node.deploy.form.ratpanel_site_names.multiple_input_modal.placeholder": "请输入耗子面板网站名称",
"workflow_node.deploy.form.safeline_site_resource_type.option.certificate.label": "替换指定证书",
"workflow_node.deploy.form.safeline_site_certificate_id.label": "雷池证书 ID",
"workflow_node.deploy.form.safeline_site_certificate_id.placeholder": "请输入雷池证书 ID",
"workflow_node.deploy.form.safeline_site_certificate_id.tooltip": "请登录雷池控制台查看",
"workflow_node.deploy.form.safeline_resource_type.option.certificate.label": "替换指定证书",
"workflow_node.deploy.form.safeline_certificate_id.label": "雷池证书 ID",
"workflow_node.deploy.form.safeline_certificate_id.placeholder": "请输入雷池证书 ID",
"workflow_node.deploy.form.safeline_certificate_id.tooltip": "请登录雷池控制台查看",
"workflow_node.deploy.form.ssh_format.label": "文件格式",
"workflow_node.deploy.form.ssh_format.placeholder": "请选择文件格式",
"workflow_node.deploy.form.ssh_format.option.pem.label": "PEM 格式(*.pem, *.crt, *.key",