diff --git a/go.mod b/go.mod index c9f1088..ec73052 100644 --- a/go.mod +++ b/go.mod @@ -57,6 +57,7 @@ require ( github.com/moby/term v0.5.0 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/nrdcg/porkbun v0.4.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/ovh/go-ovh v1.7.0 // indirect diff --git a/go.sum b/go.sum index 3693dd1..eef1e69 100644 --- a/go.sum +++ b/go.sum @@ -113,6 +113,8 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/nrdcg/porkbun v0.4.0 h1:rWweKlwo1PToQ3H+tEO9gPRW0wzzgmI/Ob3n2Guticw= +github.com/nrdcg/porkbun v0.4.0/go.mod h1:/QMskrHEIM0IhC/wY7iTCUgINsxdT2WcOphktJ9+Q54= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= diff --git a/internal/autocert/constants.go b/internal/autocert/constants.go index f50a109..d1d98a4 100644 --- a/internal/autocert/constants.go +++ b/internal/autocert/constants.go @@ -5,6 +5,7 @@ import ( "github.com/go-acme/lego/v4/providers/dns/cloudflare" "github.com/go-acme/lego/v4/providers/dns/duckdns" "github.com/go-acme/lego/v4/providers/dns/ovh" + "github.com/go-acme/lego/v4/providers/dns/porkbun" ) const ( @@ -20,6 +21,7 @@ const ( ProviderClouddns = "clouddns" ProviderDuckdns = "duckdns" ProviderOVH = "ovh" + ProviderPorkbun = "porkbun" ) var providersGenMap = map[string]ProviderGenerator{ @@ -28,4 +30,5 @@ var providersGenMap = map[string]ProviderGenerator{ ProviderClouddns: providerGenerator(clouddns.NewDefaultConfig, clouddns.NewDNSProviderConfig), ProviderDuckdns: providerGenerator(duckdns.NewDefaultConfig, duckdns.NewDNSProviderConfig), ProviderOVH: providerGenerator(ovh.NewDefaultConfig, ovh.NewDNSProviderConfig), + ProviderPorkbun: providerGenerator(porkbun.NewDefaultConfig, porkbun.NewDNSProviderConfig), } diff --git a/package.json b/package.json index d63a037..5cae13d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "godoxy-schemas", - "version": "0.9.2-2", + "version": "0.9.6", "description": "JSON Schema and typescript types for GoDoxy configuration", "license": "MIT", "repository": { diff --git a/schemas/config.schema.json b/schemas/config.schema.json index 52bb265..20c8cb4 100644 --- a/schemas/config.schema.json +++ b/schemas/config.schema.json @@ -1 +1 @@ -{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"definitions":{"AccessLogFieldMode":{"enum":["drop","keep","redact"],"type":"string"},"AccessLogFormat":{"enum":["combined","common","json"],"type":"string"},"AutocertConfig":{"anyOf":[{"$ref":"#/definitions/LocalOptions"},{"$ref":"#/definitions/CloudflareOptions"},{"$ref":"#/definitions/CloudDNSOptions"},{"$ref":"#/definitions/DuckDNSOptions"},{"$ref":"#/definitions/OVHOptionsWithAppKey"},{"$ref":"#/definitions/OVHOptionsWithOAuth2Config"}]},"CIDR":{"anyOf":[{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*$","type":"string"},{"pattern":"^.*:.*:.*:.*:.*:.*:.*:.*$","type":"string"},{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*/[0-9]*$","type":"string"},{"pattern":"^::[0-9]*$","type":"string"},{"pattern":"^.*::/[0-9]*$","type":"string"},{"pattern":"^.*:.*::/[0-9]*$","type":"string"}]},"CloudDNSOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"client_id":{"type":"string"},"email":{"$ref":"#/definitions/Email"},"password":{"type":"string"}},"required":["client_id","email","password"],"type":"object"},"provider":{"const":"clouddns","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"CloudflareOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"auth_token":{"type":"string"}},"required":["auth_token"],"type":"object"},"provider":{"const":"cloudflare","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"DomainName":{"additionalProperties":false,"pattern":"^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$","properties":{},"type":"object"},"DomainOrWildcard":{"additionalProperties":false,"pattern":"^(\\*\\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$","properties":{},"type":"object"},"DuckDNSOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"provider":{"const":"duckdns","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"Duration":{"pattern":"^([0-9]+(ms|s|m|h))+$","type":"string"},"Email":{"format":"email","type":"string"},"GotifyConfig":{"additionalProperties":false,"properties":{"name":{"type":"string"},"provider":{"const":"gotify","type":"string"},"token":{"type":"string"},"url":{"$ref":"#/definitions/URL"}},"required":["name","provider","token","url"],"type":"object"},"HTTPHeader":{"description":"HTTP Header","pattern":"^[a-zA-Z0-9\\-]+$","type":"string"},"LocalOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"key_path":{"type":"string"},"options":{"properties":{},"type":"object"},"provider":{"const":"local","type":"string"}},"required":["provider"],"type":"object"},"MiddlewareComposeMap":{"anyOf":[{"additionalProperties":false,"properties":{"use":{"enum":["CustomErrorPage","ErrorPage","customErrorPage","custom_error_page","errorPage","error_page"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["RedirectHTTP","redirectHTTP","redirect_http"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["SetXForwarded","setXForwarded","set_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["HideXForwarded","hideXForwarded","hide_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allow":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"message":{"default":"IP not allowed","description":"Error message when blocked","type":"string"},"status":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked (alias of status_code)"},"status_code":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked"},"use":{"enum":["CIDRWhitelist","cidrWhitelist","cidr_whitelist"],"type":"string"}},"required":["allow","use"],"type":"object"},{"additionalProperties":false,"properties":{"recursive":{"default":false,"description":"Recursively resolve the IP","type":"boolean"},"use":{"enum":["CloudflareRealIP","cloudflareRealIp","cloudflare_real_ip"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"add_prefix":{"description":"Add prefix to request URL","type":"string"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyRequest","Request","modifyRequest","modify_request","request"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyResponse","Response","modifyResponse","modify_response","response"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allowed_groups":{"description":"Allowed groups","items":{"type":"string"},"minItems":1,"type":"array"},"allowed_users":{"description":"Allowed users","items":{"type":"string"},"minItems":1,"type":"array"},"use":{"enum":["OIDC","oidc"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"average":{"description":"Average number of requests allowed in a period","type":"number"},"burst":{"description":"Maximum number of requests allowed in a period","type":"number"},"period":{"$ref":"#/definitions/Duration","default":"1s","description":"Duration of the rate limit"},"use":{"enum":["RateLimit","rateLimit","rate_limit"],"type":"string"}},"required":["average","burst","use"],"type":"object"},{"additionalProperties":false,"properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"},"use":{"enum":["RealIP","realIP","real_ip"],"type":"string"}},"required":["from","use"],"type":"object"}]},"NtfyConfig":{"additionalProperties":false,"properties":{"name":{"type":"string"},"provider":{"const":"ntfy","type":"string"},"style":{"type":"string"},"token":{"type":"string"},"topic":{"type":"string"},"url":{"$ref":"#/definitions/URL"}},"required":["name","provider","topic","url"],"type":"object"},"OVHEndpoint":{"enum":["kimsufi-ca","kimsufi-eu","ovh-ca","ovh-eu","ovh-us","soyoustart-ca","soyoustart-eu"],"type":"string"},"OVHOptionsWithAppKey":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"api_endpoint":{"$ref":"#/definitions/OVHEndpoint"},"application_key":{"type":"string"},"application_secret":{"type":"string"},"consumer_key":{"type":"string"}},"required":["application_key","application_secret","consumer_key"],"type":"object"},"provider":{"const":"ovh","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"OVHOptionsWithOAuth2Config":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"api_endpoint":{"$ref":"#/definitions/OVHEndpoint"},"application_secret":{"type":"string"},"consumer_key":{"type":"string"},"oauth2_config":{"additionalProperties":false,"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string"}},"required":["client_id","client_secret"],"type":"object"}},"required":["application_secret","consumer_key","oauth2_config"],"type":"object"},"provider":{"const":"ovh","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"StatusCode":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"type":"number"}]},"StatusCodeRange":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"pattern":"^[0-9]*-[0-9]*$","type":"string"},{"type":"number"}]},"URI":{"format":"uri-reference","type":"string"},"URL":{"format":"uri","type":"string"},"WebhookColorMode":{"enum":["dec","hex"],"type":"string"},"WebhookConfig":{"additionalProperties":false,"properties":{"color_mode":{"$ref":"#/definitions/WebhookColorMode","default":"hex","description":"Webhook color mode"},"method":{"$ref":"#/definitions/WebhookMethod","default":"POST","description":"Webhook method"},"mime_type":{"$ref":"#/definitions/WebhookMimeType","default":"application/json","description":"Webhook mime type"},"name":{"type":"string"},"payload":{"description":"Webhook message (usally JSON),\nrequired when template is not defined","type":"string"},"provider":{"const":"webhook","type":"string"},"template":{"$ref":"#/definitions/WebhookTemplate","default":"discord","description":"Webhook template"},"token":{"type":"string"},"url":{"$ref":"#/definitions/URL"}},"required":["name","provider","url"],"type":"object"},"WebhookMethod":{"enum":["GET","POST","PUT"],"type":"string"},"WebhookMimeType":{"enum":["application/json","application/x-www-form-urlencoded","text/markdown","text/plain"],"type":"string"},"WebhookTemplate":{"enum":["","discord"],"type":"string"}},"properties":{"autocert":{"$ref":"#/definitions/AutocertConfig","description":"Optional autocert configuration","examples":[{"provider":"local"},{"domains":["example.com"],"email":"abc@gmail","options":{"auth_token":"c1234565789-abcdefghijklmnopqrst"},"provider":"cloudflare"},{"domains":["example.com"],"email":"abc@gmail","options":{"client_id":"c1234565789","email":"abc@gmail","password":"password"},"provider":"clouddns"}]},"entrypoint":{"additionalProperties":false,"properties":{"access_log":{"additionalProperties":false,"description":"Entrypoint access log configuration","examples":[{"fields":{"headers":{"config":{"foo":"redact"},"default":"keep"}},"filters":{"status_codes":{"values":["200-299"]}},"format":"combined","path":"/var/log/access.log"}],"properties":{"buffer_size":{"default":65536,"description":"The size of the buffer.","minimum":0,"type":"integer"},"fields":{"additionalProperties":false,"properties":{"cookie":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"header":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"query":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"}},"type":"object"},"filters":{"additionalProperties":false,"properties":{"cidr":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"}},"required":["values"],"type":"object"},"headers":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"}},"required":["values"],"type":"object"},"host":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"method":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"enum":["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"],"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"status_code":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/StatusCodeRange"},"type":"array"}},"required":["values"],"type":"object"}},"type":"object"},"format":{"$ref":"#/definitions/AccessLogFormat","default":"combined","description":"The format of the access log."},"path":{"$ref":"#/definitions/URI"}},"required":["path"],"type":"object"},"middlewares":{"description":"Entrypoint middleware configuration","examples":[{"use":"RedirectHTTP"},{"allow":["127.0.0.1","10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"],"message":"Forbidden","status":403,"use":"CIDRWhitelist"}],"items":{"$ref":"#/definitions/MiddlewareComposeMap"},"type":"array"}},"type":"object"},"homepage":{"additionalProperties":false,"properties":{"use_default_categories":{"default":true,"description":"Use default app categories (uses docker image name)","type":"boolean"}},"required":["use_default_categories"],"type":"object"},"match_domains":{"description":"Optional list of domains to match","examples":["example.com","*.example.com"],"items":{"$ref":"#/definitions/DomainName"},"minItems":1,"type":"array"},"providers":{"additionalProperties":false,"properties":{"docker":{"additionalProperties":{"anyOf":[{"format":"uri","type":"string"},{"const":"$DOCKER_HOST","type":"string"}]},"description":"Name-value mapping of docker hosts to retrieve routes from","examples":[{"local":"$DOCKER_HOST"},{"remote":"tcp://10.0.2.1:2375"},{"remote2":"ssh://root:1234@10.0.2.2"}],"minProperties":1,"type":"object"},"include":{"description":"List of route definition files to include","examples":["file1.yml","file2.yml"],"items":{"pattern":"^[\\w\\d\\-_]+\\.(yaml|yml)$"},"minItems":1,"type":"array"},"notification":{"description":"List of notification providers","examples":[{"name":"gotify","provider":"gotify","token":"abcd","url":"https://gotify.domain.tld"},{"name":"discord","provider":"webhook","template":"discord","url":"https://discord.com/api/webhooks/1234/abcd"}],"items":{"anyOf":[{"$ref":"#/definitions/GotifyConfig"},{"$ref":"#/definitions/NtfyConfig"},{"$ref":"#/definitions/WebhookConfig"}]},"minItems":1,"type":"array"}},"type":"object"},"timeout_shutdown":{"default":3,"description":"Optional timeout before shutdown","minimum":1,"type":"number"}},"required":["providers"],"type":"object"} \ No newline at end of file +{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"definitions":{"AccessLogFieldMode":{"enum":["drop","keep","redact"],"type":"string"},"AccessLogFormat":{"enum":["combined","common","json"],"type":"string"},"AutocertConfig":{"anyOf":[{"$ref":"#/definitions/LocalOptions"},{"$ref":"#/definitions/CloudflareOptions"},{"$ref":"#/definitions/CloudDNSOptions"},{"$ref":"#/definitions/DuckDNSOptions"},{"$ref":"#/definitions/OVHOptionsWithAppKey"},{"$ref":"#/definitions/OVHOptionsWithOAuth2Config"},{"$ref":"#/definitions/PorkbunOptions"}]},"CIDR":{"anyOf":[{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*$","type":"string"},{"pattern":"^.*:.*:.*:.*:.*:.*:.*:.*$","type":"string"},{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*/[0-9]*$","type":"string"},{"pattern":"^::[0-9]*$","type":"string"},{"pattern":"^.*::/[0-9]*$","type":"string"},{"pattern":"^.*:.*::/[0-9]*$","type":"string"}]},"CloudDNSOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"client_id":{"type":"string"},"email":{"$ref":"#/definitions/Email"},"password":{"type":"string"}},"required":["client_id","email","password"],"type":"object"},"provider":{"const":"clouddns","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"CloudflareOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"auth_token":{"type":"string"}},"required":["auth_token"],"type":"object"},"provider":{"const":"cloudflare","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"DomainName":{"additionalProperties":false,"pattern":"^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$","properties":{},"type":"object"},"DomainOrWildcard":{"additionalProperties":false,"pattern":"^(\\*\\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$","properties":{},"type":"object"},"DuckDNSOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"provider":{"const":"duckdns","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"Duration":{"pattern":"^([0-9]+(ms|s|m|h))+$","type":"string"},"Email":{"format":"email","type":"string"},"GotifyConfig":{"additionalProperties":false,"properties":{"name":{"type":"string"},"provider":{"const":"gotify","type":"string"},"token":{"type":"string"},"url":{"$ref":"#/definitions/URL"}},"required":["name","provider","token","url"],"type":"object"},"HTTPHeader":{"description":"HTTP Header","pattern":"^[a-zA-Z0-9\\-]+$","type":"string"},"LocalOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"key_path":{"type":"string"},"options":{"properties":{},"type":"object"},"provider":{"const":"local","type":"string"}},"required":["provider"],"type":"object"},"MiddlewareComposeMap":{"anyOf":[{"additionalProperties":false,"properties":{"use":{"enum":["CustomErrorPage","ErrorPage","customErrorPage","custom_error_page","errorPage","error_page"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["RedirectHTTP","redirectHTTP","redirect_http"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["SetXForwarded","setXForwarded","set_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["HideXForwarded","hideXForwarded","hide_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allow":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"message":{"default":"IP not allowed","description":"Error message when blocked","type":"string"},"status":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked (alias of status_code)"},"status_code":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked"},"use":{"enum":["CIDRWhitelist","cidrWhitelist","cidr_whitelist"],"type":"string"}},"required":["allow","use"],"type":"object"},{"additionalProperties":false,"properties":{"recursive":{"default":false,"description":"Recursively resolve the IP","type":"boolean"},"use":{"enum":["CloudflareRealIP","cloudflareRealIp","cloudflare_real_ip"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"add_prefix":{"description":"Add prefix to request URL","type":"string"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyRequest","Request","modifyRequest","modify_request","request"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyResponse","Response","modifyResponse","modify_response","response"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allowed_groups":{"description":"Allowed groups","items":{"type":"string"},"minItems":1,"type":"array"},"allowed_users":{"description":"Allowed users","items":{"type":"string"},"minItems":1,"type":"array"},"use":{"enum":["OIDC","oidc"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"average":{"description":"Average number of requests allowed in a period","type":"number"},"burst":{"description":"Maximum number of requests allowed in a period","type":"number"},"period":{"$ref":"#/definitions/Duration","default":"1s","description":"Duration of the rate limit"},"use":{"enum":["RateLimit","rateLimit","rate_limit"],"type":"string"}},"required":["average","burst","use"],"type":"object"},{"additionalProperties":false,"properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"},"use":{"enum":["RealIP","realIP","real_ip"],"type":"string"}},"required":["from","use"],"type":"object"}]},"NtfyConfig":{"additionalProperties":false,"properties":{"name":{"type":"string"},"provider":{"const":"ntfy","type":"string"},"style":{"type":"string"},"token":{"type":"string"},"topic":{"type":"string"},"url":{"$ref":"#/definitions/URL"}},"required":["name","provider","topic","url"],"type":"object"},"OVHEndpoint":{"enum":["kimsufi-ca","kimsufi-eu","ovh-ca","ovh-eu","ovh-us","soyoustart-ca","soyoustart-eu"],"type":"string"},"OVHOptionsWithAppKey":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"api_endpoint":{"$ref":"#/definitions/OVHEndpoint"},"application_key":{"type":"string"},"application_secret":{"type":"string"},"consumer_key":{"type":"string"}},"required":["application_key","application_secret","consumer_key"],"type":"object"},"provider":{"const":"ovh","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"OVHOptionsWithOAuth2Config":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"api_endpoint":{"$ref":"#/definitions/OVHEndpoint"},"application_secret":{"type":"string"},"consumer_key":{"type":"string"},"oauth2_config":{"additionalProperties":false,"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string"}},"required":["client_id","client_secret"],"type":"object"}},"required":["application_secret","consumer_key","oauth2_config"],"type":"object"},"provider":{"const":"ovh","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"PorkbunOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"api_key":{"type":"string"},"secret_api_key":{"type":"string"}},"required":["api_key","secret_api_key"],"type":"object"},"provider":{"const":"porkbun","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"StatusCode":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"type":"number"}]},"StatusCodeRange":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"pattern":"^[0-9]*-[0-9]*$","type":"string"},{"type":"number"}]},"URI":{"format":"uri-reference","type":"string"},"URL":{"format":"uri","type":"string"},"WebhookColorMode":{"enum":["dec","hex"],"type":"string"},"WebhookConfig":{"additionalProperties":false,"properties":{"color_mode":{"$ref":"#/definitions/WebhookColorMode","default":"hex","description":"Webhook color mode"},"method":{"$ref":"#/definitions/WebhookMethod","default":"POST","description":"Webhook method"},"mime_type":{"$ref":"#/definitions/WebhookMimeType","default":"application/json","description":"Webhook mime type"},"name":{"type":"string"},"payload":{"description":"Webhook message (usally JSON),\nrequired when template is not defined","type":"string"},"provider":{"const":"webhook","type":"string"},"template":{"$ref":"#/definitions/WebhookTemplate","default":"discord","description":"Webhook template"},"token":{"type":"string"},"url":{"$ref":"#/definitions/URL"}},"required":["name","provider","url"],"type":"object"},"WebhookMethod":{"enum":["GET","POST","PUT"],"type":"string"},"WebhookMimeType":{"enum":["application/json","application/x-www-form-urlencoded","text/markdown","text/plain"],"type":"string"},"WebhookTemplate":{"enum":["","discord"],"type":"string"}},"properties":{"autocert":{"$ref":"#/definitions/AutocertConfig","description":"Optional autocert configuration","examples":[{"provider":"local"},{"domains":["example.com"],"email":"abc@gmail","options":{"auth_token":"c1234565789-abcdefghijklmnopqrst"},"provider":"cloudflare"},{"domains":["example.com"],"email":"abc@gmail","options":{"client_id":"c1234565789","email":"abc@gmail","password":"password"},"provider":"clouddns"}]},"entrypoint":{"additionalProperties":false,"properties":{"access_log":{"additionalProperties":false,"description":"Entrypoint access log configuration","examples":[{"fields":{"headers":{"config":{"foo":"redact"},"default":"keep"}},"filters":{"status_codes":{"values":["200-299"]}},"format":"combined","path":"/var/log/access.log"}],"properties":{"buffer_size":{"default":65536,"description":"The size of the buffer.","minimum":0,"type":"integer"},"fields":{"additionalProperties":false,"properties":{"cookie":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"header":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"query":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"}},"type":"object"},"filters":{"additionalProperties":false,"properties":{"cidr":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"}},"required":["values"],"type":"object"},"headers":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"}},"required":["values"],"type":"object"},"host":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"method":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"enum":["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"],"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"status_code":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/StatusCodeRange"},"type":"array"}},"required":["values"],"type":"object"}},"type":"object"},"format":{"$ref":"#/definitions/AccessLogFormat","default":"combined","description":"The format of the access log."},"path":{"$ref":"#/definitions/URI"}},"required":["path"],"type":"object"},"middlewares":{"description":"Entrypoint middleware configuration","examples":[{"use":"RedirectHTTP"},{"allow":["127.0.0.1","10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"],"message":"Forbidden","status":403,"use":"CIDRWhitelist"}],"items":{"$ref":"#/definitions/MiddlewareComposeMap"},"type":"array"}},"type":"object"},"homepage":{"additionalProperties":false,"properties":{"use_default_categories":{"default":true,"description":"Use default app categories (uses docker image name)","type":"boolean"}},"required":["use_default_categories"],"type":"object"},"match_domains":{"description":"Optional list of domains to match","examples":["example.com","*.example.com"],"items":{"$ref":"#/definitions/DomainName"},"minItems":1,"type":"array"},"providers":{"additionalProperties":false,"properties":{"docker":{"additionalProperties":{"anyOf":[{"format":"uri","type":"string"},{"const":"$DOCKER_HOST","type":"string"}]},"description":"Name-value mapping of docker hosts to retrieve routes from","examples":[{"local":"$DOCKER_HOST"},{"remote":"tcp://10.0.2.1:2375"},{"remote2":"ssh://root:1234@10.0.2.2"}],"minProperties":1,"type":"object"},"include":{"description":"List of route definition files to include","examples":["file1.yml","file2.yml"],"items":{"pattern":"^[\\w\\d\\-_]+\\.(yaml|yml)$"},"minItems":1,"type":"array"},"notification":{"description":"List of notification providers","examples":[{"name":"gotify","provider":"gotify","token":"abcd","url":"https://gotify.domain.tld"},{"name":"discord","provider":"webhook","template":"discord","url":"https://discord.com/api/webhooks/1234/abcd"}],"items":{"anyOf":[{"$ref":"#/definitions/GotifyConfig"},{"$ref":"#/definitions/NtfyConfig"},{"$ref":"#/definitions/WebhookConfig"}]},"minItems":1,"type":"array"}},"type":"object"},"timeout_shutdown":{"default":3,"description":"Optional timeout before shutdown","minimum":1,"type":"number"}},"required":["providers"],"type":"object"} \ No newline at end of file diff --git a/schemas/config/autocert.d.ts b/schemas/config/autocert.d.ts index bc6023d..ac7630e 100644 --- a/schemas/config/autocert.d.ts +++ b/schemas/config/autocert.d.ts @@ -1,7 +1,7 @@ import { DomainOrWildcard, Email } from "../types"; -export declare const AUTOCERT_PROVIDERS: readonly ["local", "cloudflare", "clouddns", "duckdns", "ovh"]; +export declare const AUTOCERT_PROVIDERS: readonly ["local", "cloudflare", "clouddns", "duckdns", "ovh", "porkbun"]; export type AutocertProvider = (typeof AUTOCERT_PROVIDERS)[number]; -export type AutocertConfig = LocalOptions | CloudflareOptions | CloudDNSOptions | DuckDNSOptions | OVHOptionsWithAppKey | OVHOptionsWithOAuth2Config; +export type AutocertConfig = LocalOptions | CloudflareOptions | CloudDNSOptions | DuckDNSOptions | OVHOptionsWithAppKey | OVHOptionsWithOAuth2Config | PorkbunOptions; export interface AutocertConfigBase { email: Email; domains: DomainOrWildcard[]; @@ -34,6 +34,13 @@ export interface DuckDNSOptions extends AutocertConfigBase { token: string; }; } +export interface PorkbunOptions extends AutocertConfigBase { + provider: "porkbun"; + options: { + api_key: string; + secret_api_key: string; + }; +} export declare const OVH_ENDPOINTS: readonly ["ovh-eu", "ovh-ca", "ovh-us", "kimsufi-eu", "kimsufi-ca", "soyoustart-eu", "soyoustart-ca"]; export type OVHEndpoint = (typeof OVH_ENDPOINTS)[number]; export interface OVHOptionsWithAppKey extends AutocertConfigBase { diff --git a/schemas/config/autocert.js b/schemas/config/autocert.js index 3cf9be4..3cefc37 100644 --- a/schemas/config/autocert.js +++ b/schemas/config/autocert.js @@ -4,6 +4,7 @@ export const AUTOCERT_PROVIDERS = [ "clouddns", "duckdns", "ovh", + "porkbun", ]; export const OVH_ENDPOINTS = [ "ovh-eu", diff --git a/schemas/config/autocert.ts b/schemas/config/autocert.ts index 50ebc3e..1363198 100644 --- a/schemas/config/autocert.ts +++ b/schemas/config/autocert.ts @@ -6,6 +6,7 @@ export const AUTOCERT_PROVIDERS = [ "clouddns", "duckdns", "ovh", + "porkbun", ] as const; export type AutocertProvider = (typeof AUTOCERT_PROVIDERS)[number]; @@ -16,7 +17,8 @@ export type AutocertConfig = | CloudDNSOptions | DuckDNSOptions | OVHOptionsWithAppKey - | OVHOptionsWithOAuth2Config; + | OVHOptionsWithOAuth2Config + | PorkbunOptions; export interface AutocertConfigBase { /* ACME email */ @@ -59,6 +61,13 @@ export interface DuckDNSOptions extends AutocertConfigBase { }; } +export interface PorkbunOptions extends AutocertConfigBase { + provider: "porkbun"; + options: { + api_key: string; + secret_api_key: string; + }; +} export const OVH_ENDPOINTS = [ "ovh-eu", "ovh-ca",