Traefik — современный reverse proxy и load balancer с автоматическим обнаружением сервисов через Docker-метки. Главная особенность — автоматическое получение SSL-сертификатов Let's Encrypt без ручной настройки.

Возможности

  • Автоматическое обнаружение контейнеров через Docker labels
  • Автоматические SSL-сертификаты Let's Encrypt (TLS Challenge)
  • Маршрутизация по домену и пути (Host(), PathPrefix())
  • Middleware: redirect, strip prefix, basic auth, rate limit
  • Веб-дашборд для мониторинга роутеров и сервисов
  • Поддержка HTTP, TCP, UDP

Установка через Docker Compose

mkdir -p /opt/traefik && cd /opt/traefik

Файл /opt/traefik/docker-compose.yml:

services: traefik: image: traefik:latest container_name: traefik restart: unless-stopped ports: - "80:80" - "443:443" command: - "--api.dashboard=true" - "--api.insecure=false" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--providers.file.filename=/etc/traefik/dynamic.yml" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--entrypoints.web.http.redirections.entryPoint.to=websecure" - "--entrypoints.web.http.redirections.entryPoint.scheme=https" - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true" - "--certificatesresolvers.letsencrypt.acme.email=admin@example.com" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" dns: - 8.8.8.8 - 1.1.1.1 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - letsencrypt:/letsencrypt - ./dynamic.yml:/etc/traefik/dynamic.yml:ro networks: - proxy networks: proxy: name: traefik_proxy driver: bridge volumes: letsencrypt:

Динамическая конфигурация

Файл /opt/traefik/dynamic.yml — для роутеров которые нельзя задать через labels (например, дашборд):

http: routers: dashboard: rule: "Host(`example.com`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))" service: api@internal entryPoints: - websecure tls: certResolver: letsencrypt

Запуск

docker compose up -d

Подключение контейнера к Traefik

Добавьте labels к любому контейнеру — Traefik автоматически создаст роутер и запросит сертификат:

labels: - "traefik.enable=true" - "traefik.http.routers.myapp.rule=Host(`myapp.example.com`)" - "traefik.http.routers.myapp.entrypoints=websecure" - "traefik.http.routers.myapp.tls.certresolver=letsencrypt" - "traefik.http.services.myapp.loadbalancer.server.port=8080" networks: - traefik_proxy

Дашборд

Доступен по адресу https://example.com/dashboard/ (слеш на конце обязателен). Показывает все роутеры, сервисы, middleware и состояние сертификатов.

Примечания

  • Добавьте dns: [8.8.8.8, 1.1.1.1] если сервер использует systemd-resolved — без этого Traefik не сможет обратиться к серверам Let's Encrypt.
  • exposedbydefault=false — безопасная настройка: Traefik видит только контейнеры с явным traefik.enable=true.
  • Файл acme.json хранит сертификаты и автоматически обновляется за 30 дней до истечения.