Traefik Reverse Proxy направляет запросы к Docker-контейнерам по доменам и автоматически получает HTTPS-сертификаты Let's Encrypt. Установите его через готовый шаблон Unihost в Portainer или используйте Compose-конфигурацию Traefik v3 ниже. Для работы настройте DNS, откройте порты 80/443, включите Docker Provider, защитите Dashboard паролем и добавьте labels к публикуемым контейнерам.

Совместимость: Linux с Docker Engine, Portainer и Traefik v3. Скриншоты показывают интерфейс шаблона Unihost.

Требования

  • VPS с Docker и Portainer, желательно с коллекцией шаблонов Unihost.
  • Домен с A-записями, указывающими на публичный IP сервера.
  • Свободные TCP-порты 80 и 443, административный доступ к серверу.
  • Доступ к консоли на случай ошибки в сетевых настройках.

Перед установкой проверьте DNS и убедитесь, что порты не заняты другим прокси:

dig +short traefik.example.com
sudo ss -tlnp | grep -E ":(80|443)\b"

Шаги

Шаг 1. Установите Traefik через шаблон Portainer

В Portainer откройте Templates → Application → Traefik Reverse Proxy. Выберите шаблон Unihost, заполните обязательные поля, задайте надёжный пароль и запустите установку.

Выбор Traefik Reverse Proxy в шаблонах Portainer

Настройки шаблона Traefik: ACME email и контроль доступа к Dashboard

В разделе Stacks проверьте, что стек создан. В исходном шаблоне Dashboard может открываться по адресу http://SERVER_IP:8080. Не оставляйте панель без защиты в интернете. Ниже показан вариант с HTTPS и авторизацией.

Созданный стек Traefik в Portainer

Шаг 2. Подготовьте DNS, сеть и пароль Dashboard

Создайте A-записи для traefik.example.com и blog.example.com, указывающие на сервер. На Docker-хосте подготовьте сеть, хранилище сертификатов и файл авторизации:

docker network create traefik_proxy
sudo mkdir -p /opt/traefik/letsencrypt /opt/traefik/auth
sudo touch /opt/traefik/letsencrypt/acme.json
sudo chmod 600 /opt/traefik/letsencrypt/acme.json
# Ubuntu/Debian: sudo apt install -y apache2-utils
sudo htpasswd -cB /opt/traefik/auth/users admin

Команда htpasswd запросит пароль. Для проверки Let's Encrypt HTTP-01 внешний порт 80 должен быть доступен.

Шаг 3. Настройте стек Traefik v3

В Portainer откройте Stacks → Add stack и вставьте конфигурацию Compose. Это альтернатива исходному шаблону, а не второй экземпляр Traefik на тех же портах.

services:
  traefik:
    image: traefik:v3.7
    restart: unless-stopped
    command:
      - "--api.dashboard=true"
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=traefik_proxy"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--certificatesresolvers.le.acme.email=admin@example.com"
      - "--certificatesresolvers.le.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.le.acme.httpchallenge=true"
      - "--certificatesresolvers.le.acme.httpchallenge.entrypoint=web"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /opt/traefik/letsencrypt:/letsencrypt
      - /opt/traefik/auth:/auth:ro
    networks:
      - traefik_proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
      - "traefik.http.routers.dashboard.entrypoints=websecure"
      - "traefik.http.routers.dashboard.tls=true"
      - "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.usersfile=/auth/users"
networks:
  traefik_proxy:
    external: true

Замените admin@example.com на свой email, а traefik.example.com на домен панели. Внешняя Docker-сеть должна быть создана заранее. Сертификаты сохраняются в постоянном каталоге.

Безопасность: даже подключение docker.sock в режиме read-only даёт доступ к чувствительной информации Docker API. Для более строгой изоляции используйте Docker Socket Proxy. Не публикуйте порт 8080.

Шаг 4. Откройте защищённый Dashboard

Разверните стек и откройте https://traefik.example.com/dashboard/. Войдите с учётными данными htpasswd и проверьте разделы HTTP Routers и Services.

Панель Traefik Dashboard с роутерами и точками входа

Шаг 5. Настройте labels для Ghost

Подключите приложение к сети traefik_proxy и добавьте labels. Внутренний HTTP-порт Ghost равен 2368. Следующий фрагмент нужно объединить с действующим стеком Ghost, сохранив образ, базу данных и volumes:

services:
  ghost:
    # Keep the existing image, database and volume settings
    networks:
      - traefik_proxy
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik_proxy"
      - "traefik.http.routers.ghost.rule=Host(`blog.example.com`)"
      - "traefik.http.routers.ghost.entrypoints=websecure"
      - "traefik.http.routers.ghost.tls=true"
      - "traefik.http.routers.ghost.tls.certresolver=le"
      - "traefik.http.services.ghost.loadbalancer.server.port=2368"
networks:
  traefik_proxy:
    external: true

Для Odoo используйте его порт приложения (обычно 8069) и настройку reverse proxy. Инструкции Ghost и Odoo приведены в связанных статьях.

Проверка

Проверьте контейнер, Dashboard, перенаправление на HTTPS и сертификат:

docker ps
docker logs --tail 50 traefik
curl -I http://blog.example.com
curl -I https://blog.example.com

HTTP должен перенаправляться на HTTPS. HTTPS-запрос должен проходить с действительным сертификатом, а маршрут должен отображаться в Dashboard.

Устранение проблем

Traefik возвращает 404

Проверьте правило Host(), метку traefik.enable, entrypoint, внутренний порт приложения и общую Docker-сеть.

Let's Encrypt не выдаёт сертификат

Проверьте DNS, доступность TCP 80/443, адрес email, права на acme.json и журналы Traefik. Wildcard-сертификаты требуют DNS-01.

Порт 80 или 443 занят

Проверьте Nginx, Apache, Nginx Proxy Manager и другие экземпляры Traefik. Один порт хоста не может одновременно использоваться двумя сервисами.

Dashboard недоступен

Проверьте DNS панели, файл паролей, HTTPS-маршрут и адрес с окончанием /dashboard/. Оставьте api.insecure отключённым.

Частые вопросы

Что выбрать: Traefik или Nginx Proxy Manager?

Traefik удобен для Docker labels и автоматической маршрутизации. Nginx Proxy Manager предлагает графический интерфейс управления прокси.

Как защитить Traefik Dashboard?

Используйте HTTPS и Basic Authentication, по возможности ограничьте доступ и установите api.insecure=false.

Почему Let's Encrypt не выдаёт сертификат?

Проверьте DNS, открытый порт 80, настройки ACME и журналы Traefik.

Можно ли получить wildcard-сертификат?

Да. Для wildcard-сертификатов необходим DNS-01 challenge и поддерживаемый DNS-провайдер.

Связанные статьи

Docker-приложения на серверах Unihost

Используйте готовые шаблоны Portainer и серверы Unihost для размещения приложений.