// Engineering Log

Прокси-серверы: Часть 8 — Traefik

Опубликовано 22.09.2026

// Быстрый маршрут

Эта статья относится к теме Деплой и стабильная работа.

Traefik (произносится «трафик») — обратный прокси и балансировщик нагрузки, который берёт маршруты не из статического файла, а из окружения: из Docker, Kubernetes, файлов или систем обнаружения сервисов. Запустили контейнер с нужными метками — Traefik сам создал для него маршрут и получил сертификат. Остановили — маршрут исчез.

Проект написан на Go, распространяется под лицензией MIT; актуальная версия на сентябрь 2026 года — v3.7.13 (04.09.2026).

Как устроен Traefik

Конфигурация Traefik делится на две части.

  • Статическая задаётся при запуске (ключами командной строки, файлом или переменными окружения): на каких портах принимать трафик (entry points), откуда брать маршруты (providers), как получать сертификаты (certificate resolvers). Чтобы её изменить, Traefik перезапускают.
  • Динамическая приходит от провайдеров и меняется на лету: маршрутизаторы (routers) с правилами вроде Host(`app.example.ru`) или PathPrefix(`/api`), сервисы (services) — куда отправлять запрос, и промежуточные обработчики (middlewares) — авторизация, заголовки, перенаправления, ограничение частоты запросов.

Цепочка простая: запрос приходит на entry point, подходящий router выбирает service, по пути его обрабатывают middlewares.

Рабочий пример: Traefik и приложение в Docker Compose

Ниже — полная конфигурация: Traefik принимает HTTP и HTTPS, перенаправляет HTTP на HTTPS, получает сертификат Let’s Encrypt через проверку HTTP-01 и публикует тестовое приложение whoami по адресу app.example.ru.

yaml
services:
  traefik:
    image: traefik:v3.7
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entryPoints.web.address=:80"
      - "--entryPoints.websecure.address=:443"
      - "--entryPoints.web.http.redirections.entryPoint.to=websecure"
      - "--entryPoints.web.http.redirections.entryPoint.scheme=https"
      - "--certificatesresolvers.le.acme.email=admin@example.ru"
      - "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"
    restart: unless-stopped

  app:
    image: traefik/whoami
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app.rule=Host(`app.example.ru`)"
      - "traefik.http.routers.app.entrypoints=websecure"
      - "traefik.http.routers.app.tls.certresolver=le"
      - "traefik.http.services.app.loadbalancer.server.port=80"

Что здесь важно:

  • exposedbydefault=false — Traefik публикует только контейнеры с меткой traefik.enable=true. Без этого наружу попадут все контейнеры на сервере, включая базы данных с открытыми портами.
  • Перенаправление с web на websecure совместимо с проверкой HTTP-01: по документации Traefik запросы проверки проходят на порт 80 и при включённом перенаправлении.
  • acme.json — файл, где Traefik хранит полученные сертификаты. Он должен лежать в томе, иначе после пересоздания контейнера сертификаты будут запрашиваться заново.
  • loadbalancer.server.port указывает порт внутри контейнера приложения. Публиковать этот порт через ports не нужно: трафик идёт по внутренней сети Docker.

Чтобы добавить второй сервис, достаточно описать его с такими же метками и своим правилом Host — конфигурацию самого Traefik трогать не придётся.

Middlewares: авторизация, заголовки, ограничения

Middlewares подключаются метками. Пример — закрыть служебный сервис паролем:

yaml
    labels:
      - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$..."
      - "traefik.http.routers.admin.middlewares=auth"

Хеш пароля готовят утилитой htpasswd; знаки $ в docker-compose нужно удваивать, иначе Compose примет их за переменные. Из готовых middlewares чаще всего используют BasicAuth, Headers (заголовки безопасности), RedirectScheme, StripPrefix и RateLimit.

Панель управления

Traefik показывает текущие маршруты, сервисы и ошибки в веб-панели (--api.dashboard=true). Открывать её нужно через отдельный маршрутизатор с авторизацией и HTTPS. Режим --api.insecure=true публикует панель без защиты и годится только для локальных экспериментов.

Traefik в Kubernetes

В Kubernetes Traefik работает как ingress-контроллер: читает стандартные объекты Ingress, собственные ресурсы IngressRoute и Gateway API. Логика та же — маршруты появляются вместе с сервисами, сертификаты выпускает тот же механизм certificate resolvers.

Типичные ошибки

  • Нет exposedbydefault=false. Traefik публикует всё подряд, в том числе служебные контейнеры.
  • Контейнер в другой сети. Если приложение и Traefik не в общей сети Docker, маршрут появится, но запросы будут падать с ошибкой 502. Держите их в одной сети или укажите её в --providers.docker.network.
  • Закрыт порт 80. Проверка HTTP-01 идёт на порт 80; без него сертификат не выпустится.
  • Сокет Docker без ограничений. Доступ к /var/run/docker.sock равен правам root на хосте. Монтируйте его только для чтения, а в чувствительных средах ставьте между Traefik и Docker прокси для сокета с ограниченным набором методов API.
  • Одинарные $ в хеше пароля. Compose подставит вместо них пустые переменные, и авторизация перестанет работать.
  • Открытая панель. api.insecure=true на сервере в интернете — прямой доступ к схеме вашей инфраструктуры.

Когда выбирать Traefik

Traefik оправдан там, где сервисы часто появляются и исчезают: Docker-хосты с десятком контейнеров, среды для веток разработки, Kubernetes. Для нескольких постоянных сайтов на VPS проще Caddy, для сложной балансировки и TCP — HAProxy. Traefik не раздаёт статические файлы сам, поэтому сайт на обычных файлах всё равно придётся отдавать отдельным веб-сервером. Сравнение всех пяти серверов — в статье «Caddy vs. Traefik vs. HAProxy vs. Nginx vs. Apache».

// Похожая задача

Если у вас похожая ситуация

Эта статья относится к одной из рабочих тем. Можно продолжить чтение по теме, перейти на главную, чтобы понять, чем я занимаюсь, или сразу открыть услуги.

Тема статьи

Деплой и стабильная работа

Docker, CI/CD, релизы, мониторинг, observability и разбор инцидентов.

Часто с этим приходят

  • Настроить деплой без ручных действий и хаоса
  • Подключить мониторинг, алерты и базовую observability
  • Разобрать инциденты и стабилизировать production

// Следующий шаг

Если вам нужна не только статья, а помощь по этой теме, удобнее сразу перейти в услугу. Главная и подборка материалов остаются рядом.

Открыть услуги

// Reviews

Отзывы по теме

Михаил - великолепный исполнитель! Чувствуется, что человек с огромным опытом. Работа была сделано четко, в срок. Пришлось повозиться из-за неидеальности проекта, который устанавливали на сервер, но Михаил внимательно и вдумчиво подсказывал как и что сделать. В итоге все заработало! Всем рекомендую для кого, важно качество работы!

Михаил - великолепный исполнитель! Чувствуется, что человек с огромным опытом. Работа была сделано четко, в срок. Пришлось повозиться из-за неидеальности проекта, который устанавливали на сервер, но Михаил внимательно и …

N_Konstantin

Настройка vps, настройка сервера

10.10.2025 · ★ 5/5

Освоившийся покупатель

// Contact

Нужна помощь?

Свяжись со мной и я помогу решить проблему

Написать в Telegram

Отвечаю в течение рабочего дня (03:00–13:00 GMT)

Или оставьте заявку здесь:

Подтвердите, что вы не бот.

Написать и получить быстрый ответ