Self-hosted Apps

Traefik

Reverse proxy и балансировщик, который сам находит запущенные контейнеры, строит маршруты по их меткам и автоматически получает HTTPS-сертификаты.

Что такое Traefik

Traefik — обратный прокси и балансировщик нагрузки, написанный на Go и рассчитанный на контейнерные среды. Он стоит на входе, принимает HTTP-запросы и раздаёт их сервисам за собой.

То же самое делает Nginx. Отличие Traefik — в способе настройки: он сам обнаруживает сервисы. Traefik подписывается на события Docker и читает маршруты из меток контейнеров. Подняли контейнер с нужными labels — маршрут появился сам, без правки конфига и reload. Убрали — исчез.

Второй аргумент в его пользу: автоматический HTTPS. Traefik сам получает и продлевает SSL-сертификаты Let's Encrypt по ACME — настройка сводится к указанию e-mail.

Как это выглядит

Вся конфигурация маршрута живёт рядом с сервисом, а не в отдельном файле прокси:

services:
  traefik:
    image: traefik:v3
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.le.acme.email=admin@example.com
      - --certificatesresolvers.le.acme.tlschallenge=true
      - --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt

  app:
    image: my-app
    labels:
      - traefik.enable=true
      - traefik.http.routers.app.rule=Host(`app.example.com`)
      - traefik.http.routers.app.entrypoints=websecure
      - traefik.http.routers.app.tls.certresolver=le
      - traefik.http.services.app.loadbalancer.server.port=8080

Здесь нет ни одной строчки про сертификат для app.example.com — Traefik выпустит его сам при первом обращении. Добавление второго сервиса — это ещё один блок с labels, и больше ничего.

Основные понятия

Понятие Что это
EntryPoint порт, на котором Traefik слушает: :80, :443
Router правило, по которому запрос попадает в сервис: Host, Path, Headers
Service куда проксировать, плюс алгоритм балансировки и health check
Middleware что сделать с запросом по пути: редирект, basic-auth, rate limit, сжатие
Provider источник конфигурации: Docker, Kubernetes, файл, Consul

Важное разделение, из-за которого чаще всего путаются: статическая конфигурация (провайдеры, entrypoints, ACME) задаётся при запуске и требует рестарта, динамическая (роутеры, сервисы, middleware) подхватывается на лету. Метки контейнеров — это динамическая часть.

Middleware — рабочая лошадка: redirectscheme для перевода HTTP на HTTPS, basicauth для быстрой защиты внутренней панели, ratelimit, stripprefix, headers для HSTS. Есть провайдеры Kubernetes (Ingress и свои CRD) и Docker Swarm, так что подход переносится на кластер без смены прокси; метрики отдаются в формате Prometheus, а дашборд висит на 8080 — наружу его выставлять не нужно.

Traefik vs Nginx vs Caddy

Traefik Nginx Caddy
Конфигурация метки контейнеров, автообнаружение свой конфиг, reload руками Caddyfile, короткий
HTTPS автоматом (ACME) вручную или через certbot автоматом
Динамика родная задача конфиг надо перегенерировать ограниченно
Статика и кеш слабое место сильнейшая сторона средне
Порог входа средний высокий низкий

Выбор по сути такой. Docker Compose-стек, где сервисы приходят и уходят, — Traefik. Раздача статики, тонкий тюнинг, кеширование, предельные нагрузки — Nginx. Один-два сайта и хочется закончить за пять минут — Caddy.

Что важно на практике

  • Доступ к Docker-сокету — это root на хосте. Traefik монтирует /var/run/docker.sock и потому обладает полной властью над машиной. Монтируйте в режиме :ro, не выставляйте дашборд в интернет, а в чувствительных средах ставьте socket-proxy, ограничивающий API.
  • exposedbydefault=false — включайте сразу. Иначе Traefik опубликует наружу каждый контейнер, включая базу данных.
  • Права на acme.json должны быть 600, иначе Traefik откажется его читать. Файл кладите на том — при пересоздании контейнера сертификаты не должны выпускаться заново, у Let's Encrypt есть лимиты на выпуск.
  • Ресурсы: Traefik — один бинарник на Go, ему хватает десятков мегабайт RAM. На фоне сервисов за ним он незаметен.

Связанные термины

  • Nginx — главная альтернатива с ручной конфигурацией
  • load balancer — одна из ролей Traefik
  • Docker Compose — среда, ради которой его и берут
  • SSL-сертификат — Traefik выпускает и продлевает их сам
  • Прокси-сервер — общий класс, к которому относится reverse proxy
  • Portainer — сосед по стеку: GUI к тем же контейнерам

Готовы запустить GPU-задачу?

Запустить GPU-сервер