Co to jest Traefik?

Traefik to dynamiczny serwer proxy oraz równoważący obciążenie o otwartym kodzie źródłowym. Często używany jest jako narzędzie do zarządzania ruchem w środowiskach kontenerowych, takich jak Docker. To narzędzie umożliwia automatyczne przekierowywanie ruchu sieciowego do różnych serwisów na podstawie zdefiniowanych reguł konfiguracyjnych. Dodatkowo, obsługuje wiele protokołów komunikacyjnych, w tym HTTP, TCP oraz UDP.

W tym poradniku pokażę Ci jak skonfigurować Traefik w Dockerze.

Zalety korzystania z Traefik

Traefik to narzędzie do odwzorowywania ruchu sieciowego w architekturze mikroserwisowej. Jego główne zalety to:

  • Dynamiczna konfiguracja: Automatyczne wykrywanie nowych usług i dostosowywanie routingu.
  • Obsługa wielu źródeł danych: Możliwość integracji z różnymi źródłami konfiguracji.
  • Wsparcie dla kontenerów: Łatwe zarządzanie ruchem w kontenerach Docker i innych technologiach.
  • Wbudowane zabezpieczenia: Wsparcie dla certyfikatów SSL, autoryzacji i uwierzytelniania.
  • Loadbalancer: Rozkładanie ruchu w sposób równomierny na dostępne usługi.
  • Współpraca z wieloma systemami: Integracja z narzędziami monitorującymi i orkiestratorami.

reverse-proxy

Konfiguracja w środowisku Docker:

Pierwszym krokiem jest utworzenie struktury katalogów dla Traefika:

mkdir traefik
cd traefik
mkdir data
cd data
touch acme.json
chmod 600 acme.json
touch config.yml

Struktura katalogów powinna prezentować się w następujący sposób:

./traefik
├── data
│   ├── acme.json
│   ├── config.yml
└── docker-compose.yml

Plik traefik.yml będzie wyglądał następująco:

api:
  dashboard: true
  debug: true
entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"
serversTransport:
  insecureSkipVerify: true
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
  file:
    filename: /config.yml
certificatesResolvers:
  cloudflare:
    acme:
      email: you@example.com
      storage: acme.json
      dnsChallenge:
        provider: cloudflare
        resolvers:
          - "1.1.1.1:53"
          - "1.0.0.1:53"

Następnie tworzymy sieć, która będzie używana przez Traefika, nazwijmy ją “proxy”:

docker network create proxy

Plik docker-compose.yml będzie wyglądał tak:

version: '3'

services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    ports:
      - 80:80
      - 443:443
    environment:
      - CF_API_EMAIL=user@example.com
      - CF_DNS_API_TOKEN=YOUR_API_TOKEN
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /home/username/traefik/data/traefik.yml:/traefik.yml:ro
      - /home/username/traefik/data/acme.json:/acme.json
      - /home/username/traefik/data/config.yml:/config.yml:ro
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`traefik-dashboard.local.example.com`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=USER:BASIC_AUTH_PASSWORD"
      - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https"
      - "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik-dashboard.local.example.com`)"
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
      - "traefik.http.routers.traefik-secure.tls=true"
      - "traefik.http.routers.traefik-secure.tls.certresolver=cloudflare"
      - "traefik.http.routers.traefik-secure.tls.domains[0].main=local.example.com"
      - "traefik.http.routers.traefik-secure.tls.domains[0].sans=*.local.example.com"
      - "traefik.http.routers.traefik-secure.service=api@internal"

networks:
  proxy:
    external: true

Następnie w katalogu data tworzymy plik config.yml.

Ustawienie hasła BasicAuth:

sudo apt update
sudo apt install apache2-utils

Generowanie hasha hasła dla BasicAuth:

echo $(htpasswd -nb "<USER>" "<PASSWORD>") | sed -e s/\\$/\\$\\$/g