Coolify logoCoolify

使用 Traefik 设置通配符 SSL 证书

通配符证书(例如 *.coolify.io)可以使用一个证书覆盖单一域名下的所有子域名。由于 Traefik 不需要为每个资源请求新证书,新部署的资源可以立即通过 HTTPS 访问,而无需等待 ACME 证书签发。

前提条件

  • Traefik 必须已经使用 DNS 挑战 — 通配符证书无法通过 HTTP 挑战签发。如果您尚未切换,请先遵循 DNS 挑战指南
  • 一个指向您服务器的 通配符 DNS A 记录,例如 *.coolify.io → 您服务器的 IP。

配置

在 DNS 挑战已就位的情况下,打开 Servers → 您的服务器 → Proxy,并在 Traefik 配置中添加三个高亮显示的标签:

labels:
  - traefik.enable=true
  - traefik.http.routers.traefik.entrypoints=http
  - 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
  - coolify.managed=true
  - coolify.proxy=true

这些标签告诉 Traefik 请求一个 SAN 同时包含根域名(coolify.io)和通配符(*.coolify.io)的证书。请将 coolify.io 替换为您自己的域名。

保存后重启代理。一旦证书签发,您有两种选择将其应用到您的资源。

普通模式

如果您的每个资源都位于自己的子域名上,并且希望它们都由同一个通配符证书提供服务,请使用此选项。

  • 在您的应用程序中,将 Domain 设置为子域名,例如 https://example.coolify.io,然后按保存。
应用程序上的域名输入字段 服务上的域名输入字段

由于通配符证书已经覆盖 *.coolify.io,Traefik 会将其重用于每个新资源 — 无需每次部署都进行 ACME 往返请求。

SaaS 模式 — 将每个子域名路由到一个应用程序

如果您的一个应用程序应该响应 所有 子域名(例如,多租户 SaaS,每个租户获得自己的子域名),请使用此选项。

  • 将应用程序的 Domain 字段 留空
  • 添加以下自定义标签:
traefik.enable=true
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_http>.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>.rule=HostRegexp(`^.+\.coolify\.io$`)
traefik.http.routers.<unique_router_name_https>.service=<unique_service_name>
traefik.http.routers.<unique_router_name_https>.tls.certresolver=letsencrypt
traefik.http.routers.<unique_router_name_https>.tls=true
traefik.http.services.<unique_service_name>.loadbalancer.server.port=80
traefik.enable=true
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_http>.rule=HostRegexp(`{subdomain:[a-zA-Z0-9-]+}.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>.rule=HostRegexp(`{subdomain:[a-zA-Z0-9-]+}.coolify.io`)
traefik.http.routers.<unique_router_name_https>.service=<unique_service_name>
traefik.http.routers.<unique_router_name_https>.tls.certresolver=letsencrypt
traefik.http.routers.<unique_router_name_https>.tls=true
traefik.http.services.<unique_service_name>.loadbalancer.server.port=80

注意

  • <unique_router_name_https>.tls.certresolver 必须与 Traefik 代理配置中的解析器名称匹配 — 默认为 letsencrypt

  • <unique_service_name>.loadbalancer.server.port 必须与您的应用程序监听的端口匹配(静态部署使用 80)。

在 Traefik 官方文档中阅读有关 HostRegexp 规则的更多信息。

警告

您的应用程序或服务需要重启才能使域名更改生效。

On this page