Traefik
Reverse proxy и балансировщик, который сам находит запущенные контейнеры, строит маршруты по их меткам и автоматически получает HTTPS-сертификаты.
Что такое Traefik
Traefik — обратный прокси и балансировщик нагрузки, написанный на Go и рассчитанный на контейнерные среды. Он стоит на входе, принимает HTTP-запросы и раздаёт их сервисам за собой.
То же самое делает Nginx. Отличие Traefik — в способе настройки: он сам обнаруживает сервисы. Traefik подписывается на события Docker и читает маршруты из меток контейнеров. Подняли контейнер с нужными labels — маршрут появился сам, без правки конфига и reload. Убрали — исчез.
Второй аргумент в его пользу: автоматический HTTPS. Traefik сам получает и продлевает SSL-сертификаты Let's Encrypt по ACME — настройка сводится к указанию e-mail.
Как это выглядит
Вся конфигурация маршрута живёт рядом с сервисом, а не в отдельном файле прокси:
services:
traefik:
image: traefik:v3
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.le.acme.email=admin@example.com
- --certificatesresolvers.le.acme.tlschallenge=true
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
app:
image: my-app
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.example.com`)
- traefik.http.routers.app.entrypoints=websecure
- traefik.http.routers.app.tls.certresolver=le
- traefik.http.services.app.loadbalancer.server.port=8080
Здесь нет ни одной строчки про сертификат для app.example.com — Traefik выпустит его сам при первом обращении. Добавление второго сервиса — это ещё один блок с labels, и больше ничего.
Основные понятия
| Понятие | Что это |
|---|---|
| EntryPoint | порт, на котором Traefik слушает: :80, :443 |
| Router | правило, по которому запрос попадает в сервис: Host, Path, Headers |
| Service | куда проксировать, плюс алгоритм балансировки и health check |
| Middleware | что сделать с запросом по пути: редирект, basic-auth, rate limit, сжатие |
| Provider | источник конфигурации: Docker, Kubernetes, файл, Consul |
Важное разделение, из-за которого чаще всего путаются: статическая конфигурация (провайдеры, entrypoints, ACME) задаётся при запуске и требует рестарта, динамическая (роутеры, сервисы, middleware) подхватывается на лету. Метки контейнеров — это динамическая часть.
Middleware — рабочая лошадка: redirectscheme для перевода HTTP на HTTPS, basicauth для быстрой защиты внутренней панели, ratelimit, stripprefix, headers для HSTS. Есть провайдеры Kubernetes (Ingress и свои CRD) и Docker Swarm, так что подход переносится на кластер без смены прокси; метрики отдаются в формате Prometheus, а дашборд висит на 8080 — наружу его выставлять не нужно.
Traefik vs Nginx vs Caddy
| Traefik | Nginx | Caddy | |
|---|---|---|---|
| Конфигурация | метки контейнеров, автообнаружение | свой конфиг, reload руками | Caddyfile, короткий |
| HTTPS | автоматом (ACME) | вручную или через certbot | автоматом |
| Динамика | родная задача | конфиг надо перегенерировать | ограниченно |
| Статика и кеш | слабое место | сильнейшая сторона | средне |
| Порог входа | средний | высокий | низкий |
Выбор по сути такой. Docker Compose-стек, где сервисы приходят и уходят, — Traefik. Раздача статики, тонкий тюнинг, кеширование, предельные нагрузки — Nginx. Один-два сайта и хочется закончить за пять минут — Caddy.
Что важно на практике
- Доступ к Docker-сокету — это root на хосте. Traefik монтирует
/var/run/docker.sockи потому обладает полной властью над машиной. Монтируйте в режиме:ro, не выставляйте дашборд в интернет, а в чувствительных средах ставьте socket-proxy, ограничивающий API. exposedbydefault=false— включайте сразу. Иначе Traefik опубликует наружу каждый контейнер, включая базу данных.- Права на
acme.jsonдолжны быть600, иначе Traefik откажется его читать. Файл кладите на том — при пересоздании контейнера сертификаты не должны выпускаться заново, у Let's Encrypt есть лимиты на выпуск. - Ресурсы: Traefik — один бинарник на Go, ему хватает десятков мегабайт RAM. На фоне сервисов за ним он незаметен.
Связанные термины
- Nginx — главная альтернатива с ручной конфигурацией
- load balancer — одна из ролей Traefik
- Docker Compose — среда, ради которой его и берут
- SSL-сертификат — Traefik выпускает и продлевает их сам
- Прокси-сервер — общий класс, к которому относится reverse proxy
- Portainer — сосед по стеку: GUI к тем же контейнерам
Готовы запустить GPU-задачу?
Запустить GPU-сервер