Установка и настройка Nginx proxy manager в docker, настройка split dns, настройка wildcard-сертификата
Nginx Proxy Manager (NPM) — это удобный инструмент с веб-интерфейсом для управления обратным прокси на базе Nginx, который упрощает маршрутизацию трафика к сервисам в Docker, LXC или VM без редактирования конфигов вручную.
Основные функции
Поддерживает проксирование по доменам/поддоменам, автоматическое получение SSL-сертификатов Let's Encrypt, HTTP-аутентификацию, списки доступа (ACL) и блокировку IP. Позволяет настраивать перенаправления, кастомные страницы ошибок и потоки TCP/UDP через Streams.
После покупки домена и регистрации его у dns провайдеров у нас появляется возможность реализовать обратный прокси трафика по доменному имени, это позволит нам убрать отображение ip адресов из нашей homelab и реализовать доступ из интернета к веб панелям необходимых нам сервисов.
Установка Nginx Proxy Manager
Создание lxc контейнера
Для установки NPM в lxc контейнер,docker, нам понадобиться скрипт с сайтапонадобится https://community-scripts.github.io/ProxmoxVE/scripts?id=nginxproxymanagerсоздать lxc контейнер
А2 такvCPU, же2 VPNГБ подключениеRAM, на20+ роутере,ГБ длядиска.
ОС: чтоDebian бы12/13 весьили трафикUbuntu в22.04 сетиLTS.
Установка Docker и compose
Подключаемся к созданному контейнеру через VPN, некоторые пакеты в скрипте не доступны из Россииssh
ВСтавим консоли ноды необходимо ввестизависимости
bashapt update
apt install -cy "$(ca-certificates curl gnupg lsb-release
Добавляем официальный репозиторий Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://raw.githubusercontent.download.docker.com/community-scripts/ProxmoxVE/main/ct/nginxproxymanager.sh)linux/$(. /etc/os-release; echo "$ID")/gpg \
-o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(. /etc/os-release; echo "$VERSION_CODENAME") stable" \
> /etc/apt/sources.list.d/docker.list
apt update
СообщенияУстанавливаем оDocker ошибках+ можноcompose‑plugin
apt наinstall все-y вопросыdocker-ce отвечаемdocker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker
Проверка
docker version
docker compose version
Готовим каталог и docker‑compose.yml
Создаём каталог под NPM
mkdir -p /opt/npm/data
mkdir -p /opt/npm/letsencrypt
Создаём docker‑compose.yml
cat > /opt/npm/docker-compose.yml << 'EOF'
version: "3.8"
services:
app:
image: docker.io/jc21/nginx-proxy-manager:latest
container_name: nginxproxymanager
restart: unless-stopped
ports:
- "80:80"
- "81:81"
- "443:443"
volumes:
- /opt/npm/data:/data
- /opt/npm/letsencrypt:/etc/letsencrypt
environment:
TZ: "Asia/Novosibirsk"
EOF
restart: unless-stopped гарантирует авто‑подъём после любого ребута, пока жив Docker.
Все данные (конфиги, база, серты) лежат в /opt/npm, независимы от жизни контейнера.
Старт NPM
Запуск
cd /opt/npm
docker compose up -d
Проверка:
docker ps
Должен быть контейнер nginxproxymanager со статусом Up.
Первый вход
В браузере: Yhttp://<ip lxc контейнера>:81
Стандартный логин:
Email: admin@example.com
Password: changeme
Если все в порядке, после установки у вас появится доступ к панели по адресу http://<ip lxc контейнера с portain>:81
Настройка Nginx Proxy Manager
После установки нам необходимо выполнить несколько обязательных вещей
Проброс портов к npm
В OPNsense нам необходимо перейти в раздел Firewall, далее NAT и перейти в Port Forward, в открывшемся окне нажать справа сверху на +(add)
В открывшемся окне нужно заполнить поля
Interface: WAN
TCP/IP Version: IPv4
Protocol: TCP
Destination: WAN adress
Destination port range: from: HTTP; to: HTTP
Redirect target IP: Single host of Network, ниже ip используемого lxc контейнера
Redirect target port: HTTP
Description: NPM HTTP for Let's Encrypt
Нажать кнопку Save
После этого нажимаем кнопку Apply changes и создаем следующее правило кнопкой +(add)
Interface: WAN
TCP/IP Version: IPv4
Protocol: TCP
Destination: WAN adress
Destination port range: from: HTTPS; to: HTTPS
Redirect target IP: Single host of Network, ниже ip используемого lxc контейнера
Redirect target port: HTTPS
Description: NPM HTTPS for Let's Encrypt
Нажать кнопку Save
После этого нажимаем кнопку Apply changes
Покупка домена reg.ru
Для настройки доменных имен в npm доменное имя необходимо купить по этому поводу уже написана подробная статья
После покупки доменного имени и указания его у ДНС провайдера потребуется время что бы запись появилась у ДНС резолверов, проверить это проще всего командой на любом клиенте сети с установленным линукс, я для этих целей создал отдельный тестовый lxc контейнер
В выводе команды должен отобразится внешний ip адрес, запись проводится в течении 1-24 часов.
Настройка сертификата
Так как мы планируем использовать большое количество поддоменов нам не подходит вариант с обычным запросом сертификата через certbot, reg.ru позволяет запрашивать wildcard сертификат на домен и все поддомены, поэтому мы будем настраивать сразу его.
На сайте reg.ru заходишь в личный кабинет, далее Настройки API, запрашиваешь ключ API, его необходимо записать.
В NPM нужно создать wildcard-сертификат, во вкладке Certificates нужно нажать на кнопку Let's Encrypt via DNS
В открывшемся окне необходимо заполнить поля
Domain Names: тут указываешь <твоедоменноеимя.ru> и <*.твоедоменноеимя.ru>
DNS Provider: reg.ru
Credentials File Content:
dns_username=<твоя почта на reg.ru>
dns_password=<api колюч>
Propagation Seconds: Лучше указать 600 так как сервера reg.ru могут работать не стабильно
После этого необходимо нажать кнопку Save и подождать 1-5 минут.
Настройка split dns
Так как мы не хотим что бы все наши домены были доступны из сети, и для оптимизации подключения к доменам, нам необходимо настроить split dns на нашем opnsense.
Технически можно реализовать эту технологию на любом локальном dns сервере, но в opnsense уже установлен unbound dns, в котором есть необходимый нам функционал (ubound dns должен быть включен и настроен), для этого нам необходимо перейти во вкладку Services, далее Unbound DNS, далее Overrides, в открывшемся окне в разделе Hosts нажать на +
В открывшемся окне необходимо заполнить поля
Enabled: Галочка
Host: *
Domain: <твой домен>
Type: A (IPv4 address)
IP address: <ip адрес lxc контейнера>
Description: NPM
Далее нажать кнопку Save и Apply
Следующим шагом нужно указать Query forwarding для нашего сертификата, что бы избежать проблем с сертификатами в локальной сети при переходе по нашим доменам.
Для этого необходимо перейти во вкладку Query forwarding нажать на + и в открывшемся окне заполнить поля
Enabled: Галочка
Domain: ocsp.int-x3.letsencrypt.org
Server IP: 1.1.1.1
Далее нажать Save и Apply
Теперь необходимо перейти в панель npm и настроить там группу доступа которую мы будем указывать при создании доменов.
Для этого необходимо перейти во вкладку Acces list нажать на кнопку Add Acces list и в открывшемся окне заполнить форму
Во вкладке Details необходимо указать имя нашей группы
Во вкладке Rules необходимо добавить подсети из которых у нас будет доступ к нашим доменам
Создание и настройка поддомена
Для создания поддомена нам необходимо перейти во вкладку Proxy Hosts и нажать на кнопку Add Proxy Host, в открывшемся окне необходимо заполнить поля
Domain Names: Вводим необходимы домен или поддомен
Scheme: В зависимости от панели к которой хотим открыть доступ выбираем http или https
Forward Hostname / IP: ip нашего сервиса,
Forward Port: Порт нашего сервиса
Access List: в зависимости от того хотим ли что бы сервис работал только локально или был публичным выбираем созданную нами группу доступа или Publicly Accessible
Cache Assets: (Опционально) Включает кэширование статических ресурсов (CSS, JS, изображения) на прокси-сервере для ускорения загрузки страниц, снижая нагрузку на backend-сервер.
Block Common Exploits: (Опционально) Активирует встроенные правила Nginx для защиты от распространённых веб-атак (XSS, SQL-инъекции, кликджекинг) через заголовки безопасности вроде X-Frame-Options и Content-Security-Policy.
Websockets Support: (Опционально) Включает поддержку WebSocket-протокола (ws://, wss://), необходимую для real-time приложений вроде чатов, дашбордов или игр (например, Grafana, Homarr в homelab).
Переходим во вкладку SSL в открывшемся окне необходимо заполнить поля
SSL Certificate: Указываем созданный нами раннее сертификат
Force SSL: (Опционально) Принудительно перенаправляет весь HTTP-трафик (порт 80) на HTTPS (порт 443) с помощью 301-редиректа, обеспечивая обязательное шифрование.
HSTS Enabled: (Опционально) Включает HTTP Strict Transport Security — браузеры запоминают домен как HTTPS-only на заданный период (max-age), предотвращая MITM-атаки и downgrade до HTTP.
HTTP/2 Support: (Опционально) Активирует протокол HTTP/2 для мультиплексирования запросов, сжатия заголовков и ускорения загрузки (требует SSL).
HSTS Sub-domains: (Опционально) Расширяет HSTS-политику на все поддомены (includeSubDomains), заставляя браузеры применять HTTPS ко всем *.domain.com.
После нажатия кнопки Save домен появится в списке и ресурс станет доступен по заданному домену









