# Установка и настройка Nginx proxy manager в docker portainer, настройка split dns, настройка wildcard-сертификата

После установки [docker portainer](https://bookstack.redpunk.net/books/ispolzuemoe-po-i-instrukcii-po-ego-ustanovke/page/ustanovka-docker-i-portainer-v-lxc-konteinere-proxmox "docker и Portainer в lxc контейнере proxmox")

**Nginx Proxy Manager (NPM)** — это удобный инструмент с веб-интерфейсом для управления обратным прокси на базе Nginx, который упрощает маршрутизацию трафика к сервисам в Docker, LXC или VM без редактирования конфигов вручную.

**Основные функции**  
Поддерживает проксирование по доменам/поддоменам, автоматическое получение SSL-сертификатов Let's Encrypt, HTTP-аутентификацию, списки доступа (ACL) и блокировку IP. Позволяет настраивать перенаправления, кастомные страницы ошибок и потоки TCP/UDP через Streams.  
​

После покупки домена и регистрации его у dns провайдеров у нас появляется возможность реализовать обратный прокси трафика по доменному имени, это позволит нам убрать отображение ip адресов из нашей homelab и реализовать доступ из интернета к веб панелям необходимых нам сервисов.

#### Установка Nginx Proxy Manager

Для установки **Nginx Proxy Manager (npm)** в docker через portainer, нам необходимо перейти в веб-интерфейс portainer

```
http://<ip lxc контейнера>:9000
```

В веб интерфейсе необходимо перейти в **docker**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/pApimage.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/pApimage.png)

Слева или в центре экрана выбрать **Stacks**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/R8Eimage.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/R8Eimage.png)

Слева сверху выбрать **+Add stack**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/1dfimage.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/1dfimage.png)

В **name** указать название нашего контейнера **npm**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/KM2image.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/KM2image.png)

Ниже в поле для ввода кода **Web editor**, вводим код нашего **docker-compose** файла

```yaml
version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'    # HTTP
      - '443:443'  # HTTPS
      - '81:81'    # Админка NPM
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    environment:
      DISABLE_IPV6: 'true'

```

После ввода необходимо нажать кнопку **Deploy the stack**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/5Vyimage.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/5Vyimage.png)

Если все в порядке, после установки у вас появится доступ к панели по адресу http://&lt;ip lxc контейнера с portain&gt;: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**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/fc0image.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/fc0image.png)

После этого нажимаем кнопку **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**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/z64image.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/z64image.png)

После этого нажимаем кнопку **Apply changes**

##### Покупка домена reg.ru

Для настройки доменных имен в npm доменное имя необходимо купить по этому поводу уже написана [подробная статья](https://habr.com/ru/articles/716002/)

После покупки доменного имени и указания его у ДНС провайдера потребуется время что бы запись появилась у ДНС резолверов, проверить это проще всего командой на любом клиенте сети с установленным линукс, я для этих целей создал отдельный тестовый [lxc контейнер](https://bookstack.redpunk.net/books/ispolzuemoe-po-i-instrukcii-po-ego-ustanovke/page/sozdanie-lxc-konteinera-proxmox "Создание LXC контейнера proxmox")

```
dig <ваш домен>
```

В выводе команды должен отобразится внешний ip адрес, запись проводится в течении 1-24 часов.

##### Настройка сертификата

Так как мы планируем использовать большое количество поддоменов нам не подходит вариант с обычным запросом сертификата через **certbot, reg.ru** позволяет запрашивать **wildcard** сертификат на домен и все поддомены, поэтому мы будем настраивать сразу его.

На сайте **reg.ru** заходишь в личный кабинет, далее Настройки API, запрашиваешь ключ API, его необходимо записать.

В **NPM** нужно создать **wildcard-сертификат**, во вкладке **Certificates** нужно нажать на кнопку **Let's Encrypt via DNS**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/oqIimage.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/oqIimage.png)

В открывшемся окне необходимо заполнить поля  
**Domain Names**: тут указываешь &lt;твоедоменноеимя.ru&gt; и &lt;\*.твоедоменноеимя.ru&gt;

**DNS Provider**: reg.ru

**Credentials File Content**:   
dns\_username=&lt;твоя почта на reg.ru&gt;  
dns\_password=&lt;api колюч&gt;

После этого необходимо нажать кнопку **Save** и подождать 1-5 минут.

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/rn1image.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/rn1image.png)

##### Настройка split dns

Так как мы не хотим что бы все наши домены были доступны из сети, и для оптимизации подключения к доменам, нам необходимо настроить **split dns** на нашем **opnsense.** Технически можно реализовать эту технологию на любом локальном **dns** сервере, но в opnsense уже установлен **unbound dns**, в котором есть необходимый нам функционал (ubound dns должен быть включен и настроен), для этого нам необходимо перейти во вкладку **Services**, далее **Unbound DNS**, далее **Overrides**, в открывшемся окне в разделе **Hosts** нажать на **+**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/Fs8image.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/Fs8image.png)

В открывшемся окне необходимо заполнить поля

**Enabled**: Галочка

**Host**: \*

**Domain**: &lt;твой домен&gt;

**Type**: A (IPv4 address)

**IP address**: &lt;ip адрес lxc контейнера&gt;

**Description**: NPM

Далее нажать кнопку **Save** и **Apply**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/WG9image.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/WG9image.png)

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

Для этого необходимо перейти во вкладку **Query forwarding** нажать на **+** и в открывшемся окне заполнить поля

**Enabled**: Галочка

**Domain**: ocsp.int-x3.letsencrypt.org

**Server IP**: 1.1.1.1

Далее нажать **Save** и **Apply**

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/W7Uimage.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/W7Uimage.png)

Теперь необходимо перейти в панель **npm** и настроить там группу доступа которую мы будем указывать при создании доменов.

Для этого необходимо перейти во вкладку **Acces list** нажать на кнопку **Add Acces list** и в открывшемся окне заполнить форму

Во вкладке **Details** необходимо указать имя нашей группы  
Во вкладке **Rules** необходимо добавить подсети из которых у нас будет доступ к нашим доменам

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/HUZimage.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/HUZimage.png)

#### Создание и настройка поддомена

Для создания поддомена нам необходимо перейти во вкладку 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).

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/qo2image.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/qo2image.png)

Переходим во вкладку **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.  
​

[![image.png](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/scaled-1680-/O8Qimage.png)](https://bookstack.redpunk.net/uploads/images/gallery/2025-12/O8Qimage.png)

После нажатия кнопки **Save** домен появится в списке и ресурс станет доступен по заданному домену