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, заполните обязательные поля, задайте надёжный пароль и запустите установку.


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

Шаг 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.

Шаг 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-провайдер.
Связанные статьи
- Что такое Portainer
- Установка Ghost CMS через Portainer
- Установка Odoo через Portainer
- Nginx Proxy Manager
Docker-приложения на серверах Unihost
Используйте готовые шаблоны Portainer и серверы Unihost для размещения приложений.