我在家里的NAS上使用docker搭建了许多服务,这些服务都使用traefik进行代理,当这些服务需要使用HTTPS时,我们可以使用Traefik的Let’s Encrypt来自动获取证书,本篇文章主要介绍Traefik的安装以及如何使用traefik来自动获取证书。
安装Traefik
我在NAS上的服务大部分都是采用docker-compose的方式进行安装,而traefik的反向代理对docker原生支持,所以我采用traefik作为所有服务的入口。当我们使用不同的域名,比如:gitea.dreamlyn.cn或者给blog.dreamlyn.cn来访问网站时,traefik会根据不同的域名,将访问代理到不同的docker容器。有兴趣深入了解traefik的可以参考中文文档或者官方文档。
traefik反向代理
对于traefik本身的安装,我也是采用了docker-compose的方式。
在nas上合适的位置创建目录,并创建如下文件。
其中docker-compose文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| --- version: "3" services: traefik: image: traefik:latest container_name: traefik environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - /var/run/docker.sock:/var/run/docker.sock - ./configs/traefik.yml:/etc/traefik/traefik.yml - ./configs/conf.d:/configs/conf.d:rw ports: - "80:80" - "443:443" labels: - "traefik.enable=true" #设置http - "traefik.http.routers.traefik.entrypoints=web" - "traefik.http.routers.traefik.service=traefik" - "traefik.http.routers.traefik.rule=Host(`traefik.dreamlyn.cn`)" #设定端口号,traefik本身有个dashboard,端口为8080 - "traefik.http.services.traefik.loadbalancer.server.port=8080" restart: always networks: default: external: name: docker_default
|
traefik配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| entryPoints: web: address: :80 websecure: address: :443
providers: docker: exposedByDefault: false defaultRule: "Host(`{{trimPrefix `/` .Name}}.dreamlyn.cn`)" file: watch: true directory: /configs/conf.d api: debug: true dashboard: true insecure: true
|
此时在traefik目录下执行如下命令:
1 2 3 4 5 6
| docker network create -d bridge --attachable=true docker_default
docker-compose up -d
docker-compose logs -f
|
如果启动没有问题,那么就可以使用http://traefik.dreamlyn.cn:880来访问traefik的dashboard了。
使用DNS Challenge
当我们的服务需要使用HTTPS时,我们可以使用traefik的Let’s Encrypt来自动获取证书。Traefik有三种方式来使用Let’s Encrypt:TLS Challenge、HTTP Challenge和DNS Challenge。
其中TLS Challenge和HTTP Challenge两种方式较为简单,但是需要服务的访问端口为80或者443,而我们在家中的网络一般都是屏蔽了80和443端口的,所以需要使用较为复杂的DNS Challenge。
使用DNS Challenge有几个前置条件:
- 确保域名的服务商在Traefik支持的域名服务商列表中(不在列表中时,请参考这篇文章对域名服务商进行修改)。
- 确保使用DNS Challenge申请的域名使用的是A记录,并且正确解析到traefik服务上。(在NAS折腾记录:打通网络篇,我将DDNS的主机域名直接设置为了*.dreamlyn.cn就是这个原因)
那么接下来就根据上面的原理一步步实现DNS Challenge。
DNS设置
DNS Challenge自动获取HTTPS证书的一个过程是验证域名的归属权,这个过程是Traefik通过调用域名服务商的API自动进行的(Traefik支持的域名服务商参考这里),而Traefik调用API的时候,是需要SecretId和SecretKey的,接下来具体操作。
到 https://doc.traefik.io/traefik/https/acme/#providers 查看Traefik是否支持自己所购买的域名服务商,如果不支持也没关系,参考这篇文章,将域名服务商修改为DNSPOD(被腾讯收购后改为了Tencent Cloud DNS)。
在DNSPOD的控制台中,如下图所示点击API密钥中。
新建密钥。
修改docker-compose.yml
如图,在相应位置创建acme.json。需要使用命令chmod 600 acme.json
将acme.json文件权限调整为600
修改docker-compose.yml,确保下图红框部分正确配置。
最终代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| --- version: "2.1" services: traefik: image: traefik container_name: traefik environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai # 因为家中的服务端口不是443,在使用Let’s Encrypt时只能用DNS Challenge的方式 # 前期如果不需要HTTPS,可以忽略 - "TENCENTCLOUD_SECRET_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - "TENCENTCLOUD_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
volumes: - /var/run/docker.sock:/var/run/docker.sock - ./configs/traefik.yml:/etc/traefik/traefik.yml # 如果不用HTTPS,可以忽略acem.json # 用的话,需要使用 chmod 600 acme.json 命令修改文件的权限 - ./configs/acme.json:/configs/acme.json:rw - ./configs/conf.d:/configs/conf.d:rw - ./configs/certs:/configs/certs ports: - "80:80" - "443:443" labels: - "traefik.enable=true" #设置http - "traefik.http.routers.traefik.entrypoints=web" - "traefik.http.routers.traefik.service=traefik" - "traefik.http.routers.traefik.rule=Host(`traefik.dreamlyn.cn`)" #设定端口号,traefik本身有个dashboard,端口为8080 - "traefik.http.services.traefik.loadbalancer.server.port=8080" restart: always networks: default: external: name: docker_default
|
修改traefik.yml
修改traefik.yml文件,确保红框部分的正确配置。
最终代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| entryPoints: web: address: :80 websecure: address: :443 http: tls: certResolver: letsencrypt domains: - main: dreamlyn.cn sans: - "*.dreamlyn.cn"
providers: docker: exposedByDefault: false defaultRule: "Host(`{{trimPrefix `/` .Name}}.dreamlyn.cn`)" file: watch: true directory: /configs/conf.d
certificatesResolvers: letsencrypt: acme: email: lyn@dreamlyn.cn storage: /configs/acme.json dnschallenge: provider: tencentcloud api: debug: true dashboard: true insecure: true
|
运行Traefik
在traefik目录下执行如下命令:
1 2 3 4 5 6
| docker network create -d bridge --attachable=true docker_default
docker-compose up -d
docker-compose logs -f
|
如果日志没有问题的话,我们就可以通过http://traefik.dreamlyn.cn:880来访问了。
至此,Traefik的安装已经完成了。