Skip to content
Go back

traefik配置,以OpenWRT为例

Published:  at  09:00 AM

traefik配置,以OpenWRT为例

traefik是一个类似于nginx和caddy的应用网关服务器,拥有动态配置和内置面板。

可以在同一个端口下分发不同的服务,例如emby、AList和qBitTorrent使用相同端口,根据域名规则区分。

OP端口放行

image

建立目录

mkdir -p /opt/bin /etc/traefik/dynamic /var/log/traefik

https://github.com/traefik/traefik/releases

下载对应架构的版本然后放入/opt/bin/

创建OpenWRT的服务单元

服务单元的路径:/etc/init.d/traefik,必须配置CloudFlareToken,用于ACME自动申请证书。

DNS Provider Token只能以环境变量的方式传递,不支持在文件中配置。

#!/bin/sh /etc/rc.common

START=99
STOP=10

USE_PROCD=1
PROG=/opt/bin/traefik
CONFIG=/etc/traefik/traefik.yml

start_service() {
    procd_open_instance
    procd_set_param command "$PROG" --configfile="$CONFIG" 
    
    procd_set_param env CF_DNS_API_TOKEN="填写CloudFlare Token"
    
    procd_set_param respawn
    procd_set_param limits core="unlimited"
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_close_instance
}

stop_service() {
    service_stop "$PROG"
}

reload_service() {
    stop
    start
}

traefik主配置(静态配置)

注意:入口点、证书处理器和动态配置的目录只能在主配置中声明。

/etc/traefik/traefik.toml

[entryPoints] #入口点,也就是监听地址
  [entryPoints.lan]
    address = "192.168.1.1:8080" #只设置监听局域网地址8080端口
  [entryPoints.wan] #监听所有地址的5000
    address = ":5000" 
[providers.file] #动态配置目录,会自动从这个目录下热重载配置
  directory = "/etc/traefik/dynamic"
[api] #启用面板
  dashboard = true
[log] #程序启动日志
  level = "INFO"
  filePath = "/var/log/traefik/traefik.log"
[accessLog] #访问日志
  filePath = "/var/log/traefik/access.log"
[certificatesResolvers.example-cert.acme] # 定义名称为kkcf的acme证书处理器
  storage = "/etc/traefik/acme.json"
  email = "" #设置邮箱
  [certificatesResolvers.example-cert.acme.dnsChallenge] #使用dns方式完成证书申请,只有这种方式可以获得通配符证书
    provider = "cloudflare" #使用CloudFlare的API
    delayBeforeCheck = 0

AList配置示例

/etc/traefik/dynamic/alist.toml

[http.services.alist] #声明alist服务
  [http.services.alist.loadBalancer]
    [[http.services.alist.loadBalancer.servers]]
      url = "http://127.0.0.1:5244/" #转发的地址
[http.routers.dav] #声明一个名称为dav的路由
  rule = "Host(`example.site`)" #根据域名控制访问
  service = "alist" #指向alist服务
[http.routers.dav.tls] #启用TLS,也就是HTTPS
  certResolver = "example-cert" #使用主配置中定义的kkcf证书申请器
  [[http.routers.dav.tls.domains]] #使用通配符证书,固定写法,不重要
    main = "example.site" #主域名
    sans = ["*.example.site"] #通配符

image-20250507012144841

内置面板配置示例

/etc/traefik/dynamic/dashboard.toml

面板服务不需要定义,程序内置。

下面的配置可以通过 http://192.168.1.1:8080 访问面板。 用户名:admin 密码:MvU*3X&GY4Fi

[http.routers.dashboard]
  rule = "PathPrefix(`/api`) || PathPrefix(`/dashboard`)"
  entryPoints = ["lan"] #只监听在局域网地址
  service = "api@internal" #面板为内置服务,使用api@internal引用
  middlewares = ["auth"] #使用验证
[http.middlewares.auth.basicAuth] #使用HTTP基本用户名和密码
  users = ["admin:$apr1$NTL4Yolz$972.cz0xsjTRv8bUzCSre."] 
  #上面的密码是摘要过的,对应的真正密码是password,可以使用在线工具或者命令行htpasswd生成

emby配置示例

/etc/traefik/dynamic/emby.toml

[http.services.emby] #声明emby服务
  [[http.services.emby.loadBalancer.servers]]
    url = "http://192.168.1.66:6666/" #指向NAS的emby端口
[http.routers.tv] #声明名称为tv的路由
    rule = "Host(`tv.example.site`)" #仅允许tv.example.site域名访问
    service = "emby" #指向emby服务
  [http.routers.tv.tls] #HTTPS
    certResolver = "example-cert"
    [[http.routers.tv.tls.domains]]
      main = "example.site"
      sans = ["*.example.site"]

启动

service traefik start
service traefik enable #开机自启