Traefik 檔案 Provider 與 TCP 路由

到目前為止,我們幾乎都依賴 Docker Provider (Labels) 來設定 Traefik。這對於容器化服務非常方便。

但在某些情況下,我們需要更進階的配置方式:

  1. 代理 非 Docker 的服務 (例如外部伺服器)。
  2. 代理 TCP/UDP 流量 (例如資料庫)。
  3. 設定 SSL 憑證 (自行購買的憑證,非 Let's Encrypt)。
  4. 定義複雜的 Middleware Chains,供多個容器共用。

這時,我們就需要 File Provider

啟用 File Provider

首先,我們需要在靜態配置 (traefik.ymlcommand) 中告訴 Traefik 去哪裡讀取動態設定檔。

修改 docker-compose.yml

command:
  # ...
  - '--providers.file.filename=/etc/traefik/dynamic.yml'
  - '--providers.file.watch=true' # 自動監聽檔案變更,免重啟

volumes:
  # ...
  - ./dynamic.yml:/etc/traefik/dynamic.yml # 掛載檔案

然後在 host 建立 dynamic.yml

定義外部服務 (External Service)

假設你有一個舊的網站跑在 http://192.168.1.50,你想透過 Traefik 代理它。

dynamic.yml 中:

http:
  routers:
    legacy-app:
      rule: Host(`legacy.example.com`)
      service: legacy-service
      entryPoints:
        - websecure
      tls:
        certResolver: myresolver

  services:
    legacy-service:
      loadBalancer:
        servers:
          - url: 'http://192.168.1.50:8080'

這樣 Traefik 就會把 legacy.example.com 的流量轉給那台外部機器,並且自動幫它加上 HTTPS!

TCP 路由 (代理資料庫)

Traefik 不只懂 HTTP,它還是個 TCP/UDP Proxy。這讓你可以將資料庫 (例如 MySQL, Redis) 暴露給外網,並透過 SNI 路由。

假設我們想透過 db.example.com 連到內部的 MySQL 容器。

首先,確保 EntryPoint 有監聽該 port (或共用 443,需依賴 TLS SNI)。為了簡單起見,我們新增一個專用的 mysql EntryPoint (Port 3306)。

docker-compose.yml 中:

command:
  - '--entrypoints.mysql.address=:3306'
ports:
  - '3306:3306'

然後在 dynamic.yml (或是 MySQL 容器的 Labels) 中設定:

tcp:
  routers:
    mysql-router:
      rule: HostSNI(`*`) # TCP 路由通常是基於 HostSNI。如果沒有 TLS,只能用 *
      service: mysql-service
      entryPoints:
        - mysql

  services:
    mysql-service:
      loadBalancer:
        servers:
          - address: 'mysql-container:3306'

注意:如果不啟用 TLS,Traefik 無法看到 Hostname (SNI),所以 HostSNI 只能設為 *。這意味著該 EntryPoint (Port 3306) 只能服務一個 TCP Router。如果你想在同一個 Port 上跑多個 TCP 服務 (例如 db1.example.comdb2.example.com),你必須啟用 TCP TLS,讓客戶端發送 SNI。

4. 自定義 TLS 憑證

如果你不想用 Let's Encrypt,而是有自己買的憑證 (server.crt, server.key)。

dynamic.yml 中設定:

tls:
  certificates:
    - certFile: /etc/traefik/certs/server.crt
      keyFile: /etc/traefik/certs/server.key
      stores:
        - default

記得把憑證檔案掛載進容器。

總結

File Provider 提供了極大的靈活性,彌補了 Docker Labels 的不足。你可以混合使用:用 Docker Labels 處理大多數簡單的微服務,用 File Provider 處理複雜的全域設定和外部服務。