diff --git a/internal/certacme/config.go b/internal/certacme/config.go index 9e59e439..7dc5f4cb 100644 --- a/internal/certacme/config.go +++ b/internal/certacme/config.go @@ -18,6 +18,7 @@ var acmeDirUrls = map[string]string{ string(domain.CAProviderTypeActalisSSL): "https://acme-api.actalis.com/acme/directory", string(domain.CAProviderTypeGlobalSignAtlas): "https://emea.acme.atlas.globalsign.com/directory", string(domain.CAProviderTypeGoogleTrustServices): "https://dv.acme-v02.api.pki.goog/directory", + string(domain.CAProviderTypeLiteSSL): "https://acme.litessl.com/acme/v2/directory", string(domain.CAProviderTypeSSLCom): "https://acme.ssl.com/sslcom-dv-rsa", string(domain.CAProviderTypeSSLCom) + "RSA": "https://acme.ssl.com/sslcom-dv-rsa", string(domain.CAProviderTypeSSLCom) + "ECC": "https://acme.ssl.com/sslcom-dv-ecc", diff --git a/internal/domain/access.go b/internal/domain/access.go index 170b9d0e..9ccf3f09 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -334,6 +334,10 @@ type AccessConfigForLinode struct { AccessToken string `json:"accessToken"` } +type AccessConfigForLiteSSL struct { + AccessConfigForACMEExternalAccountBinding +} + type AccessConfigForMattermost struct { ServerUrl string `json:"serverUrl"` Username string `json:"username"` diff --git a/internal/domain/provider.go b/internal/domain/provider.go index ae6cf480..ede78ee4 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -72,6 +72,7 @@ const ( AccessProviderTypeLetsEncrypt = AccessProviderType("letsencrypt") AccessProviderTypeLetsEncryptStaging = AccessProviderType("letsencryptstaging") AccessProviderTypeLinode = AccessProviderType("linode") + AccessProviderTypeLiteSSL = AccessProviderType("litessl") AccessProviderTypeLocal = AccessProviderType("local") AccessProviderTypeMattermost = AccessProviderType("mattermost") AccessProviderTypeNamecheap = AccessProviderType("namecheap") @@ -128,6 +129,7 @@ const ( CAProviderTypeGoogleTrustServices = CAProviderType(AccessProviderTypeGoogleTrustServices) CAProviderTypeLetsEncrypt = CAProviderType(AccessProviderTypeLetsEncrypt) CAProviderTypeLetsEncryptStaging = CAProviderType(AccessProviderTypeLetsEncryptStaging) + CAProviderTypeLiteSSL = CAProviderType(AccessProviderTypeLiteSSL) CAProviderTypeSectigo = CAProviderType(AccessProviderTypeSectigo) CAProviderTypeSSLCom = CAProviderType(AccessProviderTypeSSLCOM) CAProviderTypeZeroSSL = CAProviderType(AccessProviderTypeZeroSSL) diff --git a/pkg/core/certifier/challengers/dns01/aws-route53/aws-route53.go b/pkg/core/certifier/challengers/dns01/aws-route53/aws-route53.go index 6c572e11..05a7efe0 100644 --- a/pkg/core/certifier/challengers/dns01/aws-route53/aws-route53.go +++ b/pkg/core/certifier/challengers/dns01/aws-route53/aws-route53.go @@ -13,7 +13,7 @@ type ChallengerConfig struct { AccessKeyId string `json:"accessKeyId"` SecretAccessKey string `json:"secretAccessKey"` Region string `json:"region"` - HostedZoneId string `json:"hostedZoneId"` + HostedZoneId string `json:"hostedZoneId,omitempty"` DnsPropagationTimeout int `json:"dnsPropagationTimeout,omitempty"` DnsTTL int `json:"dnsTTL,omitempty"` } @@ -27,7 +27,9 @@ func NewChallenger(config *ChallengerConfig) (certifier.ACMEChallenger, error) { providerConfig.AccessKeyID = config.AccessKeyId providerConfig.SecretAccessKey = config.SecretAccessKey providerConfig.Region = config.Region - providerConfig.HostedZoneID = config.HostedZoneId + if config.HostedZoneId != "" { + providerConfig.HostedZoneID = config.HostedZoneId + } if config.DnsPropagationTimeout != 0 { providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second } diff --git a/pkg/core/deployer/providers/aliyun-waf/aliyun_waf.go b/pkg/core/deployer/providers/aliyun-waf/aliyun_waf.go index 11f4fb2e..eb555b86 100644 --- a/pkg/core/deployer/providers/aliyun-waf/aliyun_waf.go +++ b/pkg/core/deployer/providers/aliyun-waf/aliyun_waf.go @@ -320,7 +320,7 @@ func (d *Deployer) deployToWAF3WithCNAME(ctx context.Context, cloudCertId string RegionId: tea.String(d.config.Region), InstanceId: tea.String(d.config.InstanceId), CertId: tea.String(cloudCertId), - TLSVersion: tea.String("tlsv1"), + TLSVersion: tea.String("tlsv1.2"), EnableTLSv3: tea.Bool(true), } if describeDefaultHttpsResp.Body != nil && describeDefaultHttpsResp.Body.DefaultHttps != nil { diff --git a/pkg/core/deployer/providers/baotapanel-site/baotapanel_site.go b/pkg/core/deployer/providers/baotapanel-site/baotapanel_site.go index 5335fab4..04f38423 100644 --- a/pkg/core/deployer/providers/baotapanel-site/baotapanel_site.go +++ b/pkg/core/deployer/providers/baotapanel-site/baotapanel_site.go @@ -96,7 +96,7 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep default: { - // 遍历更新域名证书 + // 遍历更新站点证书 var errs []error for _, siteName := range d.config.SiteNames { select { diff --git a/pkg/core/deployer/providers/baotapanelgo-site/baotapanelgo_site.go b/pkg/core/deployer/providers/baotapanelgo-site/baotapanelgo_site.go index 49ce4405..ae91e64e 100644 --- a/pkg/core/deployer/providers/baotapanelgo-site/baotapanelgo_site.go +++ b/pkg/core/deployer/providers/baotapanelgo-site/baotapanelgo_site.go @@ -73,7 +73,7 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep return nil, errors.New("config `siteNames` is required") } - // 遍历更新域名证书 + // 遍历更新站点证书 var errs []error for _, siteName := range d.config.SiteNames { select { diff --git a/pkg/core/deployer/providers/baotawaf-site/baotawaf_site.go b/pkg/core/deployer/providers/baotawaf-site/baotawaf_site.go index 5238c68b..f71d629d 100644 --- a/pkg/core/deployer/providers/baotawaf-site/baotawaf_site.go +++ b/pkg/core/deployer/providers/baotawaf-site/baotawaf_site.go @@ -65,7 +65,7 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep return nil, errors.New("config `siteNames` is required") } - // 遍历更新域名证书 + // 遍历更新站点证书 var errs []error for _, siteName := range d.config.SiteNames { select { diff --git a/pkg/core/deployer/providers/ratpanel-site/ratpanel_site.go b/pkg/core/deployer/providers/ratpanel-site/ratpanel_site.go index caf66f8d..aca6a2f5 100644 --- a/pkg/core/deployer/providers/ratpanel-site/ratpanel_site.go +++ b/pkg/core/deployer/providers/ratpanel-site/ratpanel_site.go @@ -62,7 +62,7 @@ func (d *Deployer) Deploy(ctx context.Context, certPEM, privkeyPEM string) (*dep return nil, errors.New("config `siteNames` is required") } - // 遍历更新域名证书 + // 遍历更新站点证书 var errs []error for _, siteName := range d.config.SiteNames { select { diff --git a/ui/public/imgs/providers/litessl.svg b/ui/public/imgs/providers/litessl.svg new file mode 100644 index 00000000..c2ac51bd --- /dev/null +++ b/ui/public/imgs/providers/litessl.svg @@ -0,0 +1 @@ + diff --git a/ui/src/components/access/forms/AccessConfigFieldsProvider.tsx b/ui/src/components/access/forms/AccessConfigFieldsProvider.tsx index 0e605a62..7ad9bdaa 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProvider.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProvider.tsx @@ -61,6 +61,7 @@ import AccessConfigFieldsProviderKubernetes from "./AccessConfigFieldsProviderKu import AccessConfigFieldsProviderLarkBot from "./AccessConfigFieldsProviderLarkBot"; import AccessConfigFieldsProviderLeCDN from "./AccessConfigFieldsProviderLeCDN"; import AccessConfigFieldsProviderLinode from "./AccessConfigFieldsProviderLinode"; +import AccessConfigFieldsProviderLiteSSL from "./AccessConfigFieldsProviderLiteSSL"; import AccessConfigFieldsProviderMattermost from "./AccessConfigFieldsProviderMattermost"; import AccessConfigFieldsProviderNamecheap from "./AccessConfigFieldsProviderNamecheap"; import AccessConfigFieldsProviderNameDotCom from "./AccessConfigFieldsProviderNameDotCom"; @@ -163,6 +164,7 @@ const providerComponentMap: Partial { name={[parentNamePath, "zoneApiToken"]} initialValue={initialValues.zoneApiToken} label={t("access.form.cloudflare_zone_api_token.label")} + extra={} rules={[formRule]} tooltip={} > diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderLiteSSL.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderLiteSSL.tsx new file mode 100644 index 00000000..fd53aac9 --- /dev/null +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderLiteSSL.tsx @@ -0,0 +1,63 @@ +import { getI18n, useTranslation } from "react-i18next"; +import { Form, Input } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +import Tips from "@/components/Tips"; + +import { useFormNestedFieldsContext } from "./_context"; + +const AccessConfigFormFieldsProviderLiteSSL = () => { + const { i18n, t } = useTranslation(); + + const { parentNamePath } = useFormNestedFieldsContext(); + const formSchema = z.object({ + [parentNamePath]: getSchema({ i18n }), + }); + const formRule = createSchemaFieldRule(formSchema); + const initialValues = getInitialValues(); + + return ( + <> + + + + + + + + + + } /> + + + ); +}; + +const getInitialValues = (): Nullish>> => { + return { + eabKid: "", + eabHmacKey: "", + }; +}; + +const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { + const { t } = i18n; + + return z.object({ + eabKid: z.string().nonempty(t("access.form.shared_acme_eab_kid.placeholder")), + eabHmacKey: z.string().nonempty(t("access.form.shared_acme_eab_hmac_key.placeholder")), + }); +}; + +const _default = Object.assign(AccessConfigFormFieldsProviderLiteSSL, { + getInitialValues, + getSchema, +}); + +export default _default; diff --git a/ui/src/components/workflow/WorkflowRunDetail.tsx b/ui/src/components/workflow/WorkflowRunDetail.tsx index c74f61a3..71b855dc 100644 --- a/ui/src/components/workflow/WorkflowRunDetail.tsx +++ b/ui/src/components/workflow/WorkflowRunDetail.tsx @@ -287,7 +287,14 @@ const WorkflowRunLogs = ({ runId, runStatus }: { runId: string; runStatus: strin group.records .map((record) => { const datetime = dayjs(record.timestamp).format("YYYY-MM-DDTHH:mm:ss.SSSZ"); - const level = record.level; + const level = + record.level < WorkflowLogLevel.Info + ? "DBUG" + : record.level < WorkflowLogLevel.Warn + ? "INFO" + : record.level < WorkflowLogLevel.Error + ? "WARN" + : "ERRO"; const message = record.message; const data = record.data && Object.keys(record.data).length > 0 ? JSON.stringify(record.data) : ""; return `[${datetime}] [${level}] ${escape(message)} ${escape(data)}`.trim(); diff --git a/ui/src/components/workflow/designer/forms/BizApplyNodeConfigFieldsProviderAWSRoute53.tsx b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigFieldsProviderAWSRoute53.tsx index 10b5a3ff..de3627f2 100644 --- a/ui/src/components/workflow/designer/forms/BizApplyNodeConfigFieldsProviderAWSRoute53.tsx +++ b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigFieldsProviderAWSRoute53.tsx @@ -31,6 +31,7 @@ const BizApplyNodeConfigFieldsProviderAWSRoute53 = () => { name={[parentNamePath, "hostedZoneId"]} initialValue={initialValues.hostedZoneId} label={t("workflow_node.apply.form.aws_route53_hosted_zone_id.label")} + extra={t("workflow_node.apply.form.aws_route53_hosted_zone_id.help")} rules={[formRule]} tooltip={} > @@ -43,7 +44,6 @@ const BizApplyNodeConfigFieldsProviderAWSRoute53 = () => { const getInitialValues = (): Nullish>> => { return { region: "us-east-1", - hostedZoneId: "", }; }; @@ -52,7 +52,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) return z.object({ region: z.string().nonempty(t("workflow_node.apply.form.aws_route53_region.placeholder")), - hostedZoneId: z.string().nonempty(t("workflow_node.apply.form.aws_route53_hosted_zone_id.placeholder")), + hostedZoneId: z.string().nullish(), }); }; diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index 0a94a43a..edfffd10 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -76,6 +76,7 @@ export const ACCESS_PROVIDERS = Object.freeze({ LETSENCRYPT: "letsencrypt", LETSENCRYPTSTAGING: "letsencryptstaging", LINODE: "linode", + LITESSL: "litessl", LOCAL: "local", MATTERMOST: "mattermost", NAMECHEAP: "namecheap", @@ -229,6 +230,7 @@ export const accessProvidersMap: Map = new [CA_PROVIDERS.SECTIGO], [CA_PROVIDERS.SSLCOM], [CA_PROVIDERS.ZEROSSL], + [CA_PROVIDERS.LITESSL], [CA_PROVIDERS.ACMECA], ] satisfies Array<[CAProviderType, "builtin"] | [CAProviderType]> ).map(([type, builtin]) => [ diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json index 8f3f2ef1..ed599ecd 100644 --- a/ui/src/i18n/locales/en/nls.access.json +++ b/ui/src/i18n/locales/en/nls.access.json @@ -191,7 +191,8 @@ "access.form.cloudflare_dns_api_token.tooltip": "For more information, see https://developers.cloudflare.com/fundamentals/api/get-started/create-token/", "access.form.cloudflare_zone_api_token.label": "Cloudflare Zone API token (Optional)", "access.form.cloudflare_zone_api_token.placeholder": "Please enter Cloudflare Zone API token", - "access.form.cloudflare_zone_api_token.tooltip": "For more information, see https://developers.cloudflare.com/fundamentals/api/get-started/create-token/

Only required when you scope the DNS API token to specific zones. PLease scope the Zone API token to all zones with Zone/Zone/Read permission.", + "access.form.cloudflare_zone_api_token.help": "Notes: Only required when you scope the DNS API token to specific zones. PLease scope the Zone API token to all zones with Zone/Zone/Read permission.", + "access.form.cloudflare_zone_api_token.tooltip": "For more information, see https://developers.cloudflare.com/fundamentals/api/get-started/create-token/", "access.form.cloudns_auth_id.label": "ClouDNS API user ID", "access.form.cloudns_auth_id.placeholder": "Please enter ClouDNS API user ID", "access.form.cloudns_auth_id.tooltip": "For more information, see https://www.cloudns.net/wiki/article/42/", @@ -391,6 +392,7 @@ "access.form.linode_access_token.label": "Linode access token", "access.form.linode_access_token.placeholder": "Please enter Linode access token", "access.form.linode_access_token.tooltip": "For more information, see https://techdocs.akamai.com/linode-api/reference/get-started", + "access.form.litessl_eab.guide": "Learn more about using EAB key in LiteSSL:
https://freessl.cn/automation/eab-manager", "access.form.mattermost_server_url.label": "Mattermost server URL", "access.form.mattermost_server_url.placeholder": "Please enter Mattermost server URL", "access.form.mattermost_username.label": "Mattermost username", diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json index cf99d30e..878d8344 100644 --- a/ui/src/i18n/locales/en/nls.provider.json +++ b/ui/src/i18n/locales/en/nls.provider.json @@ -126,6 +126,7 @@ "provider.letsencrypt": "Let's Encrypt", "provider.letsencryptstaging": "Let's Encrypt Staging Environment", "provider.linode": "Linode", + "provider.litessl": "LiteSSL", "provider.local": "Local host", "provider.mattermost": "Mattermost", "provider.namecheap": "Namecheap", diff --git a/ui/src/i18n/locales/en/nls.workflow.nodes.json b/ui/src/i18n/locales/en/nls.workflow.nodes.json index ce4ff61e..d4304b85 100644 --- a/ui/src/i18n/locales/en/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/en/nls.workflow.nodes.json @@ -60,8 +60,9 @@ "workflow_node.apply.form.aws_route53_region.label": "AWS Region", "workflow_node.apply.form.aws_route53_region.placeholder": "Please enter AWS Route53 region (e.g. us-east-1)", "workflow_node.apply.form.aws_route53_region.tooltip": "For more information, see https://docs.aws.amazon.com/en_us/general/latest/gr/rande.html#regional-endpoints", - "workflow_node.apply.form.aws_route53_hosted_zone_id.label": "AWS Route53 hosted zone ID", + "workflow_node.apply.form.aws_route53_hosted_zone_id.label": "AWS Route53 hosted zone ID (Optional)", "workflow_node.apply.form.aws_route53_hosted_zone_id.placeholder": "Please enter AWS Route53 hosted zone ID", + "workflow_node.apply.form.aws_route53_hosted_zone_id.help": "Notes: Only required when there are several hosted zones with the same FQDN.", "workflow_node.apply.form.aws_route53_hosted_zone_id.tooltip": "For more information, see https://docs.aws.amazon.com/en_us/Route53/latest/DeveloperGuide/hosted-zones-working-with.html", "workflow_node.apply.form.huaweicloud_dns_region.label": "Huawei Cloud region", "workflow_node.apply.form.huaweicloud_dns_region.placeholder": "Please enter Huawei Cloud DNS region (e.g. cn-north-1)", @@ -170,7 +171,7 @@ "workflow_node.monitor.form.port.placeholder": "Please enter port", "workflow_node.monitor.form.domain.label": "Domain (Optional)", "workflow_node.monitor.form.domain.placeholder": "Please enter domain name", - "workflow_node.monitor.form.domain.help": "Notes: It is only required when the host is an IP address.", + "workflow_node.monitor.form.domain.help": "Notes: Only required when the host is an IP address.", "workflow_node.monitor.form.request_path.label": "Request path (Optional)", "workflow_node.monitor.form.request_path.placeholder": "Please enter request path", @@ -201,7 +202,7 @@ "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: It is only used for 1Panel v2+.", + "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", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index 797b2e1d..f3e9435b 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -190,7 +190,8 @@ "access.form.cloudflare_dns_api_token.tooltip": "这是什么?请参阅 https://developers.cloudflare.com/fundamentals/api/get-started/create-token/", "access.form.cloudflare_zone_api_token.label": "Cloudflare Zone API 令牌(可选)", "access.form.cloudflare_zone_api_token.placeholder": "请输入 Cloudflare Zone API 令牌", - "access.form.cloudflare_zone_api_token.tooltip": "这是什么?请参阅 https://developers.cloudflare.com/fundamentals/api/get-started/create-token/

仅当你将 DNS API 令牌范围指定为特定域时需要填写,请将 Zone API 令牌范围指定为全部域,并分配 Zone/Zone/Read 权限。", + "access.form.cloudflare_zone_api_token.help": "提示:仅当你将 DNS API 令牌范围指定为特定域时需要填写,请将 Zone API 令牌范围指定为全部域,并分配 Zone/Zone/Read 权限。", + "access.form.cloudflare_zone_api_token.tooltip": "这是什么?请参阅 https://developers.cloudflare.com/fundamentals/api/get-started/create-token/", "access.form.cloudns_auth_id.label": "ClouDNS API 用户 ID", "access.form.cloudns_auth_id.placeholder": "请输入 ClouDNS API 用户 ID", "access.form.cloudns_auth_id.tooltip": "这是什么?请参阅 https://www.cloudns.net/wiki/article/42/", @@ -390,6 +391,7 @@ "access.form.linode_access_token.label": "Linode AccessToken", "access.form.linode_access_token.placeholder": "请输入 Linode AccessToken", "access.form.linode_access_token.tooltip": "这是什么?请参阅 https://techdocs.akamai.com/linode-api/reference/get-started", + "access.form.litessl_eab.guide": "点击下方链接了解如何获取 LiteSSL EAB:
https://freessl.cn/automation/eab-manager", "access.form.mattermost_server_url.label": "Mattermost 服务地址", "access.form.mattermost_server_url.placeholder": "请输入 Mattermost 服务地址", "access.form.mattermost_username.label": "Mattermost 用户名", diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json index c3c475f6..e0e0f12d 100644 --- a/ui/src/i18n/locales/zh/nls.provider.json +++ b/ui/src/i18n/locales/zh/nls.provider.json @@ -126,6 +126,7 @@ "provider.letsencrypt": "Let's Encrypt", "provider.letsencryptstaging": "Let's Encrypt 测试环境", "provider.linode": "Linode", + "provider.litessl": "LiteSSL", "provider.local": "本地主机", "provider.mattermost": "Mattermost", "provider.namecheap": "Namecheap", diff --git a/ui/src/i18n/locales/zh/nls.workflow.nodes.json b/ui/src/i18n/locales/zh/nls.workflow.nodes.json index c9979db9..620099b2 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/zh/nls.workflow.nodes.json @@ -60,8 +60,9 @@ "workflow_node.apply.form.aws_route53_region.label": "AWS 服务区域", "workflow_node.apply.form.aws_route53_region.placeholder": "请输入 AWS Route53 服务区域(例如:us-east-1)", "workflow_node.apply.form.aws_route53_region.tooltip": "这是什么?请参阅 https://docs.aws.amazon.com/zh_cn/general/latest/gr/rande.html#regional-endpoints", - "workflow_node.apply.form.aws_route53_hosted_zone_id.label": "AWS Route53 托管区域 ID", + "workflow_node.apply.form.aws_route53_hosted_zone_id.label": "AWS Route53 托管区域 ID(可选)", "workflow_node.apply.form.aws_route53_hosted_zone_id.placeholder": "请输入 AWS Route53 托管区域 ID", + "workflow_node.apply.form.aws_route53_hosted_zone_id.help": "提示:仅当存在多个相同 FQDN 的托管区域时需要填写。", "workflow_node.apply.form.aws_route53_hosted_zone_id.tooltip": "这是什么?请参阅 https://docs.aws.amazon.com/zh_cn/Route53/latest/DeveloperGuide/hosted-zones-working-with.html", "workflow_node.apply.form.huaweicloud_dns_region.label": "华为云服务区域", "workflow_node.apply.form.huaweicloud_dns_region.placeholder": "请输入华为云 DNS 服务区域(例如:cn-north-1)", @@ -169,7 +170,7 @@ "workflow_node.monitor.form.port.placeholder": "请输入主机端口", "workflow_node.monitor.form.domain.label": "域名(可选)", "workflow_node.monitor.form.domain.placeholder": "请输入域名", - "workflow_node.monitor.form.domain.help": "提示:仅当主机地址为 IP 时需要输入。", + "workflow_node.monitor.form.domain.help": "提示:仅当主机地址为 IP 时需要填写。", "workflow_node.monitor.form.request_path.label": "请求路径(可选)", "workflow_node.monitor.form.request_path.placeholder": "请输入请求路径", @@ -200,7 +201,7 @@ "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.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": "替换指定证书", diff --git a/ui/src/pages/settings/SettingsSSLProvider.tsx b/ui/src/pages/settings/SettingsSSLProvider.tsx index 097aa18e..a22558d9 100644 --- a/ui/src/pages/settings/SettingsSSLProvider.tsx +++ b/ui/src/pages/settings/SettingsSSLProvider.tsx @@ -48,6 +48,7 @@ const SettingsSSLProvider = () => { [CA_PROVIDERS.SECTIGO, "provider.sectigo", "sectigo.com", "/imgs/providers/sectigo.svg"], [CA_PROVIDERS.SSLCOM, "provider.sslcom", "ssl.com", "/imgs/providers/sslcom.svg"], [CA_PROVIDERS.ZEROSSL, "provider.zerossl", "zerossl.com", "/imgs/providers/zerossl.svg"], + [CA_PROVIDERS.LITESSL, "provider.litessl", "litessl.cn (freessl.cn)", "/imgs/providers/litessl.svg"], [CA_PROVIDERS.ACMECA, "provider.acmeca", "ACME v2 (RFC 8555)", "/imgs/providers/acmeca.svg"], ].map(([value, name, description, icon]) => { return { @@ -70,6 +71,8 @@ const SettingsSSLProvider = () => { return ; case CA_PROVIDERS.GOOGLETRUSTSERVICES: return ; + case CA_PROVIDERS.LITESSL: + return ; case CA_PROVIDERS.SECTIGO: return ; case CA_PROVIDERS.SSLCOM: @@ -271,6 +274,14 @@ const InternalSettingsFormProviderGoogleTrustServices = () => { ); }; +const InternalSettingsFormProviderLiteSSL = () => { + return ( + + + + ); +}; + const InternalSettingsFormProviderSectigo = () => { const { t } = useTranslation(); diff --git a/ui/src/repository/certificate.ts b/ui/src/repository/certificate.ts index a355b8b3..4478993d 100644 --- a/ui/src/repository/certificate.ts +++ b/ui/src/repository/certificate.ts @@ -65,7 +65,7 @@ export const listByWorkflowRunId = async (workflowRunId: string) => { const list = await pb.collection(COLLECTION_NAME_CERTIFICATE).getFullList({ batch: 65535, - fields: [..._commonFields, ..._expandFields].join(","), + fields: [..._commonFields, ..._expandFields, "certificate", "privateKey"].join(","), filter: pb.filter("workflowRunRef={:workflowRunId}", { workflowRunId }), sort: "created", requestKey: null,