diff --git a/ui/public/imgs/providers/acmedns.svg b/ui/public/imgs/providers/acmedns.svg
new file mode 100644
index 00000000..936ca077
--- /dev/null
+++ b/ui/public/imgs/providers/acmedns.svg
@@ -0,0 +1,2 @@
+
diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx
index ba9e1318..204eb6e2 100644
--- a/ui/src/components/access/AccessForm.tsx
+++ b/ui/src/components/access/AccessForm.tsx
@@ -13,6 +13,7 @@ import { useAntdForm, useAntdFormName } from "@/hooks";
import AccessForm1PanelConfig from "./AccessForm1PanelConfig";
import AccessFormACMECAConfig from "./AccessFormACMECAConfig";
+import AccessFormACMEDNSConfig from "./AccessFormACMEDNSConfig";
import AccessFormACMEHttpReqConfig from "./AccessFormACMEHttpReqConfig";
import AccessFormAliyunConfig from "./AccessFormAliyunConfig";
import AccessFormAPISIXConfig from "./AccessFormAPISIXConfig";
@@ -193,6 +194,8 @@ const AccessForm = forwardRef(({ className,
return ;
case ACCESS_PROVIDERS.ACMECA:
return ;
+ case ACCESS_PROVIDERS.ACMEDNS:
+ return ;
case ACCESS_PROVIDERS.ACMEHTTPREQ:
return ;
case ACCESS_PROVIDERS.ALIYUN:
diff --git a/ui/src/components/access/AccessFormACMEDNSConfig.tsx b/ui/src/components/access/AccessFormACMEDNSConfig.tsx
new file mode 100644
index 00000000..c842d97f
--- /dev/null
+++ b/ui/src/components/access/AccessFormACMEDNSConfig.tsx
@@ -0,0 +1,85 @@
+import { useTranslation } from "react-i18next";
+import { Form, type FormInstance, Input } from "antd";
+import { createSchemaFieldRule } from "antd-zod";
+import { z } from "zod/v4";
+
+import { type AccessConfigForACMEDNS } from "@/domain/access";
+
+type AccessFormACMEDNSConfigFieldValues = Nullish;
+
+export interface AccessFormACMEDNSConfigProps {
+ form: FormInstance;
+ formName: string;
+ disabled?: boolean;
+ initialValues?: AccessFormACMEDNSConfigFieldValues;
+ onValuesChange?: (values: AccessFormACMEDNSConfigFieldValues) => void;
+}
+
+const initFormModel = (): AccessFormACMEDNSConfigFieldValues => {
+ return {
+ apiBase: "https://auth.acme-dns.io/",
+ storageBaseUrl: "",
+ storagePath: "",
+ };
+};
+
+const AccessFormACMEDNSConfig = ({ form: formInst, formName, disabled, initialValues, onValuesChange }: AccessFormACMEDNSConfigProps) => {
+ const { t } = useTranslation();
+
+ const formSchema = z.object({
+ apiBase: z.url(t("common.errmsg.url_invalid")),
+ storageBaseUrl: z
+ .string()
+ .max(256, t("common.errmsg.string_max", { max: 256 }))
+ .nullish(),
+ storagePath: z
+ .string()
+ .max(256, t("common.errmsg.string_max", { max: 256 }))
+ .nullish(),
+ });
+ const formRule = createSchemaFieldRule(formSchema);
+
+ const handleFormChange = (_: unknown, values: z.infer) => {
+ onValuesChange?.(values);
+ };
+
+ return (
+ }
+ >
+
+
+
+ }
+ >
+
+
+
+ }
+ >
+
+
+
+ );
+};
+
+export default AccessFormACMEDNSConfig;
diff --git a/ui/src/domain/access.ts b/ui/src/domain/access.ts
index 51555f07..fcf5ebaf 100644
--- a/ui/src/domain/access.ts
+++ b/ui/src/domain/access.ts
@@ -8,6 +8,7 @@ export interface AccessModel extends BaseModel {
(
| AccessConfigFor1Panel
| AccessConfigForACMECA
+ | AccessConfigForACMEDNS
| AccessConfigForACMEHttpReq
| AccessConfigForAliyun
| AccessConfigForAPISIX
@@ -96,6 +97,12 @@ export type AccessConfigForACMECA = {
eabHmacKey?: string;
};
+export type AccessConfigForACMEDNS = {
+ apiBase: string;
+ storageBaseUrl?: string;
+ storagePath?: string;
+};
+
export type AccessConfigForACMEHttpReq = {
endpoint: string;
mode?: string;
diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts
index 9c098fc5..37525536 100644
--- a/ui/src/domain/provider.ts
+++ b/ui/src/domain/provider.ts
@@ -6,6 +6,7 @@
export const ACCESS_PROVIDERS = Object.freeze({
["1PANEL"]: "1panel",
ACMECA: "acmeca",
+ ACMEDNS: "acmedns",
ACMEHTTPREQ: "acmehttpreq",
ALIYUN: "aliyun",
APISIX: "apisix",
@@ -173,6 +174,7 @@ export const accessProvidersMap: Map = new
NOTICE: If you add new constant, please keep ASCII order.
*/
export const ACME_DNS01_PROVIDERS = Object.freeze({
+ ACMEDNS: `${ACCESS_PROVIDERS.ACMEDNS}`,
ACMEHTTPREQ: `${ACCESS_PROVIDERS.ACMEHTTPREQ}`,
ALIYUN: `${ACCESS_PROVIDERS.ALIYUN}`, // 兼容旧值,等同于 `ALIYUN_DNS`
ALIYUN_DNS: `${ACCESS_PROVIDERS.ALIYUN}-dns`,
@@ -365,6 +368,7 @@ export const acmeDns01ProvidersMap: Map [
type,
{
diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json
index 0dd233d6..efcf44f6 100644
--- a/ui/src/i18n/locales/en/nls.access.json
+++ b/ui/src/i18n/locales/en/nls.access.json
@@ -51,6 +51,15 @@
"access.form.acmeca_eab_kid.placeholder": "Please enter ACME EAB KID",
"access.form.acmeca_eab_hmac_key.label": "ACME EAB HMAC key (Optional)",
"access.form.acmeca_eab_hmac_key.placeholder": "Please enter ACME EAB HMAC key",
+ "access.form.acmedns_api_base.label": "ACME-DNS API URL",
+ "access.form.acmedns_api_base.placeholder": "Please enter ACME-DNS API URL",
+ "access.form.acmedns_api_base.tooltip": "For more information, see https://go-acme.github.io/lego/dns/acme-dns/",
+ "access.form.acmedns_storage_base_url.label": "ACME-DNS Credentials URL PATH",
+ "access.form.acmedns_storage_base_url.placeholder": "Enter the URL path to the ACME-DNS JSON credentials JSON file. Each credentials are stored in a separate JSON file. This file will be used for TXT record updates.",
+ "access.form.acmedns_storage_base_url.tooltip": "For more information, see https://go-acme.github.io/lego/dns/acme-dns/",
+ "access.form.acmedns_storage_path.label": "ACME-DNS Credentials Local Path",
+ "access.form.acmedns_storage_path.placeholder": "Please enter the ACME-DNS JSON Credentials JSON File Path. Each credentials are in a separate JSON file. It will be used for TXT record updates.",
+ "access.form.acmedns_storage_path.tooltip": "For more information, see https://go-acme.github.io/lego/dns/acme-dns/",
"access.form.acmehttpreq_endpoint.label": "Endpoint",
"access.form.acmehttpreq_endpoint.placeholder": "Please enter endpoint",
"access.form.acmehttpreq_endpoint.tooltip": "For more information, see https://go-acme.github.io/lego/dns/httpreq/",
diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json
index 9c7d0053..c227be35 100644
--- a/ui/src/i18n/locales/en/nls.provider.json
+++ b/ui/src/i18n/locales/en/nls.provider.json
@@ -3,6 +3,7 @@
"provider.1panel.console": "1Panel - Console",
"provider.1panel.site": "1Panel - Website",
"provider.acmeca": "ACME Custom CA Endpoint",
+ "provider.acmedns": "ACME DNS",
"provider.acmehttpreq": "ACME Custom HTTP Endpoint",
"provider.aliyun": "Alibaba Cloud",
"provider.aliyun.alb": "Alibaba Cloud - ALB (Application Load Balancer)",
diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json
index b6a4a0be..1a310773 100644
--- a/ui/src/i18n/locales/zh/nls.access.json
+++ b/ui/src/i18n/locales/zh/nls.access.json
@@ -51,6 +51,15 @@
"access.form.acmeca_eab_kid.placeholder": "请输入 ACME EAB KID",
"access.form.acmeca_eab_hmac_key.label": "ACME EAB HMAC Key(可选)",
"access.form.acmeca_eab_hmac_key.placeholder": "请输入 ACME EAB HMAC Key",
+ "access.form.acmedns_api_base.label": "ACME-DNS API 地址",
+ "access.form.acmedns_api_base.placeholder": "请输入 ACME-DNS API 地址",
+ "access.form.acmedns_api_base.tooltip": "这是什么?请参阅 https://go-acme.github.io/lego/dns/acme-dns/",
+ "access.form.acmedns_storage_base_url.label": "ACME-DNS JSON 帐户数据服务器",
+ "access.form.acmedns_storage_base_url.placeholder": "请输入 ACME-DNS JSON 帐户数据服务器地址",
+ "access.form.acmedns_storage_base_url.tooltip": "这是什么?请参阅 https://go-acme.github.io/lego/dns/acme-dns/",
+ "access.form.acmedns_storage_path.label": "ACME-DNS JSON 帐户数据文件",
+ "access.form.acmedns_storage_path.placeholder": "ACME-DNS JSON 帐户数据文件。每个域的帐户都将注册/保存到此文件,并用于 TXT 更新。",
+ "access.form.acmedns_storage_path.tooltip": "这是什么?请参阅 https://go-acme.github.io/lego/dns/acme-dns/",
"access.form.acmehttpreq_endpoint.label": "服务端点",
"access.form.acmehttpreq_endpoint.placeholder": "请输入服务端点",
"access.form.acmehttpreq_endpoint.tooltip": "这是什么?请参阅 https://go-acme.github.io/lego/dns/httpreq/",
diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json
index 73a3b63c..d9baa7d7 100644
--- a/ui/src/i18n/locales/zh/nls.provider.json
+++ b/ui/src/i18n/locales/zh/nls.provider.json
@@ -3,6 +3,7 @@
"provider.1panel.console": "1Panel - 控制台",
"provider.1panel.site": "1Panel - 网站",
"provider.acmeca": "ACME 自定义 CA 端点",
+ "provider.acmedns": "ACME DNS",
"provider.acmehttpreq": "ACME 自定义 HTTP 端点",
"provider.aliyun": "阿里云",
"provider.aliyun.alb": "阿里云 - 应用型负载均衡 ALB",