来自环境变量的 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 中的命令;

https://github.com/nasatome/docker-network-utils/blob/389324b6795d07684dac9bfe7dc5315bcd7eef7c/reverse-proxy/traefik/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}