Traefik 3: установка, настройка и примеры для Docker

Traefik — обратный прокси, созданный для контейнеров. Он сам обнаруживает запущенные сервисы Docker, читает правила маршрутизации из их меток и автоматически выпускает SSL-сертификаты. Чтобы опубликовать новый сервис, не нужно править конфигурацию прокси — достаточно добавить несколько строк в его docker-compose.yml.
Основные понятия
- Entrypoint — порт, на котором Traefik принимает запросы: обычно 80 и 443.
- Router — правило, по которому запрос направляется сервису, например по имени домена.
- Service — контейнер, который обрабатывает запрос.
- Middleware — промежуточная обработка: авторизация, перенаправления, заголовки, ограничение частоты запросов.
- Certificate resolver — способ получения SSL-сертификатов.
Что понадобится
- VPS с Docker и Docker Compose — см. инструкцию по установке;
- домены, A-записи которых указывают на сервер;
- свободные порты 80 и 443.
Шаг 1. Установка Traefik
mkdir -p ~/traefik && cd ~/traefik
Создайте docker-compose.yml:
services:
traefik:
image: traefik:v3
container_name: traefik
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=proxy
- --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=admin@example.com
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.le.acme.tlschallenge=true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- proxy
networks:
proxy:
name: proxy
Что здесь настроено:
exposedbydefault=false— Traefik публикует только те контейнеры, где это явно разрешено меткой;- весь трафик с порта 80 перенаправляется на HTTPS;
- сертификаты Let’s Encrypt выпускаются автоматически и хранятся в каталоге
letsencrypt; - общая сеть
proxyсвязывает Traefik с остальными контейнерами.
Запустите:
docker compose up -d
Шаг 2. Публикация первого сервиса
Создайте в отдельном каталоге docker-compose.yml тестового сервиса:
services:
whoami:
image: traefik/whoami
restart: unless-stopped
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.whoami.rule=Host(`whoami.example.com`)
- traefik.http.routers.whoami.entrypoints=websecure
- traefik.http.routers.whoami.tls.certresolver=le
networks:
proxy:
external: true
docker compose up -d
Через несколько секунд сервис откроется по адресу https://whoami.example.com с действующим сертификатом. Порты контейнера публиковать не нужно: Traefik обращается к нему по внутренней сети.
Если контейнер слушает несколько портов или порт не указан в образе, задайте его явно:
- traefik.http.services.whoami.loadbalancer.server.port=80
Шаг 3. Панель мониторинга
Встроенная панель показывает все маршруты, сервисы и ошибки конфигурации. Открывать её без пароля нельзя.
Создайте хеш пароля:
sudo apt install -y apache2-utils
htpasswd -nB admin
Добавьте в command контейнера Traefik строку:
- --api.dashboard=true
и метки в тот же сервис, удвоив каждый знак $ в хеше:
labels:
- traefik.enable=true
- traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)
- 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=dashboard-auth
- traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$2y$$05$$...
После docker compose up -d панель доступна по адресу https://traefik.example.com.
Полезные middleware
Middleware объявляется меткой и подключается к маршруту по имени. Несколько middleware перечисляются через запятую.
Заголовки безопасности:
- traefik.http.middlewares.secure.headers.stsSeconds=31536000
- traefik.http.middlewares.secure.headers.contentTypeNosniff=true
- traefik.http.middlewares.secure.headers.frameDeny=true
- traefik.http.routers.whoami.middlewares=secure
Ограничение частоты запросов:
- traefik.http.middlewares.limit.ratelimit.average=50
- traefik.http.middlewares.limit.ratelimit.burst=100
Доступ только с определённых адресов:
- traefik.http.middlewares.office.ipallowlist.sourcerange=198.51.100.0/24
Перенаправление с www на основной домен:
- traefik.http.routers.site-www.rule=Host(`www.example.com`)
- traefik.http.routers.site-www.middlewares=to-apex
- traefik.http.middlewares.to-apex.redirectregex.regex=^https://www\.(.*)
- traefik.http.middlewares.to-apex.redirectregex.replacement=https://$${1}
- traefik.http.middlewares.to-apex.redirectregex.permanent=true
Wildcard-сертификат
Сертификат для всех поддоменов выпускается через проверку DNS. Замените строку tlschallenge на параметры своего DNS-провайдера, например Cloudflare:
- --certificatesresolvers.le.acme.dnschallenge=true
- --certificatesresolvers.le.acme.dnschallenge.provider=cloudflare
и передайте токен API в переменной окружения CF_DNS_API_TOKEN. В маршруте укажите домены сертификата:
- traefik.http.routers.app.tls.domains[0].main=example.com
- traefik.http.routers.app.tls.domains[0].sans=*.example.com
Переход с Traefik 2
Конфигурация версии 2 в основном совместима с третьей. Что стоит проверить:
- Синтаксис правил. В
HostRegexpиPathPrefixбольше нет именованных шаблонов вида{name:regex}— используются обычные регулярные выражения. На время перехода можно включить прежний синтаксис параметром--core.defaultRuleSyntax=v2. - Docker Swarm. Режим Swarm вынесен из провайдера Docker в отдельный провайдер
swarm. - Middleware
ipWhiteListпереименован вipAllowList.
Перед обновлением прочитайте официальное руководство по миграции и проверьте конфигурацию на тестовом сервере.
Диагностика
docker logs traefik
- 404 page not found — Traefik не нашёл маршрут: проверьте метку
traefik.enable=true, правилоHostи общую сеть. - Сертификат не выпускается — домен не указывает на сервер или закрыт порт 443. Let’s Encrypt ограничивает число попыток, поэтому при отладке включите тестовый сервер:
--certificatesresolvers.le.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory. - Gateway Timeout — контейнер не подключён к сети
proxyили указан неверный порт сервиса. - Подробный журнал — добавьте
--log.level=DEBUG.
Traefik или Nginx Proxy Manager
Traefik удобен, когда сервисов много и они часто меняются: вся конфигурация живёт рядом с сервисом и хранится в Git. Если привычнее настраивать прокси мышкой в веб-интерфейсе, выберите Nginx Proxy Manager.
Видеоинструкция
Видео снято для Traefik 2: общие принципы и структура меток остались прежними.



