NAS折腾记录:安装Traefik

我在家里的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文件如下:

---
version: "2.1"
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配置文件如下:

entryPoints:
  web:
    address: :80
  websecure:
    address: :443
# 两种Traefik的配置方式,
providers:
  #docker配置方式
  #可以在使用docker-compose安装wordpress的时候直接配置好wordpress的相关配置,而不需要修改traefik的任何东西。
  docker: 
    exposedByDefault: false
    defaultRule: "Host(`{{trimPrefix `/` .Name}}.dreamlyn.cn`)" 
  #file配置方式,反向代理非docker时使用,配置文件统一放在/configs/conf.d目录里
  file:
    watch: true
    directory: /configs/conf.d
api:
  debug: true
  dashboard: true
  insecure: true
#log:
#  level: DEBUG

此时在traefik目录下执行如下命令:

# 创建docker网络,如果已经有docker_default网络,则不需要。
docker network create -d bridge --attachable=true docker_default
# 启动traefik
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。

Let's Encrypt是一种自动获取HTTPS证书的方式,也就是我们设置好之后,不需要再去手动申请证书,然后各种配置了。

使用DNS Challenge有几个前置条件:

  1. 确保域名的服务商在Traefik支持的域名服务商列表中(不在列表中时,请参考这篇文章对域名服务商进行修改)。
  2. 确保使用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,确保下图红框部分正确配置。

最终代码如下:

---
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文件,确保红框部分的正确配置。

最终代码如下:

entryPoints:
  web:
    address: :80
  websecure:
    address: :443
    # 不使用HTTPS的话,下面可以忽略
    http:
      tls: 
        certResolver: letsencrypt
        domains:
          - main: dreamlyn.cn
            sans:
              - "*.dreamlyn.cn"
# 两种配置方式,
providers:
  #docker配置方式
  #比如:可以在使用docker-compose安装wordpress的时候直接配置好wordpress的相关配置,而不需要修改traefik的任何东西。
  docker: 
    exposedByDefault: false
    defaultRule: "Host(`{{trimPrefix `/` .Name}}.dreamlyn.cn`)" 
  #file配置方式,反向代理非docker时使用,比如群晖上的Plex,配置文件统一放在/configs/conf.d目录里
  file:
    watch: true
    directory: /configs/conf.d
#注意,letsencrypt在服务器无法开放80和443端口的情况下无法使用tls和http,暂时不用。
#后来发现DNS的服务商可以修改,故将花生壳的DNS服务商修改为DNSPod,可以使用DNS-01进行自动tls申请
certificatesResolvers:
  letsencrypt:
    acme:
      email: lyn@dreamlyn.cn
      storage: /configs/acme.json
      dnschallenge: 
        provider: tencentcloud
api:
  debug: true
  dashboard: true
  insecure: true
#log:
#  level: DEBUG

运行Traefik

在traefik目录下执行如下命令:

# 创建docker网络,如果已经有docker_default网络,则不需要。
docker network create -d bridge --attachable=true docker_default
# 启动traefik
docker-compose up -d
# 查看启动日志
docker-compose logs -f

如果日志没有问题的话,我们就可以通过http://traefik.dreamlyn.cn:880来访问了。

至此,Traefik的安装已经完成了。

评论

  1. chenjintx
    8月前
    2023-2-02 13:54:23

    博主你好,请问有没有遇到如下情况(如果遇到了是如何解决的):
    dnspod 购买的域名,按照你的这个配置,配置好dns challenge之后启动容器提示 cannot get ACME client unrecognized DNS provider: tencentcloud;
    按照https://doc.traefik.io/traefik/https/acme/#providers修改 dnschallenge provider 为 dnspod(按照说明也修改了 environment中的配置),启动容器后提示 error presenting token: API call failed: could not get domains: The login token ID is invalid\n" providerName=letsencrypt.acme

    • Avatar photo
      博主
      chenjintx
      8月前
      2023-2-04 10:05:59

      我没遇到过,看这个提示是不是provierName写错了。
      回忆了下还有个没说清楚的地方:对于需要使用dnschallenge的域名需要能通过A记录到达traefik服务。(cname不行)
      另外我在调试的时候,会根据dnschallenge的流程,去dnspod的操作日志查看信息对不对。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇