Traefik — 1. устанавливаем L7 роутер

30 июня 2023

Давайте представим себе простую ситуацию, когда у нас есть веб-сервер, у которого на стандартных портах 80/443 крутятся несколько сайтов и/или других сервисов. В этом случае всё стандартно: разные домены указывает на один IP-адрес сервера, сайты успешно открываются по штатным портам.

Теперь представим себе, что у нас сервисы находятся на разных хостах, виртуальных машинах или в разных контейнерах (LXC, Docker и др.). В этом случае мы будем вынуждены разнести их на различные порты сервера, либо прокидывать разные порты с роутера. В случае с сайтами это приведёт к тому, что мы будем вынуждены заставлять посетителей кроме имени домена вводить ещё и номер порта. Нехорошо… И здесь нам очень поможет Traefik.

Traefik — это обратный прокси с поддержкой Docker. Обратный прокси (reverse proxy) служит для ретрансляции запросов из внешней сети к каким-либо серверам/сервисам внутренней сети. Следующая картинка прекрасно описывает функционал Traefik:

Обратный прокси работает на седьмом уровне сетевой модели OSI, что позволяет ему получать доступ к информации о домене и полном URL, на основе чего и принимаются дальнейшие действия по маршрутизации трафика.

Дополнительные возможности Traefik:

  • Зашифрованное соединение (HTTPS) между клиентом и сервисом даже если изначально сервис этого не поддерживает. Причём Traefik сам может получать и обновлять сертификаты Let’s Encrypt.
  • Доступ по логину/паролю к сервисам.
  • Модификация запросов (изменение URL, переадресация и т.д.).
  • Фильтрация и блокировка запросов.

Некоторые функции также можно расширить с помощью плагинов:

  • Блокировка по странам;
  • блокировка выходных нод TOR;
  • Fail2Ban;
  • запуск контейнеров по запросу;
  • и другое.

Для разворачивания роутера воспользуемся Docker Composer. Скачиваем архив с сайта. Распаковываем содержимое в отдельную папку (например, /home/username/traefik). В результате внутри этой папки должна получиться вот такая структура:

Назначение файлов следующее:

  • docker-compose.yml — файл composer;
  • data/traefik.yml — файл статической конфигурации. Изменения в этом файле применяются только после перезапуска контейнера;
  • data/acme.json — файл для хранения SSL сертификатов;
  • data/custom/host.yml — файл динамической конфигурации. Изменения применяются немедленно.

Содержимое этих файлов необходимо отредактировать.

Здесь обращаем внимание на номер версии Traefik (v3.6.6 последняя на 8 января 2026). Перед изменением версии на более поздние настоятельно рекомендую почитать changelog и убедиться, что конфигурация не противоречит изменениям.

В строке traefik.http.routers.traefik.rule указано имя домена по которому у нас будет открываться панель мониторинга Traefik. Меняем на своё.

Ну и в параметре traefik.http.middlewares.traefik-auth.basicauth.users необходимо указать имя пользователя и пароль для доступа к странице мониторинга. Для создания пары логин:пароль можно воспользоваться следующей командой в Linux:

echo $(htpasswd -nB user) | sed -e s/\\$/\\$\\$/g

В данном файле необходимо только вписать свой e-mail на который система будет генерировать SSL-сертификаты Let’s Encrypt. Это делается в параметре certificatesResolvers - letsEncrypt - acme - email.

Также можно, при необходимости, добавить свои точки входа (entryPoints) кроме стандартных 80/443.

Содержимое этого файла не трогаем, по-умолчанию он пустой. Затем Traefik туда добавит содержимое сертификатов. Но обязательно нужно изменить права доступа к этому файлу, иначе ничего работать не будет:

chmod 0600 data/acme.json

Самый интересный файл. Именно в него прописываются все домены, фильтры, сервера и т.д. Внесённые в этот файл изменения применяются сразу же после сохранения. Файл состоит из трёх основных секций:

  • routers — служит для указания условий маршрутизации трафика. У каждого «роутера» могут быть следующие параметры:
    • entryPoints — одна или несколько точек входа (указанные соответственно в traefik.yml);
    • service — сервис, на который пересылать запрос;
    • rule — правило соответствия трафика роутеру;
    • tls — параметры SSL сертификатов;
    • middlewares — один или несколько модификаторов.
  • middlewares — здесь указываются сами модификаторы. Это может быть изменение URL, блокировка запроса и т.д.
  • services — список сервисов, то есть Web-серверов, на которые будут маршрутизироваться запросы.

Рассмотрим следующий случай: имеется три домена и два веб-сервера в локальной сети или в контейнерах. При этом один из серверов принимает запросы на порт 8080, сам же сайт должен открываться на стандартном 80.

Сервисы в файле конфигурации запишутся следующим образом:

http:
  services:
    web-server1:
      loadBalancer:
        servers:
          - url: http://192.0.2.10/
        passHostHeader: true 
    web-server2:
      loadBalancer:
        servers:
          - url: http://192.0.2.20:8080/
        passHostHeader: true 

Теперь пример модификатора, который будет автоматически заменять http: на https: :

http:
  middlewares:
    http-to-https:
      redirectScheme:
        scheme: https
        permanent: true

Теперь собираем конфигурацию роутеров. Пусть домены связаны с серверами следующим образом:

  • example.com на сервере 192.0.2.10. Автоматический редирект на https. Также доступен и с www.
  • svc1.example.com доступен только по https на том же сервере.
  • test.example на втором сервере 192.0.2.20. Только http.

В результате получаем такую конфигурацию:

http:
  routers:
    example-ssl:
      entryPoints:
        - https
      service: web-server1
      rule: Host(`example.com`) || Host(`www.example.com`)
      tls:
        certResolver: letsEncrypt

    example:
      entryPoints:
        - http
      service: web-server1
      middlewares:
        - "http-to-https"
      rule: Host(`example.com`) || Host(`www.example.com`)

    svc1-example:
      entryPoints:
        - https
      service: web-server1
      rule: Host(`svc1.example.com`)
      tls:
        certResolver: letsEncrypt

    test-example:
      entryPoints:
        - http
      service: web-server2
      rule: Host(`test.example`)

Думаю этого примера вполне достаточно, чтобы понять логику построения файла конфигурации.

Теперь собираем контейнер. Для этого в каталоге с файлом docker-compose.yml выполняем команду:

sudo docker-compose up -d

После этого у нас должен запуститься контейнер traefik, а по указанному в конфигурации адресу https://dashboard.example.com должна открыться страница мониторинга:

Остаётся только проверить корректность работы всех сервисов по их доменным именам.

  • docker/traefik_ustanavlivaem_l7_router.txt
  • Последнее изменение: 21.01.2026 15:21
  • r0wbh