1. Блог
  2. Мануалы

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

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

Traefik — обратный прокси, созданный для контейнеров. Он сам обнаруживает запущенные сервисы Docker, читает правила маршрутизации из их меток и автоматически выпускает SSL-сертификаты. Чтобы опубликовать новый сервис, не нужно править конфигурацию прокси — достаточно добавить несколько строк в его docker-compose.yml.

Основные понятия

  • Entrypoint — порт, на котором Traefik принимает запросы: обычно 80 и 443.
  • Router — правило, по которому запрос направляется сервису, например по имени домена.
  • Service — контейнер, который обрабатывает запрос.
  • Middleware — промежуточная обработка: авторизация, перенаправления, заголовки, ограничение частоты запросов.
  • Certificate resolver — способ получения SSL-сертификатов.

Что понадобится

Шаг 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: общие принципы и структура меток остались прежними.

YouTube video
#traefik#docker#reverse proxy#ssl#let's encrypt

Эта статья на других языках:EnglishУкраїнська