来自环境变量的 Traefik yml acme 电子邮件值
Traefik yml acme email value from environment variables
我使用包含两个服务(Python 应用程序和 Traefik)的组合文件,在 docker 文件中我加载了所有环境变量。
对于 Traefik,我使用 YML 文件来定义服务,在该 YML 文件中,我有一个用于 certificateResolvers 的节点,该节点如下所示:
certificatesResolvers:
letsencrypt:
acme:
email: "email@domain.com"
storage: /etc/traefik/acme/acme.json
httpChallenge:
entryPoint: web
我想通过环境变量设置电子邮件,因此 YML 文件应如下所示:
certificatesResolvers:
letsencrypt:
acme:
email: '{{env "USER_EMAIL"}}'
storage: /etc/traefik/acme/acme.json
httpChallenge:
entryPoint: web
以这种方式获得 YML 我在日志中得到了这个:
level=info msg="Starting provider *acme.Provider {\"email\":\"{{env \\"USER_EMAIL\\"}}\",\"caServer\":\"https://acme-v02.api.letsencrypt.org/directory\",\"storage\":\"/etc/traefik/acme/acme.json\",\"keyType\":\"RSA4096\",\"httpChallenge\":{\"entryPoint\":\"web\"},\"ResolverName\":\"letsencrypt\",\"store\":{},\"ChallengeStore\":{}}"
level=error msg="Unable to obtain ACME certificate for domains \"domain.com\": cannot get ACME client acme: error: 400 :: POST :: https://acme-v02.api.letsencrypt.org/acme/new-acct :: urn:ietf:params:acme:error:invalidEmail :: Error creating new account :: \"{{env \\"USER_EMAIL\\"}}\" is not a valid e-mail address, url: " providerName=letsencrypt.acme routerName=web-secure-router@file rule="Host(`domain.com`)"
我试过:
email: '{{env "USER_EMAIL"}}'
email: '`{{env "USER_EMAIL"}}`'
email: "{{env 'USER_EMAIL'}}"
email: "{{env USER_EMAIL}}"
但其中 none 有效。
在同一个 YML 文件中,我有一个如下所示的节点:
http:
routers:
web-secure-router:
rule: 'Host(`{{env "PROJECT_HOSTNAME"}}`)'
entryPoints:
- web-secure
service: fastapi
tls:
certResolver: letsencrypt
在那个部分,我得到了 PROJECT_HOSTNAME
变量的正确值,在本例中是 domain.com
正如您在上面的日志中看到的那样
这可能不是解决方案,但它是一种不同的处理方式,您可以尝试:
不使用 traefik yml,而是使用 docker compose yml 中的命令;
另一个可以尝试的方法是使用:
${USER_EMAIL}
而不是
{{env "USER_EMAIL"}}
澄清为什么你不能为 certificatesResolvers
使用你自己的用户定义的环境变量是因为这是 static configuration, whereas the http
is part of the dynamic configuration 的一部分(你可以使用你自己的 PROJECT_HOSTNAME
)
您仍然可以使用 TRAEFIK
Environment variables 通过变量 TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_EMAIL
.
为您的证书解析器设置电子邮件
我自己还没有测试过,但我认为以下应该可以解决问题:
services:
traefik:
environment:
TRAEFIK_CERTIFICATESRESOLVERS_LETSENCRYPT_ACME_EMAIL: ${USER_EMAIL}
我使用包含两个服务(Python 应用程序和 Traefik)的组合文件,在 docker 文件中我加载了所有环境变量。
对于 Traefik,我使用 YML 文件来定义服务,在该 YML 文件中,我有一个用于 certificateResolvers 的节点,该节点如下所示:
certificatesResolvers:
letsencrypt:
acme:
email: "email@domain.com"
storage: /etc/traefik/acme/acme.json
httpChallenge:
entryPoint: web
我想通过环境变量设置电子邮件,因此 YML 文件应如下所示:
certificatesResolvers:
letsencrypt:
acme:
email: '{{env "USER_EMAIL"}}'
storage: /etc/traefik/acme/acme.json
httpChallenge:
entryPoint: web
以这种方式获得 YML 我在日志中得到了这个:
level=info msg="Starting provider *acme.Provider {\"email\":\"{{env \\"USER_EMAIL\\"}}\",\"caServer\":\"https://acme-v02.api.letsencrypt.org/directory\",\"storage\":\"/etc/traefik/acme/acme.json\",\"keyType\":\"RSA4096\",\"httpChallenge\":{\"entryPoint\":\"web\"},\"ResolverName\":\"letsencrypt\",\"store\":{},\"ChallengeStore\":{}}"
level=error msg="Unable to obtain ACME certificate for domains \"domain.com\": cannot get ACME client acme: error: 400 :: POST :: https://acme-v02.api.letsencrypt.org/acme/new-acct :: urn:ietf:params:acme:error:invalidEmail :: Error creating new account :: \"{{env \\"USER_EMAIL\\"}}\" is not a valid e-mail address, url: " providerName=letsencrypt.acme routerName=web-secure-router@file rule="Host(`domain.com`)"
我试过:
email: '{{env "USER_EMAIL"}}'
email: '`{{env "USER_EMAIL"}}`'
email: "{{env 'USER_EMAIL'}}"
email: "{{env USER_EMAIL}}"
但其中 none 有效。
在同一个 YML 文件中,我有一个如下所示的节点:
http:
routers:
web-secure-router:
rule: 'Host(`{{env "PROJECT_HOSTNAME"}}`)'
entryPoints:
- web-secure
service: fastapi
tls:
certResolver: letsencrypt
在那个部分,我得到了 PROJECT_HOSTNAME
变量的正确值,在本例中是 domain.com
正如您在上面的日志中看到的那样
这可能不是解决方案,但它是一种不同的处理方式,您可以尝试:
不使用 traefik yml,而是使用 docker compose yml 中的命令;
另一个可以尝试的方法是使用:
${USER_EMAIL}
而不是
{{env "USER_EMAIL"}}
澄清为什么你不能为 certificatesResolvers
使用你自己的用户定义的环境变量是因为这是 static configuration, whereas the http
is part of the dynamic configuration 的一部分(你可以使用你自己的 PROJECT_HOSTNAME
)
您仍然可以使用 TRAEFIK
Environment variables 通过变量 TRAEFIK_CERTIFICATESRESOLVERS_<NAME>_ACME_EMAIL
.
我自己还没有测试过,但我认为以下应该可以解决问题:
services:
traefik:
environment:
TRAEFIK_CERTIFICATESRESOLVERS_LETSENCRYPT_ACME_EMAIL: ${USER_EMAIL}