Traefik для личного сервера

18 июля 2025 г.

Раньше на каждом своем сервере я использовал nginx для управления запросами к внутренним сервисам и выпускал SSL-сертификаты для доментов через certbot. А недавно перешел на Traefik, который позволяет управлять доменами и сертификатами прямо в docker-compose файлах.

Traefik — это сервер, как nginx, который настраивает маршрутизацию запросов к вашим сервисам и управляет SSL-сертификатами. Он поддерживает динамическую конфигурацию и интеграцию с Docker, что удобно, если вы используете контейнеры.

У него подробная документация и много примеров для запуска и изучения с нуля. Я расскажу о своем опыте и настройках.

Настройка контейнера Traefik

Сервисы на сервере я убираю в отдельные папки, чтобы не путаться в конфигурациях. Например, у меня есть папка , в которой лежит файл с настройками и .

  • traefik
    • traefik.yml
    • docker-compose.yml
    • data

Папка создается автоматически и используется для хранения сертификатов Let's Encrypt, которые Traefik будет выпускать и обновлять.

Файл с конфигурацией контейнера Traefik:

services:
  traefik:
    image: traefik:2.4.8
    restart: unless-stopped
    labels:
      # HTTP -> HTTPS redirection
      - traefik.http.routers.to-https.rule=HostRegexp(`{host:.+}`)
      - traefik.http.routers.to-https.entrypoints=http
      - traefik.http.routers.to-https.middlewares=to-https
      - traefik.http.middlewares.to-https.redirectscheme.scheme=https

      # Basic Auth middleware for securing dashboard
      - traefik.http.middlewares.auth.basicauth.users=admin:$2y$05$m3Bi4.nh8RfUw/aCNBBI4eNq6wzOP5OOTf3QZdnSVK7Xu0q6VCC8u

      # Traefik dashboard with HTTPS and basic auth
      - traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
      - traefik.http.routers.traefik.entrypoints=https
      - traefik.http.routers.traefik.middlewares=auth
      - traefik.http.routers.traefik.service=api@internal
      - traefik.http.routers.traefik.tls=true
      - traefik.http.routers.traefik.tls.certresolver=letsencrypt
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./traefik.yml:/etc/traefik/traefik.yml
      - ./data/letsencrypt:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock

В нем я запускаю контейнер с Traefik, указываю ему слушать порты 80 и 443 сервера, настраиваю форсированное использование HTTPS, защищаю панель управления Traefik базовой аутентификацией и подключаю внешние файлы и папки.

Панель управления Traefik будет доступна по указанному адресу . Let's Encrypt автоматически выпустит SSL сертификат. А панель будет защищена простой авторизацией с логином и зашифрованным паролем. Об этом расскажу ниже.

Также я подключаю файл с настройками и указываю папку для хранения сертификатов Let's Encrypt.

Файл :

#log:
#  level: DEBUG

api:
  dashboard: true

certificatesResolvers:
  letsencrypt:
    acme:
      httpchallenge:
        entrypoint: http
      email: admin@example.com
      storage: /letsencrypt/acme.json

Создания пароля для базовой аутентификации

Чтобы создать пароль для базовой аутентификации, можно использовать команду из пакета или использовать онлайн-генератор паролей bcrypt.

htpasswd -nB admin

Система дважды запросит пароль и вернет строку в формате , которую нужно вставить в нужную метку в docker-compose файле.

admin:$2y$05$m3Bi4.nh8RfUw/aCNBBI4eNq6wzOP5OOTf3QZdnSVK7Xu0q6VCC8u

Запуск и использование

После настройки файлов остается запустить Traefik командой:

docker compose up -d

Traefik запустится в фоновом режиме, и вы сможете получить доступ к панели управления по адресу, который вы указали вместо .

Добавление сервисов

Чтобы подключить другой контейнер к Traefik, нужно добавить в его соответствующие метки.

Например, запустим nginx на домене с подключенным SSL-сертификатом. Важно правильно указать домен и используемый порт сервиса.

services:
  nginx-example-com:
    labels:
      - traefik.http.routers.nginx-example-com.rule=Host(`nginx.example.com`)
      - traefik.http.routers.nginx-example-com.entrypoints=https
      - traefik.http.routers.nginx-example-com.service=nginx-example-com
      - traefik.http.services.nginx-example-com.loadbalancer.server.port=80
      - traefik.http.routers.nginx-example-com.tls=true
      - traefik.http.routers.nginx-example-com.tls.certresolver=letsencrypt
    image: nginx:latest
    restart: unless-stopped

Или запустим 3 реплики сервиса на домене , который будет отвечать на запросы и показывать информацию о запросе.

services:
  whoami-example-com:
    labels:
      - traefik.http.routers.whoami-example-com.rule=Host(`whoami.example.com`)
      - traefik.http.routers.whoami-example-com.entrypoints=https
      - traefik.http.routers.whoami-example-com.service=whoami-example-com
      - traefik.http.services.whoami-example-com.loadbalancer.server.port=80
      - traefik.http.routers.whoami-example-com.tls=true
      - traefik.http.routers.whoami-example-com.tls.certresolver=letsencrypt
    image: containous/whoami
    restart: unless-stopped
    deploy:
      replicas: 3

Docker запустит 3 реплики сервиса , а Traefik будет автоматически распределять запросы к домену между ними.

Опыт использования и выводы

Traefik значительно упростил управление сервисами и сертификатами на моих серверах. Теперь не нужно настраивать nginx и выпускать сертификаты через certbot для каждого нового домена. Достаточно добавить нужные метки в конфигурацию контейнера.

Мне нравится, что настройки Traefik можно хранить рядом с настройками самих сервисов в docker-compose файлах.

Этот базовый функционал закрывает большинство моих потребностей. Панель администратора я использую только для проверки сертификатов сразу после добавления нового домена.

При необходимости логи Traefik можно почитать в самом контейнере.

Показать заметки по похожей теме
Подпишитесь на мой Бусти, чтобы комментировать записи и получать уведомления о новых заметках.Подписаться на Бусти