Skip to content

在 Traefik 中设置通配符 SSL 证书

先决条件

  • 您需要有一个域名和支持通配符子域名的 DNS 提供商。
  • 您需要在 Traefik 中使用 dnsChallenge 从 Let's Encrypt 获取通配符证书。
  • 您需要使用受支持的 DNS 提供商之一。

提示

每个提供商都需要在 Traefik 配置中设置环境变量。您可以在官方文档中找到所需的变量。

如果您需要细粒度令牌,如Cloudflare,请查看提供商配置。

配置

  1. 设置您的通配符子域名 DNS 记录,*.coolify.io
  2. 转到您的代理设置(服务器/代理菜单),根据您的提供商添加以下配置。本示例将使用 Hetzner 作为提供商。
bash
version: '3.8'
networks:
  coolify:
    external: true
services:
  traefik:
    container_name: coolify-proxy
    image: 'traefik:v2.10'
    restart: unless-stopped
    environment:
      - HETZNER_API_KEY=<API>
    extra_hosts:
      - 'host.docker.internal:host-gateway'
    networks:
      - coolify
    ports:
      - '80:80'
      - '443:443'
      - '8080:8080'
    healthcheck:
      test: 'wget -qO- http://localhost:80/ping || exit 1'
      interval: 4s
      timeout: 2s
      retries: 5
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
      - '/data/coolify/proxy:/traefik'
    command:
      - '--ping=true'
      - '--ping.entrypoint=http'
      - '--api.dashboard=true'
      - '--api.insecure=false'
      - '--entrypoints.http.address=:80'
      - '--entrypoints.https.address=:443'
      - '--entrypoints.http.http.encodequerysemicolons=true'
      - '--entrypoints.https.http.encodequerysemicolons=true'
      - '--providers.docker.exposedbydefault=false'
      - '--providers.file.directory=/traefik/dynamic/'
      - '--providers.file.watch=true'
      # 使用 dnschallenge 而不是 httpchallenge
      # - '--certificatesresolvers.letsencrypt.acme.httpchallenge=true'
      # - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http'
      - '--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=hetzner'
      - '--certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=0'
      - '--certificatesresolvers.letsencrypt.acme.storage=/traefik/acme.json'
      - '--providers.docker=true'
    labels:
      - traefik.enable=true
      - traefik.http.routers.traefik.entrypoints=http
      - traefik.http.routers.traefik.middlewares=traefik-basic-auth@file
      - traefik.http.routers.traefik.service=api@internal
      - traefik.http.routers.traefik.tls.certresolver=letsencrypt
      - traefik.http.routers.traefik.tls.domains[0].main=coolify.io
      - traefik.http.routers.traefik.tls.domains[0].sans=*.coolify.io
      - traefik.http.services.traefik.loadbalancer.server.port=8080
      - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
      - traefik.http.middlewares.gzip.compress=true

您也可以在上面的示例中设置 env_file 而不是 environment,但您需要在服务器上创建一个包含 HETZNER_API_KEY 变量的 .env 文件。

--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=hetzner 更改为您的提供商。

现在,您有两种选择来配置资源的通配符子域名。

常规模式

如果您想为所有资源使用一个(通配符)证书,可以使用此选项。

这很有用,因为 Traefik 不需要为每个资源生成新证书,因此新部署将立即可用,无需等待证书生成。

  • 在您的应用程序中,将 FQDN 设置为您想要使用的子域名:https://example.coolify.io
bash
traefik.enable=true
traefik.http.routers.<unique_router_name_https>.rule=Host(`example.coolify.io`) && PathPrefix(`/`)
traefik.http.routers.<unique_router_name_https>.entryPoints=https
traefik.http.routers.<unique_router_name_https>.middlewares=gzip
traefik.http.routers.<unique_router_name_https>.service=<unique_service_name>
traefik.http.routers.<unique_router_name_https>.tls=true
traefik.http.services.<unique_service_name>.loadbalancer.server.port=80
traefik.http.routers.<unique_router_name_https>.tls.certresolver=letsencrypt

traefik.http.routers.<unique_router_name_http>.rule=Host(`example.coolify.io`) && PathPrefix(`/`)
traefik.http.routers.<unique_router_name_http>.entryPoints=http
traefik.http.routers.<unique_router_name_http>.middlewares=redirect-to-https

SaaS 模式

将所有子域名重定向到一个应用程序。如果您想将 Coolify 用作 SaaS 提供商,可以使用此选项。

  • 在您的应用程序中,将 FQDN 配置留空。
  • 添加以下自定义标签配置:
bash
traefik.enable=true
traefik.http.routers.<unique_router_name_https>.rule=HostRegexp(`^.+\.coolify\.io$`)
traefik.http.routers.<unique_router_name_https>.entryPoints=https
traefik.http.routers.<unique_router_name_https>.middlewares=gzip
traefik.http.routers.<unique_router_name_https>.service=<unique_service_name>
traefik.http.routers.<unique_router_name_https>.tls.certresolver=letsencrypt
traefik.http.services.<unique_service_name>.loadbalancer.server.port=80
traefik.http.routers.<unique_router_name_https>.tls=true

traefik.http.routers.<unique_router_name_http>.rule=HostRegexp(`^.+\.coolify\.io$`)
traefik.http.routers.<unique_router_name_http>.entryPoints=http
traefik.http.routers.<unique_router_name_http>.middlewares=redirect-to-https

traefik.http.routers.<unique_router_name_https>.tls.certresolver 应该与您在 Traefik 代理配置中的 certresolver 名称相同,默认为 letsencrypt

traefik.http.services.<unique_service_name>.loadbalancer.server.port 应该与您的应用程序监听的端口相同。如果使用静态部署,则为端口 80。

注意

您不能在一台服务器上同时使用两种配置(常规模式和 SaaS 模式)。