Traefik v3 jako reverse proxy — routing, TLS i dashboard w praktyce
Traefik automatycznie wykrywa kontenery Dockera i konfiguruje routing. Pokazuję jak skonfigurowałem go w tym projekcie — od HTTP redirect po własne certyfikaty TLS.
Czym jest Traefik?
Traefik to nowoczesny reverse proxy i load balancer, który odróżnia się od Nginx tym, że konfiguruje się dynamicznie. Zamiast ręcznie pisać bloki server {}, Traefik czyta labele z kontenerów Dockera i sam buduje routing.
Podstawowa konfiguracja
W docker-compose.prod.yml Traefik uruchamiam jako pierwszy serwis:
traefik:
image: traefik:v3.6
command:
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.websecure.http.tls=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--providers.file.filename=/etc/traefik/dynamic/traefik_dynamic.yml"
Kluczowe decyzje:
exposedbydefault=false— serwis musi explicite dodać labeltraefik.enable=true, żeby być wystawiony- Redirect z HTTP na HTTPS jest globalny, jeden wpis, działa dla wszystkich serwisów
Routing przez labele
Każdy serwis, który chcę wystawić publicznie, dostaje etykiety:
frontend:
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`portfolio.example.com`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.routers.frontend.tls=true"
- "traefik.http.services.frontend.loadbalancer.server.port=80"
Serwisy wewnętrzne (Blog API, Users API) są w osobnej sieci i nie mają tych labeli — dostępne tylko z sieci microservices.
TLS z własnymi certyfikatami
W projekcie używam własnych certyfikatów (dev) lub Let's Encrypt (produkcja). Konfiguracja TLS jest w pliku dynamicznym:
# infra/dynamic/traefik_dynamic.yml
tls:
certificates:
- certFile: /certs/cert.pem
keyFile: /certs/key.pem
stores:
default:
defaultCertificate:
certFile: /certs/cert.pem
keyFile: /certs/key.pem
Dashboard
Dashboard Traefika jest bardzo przydatny do debugowania — pokazuje aktywne routery, serwisy i middleware. Zabezpieczam go osobną domeną z Basic Auth przez middleware:
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.dashboard.middlewares=auth@file"
Co mi się podoba w Traefikie?
Największy plus to zero restartów przy zmianie konfiguracji. Dodam nowy kontener z odpowiednimi labelami, Traefik wykryje go w ciągu sekund i zacznie routować ruch. W Nginx musiałbym edytować plik konfiguracyjny i przeładować serwis.
Minusem jest krzywa uczenia się — składnia labeli jest specyficzna i łatwo o literówkę, która cicho nic nie robi.