在 Traefik 中设置通配符 SSL 证书
先决条件
- 您需要有一个域名和支持通配符子域名的 DNS 提供商。
- 您需要在 Traefik 中使用 dnsChallenge 从 Let's Encrypt 获取通配符证书。
- 您需要使用受支持的 DNS 提供商之一。
配置
- 设置您的通配符子域名 DNS 记录,
*.coolify.io。 - 转到您的代理设置(服务器/代理菜单),根据您的提供商添加以下配置。本示例将使用
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-httpsSaaS 模式
将所有子域名重定向到一个应用程序。如果您想将 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 模式)。
