Traefik反代教程

-
2024-05-21

特别注意

2023年9月19日更新了Traefik.yml的代码,增加申请证书的自定义DNS,解决因DNS污染导致申请证书失败的问题!!!

2023年5月27日更新了代码,修复了http跳转https的问题

2023年4月24日更新了代码,证书在正常情况下两分钟之内就会出来(10分钟内还不行的话就是配置有问题了)

修改配置文件

按需修改traefik.yml、dynamic_conf.yml,其中的xxxx就是需要改的地方,一定要用编辑器改,记事本改了可能导致格式错乱,推荐VS Code

复制三个文件到指定的docker路径

/xxxxxx/docker/traefik/

acme.json、traefik.yml、dynamic_conf.yml

修改 acme.json 权限为600(这步必须做,不然申请证书会报错)

命令 chmod 600 /xxxxxx/docker/traefik/acme.json

部署命令

命令部署(腾讯云dnspod示例)
docker run -d --name=traefik --net=host --restart always -e TZ=Asia/Shanghai -v /xxxxxx/docker/traefik:/etc/traefik:rw -v /var/run/docker.sock:/var/run/docker.sock:rw -e DNSPOD_API_KEY=APPID,密钥 -e DNSPOD_HTTP_TIMEOUT=30 traefik:latest

堆栈部署(按需改运营商)
version: '3.3'
services:
    traefik:
        container_name: traefik
        network_mode: host
        restart: always
        environment:
            - TZ=Asia/Shanghai
            - DNSPOD_API_KEY=APPID,密钥                #腾讯云
            - DNSPOD_HTTP_TIMEOUT=30                   #腾讯云
            - CF_API_EMAIL=CF邮箱                      #CF
            - CF_API_KEY=key                           #CF
            - ALICLOUD_ACCESS_KEY=没见过               #阿里云
            - ALICLOUD_SECRET_KEY=没见过               #阿里云
            - ALICLOUD_REGION_ID=没见过                #阿里云

        volumes:
            - '/xxxxxx/docker/traefik:/etc/traefik:rw'
            - '/var/run/docker.sock:/var/run/docker.sock:rw'
        image: 'traefik:latest'

DNSPOD自动申请证书参数DNSPOD_API_KEY=xxxxxx,xxxxxxxxxxxxxxx(由dnspod的appid和token构成,注意英文逗号隔开)超时时间 DNSPOD_HTTP_TIMEOUT=30

阿里云REGION_ID对照表

image.png

新加反代

修改dynamic_conf.yml即可,保存后自动反代,无需重启容器(会有延迟,等不了的就手动重启),如有报错则重启容器

配置文件

# traefik.yml配置
entryPoints:
  websecure:
    address: ":8433"  #只需改这里的端口号,随便你喜欢,改完记得路由器映射出去
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true
          priority: 10        

serversTransport:
  insecureSkipVerify: true

providers:
  docker:
    defaultRule: Host(`{{normalize .Name }}.xxxxxxx.com`)  #只需改这里的根域名
    exposedbydefault: false
 
  file:
    filename: "/etc/traefik/dynamic_conf.yml"      

certificatesresolvers:
  LetsEncrypt:
    acme:
      email: xxxxxxx@qq.com         #只需改这里的邮箱(腾讯云、阿里云、CF)
      storage: /etc/traefik/acme.json     
      dnschallenge:
        provider: dnspod            #域名解析运营商
        delayBeforeCheck: 30  
        resolvers:
          - "1.1.1.1:53"
          - "8.8.8.8:53"    

# 常用域名解析运营商对照        
# 腾讯云   dnspod
# 阿里云   alidns
# CF       cloudflare

# dynamic_conf.yml配置
http:
  routers:
    plex:                                 #随便你写啥
      entryPoints:
        - websecure
      service: plex                       #随便你写啥,但要跟下面的一致
      rule: "Host(`plex.xxxxxxxx.com`)"   #只需改这里的二级域名
      tls:
        certResolver: LetsEncrypt
        domains:
          - main: "xxxxxxx.com"     #只需改这里的根域名
            sans: "*.xxxxxxx.com"   #只需改这里的根域名

    emby:
      entryPoints:
        - websecure
      service: emby
      rule: "Host(`emby.xxxxxx.com`)"
      tls: true  

    nav:
      entryPoints:
        - websecure
      service: nav
      rule: "Host(`nav.xxxxxx.com`)"  
      tls: true      
################## 华丽的分割线 ##################
  services:  
    plex:                              #随便你写啥,但要跟上面的一致
      loadBalancer:
        servers:
        - url: "http://127.0.0.1:32400"
    emby:
      loadBalancer:
        servers:
        - url: "http://10.0.0.5:12345"        
    nav:
      loadBalancer:
        servers:
        - url: "http://10.0.0.5:12345"           

官方文档

其他dns服务商参考官网文档去改docker部署命令及静态文件traefik.yml里申请证书的部分即可

Traefik Let's Encrypt Documentation - Traefik

image.png

进阶

想让windows远程桌面和https共用同一个端口吗? Come on!So esay!

只需把下面的代码复制到dynamic_conf.yml最下面即可,记得改成你的ip和端口哦

注意:这样会极大增加被黑客扫描风险,慎用!!!还会导致http无法自动跳转到https,自行取舍吧

tcp:
  routers:
    remote:
      entryPoints:
        - websecure
      service: nas               
      rule: "HostSNI(`*`)" 
  services:        
    nas:
      loadBalancer:
        servers:
        - address: "10.0.0.5:3389"  #只需要改成你的windows的ip和端口

Tip

直接输入plex.example.com:8433就会跳转到https://plex.example.com:8433

后续补充

2023年5月23日:实测在unraid系统下首次申请证书大概率出现申请不到的问题,如果超过3分钟acme的文件大小大于0kb且小于8kb的话(方便判定)则申请证书失败,此时重启Traefik容器后再去观察acme文件大小,超过12kb应该就是正常的了,再访问https查看是否已经正常工作。

参考原文

https://alanoo.notion.site/Traefik-docker-61fa53bde5554e858b5a2095ddbd8e9d


目录