前言

使用 Traefik 可以很簡單的建立反向代理伺服器,並且自動獲取 SSL 證書,所以嘗試記錄一下。

預備步驟

安裝 docker & docker-compose 在伺服器上。

步驟

  • 建立 Docker 網路
  • 準備好 Traefik 設定檔
  • 建立 Docker compose file
  • 設定反向代理

建立 Docker 網路

透過以下指令建立 docker network,在後面的 docker compose file 會用到。

docker network create <network-name>
# docker network create traefik_network

準備 Traefik 設定檔

先寫好 Traefik 設定檔,檔名為 traefik.yaml,要放在 /etc/traefik 中,這裡的設定檔沒記錯應該有參考到網路上的某篇文章,知道是哪篇的或是作者再麻煩聯繫我,我會標注的 QQ。

api:
  # 關閉 Traefik 8080 port
  insecure: false
  # 啟用 Traefik 的 dashboard
  dashboard: true

# 設定 Traefik 的 providers
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

# 啟用 ACME (Let's Encrypt) 功能
certificatesResolvers:
  letsencrypt-production:
    acme:
      email:  # 設定你的 email
      storage: /etc/traefik/acme/acme.json # 設定 ACME 資料儲存路徑
      # caServer: https://acme-v02.api.letsencrypt.org/directory # production ca server
      # caServer: https://acme-staging-v02.api.letsencrypt.org/directory # test ca server
      
      tlsChallenge: {}

      # dnsChallenge:
      #   provider: googledomains
        
      # httpChallenge:
      #   entryPoint: https # 設定使用 HTTP Challenge 驗證
  
# 設定 Traefik 的 entryPoints
entryPoints:
  https:
    address: ":443"

建立 Docker compose file

透過以下的 docker compose file 填入對應的欄位建立 traefik 的容器,配合下方的 env 填入機敏資訊。

注意事項

  • networks 要設定連接到剛剛建立的 network,為了給其他容器加入用。
version: "3.3"

services:
  traefik:
    image: "traefik:v2.10"
    container_name: "traefik"
    env_file:
      - ".env"
    ports:
      - "443:443"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "$TRAEFIK_DATA:/etc/traefik:ro"
      - "$TRAEFIK_DATA/acme:/etc/traefik/acme:rw"
    labels:
      - "traefik.enable=true"
   # https
      # - "traefik.http.routers.traefik_https.rule=Host(`$TRAEFIK_SUBDOMAIN.$BASE_DOMAIN`)"
      # - "traefik.http.routers.traefik_https.entrypoints=https"
      # - "traefik.http.routers.traefik_https.tls.certresolver=letsencrypt-production"
      # - "traefik.http.routers.traefik_https.tls=true"
     # - "traefik.http.routers.traefik_https.service=api@internal"
    networks:
      - traefik_network

networks:
  traefik_network:
    external: true

設定反向代理

以 Nginx 作為範例,只要在 docker compose 中的 labels,加上這些標籤就可以設定反向代理。

注意事項

  • traefik.http.routers.<router-name> 請將 router-name 換成自定義的 router name,本例為 test。
  • traefik.http.routers.<router-name>.tls.certresolver 要填入設定檔中的 resolver 名稱。
  • networks 要設定連接到剛剛建立的 network,才可以被 traefik 偵測到。
nginx-test:
    image: "nginx"
    container_name: "test"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`$TEST_SUBDOMAIN.$BASE_DOMAIN`)"
      - "traefik.http.routers.test.entrypoints=https"
      - "traefik.http.routers.test.tls.certresolver=letsencrypt-production"
      - "traefik.http.routers.test.tls=true"
    networks:
      - traefik_network

networks:
  traefik_network:
    external: true

結語

Traefik 有更多細節與功能可以設定,但是第一次接觸實在需要比較多的範例與試錯,這篇文是整整搞了三天的精華,有問題可以一起討論(因為我也不一定會😀)。