mirror of
https://github.com/certimate-go/certimate.git
synced 2026-09-24 23:10:13 +08:00
feat(provider): new acme dns-01 provider: arvancloud
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
package applicators
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/go-acme/lego/v4/challenge"
|
||||
|
||||
"github.com/certimate-go/certimate/internal/domain"
|
||||
"github.com/certimate-go/certimate/pkg/core/ssl-applicator/acme-dns01/providers/arvancloud"
|
||||
xmaps "github.com/certimate-go/certimate/pkg/utils/maps"
|
||||
)
|
||||
|
||||
func init() {
|
||||
if err := ACMEDns01Registries.Register(domain.ACMEDns01ProviderTypeArvanCloud, func(options *ProviderFactoryOptions) (challenge.Provider, error) {
|
||||
credentials := domain.AccessConfigForArvanCloud{}
|
||||
if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil {
|
||||
return nil, fmt.Errorf("failed to populate provider access config: %w", err)
|
||||
}
|
||||
|
||||
provider, err := arvancloud.NewChallengeProvider(&arvancloud.ChallengeProviderConfig{
|
||||
ApiKey: credentials.ApiKey,
|
||||
DnsPropagationTimeout: options.DnsPropagationTimeout,
|
||||
DnsTTL: options.DnsTTL,
|
||||
})
|
||||
return provider, err
|
||||
}); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
@@ -60,6 +60,10 @@ type AccessConfigForAPISIX struct {
|
||||
AllowInsecureConnections bool `json:"allowInsecureConnections,omitempty"`
|
||||
}
|
||||
|
||||
type AccessConfigForArvanCloud struct {
|
||||
ApiKey string `json:"apiKey"`
|
||||
}
|
||||
|
||||
type AccessConfigForAWS struct {
|
||||
AccessKeyId string `json:"accessKeyId"`
|
||||
SecretAccessKey string `json:"secretAccessKey"`
|
||||
|
||||
@@ -17,6 +17,7 @@ const (
|
||||
AccessProviderTypeAkamai = AccessProviderType("akamai") // Akamai(预留)
|
||||
AccessProviderTypeAliyun = AccessProviderType("aliyun")
|
||||
AccessProviderTypeAPISIX = AccessProviderType("apisix")
|
||||
AccessProviderTypeArvanCloud = AccessProviderType("arvancloud")
|
||||
AccessProviderTypeAWS = AccessProviderType("aws")
|
||||
AccessProviderTypeAzure = AccessProviderType("azure")
|
||||
AccessProviderTypeBaiduCloud = AccessProviderType("baiducloud")
|
||||
@@ -40,8 +41,10 @@ const (
|
||||
AccessProviderTypeDingTalkBot = AccessProviderType("dingtalkbot")
|
||||
AccessProviderTypeDiscordBot = AccessProviderType("discordbot")
|
||||
AccessProviderTypeDNSLA = AccessProviderType("dnsla")
|
||||
AccessProviderTypeDNSMadeEasy = AccessProviderType("dnsmadeeasy") // DNS Made Easy(预留)
|
||||
AccessProviderTypeDogeCloud = AccessProviderType("dogecloud")
|
||||
AccessProviderTypeDuckDNS = AccessProviderType("duckdns")
|
||||
AccessProviderTypeDynu = AccessProviderType("dynu") // Dynu(预留)
|
||||
AccessProviderTypeDynv6 = AccessProviderType("dynv6")
|
||||
AccessProviderTypeEmail = AccessProviderType("email")
|
||||
AccessProviderTypeFastly = AccessProviderType("fastly") // Fastly(预留)
|
||||
@@ -57,6 +60,7 @@ const (
|
||||
AccessProviderTypeHostingde = AccessProviderType("hostingde")
|
||||
AccessProviderTypeHostinger = AccessProviderType("hostinger")
|
||||
AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud")
|
||||
AccessProviderTypeInfomaniak = AccessProviderType("infomaniak") // Infomaniak(预留)
|
||||
AccessProviderTypeIONOS = AccessProviderType("ionos")
|
||||
AccessProviderTypeJDCloud = AccessProviderType("jdcloud")
|
||||
AccessProviderTypeKong = AccessProviderType("kong")
|
||||
@@ -75,6 +79,7 @@ const (
|
||||
AccessProviderTypeNetcup = AccessProviderType("netcup")
|
||||
AccessProviderTypeNetlify = AccessProviderType("netlify")
|
||||
AccessProviderTypeNS1 = AccessProviderType("ns1")
|
||||
AccessProviderTypeOVHcloud = AccessProviderType("ovhcloud") // OVHcloud(预留)
|
||||
AccessProviderTypePorkbun = AccessProviderType("porkbun")
|
||||
AccessProviderTypePowerDNS = AccessProviderType("powerdns")
|
||||
AccessProviderTypeProxmoxVE = AccessProviderType("proxmoxve")
|
||||
@@ -141,6 +146,7 @@ const (
|
||||
ACMEDns01ProviderTypeAliyun = ACMEDns01ProviderType(AccessProviderTypeAliyun) // 兼容旧值,等同于 [ACMEDns01ProviderTypeAliyunDNS]
|
||||
ACMEDns01ProviderTypeAliyunDNS = ACMEDns01ProviderType(AccessProviderTypeAliyun + "-dns")
|
||||
ACMEDns01ProviderTypeAliyunESA = ACMEDns01ProviderType(AccessProviderTypeAliyun + "-esa")
|
||||
ACMEDns01ProviderTypeArvanCloud = ACMEDns01ProviderType(AccessProviderTypeArvanCloud)
|
||||
ACMEDns01ProviderTypeAWS = ACMEDns01ProviderType(AccessProviderTypeAWS) // 兼容旧值,等同于 [ACMEDns01ProviderTypeAWSRoute53]
|
||||
ACMEDns01ProviderTypeAWSRoute53 = ACMEDns01ProviderType(AccessProviderTypeAWS + "-route53")
|
||||
ACMEDns01ProviderTypeAzure = ACMEDns01ProviderType(AccessProviderTypeAzure) // 兼容旧值,等同于 [ACMEDns01ProviderTypeAzure]
|
||||
@@ -159,7 +165,9 @@ const (
|
||||
ACMEDns01ProviderTypeDeSEC = ACMEDns01ProviderType(AccessProviderTypeDeSEC)
|
||||
ACMEDns01ProviderTypeDigitalOcean = ACMEDns01ProviderType(AccessProviderTypeDigitalOcean)
|
||||
ACMEDns01ProviderTypeDNSLA = ACMEDns01ProviderType(AccessProviderTypeDNSLA)
|
||||
ACMEDns01ProviderTypeDNSMadeEasy = ACMEDns01ProviderType(AccessProviderTypeDNSMadeEasy)
|
||||
ACMEDns01ProviderTypeDuckDNS = ACMEDns01ProviderType(AccessProviderTypeDuckDNS)
|
||||
ACMEDns01ProviderTypeDynu = ACMEDns01ProviderType(AccessProviderTypeDynu)
|
||||
ACMEDns01ProviderTypeDynv6 = ACMEDns01ProviderType(AccessProviderTypeDynv6)
|
||||
ACMEDns01ProviderTypeGandinet = ACMEDns01ProviderType(AccessProviderTypeGandinet)
|
||||
ACMEDns01ProviderTypeGcore = ACMEDns01ProviderType(AccessProviderTypeGcore)
|
||||
@@ -170,6 +178,7 @@ const (
|
||||
ACMEDns01ProviderTypeHostinger = ACMEDns01ProviderType(AccessProviderTypeHostinger)
|
||||
ACMEDns01ProviderTypeHuaweiCloud = ACMEDns01ProviderType(AccessProviderTypeHuaweiCloud) // 兼容旧值,等同于 [ACMEDns01ProviderTypeHuaweiCloudDNS]
|
||||
ACMEDns01ProviderTypeHuaweiCloudDNS = ACMEDns01ProviderType(AccessProviderTypeHuaweiCloud + "-dns")
|
||||
ACMEDns01ProviderTypeInfomaniak = ACMEDns01ProviderType(AccessProviderTypeInfomaniak)
|
||||
ACMEDns01ProviderTypeIONOS = ACMEDns01ProviderType(AccessProviderTypeIONOS)
|
||||
ACMEDns01ProviderTypeJDCloud = ACMEDns01ProviderType(AccessProviderTypeJDCloud) // 兼容旧值,等同于 [ACMEDns01ProviderTypeJDCloudDNS]
|
||||
ACMEDns01ProviderTypeJDCloudDNS = ACMEDns01ProviderType(AccessProviderTypeJDCloud + "-dns")
|
||||
@@ -180,6 +189,7 @@ const (
|
||||
ACMEDns01ProviderTypeNetcup = ACMEDns01ProviderType(AccessProviderTypeNetcup)
|
||||
ACMEDns01ProviderTypeNetlify = ACMEDns01ProviderType(AccessProviderTypeNetlify)
|
||||
ACMEDns01ProviderTypeNS1 = ACMEDns01ProviderType(AccessProviderTypeNS1)
|
||||
ACMEDns01ProviderTypeOVHcloud = ACMEDns01ProviderType(AccessProviderTypeOVHcloud)
|
||||
ACMEDns01ProviderTypePorkbun = ACMEDns01ProviderType(AccessProviderTypePorkbun)
|
||||
ACMEDns01ProviderTypePowerDNS = ACMEDns01ProviderType(AccessProviderTypePowerDNS)
|
||||
ACMEDns01ProviderTypeRainYun = ACMEDns01ProviderType(AccessProviderTypeRainYun)
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package arvancloud
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"github.com/go-acme/lego/v4/providers/dns/arvancloud"
|
||||
|
||||
"github.com/certimate-go/certimate/pkg/core"
|
||||
)
|
||||
|
||||
type ChallengeProviderConfig struct {
|
||||
ApiKey string `json:"apiKey"`
|
||||
DnsPropagationTimeout int32 `json:"dnsPropagationTimeout,omitempty"`
|
||||
DnsTTL int32 `json:"dnsTTL,omitempty"`
|
||||
}
|
||||
|
||||
func NewChallengeProvider(config *ChallengeProviderConfig) (core.ACMEChallenger, error) {
|
||||
if config == nil {
|
||||
return nil, errors.New("the configuration of the acme challenge provider is nil")
|
||||
}
|
||||
|
||||
providerConfig := arvancloud.NewDefaultConfig()
|
||||
providerConfig.APIKey = config.ApiKey
|
||||
if config.DnsPropagationTimeout != 0 {
|
||||
providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second
|
||||
}
|
||||
if config.DnsTTL != 0 {
|
||||
providerConfig.TTL = int(config.DnsTTL)
|
||||
}
|
||||
|
||||
provider, err := arvancloud.NewDNSProviderConfig(providerConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return provider, nil
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 21 21" fill="none"><path d="M13.7039 1.80808L13.7435 1.88816L20.4095 15.2197C20.6201 15.6565 20.7385 16.1468 20.7385 16.6648C20.7385 18.5057 19.2464 19.9978 17.4055 19.9978C16.1396 19.9978 15.039 19.2925 14.4748 18.2536L14.4676 18.2399C14.4369 18.1839 14.4091 18.1273 14.3824 18.0696L14.3817 18.0678L7.79261 4.89104L7.78937 4.88455C7.77061 4.84956 7.75221 4.81384 7.73525 4.77777L7.72876 4.76406C7.52205 4.33044 7.40625 3.84559 7.40625 3.33333C7.40625 2.05519 8.12522 0.945524 9.18042 0.386723C9.22515 0.362553 9.27024 0.339826 9.3157 0.319263L9.32039 0.316738C9.75076 0.113997 10.2316 1.32764e-07 10.7396 1.32764e-07C12.0311 -0.000360617 13.1508 0.734486 13.7039 1.80808Z" fill="#00BABA"/><path d="M7.40008 16.6688C7.40008 18.5096 5.90771 20.0016 4.06723 20.0016C2.22638 20.0016 0.734375 18.5096 0.734375 16.6688C0.734375 14.8279 2.22638 13.3359 4.06723 13.3359C5.90771 13.3359 7.40008 14.8283 7.40008 16.6688Z" fill="#00BABA"/></svg>
|
||||
|
After Width: | Height: | Size: 989 B |
@@ -9,6 +9,7 @@ import AccessConfigFieldsProviderACMEHttpReq from "./AccessConfigFieldsProviderA
|
||||
import AccessConfigFieldsProviderActalisSSL from "./AccessConfigFieldsProviderActalisSSL";
|
||||
import AccessConfigFieldsProviderAliyun from "./AccessConfigFieldsProviderAliyun";
|
||||
import AccessConfigFieldsProviderAPISIX from "./AccessConfigFieldsProviderAPISIX";
|
||||
import AccessConfigFieldsProviderArvanCloud from "./AccessConfigFieldsProviderArvanCloud";
|
||||
import AccessConfigFieldsProviderAWS from "./AccessConfigFieldsProviderAWS";
|
||||
import AccessConfigFieldsProviderAzure from "./AccessConfigFieldsProviderAzure";
|
||||
import AccessConfigFieldsProviderBaiduCloud from "./AccessConfigFieldsProviderBaiduCloud";
|
||||
@@ -101,6 +102,7 @@ const providerComponentMap: Partial<Record<AccessProviderType, React.ComponentTy
|
||||
[ACCESS_PROVIDERS.ACTALISSSL]: AccessConfigFieldsProviderActalisSSL,
|
||||
[ACCESS_PROVIDERS.ALIYUN]: AccessConfigFieldsProviderAliyun,
|
||||
[ACCESS_PROVIDERS.APISIX]: AccessConfigFieldsProviderAPISIX,
|
||||
[ACCESS_PROVIDERS.ARVANCLOUD]: AccessConfigFieldsProviderArvanCloud,
|
||||
[ACCESS_PROVIDERS.AWS]: AccessConfigFieldsProviderAWS,
|
||||
[ACCESS_PROVIDERS.AZURE]: AccessConfigFieldsProviderAzure,
|
||||
[ACCESS_PROVIDERS.BAIDUCLOUD]: AccessConfigFieldsProviderBaiduCloud,
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
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 AccessConfigFormFieldsProviderArvanCloud = () => {
|
||||
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, "apiKey"]}
|
||||
initialValue={initialValues.apiKey}
|
||||
label={t("access.form.arvancloud_api_key.label")}
|
||||
rules={[formRule]}
|
||||
tooltip={<span dangerouslySetInnerHTML={{ __html: t("access.form.arvancloud_api_key.tooltip") }}></span>}
|
||||
>
|
||||
<Input.Password autoComplete="new-password" placeholder={t("access.form.arvancloud_api_key.placeholder")} />
|
||||
</Form.Item>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
|
||||
return {
|
||||
apiKey: "",
|
||||
};
|
||||
};
|
||||
|
||||
const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType<typeof getI18n> }) => {
|
||||
const { t } = i18n;
|
||||
|
||||
return z.object({
|
||||
apiKey: z.string().nonempty(t("access.form.arvancloud_api_key.placeholder")),
|
||||
});
|
||||
};
|
||||
|
||||
const _default = Object.assign(AccessConfigFormFieldsProviderArvanCloud, {
|
||||
getInitialValues,
|
||||
getSchema,
|
||||
});
|
||||
|
||||
export default _default;
|
||||
@@ -22,6 +22,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
|
||||
ACTALISSSL: "actalisssl",
|
||||
ALIYUN: "aliyun",
|
||||
APISIX: "apisix",
|
||||
ARVANCLOUD: "arvancloud",
|
||||
AWS: "aws",
|
||||
AZURE: "azure",
|
||||
BAIDUCLOUD: "baiducloud",
|
||||
@@ -44,8 +45,10 @@ export const ACCESS_PROVIDERS = Object.freeze({
|
||||
DINGTALKBOT: "dingtalkbot",
|
||||
DISCORDBOT: "discordbot",
|
||||
DNSLA: "dnsla",
|
||||
DNSMADEEASY: "dnsmadeeasy",
|
||||
DOGECLOUD: "dogecloud",
|
||||
DUCKDNS: "duckdns",
|
||||
DYNU: "dynu",
|
||||
DYNV6: "dynv6",
|
||||
EMAIL: "email",
|
||||
FLEXCDN: "flexcdn",
|
||||
@@ -60,6 +63,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
|
||||
HOSTINGDE: "hostingDE",
|
||||
HOSTINGER: "hostinger",
|
||||
HUAWEICLOUD: "huaweicloud",
|
||||
INFOMANIAK: "infomaniak",
|
||||
IONOS: "ionos",
|
||||
JDCLOUD: "jdcloud",
|
||||
KONG: "kong",
|
||||
@@ -77,6 +81,7 @@ export const ACCESS_PROVIDERS = Object.freeze({
|
||||
NETCUP: "netcup",
|
||||
NETLIFY: "netlify",
|
||||
NS1: "ns1",
|
||||
OVHCLOUD: "ovhcloud",
|
||||
PORKBUN: "porkbun",
|
||||
POWERDNS: "powerdns",
|
||||
PROXMOXVE: "proxmoxve",
|
||||
@@ -170,6 +175,7 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
|
||||
[ACCESS_PROVIDERS.KONG, "provider.kong", "/imgs/providers/kong.png", [ACCESS_USAGES.HOSTING]],
|
||||
[ACCESS_PROVIDERS.PROXMOXVE, "provider.proxmoxve", "/imgs/providers/proxmoxve.svg", [ACCESS_USAGES.HOSTING]],
|
||||
|
||||
[ACCESS_PROVIDERS.ARVANCLOUD, "provider.arvancloud", "/imgs/providers/arvancloud.svg", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.BOOKMYNAME, "provider.bookmyname", "/imgs/providers/bookmyname.png", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.CLOUDFLARE, "provider.cloudflare", "/imgs/providers/cloudflare.svg", [ACCESS_USAGES.DNS]],
|
||||
[ACCESS_PROVIDERS.CLOUDNS, "provider.cloudns", "/imgs/providers/cloudns.png", [ACCESS_USAGES.DNS]],
|
||||
@@ -298,6 +304,7 @@ export const ACME_DNS01_PROVIDERS = Object.freeze({
|
||||
ALIYUN: `${ACCESS_PROVIDERS.ALIYUN}`, // 兼容旧值,等同于 `ALIYUN_DNS`
|
||||
ALIYUN_DNS: `${ACCESS_PROVIDERS.ALIYUN}-dns`,
|
||||
ALIYUN_ESA: `${ACCESS_PROVIDERS.ALIYUN}-esa`,
|
||||
ARVANCLOUD: `${ACCESS_PROVIDERS.ARVANCLOUD}`,
|
||||
AWS: `${ACCESS_PROVIDERS.AWS}`, // 兼容旧值,等同于 `AWS_ROUTE53`
|
||||
AWS_ROUTE53: `${ACCESS_PROVIDERS.AWS}-route53`,
|
||||
AZURE: `${ACCESS_PROVIDERS.AZURE}`, // 兼容旧值,等同于 `AZURE_DNS`
|
||||
@@ -316,7 +323,9 @@ export const ACME_DNS01_PROVIDERS = Object.freeze({
|
||||
DESEC: `${ACCESS_PROVIDERS.DESEC}`,
|
||||
DIGITALOCEAN: `${ACCESS_PROVIDERS.DIGITALOCEAN}`,
|
||||
DNSLA: `${ACCESS_PROVIDERS.DNSLA}`,
|
||||
DNSMADEEASY: `${ACCESS_PROVIDERS.DNSMADEEASY}`,
|
||||
DUCKDNS: `${ACCESS_PROVIDERS.DUCKDNS}`,
|
||||
DYNU: `${ACCESS_PROVIDERS.DYNU}`,
|
||||
DYNV6: `${ACCESS_PROVIDERS.DYNV6}`,
|
||||
GANDINET: `${ACCESS_PROVIDERS.GANDINET}`,
|
||||
GCORE: `${ACCESS_PROVIDERS.GCORE}`,
|
||||
@@ -327,6 +336,7 @@ export const ACME_DNS01_PROVIDERS = Object.freeze({
|
||||
HOSTINGER: `${ACCESS_PROVIDERS.HOSTINGER}`,
|
||||
HUAWEICLOUD: `${ACCESS_PROVIDERS.HUAWEICLOUD}`, // 兼容旧值,等同于 `HUAWEICLOUD_DNS`
|
||||
HUAWEICLOUD_DNS: `${ACCESS_PROVIDERS.HUAWEICLOUD}-dns`,
|
||||
INFOMANIAK: `${ACCESS_PROVIDERS.INFOMANIAK}`,
|
||||
IONOS: `${ACCESS_PROVIDERS.IONOS}`,
|
||||
JDCLOUD: `${ACCESS_PROVIDERS.JDCLOUD}`, // 兼容旧值,等同于 `JDCLOUD_DNS`
|
||||
JDCLOUD_DNS: `${ACCESS_PROVIDERS.JDCLOUD}-dns`,
|
||||
@@ -337,6 +347,7 @@ export const ACME_DNS01_PROVIDERS = Object.freeze({
|
||||
NETCUP: `${ACCESS_PROVIDERS.NETCUP}`,
|
||||
NETLIFY: `${ACCESS_PROVIDERS.NETLIFY}`,
|
||||
NS1: `${ACCESS_PROVIDERS.NS1}`,
|
||||
OVHCLOUD: `${ACCESS_PROVIDERS.OVHCLOUD}`,
|
||||
PORKBUN: `${ACCESS_PROVIDERS.PORKBUN}`,
|
||||
POWERDNS: `${ACCESS_PROVIDERS.POWERDNS}`,
|
||||
RAINYUN: `${ACCESS_PROVIDERS.RAINYUN}`,
|
||||
@@ -375,6 +386,7 @@ export const acmeDns01ProvidersMap: Map<ACMEDns01Provider["type"] | string, ACME
|
||||
[ACME_DNS01_PROVIDERS.JDCLOUD_DNS, "provider.jdcloud.dns"],
|
||||
[ACME_DNS01_PROVIDERS.AWS_ROUTE53, "provider.aws.route53"],
|
||||
[ACME_DNS01_PROVIDERS.AZURE_DNS, "provider.azure.dns"],
|
||||
[ACME_DNS01_PROVIDERS.ARVANCLOUD, "provider.arvancloud"],
|
||||
[ACME_DNS01_PROVIDERS.BOOKMYNAME, "provider.bookmyname"],
|
||||
[ACME_DNS01_PROVIDERS.BUNNY, "provider.bunny"],
|
||||
[ACME_DNS01_PROVIDERS.CLOUDFLARE, "provider.cloudflare"],
|
||||
|
||||
@@ -98,6 +98,9 @@
|
||||
"access.form.apisix_api_key.label": "APISIX Admin API key",
|
||||
"access.form.apisix_api_key.placeholder": "Please enter APISIX Admin API key",
|
||||
"access.form.apisix_api_key.tooltip": "For more information, see <a href=\"https://apisix.apache.org/docs/apisix/admin-api/\" target=\"_blank\">https://apisix.apache.org/docs/apisix/admin-api/</a>",
|
||||
"access.form.arvancloud_api_key.label": "ArvanCloud API key",
|
||||
"access.form.arvancloud_api_key.placeholder": "Please enter ArvanCloud API key",
|
||||
"access.form.arvancloud_api_key.tooltip": "For more information, see <a href=\"https://docs.arvancloud.ir/en/developer-tools/api/api-key\" target=\"_blank\">https://docs.arvancloud.ir/en/developer-tools/api/api-key</a>",
|
||||
"access.form.aws_access_key_id.label": "AWS AccessKeyID",
|
||||
"access.form.aws_access_key_id.placeholder": "Please enter AWS AccessKeyID",
|
||||
"access.form.aws_access_key_id.tooltip": "For more information, see <a href=\"https://docs.aws.amazon.com/en_us/IAM/latest/UserGuide/id_credentials_access-keys.html\" target=\"_blank\">https://docs.aws.amazon.com/en_us/IAM/latest/UserGuide/id_credentials_access-keys.html</a>",
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
"provider.akamai": "Akamai",
|
||||
"provider.akamai.cdn": "Akamai - CDN (Content Delivery Network)",
|
||||
"provider.apisix": "Apache APISIX",
|
||||
"provider.arvancloud": "ArvanCloud",
|
||||
"provider.aws": "AWS",
|
||||
"provider.aws.acm": "AWS - ACM (Amazon Certificate Manager)",
|
||||
"provider.aws.cloudfront": "AWS - CloudFront",
|
||||
@@ -78,9 +79,11 @@
|
||||
"provider.dingtalkbot": "DingTalk Bot",
|
||||
"provider.discordbot": "Discord Bot",
|
||||
"provider.dnsla": "DNS.LA",
|
||||
"provider.dogecloud": "Doge Cloud",
|
||||
"provider.dnsmadeeasy": "DNS Made Easy",
|
||||
"provider.dogecloud.cdn": "Doge Cloud - CDN (Content Delivery Network)",
|
||||
"provider.dogecloud": "Doge Cloud",
|
||||
"provider.duckdns": "Duck DNS",
|
||||
"provider.dynu": "Dynu",
|
||||
"provider.dynv6": "dynv6",
|
||||
"provider.email": "Email (SMTP)",
|
||||
"provider.fastly": "Fastly",
|
||||
@@ -103,6 +106,7 @@
|
||||
"provider.huaweicloud.obs": "Huawei Cloud - OBS (Object Storage Service)",
|
||||
"provider.huaweicloud.scm_upload": "Huawei Cloud - Upload to SCM (SSL Certificate Manager)",
|
||||
"provider.huaweicloud.waf": "Huawei Cloud - WAF (Web Application Firewall)",
|
||||
"provider.infomaniak": "Infomaniak",
|
||||
"provider.ionos": "IONOS",
|
||||
"provider.jdcloud": "JD Cloud",
|
||||
"provider.jdcloud.alb": "JD Cloud - ALB (Application Load Balancer)",
|
||||
@@ -126,6 +130,7 @@
|
||||
"provider.netcup": "netcup",
|
||||
"provider.netlify": "Netlify",
|
||||
"provider.netlify.site": "Netlify - Site",
|
||||
"provider.ovhcloud": "OVHcloud",
|
||||
"provider.ns1": "NS1 (IBM NS1 Connect)",
|
||||
"provider.porkbun": "Porkbun",
|
||||
"provider.powerdns": "PowerDNS",
|
||||
|
||||
@@ -97,6 +97,9 @@
|
||||
"access.form.apisix_api_key.label": "APISIX Admin API Key",
|
||||
"access.form.apisix_api_key.placeholder": "请输入 APISIX Admin API Key",
|
||||
"access.form.apisix_api_key.tooltip": "这是什么?请参阅 <a href=\"https://apisix.apache.org/zh/docs/apisix/admin-api/\" target=\"_blank\">https://apisix.apache.org/zh/docs/apisix/admin-api/</a>",
|
||||
"access.form.arvancloud_api_key.label": "ArvanCloud API 密钥",
|
||||
"access.form.arvancloud_api_key.placeholder": "请输入 ArvanCloud API 密钥",
|
||||
"access.form.arvancloud_api_key.tooltip": "这是什么?请参阅 <a href=\"https://docs.arvancloud.ir/en/developer-tools/api/api-key\" target=\"_blank\">https://docs.arvancloud.ir/en/developer-tools/api/api-key</a>",
|
||||
"access.form.aws_access_key_id.label": "AWS AccessKeyID",
|
||||
"access.form.aws_access_key_id.placeholder": "请输入 AWS AccessKeyID",
|
||||
"access.form.aws_access_key_id.tooltip": "这是什么?请参阅 <a href=\"https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_access-keys.html\" target=\"_blank\">https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_access-keys.html</a>",
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
"provider.akamai": "Akamai",
|
||||
"provider.akamai.cdn": "Akamai - 内容分发网络 CDN",
|
||||
"provider.apisix": "Apache APISIX",
|
||||
"provider.arvancloud": "ArvanCloud",
|
||||
"provider.aws": "AWS",
|
||||
"provider.aws.acm": "AWS - ACM (Amazon Certificate Manager)",
|
||||
"provider.aws.cloudfront": "AWS - CloudFront",
|
||||
@@ -78,9 +79,11 @@
|
||||
"provider.dingtalkbot": "钉钉群机器人",
|
||||
"provider.discordbot": "Discord 机器人",
|
||||
"provider.dnsla": "DNS.LA",
|
||||
"provider.dnsmadeeasy": "DNS Made Easy",
|
||||
"provider.dogecloud": "多吉云",
|
||||
"provider.dogecloud.cdn": "多吉云 - 内容分发网络 CDN",
|
||||
"provider.duckdns": "Duck DNS",
|
||||
"provider.dynu": "Dynu",
|
||||
"provider.dynv6": "dynv6",
|
||||
"provider.email": "邮件(SMTP)",
|
||||
"provider.fastly": "Fastly",
|
||||
@@ -103,6 +106,7 @@
|
||||
"provider.huaweicloud.obs": "华为云 - 对象储存服务 OBS",
|
||||
"provider.huaweicloud.scm_upload": "华为云 - 上传到云证书管理服务 SCM",
|
||||
"provider.huaweicloud.waf": "华为云 - Web 应用防火墙 WAF",
|
||||
"provider.infomaniak": "Infomaniak",
|
||||
"provider.ionos": "IONOS",
|
||||
"provider.jdcloud": "京东云",
|
||||
"provider.jdcloud.alb": "京东云 - 应用负载均衡 ALB",
|
||||
@@ -127,6 +131,7 @@
|
||||
"provider.netlify": "Netlify",
|
||||
"provider.netlify.site": "Netlify - Site",
|
||||
"provider.ns1": "NS1 (IBM NS1 Connect)",
|
||||
"provider.ovhcloud": "OVHcloud",
|
||||
"provider.porkbun": "Porkbun",
|
||||
"provider.powerdns": "PowerDNS",
|
||||
"provider.proxmoxve": "Proxmox VE",
|
||||
|
||||
Reference in New Issue
Block a user