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

Traefik зручний, коли сервісів багато й вони часто змінюються: уся конфігурація живе поруч із сервісом і зберігається в Git. Якщо сайтів небагато й потрібен повний контроль, простіше налаштувати віртуальні хости Nginx вручну. Якщо звичніше налаштовувати проксі у вебінтерфейсі, оберіть Nginx Proxy Manager.

Відеоінструкція

Відео знято для Traefik 2: загальні принципи та структура міток залишилися тими самими.

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

Ця стаття іншими мовами:EnglishРусский