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 — файл динамической конфигурации. Изменения применяются немедленно.
Содержимое этих файлов необходимо отредактировать.
docker-compose.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
data/traefik.yml
В данном файле необходимо только вписать свой e-mail на который система будет генерировать SSL-сертификаты Let’s Encrypt. Это делается в параметре certificatesResolvers - letsEncrypt - acme - email.
Также можно, при необходимости, добавить свои точки входа (entryPoints) кроме стандартных 80/443.
data/acme.json
Содержимое этого файла не трогаем, по-умолчанию он пустой. Затем Traefik туда добавит содержимое сертификатов. Но обязательно нужно изменить права доступа к этому файлу, иначе ничего работать не будет:
chmod 0600 data/acme.json
data/custom/host.yml
Самый интересный файл. Именно в него прописываются все домены, фильтры, сервера и т.д. Внесённые в этот файл изменения применяются сразу же после сохранения. Файл состоит из трёх основных секций:
- 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 должна открыться страница мониторинга:
Остаётся только проверить корректность работы всех сервисов по их доменным именам.



