基本上我一直在研究一点 Traefik,因为它看起来比我使用的其他反向代理更专业一点,而我仍然面临的唯一问题是仅为我的 WILDCARD DuckDNS 生成证书。
示例: 我想要为
*.mydomain.duckdns.org
生成一个证书,并且该证书将由所有选定的服务/容器使用。就我而言,出于学习目的,我只有 Portainer
和 Traefik Whoami
服务,因此它们的 URL 分别是:
portainer.mydomain.duckdns.org
whoami.mydomain.duckdns.org
当前行为是:Traefik 正在为第一个 URL 请求一个证书,为第二个 URL 请求另一个证书。
目标:仅创建一个通配符证书并将其用于两个 URL。
我现在更喜欢使用静态和动态文件而不是 docker 标签来完成所有配置,因为它对于初学者来说似乎更容易理解,所以这是我的文件:
# docker-compose.yml
networks:
selfhost:
external: true
services:
portainer:
image: portainer/portainer-ce:2.21.5
container_name: portainer
networks:
- selfhost
volumes:
- ./portainer/data:/data:rw
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
ports:
- 9000:9000
whoami:
image: traefik/whoami
container_name: whoami
networks:
- selfhost
restart: unless-stopped
traefik:
image: traefik:v3.2
container_name: traefik
networks:
- selfhost
volumes:
- ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro
- ./traefik/dynamic.yml:/config/dynamic.yml:ro
- ./traefik/letsencrypt:/letsencrypt:rw
restart: unless-stopped
ports:
- 8080:8080
- 80:80
- 443:443
environment:
DUCKDNS_TOKEN: duckdnstoken
duckdns:
image: linuxserver/duckdns:version-5046d23b
container_name: duckdns
networks:
- selfhost
restart: unless-stopped
environment:
PUID: 1000
PGID: 1000
TZ: America/Sao_Paulo
SUBDOMAINS: mydomain
TOKEN: duckdnstoken
UPDATE_IP: ipv4
# traefik.yml
entryPoints:
web:
address: :80
websecure:
address: :443
certificatesResolvers:
letsencrypt:
acme:
email: myemail
storage: /letsencrypt/acme.json
dnsChallenge:
provider: duckdns
disablePropagationCheck: true
delayBeforeCheck: 60s
resolvers:
- "1.1.1.1:53"
- "8.8.8.8:53"
api:
insecure: true
providers:
file:
filename: /config/dynamic.yml
watch: true
log:
level: DEBUG
# dynamic.yml
http:
routers:
whoami:
rule: Host(`whoami.mydomain.duckdns.org`)
service: whoami
entryPoints:
- websecure
tls:
certResolver: letsencrypt
portainer:
rule: Host(`portainer.mydomain.duckdns.org`)
service: portainer
entryPoints:
- websecure
tls:
certResolver: letsencrypt
services:
whoami:
loadBalancer:
servers:
- url: http://whoami:80
portainer:
loadBalancer:
servers:
- url: http://portainer:9000
老实说,这就是我到目前为止所能得到的......我已经在整个互联网上查看了很多主题和线程,例如 Stack Overflow、Reddit、Discord 社区、Traefik 社区,但没有任何配置真正起作用。
我使用的这个设置实际上有时可以工作(这意味着它偶尔可以工作一次)为每个 URL 生成证书,但必须使用
disablePropagationCheck
和 delayBeforeCheck
看起来更像是一种解决方法,而不是实际功能在这种情况下。如果没有它们,我只会陷入 whoami
的单个证书,而 portainer
无法生成,因为超出了 ACME 响应的时间限制。当前的设置实际上给了我同样的错误,但几分钟后它会重试请求并成功获得 portainer
... 的证书
你可以在这里看到Traefik的日志,这样你就可以理解“错误”了,这样的话,只能又报错,这次没有成功!:https://pastebin.com/Th9HDJLj