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
Traefik зручний, коли сервісів багато й вони часто змінюються: уся конфігурація живе поруч із сервісом і зберігається в Git. Якщо сайтів небагато й потрібен повний контроль, простіше налаштувати віртуальні хости Nginx вручну. Якщо звичніше налаштовувати проксі у вебінтерфейсі, оберіть Nginx Proxy Manager.
Відеоінструкція
Відео знято для Traefik 2: загальні принципи та структура міток залишилися тими самими.



