1. Home
  2. Docs
  3. Self-hosted Server
  4. Traefik: Reverse Proxy &#...
  5. Install dan Konfigurasi Reverse Proxy dengan Traefik

Install dan Konfigurasi Reverse Proxy dengan Traefik

Untuk yang menggunakan docker-compose untuk install Traefik di Docker Container, install & renew sertifikat SSL/TLS dengan Let’s Encrypt secara otomatis tanpa expose port 80/443 ke public internet. Hanya ingin “Everything use VALID HTTPS” untuk aplikasi-aplikasi di docker container lokal kita.

Buat Directory dan File Konfigurasi

Buat struktur folder untuk mapping:

./traefik
├── data
│   ├── acme.json
│   ├── config.yml
│   └── traefik.yml
└── docker-compose.yml
mkdir -p /home/appdata/traefik /home/appdata/traefik/data

Agar traefik bisa berjalan sepenuhnya, kita perlu menambahkan 2 files config traefik.yml and fileConfig.yml.

Konfigurasi File Static

Yang dimaksud statik disini adalah jika kita melakukan perubahan di file ini, kita harus restart container untuk menerapkan perubahan konfigurasi yang baru.

nano /home/appdata/traefik/data/traefik.yml
Contoh konfigurasi file traefik.yml
global:
  checkNewVersion: true
  sendAnonymousUsage: false

serversTransport:
  insecureSkipVerify: true

entryPoints:
  # Not used in apps, but redirect everything from HTTP to HTTPS
  http:
    address: :80

    http:
      redirections:
        entryPoint:
          to: https
          scheme: https

  # HTTPS endpoint, with domain wildcard
  https:
    address: :443
    http:
      tls:
        # Generate a wildcard domain certificate
        certResolver: letsencrypt
        domains:
          - main: DOMAINKITA.COM
            sans:
              - '*.DOMAINKITA.COM'
      middlewares:
        - securityHeaders@file

providers:
  providersThrottleDuration: 2s

  # File provider for connecting things that are outside of docker / defining middleware
  file:
    filename: /etc/traefik/fileConfig.yml
    watch: true

  # Docker provider for connecting all apps that are inside of the docker network
  docker:
    watch: true
    network: proxy # Add Your Docker Network Name Here
    # Default host rule to containername.domain.example
    defaultRule: "Host(`{{ index .Labels \"com.docker.compose.service\"}}.DOMAINKITA.COM`)"
    swarmModeRefreshSeconds: 15s
    exposedByDefault: false
    #endpoint: "tcp://dockersocket:2375" # Uncomment if you are using docker socket proxy

# Enable traefik ui
api:
  dashboard: true
  insecure: true

# Log level INFO|DEBUG|ERROR
log:
  level: INFO

# Use letsencrypt to generate ssl serficiates
certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]
      storage: /etc/traefik/acme.json
      dnsChallenge:
        provider: cloudflare
        # Used to make sure the dns challenge is propagated to the rights dns servers
        resolvers:
          - "1.1.1.1:53"
          - "1.0.0.1:53"

Di contoh ini saya menggunakan provider Cloudflare untuk generate WildCard SSL/TLS certificates.

Konfigurasi File Dynamic

Kalo file ini jika menerapkan perubahan konfigurasi yang baru, kita ga perlu restart container. File ini kita buat untuk setting routing service host manual, misalnya saya ingin mengarahkan domain “adguard.domainkita.com” ke http://192.168.99.53:3000 (WebUI Adguard-home) dan setting middleware yang akan kita gunakan.

nano /home/appdata/traefik/data/fileConfig.yml
Contoh File Konfigurasi fileConfig.yml
http:
  ## EXTERNAL ROUTING - Only use if you want to proxy something manually ##
  routers:
    # Adguard routing example - Remove if not used
    adguard:
      entryPoints:
        - https
      rule: 'Host(`adguard.domainkita.com`)'
      service: adguard
      middlewares:
        - default-headers
        - https-redirectscheme
    
    pihole:
      entryPoints:
        - https
      rule: 'Host(`pihole.domainkita.com`)'
      service: pihole
      middlewares:
        - redirectregex-pihole
        - default-headers
        - addprefix-pihole
        - https-redirectscheme
  
  ## SERVICES EXAMPLE ##
  services:
    adguard:
      loadBalancer:
        servers:
          - url: http://192.168.99.53:3000/
    pihole:
      loadBalancer:
        servers:
          - url: "http://192.168.99.101:80"

  ## MIDDLEWARES ##
  middlewares:
    # Only Allow Local networks
    default-ipwhitelist:
      ipWhiteList:
        sourceRange: 
          - 127.0.0.1/32 # localhost
          - 192.168.1.1/24 # LAN Subnet
    
    # Security headers
    default-headers:
      headers:
        customResponseHeaders:
          X-Robots-Tag: "none,noarchive,nosnippet,notranslate,noimageindex"
          server: ""
          X-Forwarded-Proto: "https"
        sslProxyHeaders:
          X-Forwarded-Proto: https
        referrerPolicy: "strict-origin-when-cross-origin"
        hostsProxyHeaders:
          - "X-Forwarded-Host"
        customRequestHeaders:
          X-Forwarded-Proto: "https"
        contentTypeNosniff: true
        browserXssFilter: true
        forceSTSHeader: true
        stsIncludeSubdomains: true
        stsSeconds: 63072000
        stsPreload: true
    
    secured:
      chain:
        middlewares:
        - default-ipwhitelist
        - default-headers

    # pihole subfolder redirect /admin
    addprefix-pihole:
      addPrefix:
        prefix: "/admin"
    https-redirectscheme:
      redirectScheme:
        scheme: https
        permanent: true
    redirectregex-pihole:
      redirectRegex:
        regex: /admin/$
        replacement: /
  
    # Authelia guard
    auth:
      forwardauth:
        address: http://auth:9091/api/verify?rd=https://auth.domain.com/ # replace auth with your authelia container name
        trustForwardHeader: true
        authResponseHeaders:
          - Remote-User
          - Remote-Groups
          - Remote-Name
          - Remote-Email
  
    # Authelia basic auth guard
    auth-basic:
      forwardauth:
        address: http://auth:9091/api/verify?auth=basic # replace auth with your authelia container name
        trustForwardHeader: true
        authResponseHeaders:
          - Remote-User
          - Remote-Groups
          - Remote-Name
          - Remote-Email

# Only use secure ciphers - https://ssl-config.mozilla.org/#server=traefik&version=2.6.0&config=intermediate&guideline=5.6
tls:
  options:
    default:
      minVersion: VersionTLS12
      cipherSuites:
        - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
        - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
        - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305

Kita tinggal sesuaikan dengan infrastruktur micro-services apps yang ada.

File Storage SSL/TLS certificates

Traefik membutuhkan file bernama acme.json untuk menyimpan informasi SSL certificate. Jadi, kita buat file ini dan ganti permission yang sesuai.

touch /home/appdata/traefik/data/acme.json; chmod 600 /home/appdata/traefik/data/acme.json

API Token Cloudflare

Untuk mendapatkan token API, login ke akun cloudflare kita di link: https://dash.cloudflare.com. Masuk ke My Profile, pilih API tokens dan pilih Create Token. Gunakan template Edit zone DNS. Sesuaikan seperti settingan dibawah, klik Continue to Summary kemudian Create Token.

  • Zone – Zone Settings – Read
  • Zone – Zone – Read
  • Zone – DNS – Edit
  • Zone Resources – Include – All Zones

Docker Compose

Sekarang kita buat file docker-compose.yml menggunakan editor favorit. Jika lebih suka membuat docker stack, bisa dengan portainer atau dockge.

nano /home/appdata/traefik/docker-compose.yml
version: '3'
services:
  traefik:
    container_name: traefik
    image: traefik:latest
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    ports:
      - 80:80
      - 443:443
      - 8080:8080 # Dashboard Web UI
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /home/appdata/traefik/data/:/etc/traefik/
    networks:
      - proxy 
    environment:
      - CF_DNS_API_TOKEN=YOUR_SUPER_SECURE_CLOUDFLARE_API_TOKEN
    labels:
      - traefik.enable=true   # Enable Traefik reverse proxy for the Traefik dashboard.
      - traefik.http.routers.api.rule=Host(`traefik.DOMAINKITA.COM`)    # Define the subdomain for the traefik dashboard.
      - traefik.http.routers.api.entryPoints=https    # Set the Traefik entry point.
      - traefik.http.routers.api.service=api@internal    # Enable Traefik API.

networks:
  proxy:    
    driver: bridge
    external: true

Setelah kita sudah mempersiapkan file-file konfigurasi, jalankan perintah:

docker-compose -f /home/appdata/traefik/docker-compose.yml up -d

Proksi kan Aplikasi

Yang kita lakukan di beberapa aplikasi docker yang kita buat dan mengarahkan WebUInya via traefik, kita hanya menambahkan label atau menambahkan metadata di docker object supaya traefik bisa otomatis mengambilnya. Jika menggunakan docker-compose cukup tambahkan baris dibawah label:

    labels:
      - traefik.enable=true
      - traefik.http.routers.app.entryPoints=https

Misalnya saya ingin buat container Excalidraw dengan docker-compose dan WebUI diproksikan via traefik:

version: "3.3"
services:
  excalidraw:
    container_name: excalidraw
    image: excalidraw/excalidraw
    restart: unless-stopped
    networks:
      - proxy
    ports:
      - 8080:80/tcp
    environment:
      - TZ=Asia/Bangkok
    labels:
      - traefik.enable=true
      - traefik.http.routers.excalidraw.entryPoints=https
networks:
  proxy:
    driver: bridge
    external: true
    

Web UI App Docker HTTPS

Secara default Traefik terkoneksi dengan aplikasi via HTTP. Jika aplikasi kita hanya mengexpose WebUI via HTTPS, kita harus memberitahukan Traefik agar menggunakan protocol ini dengan menambahkan label:

labels:
      - traefik.enable=true
      - traefik.http.routers.app.entryPoints=https
      - traefik.http.services.app.loadbalancer.server.scheme=https

App Docker Multiple Port

Jika Aplikasi docker kita mengexpose port lebih dari satu, misalnya aplikasi kita mempunyai port untuk WebUI di 8080 dan ada port lain yang di expose juga. Kita harus memberitahu Traefik bahwa Web-UI nya di port 8080 dengan menambahkan label::

 labels:
      - traefik.enable: true
      - traefik.http.routers.app.entryPoints=https
      - traefik.http.services.app.loadbalancer.server.port=8080

Pilih Nama Subdomain Manual

Kalau kita pakai label diatas, Traefik akan otomatis membuat subdomain dengan nama container. Kita juga bisa secara manual memberikan nama subdomain untuk App kita dengan menambahkan label:

labels:
      - traefik.enable=true
      - traefik.http.routers.app.entryPoints=https
      - traefik.http.routers.app.rule=Host(`draw.domainkita.com`)
Tags ,

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *