- NPM — веб-интерфейс, мышка, 5 минут до первого проксирования. Идеально для старта и небольших homelab-стеков
- Traefik — метки в docker-compose, автодискавери контейнеров, SSL без касания мышкой. Для тех, кто живёт в YAML и хочет Infrastructure as Code
- Переходить с NPM на Traefik стоит когда: больше 5-7 сервисов, нужны middlewares, важен GitOps-подход
- Оставаться на NPM стоит когда: команда не-технических людей, простой стек, нет желания вникать в Traefik label syntax
- По производительности для homelab — разница незаметна. Оба справятся с любым реалистичным трафиком домашней лаборатории
В чём реальный конфликт
Nginx Proxy Manager vs Traefik — это не вопрос «что лучше». Это вопрос «как ты работаешь». И ответ зависит не от характеристик, а от того, как выглядит твой рабочий процесс.
Поднял новый контейнер. Что делаешь дальше?
В NPM: открыл браузер, вбил IP и порт, нажал Save. Готово. Сертификат пришёл сам через минуту. Ты даже не открывал терминал.
В Traefik: добавил 4 строки labels в docker-compose.yml, сделал docker compose up -d. Контейнер поднялся — Traefik его увидел, запросил сертификат, начал проксировать. Ты даже не открывал браузер.
Это не один и тот же процесс через разные интерфейсы. Это принципиально разная философия управления инфраструктурой. Что тебе ближе — то и выбирай.
Nginx Proxy Manager: сильные стороны и ограничения
NPM появился в 2018 году как обёртка над боевым Nginx. Идея проста: взять надёжный прокси и убрать необходимость писать конфиги вручную. Получился инструмент с веб-интерфейсом, который добился огромной популярности в selfhosted-сообществе.
Поднимается за три команды:
version: "3"
services:
npm:
image: jc21/nginx-proxy-manager:latest
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
restart: unless-stopped
docker compose up -d
Открываешь http://IP:81, логин admin@example.com / пароль changeme. Меняешь пароль. Добавляешь первый Proxy Host. Готово.
SSL через Let’s Encrypt — галочка в интерфейсе. Wildcard-сертификаты через DNS Challenge — в том же интерфейсе, выбираешь DNS-провайдера из списка. NPM автоматически обновляет сертификаты. Это работает хорошо и без единой строки конфига.
Ограничения NPM
Все настройки хранятся в SQLite-базе внутри контейнера. Нет файлов конфига — нет Git. Если хочешь перенести NPM на другой сервер или воспроизвести окружение — делаешь бэкап базы и вручную пересоздаёшь хосты. Привет, ручной труд.
Advanced Config — есть вкладка для сырого Nginx-конфига. Мощно, но это костыль. Чем больше логики туда попадает, тем больше NPM превращается в «а кто и зачем это написал в 2023 году».
Масштабирование — если у тебя 20+ сервисов и каждый имеет свои особенности, интерфейс NPM становится неудобным. Нет поиска по хостам, нет группировки, нет шаблонов.
Безопасность NPM: что нужно знать
# Проверь текущую версию
docker inspect jc21/nginx-proxy-manager:latest | grep -i version
# Обновить
docker compose pull && docker compose up -d
Traefik: сильные стороны и ограничения
Traefik написан на Go командой Traefik Labs. Запущен в 2015-м, сейчас на версии v3. Более 54 000 звёзд на GitHub. Это не хоббийный проект — его используют в production крупные компании.
Ключевая идея: Traefik читает метки Docker-контейнеров и сам конфигурирует роутинг. Ты не трогаешь конфиг Traefik когда добавляешь новый сервис. Ты добавляешь 4 строки в docker-compose.yml нового сервиса — и всё происходит автоматически.
Минимальный рабочий Traefik v3 с SSL через Let’s Encrypt:
version: "3.8"
services:
traefik:
image: traefik:v3.3
container_name: traefik
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--certificatesresolvers.letsencrypt.acme.email=you@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
restart: unless-stopped
networks:
- proxy
networks:
proxy:
external: true
Теперь чтобы добавить любой сервис за Traefik — только метки в его docker-compose:
services:
nextcloud:
image: nextcloud:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.nextcloud.rule=Host(`cloud.example.com`)"
- "traefik.http.routers.nextcloud.entrypoints=websecure"
- "traefik.http.routers.nextcloud.tls.certresolver=letsencrypt"
networks:
- proxy
restart: unless-stopped
networks:
proxy:
external: true
Всё. Traefik увидел контейнер, запросил сертификат, настроил HTTPS-роутинг. Ты не открывал браузер.
Wildcard SSL через Cloudflare DNS Challenge
Это то, чем Traefik действительно выделяется. Один wildcard-сертификат на все поддомены — и никаких rate-limit проблем с Let’s Encrypt при большом количестве сервисов.
services:
traefik:
image: traefik:v3.3
environment:
- CF_API_EMAIL=you@example.com
- CF_DNS_API_TOKEN=ваш_cloudflare_api_token
command:
- "--certificatesresolvers.cloudflare.acme.dnschallenge=true"
- "--certificatesresolvers.cloudflare.acme.dnschallenge.provider=cloudflare"
- "--certificatesresolvers.cloudflare.acme.email=you@example.com"
- "--certificatesresolvers.cloudflare.acme.storage=/letsencrypt/acme.json"
В метках сервиса добавляешь:
- "traefik.http.routers.myapp.tls.certresolver=cloudflare"
- "traefik.http.routers.myapp.tls.domains[0].main=example.com"
- "traefik.http.routers.myapp.tls.domains[0].sans=*.example.com"
Middlewares — то, где NPM отстаёт
Middlewares в Traefik — это цепочки обработки запросов. Basic Auth, IP whitelist, rate limiting, redirect, headers — всё это декларативно в YAML или labels. Один middleware — переиспользуй в любом роутере.
labels:
# Создаём middleware для Basic Auth
- "traefik.http.middlewares.auth.basicauth.users=admin:$$2y$$10$$hashed_password"
# Применяем к роутеру
- "traefik.http.routers.myapp.middlewares=auth"
Ограничения Traefik
Кривая обучения — первые два часа с Traefik можно потратить на отладку почему не работает роутинг. Labels-синтаксис специфичен, ошибки в именовании молча игнорируются. Dashboard показывает что сконфигурировано, но не всегда очевидно почему что-то не работает.
Docker socket — Traefik читает Docker socket для autodiscovery. Это значит контейнер Traefik имеет полный доступ к Docker-демону. Для homelab допустимо, для production — монтируй socket через read-only и рассмотри Docker Socket Proxy.
acme.json — файл с сертификатами хранится в одном файле с правами 600. Если он слетит или повредится — теряешь все сертификаты и запрашиваешь заново. Бэкапить обязательно.
Архитектура: как оба инструмента работают изнутри
Ключевое различие: NPM хранит конфигурацию в базе данных, Traefik — в метаданных контейнеров и файлах. Последний подход дружелюбен к Git, первый — к мышке.
Таблица сравнения по ключевым критериям
| Критерий | Nginx Proxy Manager | Traefik v3 |
|---|---|---|
| Интерфейс | Веб-UI, мышка | YAML/labels, терминал |
| Порог входа | Низкий — 5 минут до результата | Средний — 1-2 часа на понимание |
| Infrastructure as Code | Нет (база данных) | Да (labels + YAML файлы) |
| Autodiscovery контейнеров | Нет — ручная настройка | Да — автоматически по labels |
| Let’s Encrypt HTTP Challenge | Галочка в UI | Параметр в команде |
| Let’s Encrypt DNS Challenge | UI + выбор провайдера | ENV переменные + параметры |
| Wildcard сертификаты | Да (DNS Challenge) | Да (DNS Challenge) |
| Middlewares (auth, rate limit) | Базово через Advanced Config | Полноценные, переиспользуемые |
| TCP/UDP проксирование | Нет | Да (встроено) |
| Load balancing | Базовый | Полноценный с health checks |
| Kubernetes поддержка | Нет | Да (Ingress + CRD) |
| Dashboard | Веб-UI со всеми настройками | Read-only dashboard (опционально) |
| Мониторинг / Prometheus | Нет из коробки | Встроенные метрики |
| История CVE | Активная (несколько критических) | Минимальная |
| Потребление RAM | ~100-150 MB | ~50-80 MB |
| Язык | Node.js + Nginx | Go |
| Перенос на другой сервер | Бэкап базы + ручное восстановление | Git push + docker compose up |
Системные требования
| Параметр | Nginx Proxy Manager | Traefik v3 |
|---|---|---|
| ОС | Любой Linux с Docker | Любой Linux с Docker |
| RAM минимум | 256 MB | 128 MB |
| Docker | 20.x+ | 20.x+ |
| Docker Compose | v2.x | v2.x |
| Актуальная версия (май 2026) | 2.12.x | 3.3.x |
Перед установкой проверяй актуальные релизы: NPM releases и Traefik releases.
Таблица портов
| Порт | Инструмент | Назначение | Снаружи? |
|---|---|---|---|
| 80 | Оба | HTTP трафик (редирект на HTTPS) | Да |
| 443 | Оба | HTTPS трафик | Да |
| 81 | NPM | Веб-интерфейс администратора | Нет — только VPN/локалка |
| 8080 | Traefik | Dashboard (опционально) | Нет — только с auth |
Когда что выбирать: матрица решений
Безопасная настройка NPM
Если выбрал NPM — вот минимум безопасности, который нельзя игнорировать.
# Закрыть порт 81 снаружи через UFW
sudo ufw deny 81/tcp
# Разрешить только с конкретного IP (твой домашний адрес)
sudo ufw allow from 192.168.1.0/24 to any port 81
Обязательно смени дефолтные креды сразу после первого входа. Включи двухфакторную аутентификацию в настройках профиля NPM.
Следи за обновлениями. NPM имеет активную историю CVE — CVE Details. Настрой автообновление или хотя бы ежемесячное ручное обновление образа.
Безопасный Traefik: минимальный checklist
Закрой dashboard от публичного доступа или защити BasicAuth:
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.dashboard.entrypoints=websecure"
- "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$hashed_password"
Сгенерировать хеш пароля для BasicAuth:
echo $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g
Troubleshooting
Traefik: сервис не отвечает, но labels добавлены
Проверь — контейнер и Traefik в одной Docker network?
# Посмотреть сети контейнера
docker inspect имя_контейнера | grep -A 10 "Networks"
# Если сети разные - добавь общую сеть в оба compose файла
# networks:
# proxy:
# external: true
Проверь что traefik.enable=true есть в labels — если в конфиге Traefik стоит exposedbydefault=false, без этой метки контейнер игнорируется.
# Посмотреть что Traefik видит
docker exec traefik traefik healthcheck
# Открыть dashboard и проверить Routers
Traefik: SSL-сертификат не запрашивается
Первая причина — домен не резолвится публично. Let’s Encrypt должен достучаться до твоего сервера по HTTP для TLS Challenge.
# Проверить резолвинг с внешнего сервера
dig +short myapp.example.com @8.8.8.8
# Проверить логи Traefik на ошибки ACME
docker logs traefik 2>&1 | grep -i acme
docker logs traefik 2>&1 | grep -i "certificate"
Вторая причина — превышен rate limit Let’s Encrypt (5 сертификатов на домен за 7 дней). Используй staging для тестов:
# Добавить в command Traefik для тестирования
- "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
NPM: 502 Bad Gateway после добавления хоста
502 — NPM не может достучаться до backend. Причины:
- Неправильный IP или порт в настройках Proxy Host
- Backend контейнер не запущен или не слушает на нужном порту
- NPM и backend в разных Docker-сетях
# Проверить что backend контейнер запущен
docker ps | grep имя_контейнера
# Проверить порт изнутри NPM-контейнера
docker exec -it nginx-proxy-manager sh
# Внутри контейнера:
wget -qO- http://IP_бэкенда:ПОРТ
NPM: сертификат не обновляется автоматически
# Посмотреть логи NPM
docker logs nginx-proxy-manager 2>&1 | grep -i "certif\|renew\|acme"
# Проверить что порт 80 открыт публично - нужен для HTTP Challenge
curl -v http://твой_домен/.well-known/acme-challenge/test
Traefik: метки двойного доллара
Частая ошибка: хеш пароля для BasicAuth содержит символ $. В docker-compose.yml его нужно экранировать двойным $$. В .env файле — одинарный $. Путаница приводит к «Auth middleware created but not working».
# Правильно в docker-compose.yml labels:
# admin:$$2y$$10$$abc...
# Правильно в .env файле:
# BASIC_AUTH=admin:$2y$10$abc...
Общая ошибка: acme.json имеет неправильные права
# Traefik требует chmod 600 на acme.json
chmod 600 ./letsencrypt/acme.json
# Если файл повреждён - удали и дай Traefik создать заново
rm ./letsencrypt/acme.json
touch ./letsencrypt/acme.json
chmod 600 ./letsencrypt/acme.json
docker compose restart traefik
Альтернативы: что ещё существует
| Инструмент | Плюс | Минус | Ниша |
|---|---|---|---|
| Nginx Proxy Manager | Самый простой старт, UI | CVE история, нет IaC | Homelab, начинающие |
| Traefik v3 | Autodiscovery, middlewares, Go | Кривая обучения, labels syntax | Docker-native, production |
| Caddy v2 | Простой Caddyfile, HTTP/3 | Менее развитая экосистема | Простые статические сайты |
| HAProxy | Максимальная производительность | Нет встроенного SSL | Enterprise, high load |
| Nginx (чистый) | Максимальный контроль | Ручная конфигурация всего | Когда точно знаешь что делаешь |
Caddy заслуживает отдельного упоминания. У него автоматический HTTPS из коробки, Caddyfile читается как человеческий язык, и он значительно проще Traefik при сопоставимых возможностях для типичного homelab. Если тебе не нужен Docker autodiscovery — посмотри на него.
Профилактика: бэкап и обновления
Бэкап NPM
# Остановить NPM
docker compose stop npm
# Бэкап данных
tar -czf npm-backup-$(date +%Y%m%d).tar.gz ./data ./letsencrypt
# Запустить обратно
docker compose start npm
Бэкап Traefik
Если конфиги в Git — бэкап уже есть. Дополнительно сохрани acme.json:
# Бэкап сертификатов
cp ./letsencrypt/acme.json ./letsencrypt/acme.json.backup-$(date +%Y%m%d)
Безопасное обновление
# Для обоих инструментов - стандартная процедура
docker compose pull
docker compose up -d
# Проверить версию после обновления
docker inspect traefik:latest | grep -i version
FAQ
Что лучше nginx proxy manager или traefik для homelab в 2026?
Зависит от того, как ты работаешь. NPM быстрее стартует и не требует изучения — открыл UI, добавил хост, готово. Traefik требует понять концепцию labels и сетей, но зато весь конфиг живёт в docker-compose.yml рядом с сервисами, версионируется в Git и воспроизводится одной командой. Если начинаешь — NPM. Если растёшь — Traefik.
Traefik сложный или нет?
Первые два часа — да, сложный. Потом — нет. Самая частая ошибка начинающих: забыть что Traefik и сервис должны быть в одной Docker-сети. Как только это понял, и освоил синтаксис labels — дальше всё интуитивно. Большинство проблем решаются через dashboard и docker logs traefik.
Стоит ли переходить с nginx proxy manager на traefik?
Стоит если: у тебя больше 5-7 сервисов, ты хочешь хранить конфиги в Git, или тебе нужны middlewares (auth, rate limiting, headers). Переход занимает 1-2 часа. Оба можно запустить одновременно на разных портах для параллельной работы во время миграции — NPM на 8080/8443, Traefik на 80/443.
Почему traefik не видит мой контейнер?
Три самые частые причины: контейнер и Traefik в разных Docker-сетях, в конфиге Traefik стоит exposedbydefault=false а в labels нет traefik.enable=true, или ошибка в синтаксисе labels — лишний пробел или неправильное имя роутера. Открой dashboard Traefik на :8080 и посмотри раздел Routers — там сразу видно что сконфигурировано.
Nginx Proxy Manager безопасен?
NPM имеет реальную историю уязвимостей: CVE-2024-46256 (CVSS 9.8, RCE без аутентификации через Let’s Encrypt функцию), CVE-2025-50579 (CORS misconfiguration, кража токенов). Это не повод избегать NPM — это повод обновляться регулярно и никогда не выставлять порт 81 в публичный интернет. Используй последнюю версию, изолируй admin-панель за VPN.
Как Traefik работает с несколькими docker-compose файлами?
Traefik видит все контейнеры через Docker socket независимо от того, в каком compose файле они определены. Главное — контейнер должен быть в той же Docker-сети (external network), которую слушает Traefik. Создай одну общую сеть: docker network create proxy, добавь её в каждый compose-файл как external: true, и Traefik будет видеть все сервисы автоматически.
Прогноз
NPM никуда не уйдёт — у него 32 000 звёзд на GitHub и огромная база пользователей. Для быстрого старта и простых стеков это отличный выбор. Но если твой homelab растёт, и ты уже несколько раз пожалел что не можешь сделать git pull чтобы восстановить конфиг на новом сервере — Traefik это решает.
Начни с NPM если сомневаешься. Это правильный первый шаг — понять что такое reverse proxy на практике, не утонув в labels-синтаксисе. Когда NPM начнёт тебя ограничивать — ты сам почувствуешь. Вот тогда и переходи. Миграция займёт вечер, не неделю.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →


