为多个 Traefik 服务共享 Acme 配置

Mos*_*atz 5 ssl lets-encrypt traefik

我有一台使用 Traefik 运行 Docker 容器的服务器。假设机器的主机名是machine1.example.com,每个服务都作为子域运行,例如srv1.machine1.example.com, srv2.machine1.example.com, srv3.machine1.example.com....

我想让 LetsEncrypt 为所有服务生成通配符证书*.machine1.example.com并将其用于所有服务,而不是为每个服务生成单独的证书。

令人烦恼的是我必须将配置行放入每个服务中labels

labels:
  - traefik.http.routers.srv1.rule=Host(`srv1.machine1.example.com`)
  - traefik.http.routers.srv1.tls=true
  - traefik.http.routers.srv1.tls.certresolver=myresolver
  - traefik.http.routers.srv1.tls.domains[0].main=machine1.example.com
  - traefik.http.routers.srv1.tls.domains[0].sans=*.machine1.example.com

labels:
  - traefik.http.routers.srv2.rule=Host(`srv2.machine1.example.com`)
  - traefik.http.routers.srv2.tls=true
  - traefik.http.routers.srv2.tls.certresolver=myresolver
  - traefik.http.routers.srv2.tls.domains[0].main=machine1.example.com
  - traefik.http.routers.srv2.tls.domains[0].sans=*.machine1.example.com

# etc.
Run Code Online (Sandbox Code Playgroud)

这会变成很多看似不必要的样板文件。

我尝试通过使用文件提供程序中的模板功能来解决它​​(以一种仍然丑陋和烦人的方式,但不那么烦人),如下所示:

[http]
  [http.routers]

  {{ range $i, $e := list "srv1" "srv2 }}
    [http.routers."{{ $e }}".tls]
      certResolver = "letsencrypt"
      [[http.routers."{{ $e }}".tls.domains]]
        main = "machine1.example.com"
        sans = ["*.machine1.example.com"]
  {{ end }}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为这里创建的路由器是srv1@filesrv2@file而不是srv1@dockersrv2@docker它们是由 docker-compose 配置创建的。

有没有办法只指定一次此配置并将其应用于多个服务?

Arc*_*ano -1

目前,对共享同一存储的多个副本的支持是一种抢钱行为,因此根据ACME 存储中的警告,不支持该警告:

出于并发原因,该文件无法在 Traefik 的多个实例之间共享。

根据您的情况,一项建议是实际管理 SSL 证书并根据需要部署文件。然而,权衡一下 Traefik 企业版的成本,我上次检查的网站上没有显示价格。