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.
 

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: [email protected]
      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:
      - [email protected]
      - 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
