Traefik: reverse proxy для Docker и микросервисов
Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет админской практики на клиентских серверах у меня было всё: nginx с ручной выдачей сертификатов, HAProxy со сложными конфигами, Apache с mod_proxy. Когда инфраструктура переехала в контейнеры, я полностью перешёл на Traefik. Он сам обнаруживает сервисы, сам получает SSL, сам обновляет маршруты. В итоге — меньше YAML в Git, меньше боли на продакшене.
Ключевые концепции
| Понятие | Описание |
|---|---|
| EntryPoint | Порт, который слушает Traefik: web (80), websecure (443), tcp-mqtt (1883) |
| Router | Правило маршрутизации: Host, Path, Headers |
| Service | Куда проксирует: контейнер, группа контейнеров, внешний URL |
| Middleware | Обработка: basicauth, redirect, rate-limit, compress |
| Provider | Источник конфигурации: Docker, File, Kubernetes, Consul |
Базовый docker-compose
services:
traefik:
image: traefik:v3.1
command:
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
- --entrypoints.websecure.address=:443
- --certificatesresolvers.le.acme.email=boss@itfresh.ru
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.le.acme.tlschallenge=true
- --log.level=INFO
- --accesslog=true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
labels:
- traefik.enable=true
- traefik.http.routers.dashboard.rule=Host(`traefik.itfresh.ru`)
- traefik.http.routers.dashboard.entrypoints=websecure
- traefik.http.routers.dashboard.tls.certresolver=le
- traefik.http.routers.dashboard.service=api@internal
- traefik.http.routers.dashboard.middlewares=auth
- traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xxx$$yyy
restart: unless-stopped
networks: [ edge ]
networks:
edge:
external: true
Подключение сервиса
services:
portal:
image: itfresh/portal:latest
networks: [ edge ]
labels:
- traefik.enable=true
- traefik.http.routers.portal.rule=Host(`portal.itfresh.ru`)
- traefik.http.routers.portal.entrypoints=websecure
- traefik.http.routers.portal.tls.certresolver=le
- traefik.http.services.portal.loadbalancer.server.port=8080
- traefik.http.routers.portal.middlewares=compress,rate-limit
- traefik.http.middlewares.compress.compress=true
- traefik.http.middlewares.rate-limit.ratelimit.average=100
- traefik.http.middlewares.rate-limit.ratelimit.burst=200
DNS-01 для wildcard
Если нужен сертификат *.corp.itfresh.ru — TLS challenge не подойдёт. Настраиваем DNS-01 через Cloudflare API:
environment:
- CF_DNS_API_TOKEN=xxx_cloudflare_token
command:
- --certificatesresolvers.le.acme.dnschallenge=true
- --certificatesresolvers.le.acme.dnschallenge.provider=cloudflare
- --certificatesresolvers.le.acme.email=boss@itfresh.ru
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
# В labels
- traefik.http.routers.api.tls.domains[0].main=corp.itfresh.ru
- traefik.http.routers.api.tls.domains[0].sans=*.corp.itfresh.ru
Middleware: частые полезные
- redirectScheme — принудительный HTTP→HTTPS.
- stripPrefix — отрезать префикс пути перед проксированием.
- headers — HSTS, X-Frame-Options, CSP.
- ipWhiteList — доступ только из офисного IP.
- forwardAuth — интеграция с Authelia, Authentik для SSO.
- traefik.http.middlewares.security.headers.stsSeconds=31536000
- traefik.http.middlewares.security.headers.stsIncludeSubdomains=true
- traefik.http.middlewares.security.headers.contentTypeNosniff=true
- traefik.http.middlewares.security.headers.browserXssFilter=true
- traefik.http.middlewares.ipoffice.ipwhitelist.sourcerange=10.0.0.0/16,203.0.113.0/24
File provider для внешних сервисов
Не всё крутится в Docker. Для легаси-серверов используем file provider:
# /etc/traefik/dynamic.yaml
http:
routers:
legacy:
rule: "Host(`legacy.itfresh.ru`)"
service: legacy-svc
entrypoints: [ websecure ]
tls: { certResolver: le }
services:
legacy-svc:
loadBalancer:
servers:
- url: "http://10.0.5.12:8080"
- url: "http://10.0.5.13:8080"
healthCheck:
path: "/health"
interval: 10s
Дашборд и метрики
Дашборд Traefik показывает маршрутизаторы, сервисы и middleware. Для мониторинга включаем Prometheus endpoint:
command:
- --metrics.prometheus=true
- --metrics.prometheus.entrypoint=metrics
- --entrypoints.metrics.address=:8082
Дальше — стандартный Grafana-дашборд ID 4475 Traefik 2.
Мини-кейс: SaaS с 18 микросервисами
В сентябре 2025 года к нам пришёл SaaS-стартап: 18 Docker-контейнеров на одном Dell Xeon Platinum 8280 (40 ядер) в дата-центре МТС, nginx+certbot на фронтенде, ручные правки конфигов, каждая выкатка — 20 минут стресса. За 2 рабочих дня мы мигрировали на Traefik v3: docker-compose с labels на каждом сервисе, DNS-01 через Cloudflare для wildcard сертификата, middleware security-headers, basicauth на дашборде. После миграции: 0 минут простоя на выкатке нового сервиса (label — и он доступен), 3-кратное уменьшение YAML-конфигов, автоматический SSL для любого нового поддомена. Стоимость миграции — 58 000 руб., окупилась за месяц экономии времени девопса.
Балансировка TCP и UDP
- traefik.tcp.routers.mqtt.rule=HostSNI(`*`)
- traefik.tcp.routers.mqtt.entrypoints=mqtt
- traefik.tcp.services.mqtt.loadbalancer.server.port=1883
# EntryPoint
- --entrypoints.mqtt.address=:1883
Типичные ошибки
- Дашборд открыт в интернет без auth. Любой может видеть структуру сервисов.
- acme.json без mode 600. Traefik просто не стартует с такими правами.
- Docker socket proxy. Для безопасности используйте docker-socket-proxy вместо прямого bind /var/run/docker.sock.
- Нет healthcheck. Traefik продолжает слать трафик на упавший контейнер.
- exposedbydefault=true. Все контейнеры автоматически публикуются — потенциальная утечка.
Настроим Traefik под вашу Docker-инфраструктуру
Миграция с nginx, автоматический SSL, middleware-пайплайны, дашборд с SSO, мониторинг в Prometheus. От 45 000 руб. за площадку до 20 сервисов.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — частые вопросы о Traefik
- Чем Traefik лучше nginx?
- Автоматическое обнаружение контейнеров через labels, встроенный Let's Encrypt, дашборд, middleware pipeline.
- Работает ли Traefik с обычными серверами, не Docker?
- Да, через file provider с YAML или TOML описанием.
- Как защитить дашборд Traefik?
- Через middleware basicauth или forwardauth (Authelia, Authentik).
- Можно ли балансировать TCP/UDP?
- Да, Traefik v3 поддерживает TCP, UDP и HTTP одновременно.
- Сколько RPS держит один Traefik?
- На 4 vCPU обычного сервера — до 30 000 HTTPS RPS.