使用 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=80traefik.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 规则的更多信息。
警告
您的应用程序或服务需要重启才能使域名更改生效。
