no-style

Nginx Proxy Manager в Docker контейнере

docker-compose + linuxserver + wireguard
Привет. Сегодня поднимаем панельку и по совместительству reverse-proxy Nginx Proxy Manager внутри докер контейнера. Ну и немного потренируемся для закрепления результата.


Необходимые требования

Чтобы всё получилось нам понадобится:







В двух словах о Nginx Proxy Manager

NPM является обратным прокси(reverse proxy), основанным на Nginx. Имеет приятный и интуитивно понятный веб интерфейс.

Используется для того чтобы проксировать Ваше приложение на необходимый домен либо поддомен. Другими словами для привязывания контейнера к домену или поддомену.

Привязывать (проксировать) домены можно двумя разными способами

По порту - самый простой способ при этом есть минус в качестве торчащего наружу порта.

По хостнейму - более продвинутый способ, для которого нужно открыть только 3 порта 80, 443 и порт управления панелькой NPM. Порты всех остальных проксированных контейнеров не будут торчать наружу.

В пределах этого поста рассмотрим оба варианта проксирования.

Помимо проксирования в панельке предусмотрена работа с TLS(SSL) сертификатами. В рамках этого поста затронем несколько способов получения бесплатных SSL сертификатов:


  • Бесплатный самообновляющийся сертификат от Lets Encrypt
  • Бесплатный самообновляющийся wildcard сертификат от Lets Encrypt
  • Бесплатный origin сертификат от CloudFlare на 15 лет

NPM в автоматическом режиме будет продлевать самообновляющийся сертификаты каждые 3 месяца за нас.

В NPM присутствуют специальные правила ACL для предоставления/ограничения доступа к вашим приложениям. На основе ip адреса, пароля, либо и того и того одновременно.

Ещё NPM умеет работать с редиректами и стримами, но их касаться в пределах этой статьи мы не будем.







Подготовка

Как и в предыдущих статьях про докер контейнеры мы будем придерживаться правила - хранить все контейнеры в одном месте. Создаём директорию под NPM

sudo mkdir -p /app/NPM

Сделаем нашего пользователя (не root !) владельцем этой директории

sudo chown -R $USER:$USER /app/NPM






Конфигурация и запуск

Перейдём в директорию, которую мы создавали выше

cd /app/NPM

Создадим фаил docker-compose.yml

nano docker-compose.yml

С таким содержанием.

На всякий случай оставлю конфиг под aarch64, оффсайт и dockerhub


Стартуем контейнер NPM

sudo docker-compose up -d






Настройка Nginx Proxy Manager

В браузере открываем нашу панельку NPM. Порт будет либо 81 либо тот который вы замапили на 81. Я советую на всякий случай замапить какой нибудь нестандартный порт например 43013

http://ip.адрес.вашего.сервера:порт
Nginx Proxy Maneger Auth

Выполняем вход с такими данными

Email: admin@example.com
Password: changeme

Нас перебросит на страницу на которой любезно спросят как мы хотим назвать учётную запись, наше имя и почту. Почта будет в дальнейшем использована в качестве логина. Настоятельно рекомендую вписывать валидную почту.

После этого откроется диалог смены пароля - вписываем стандартный changeme и ставим свой сложный пароль.







Обновляем записи DNS

Для того чтобы проксировать наше приложение нам понадобится изменить DNS записи нашего домена. Если у вас нет свободного домена под рукой вы можете получить его бесплатно тут.

Так как у всех скорее всего будут разные регистраторы то для удобства я буду показывать дальнейший процесс в cloudflare.

Первым делом я предлагаю проксировать саму панельку на поддомен npm.example.com. Для этого в CloudFlare переходим в раздел DNS и создаём A-запись в поле Name вписываем npm, а в поле IPv4 address вписываем ip адресс сервера. Нажимаем save. Ждём какое то время, обычно около 5-10 минут иногда быстрее иногда дольше.

Add Cloudflare Subdomain

Proxy status то есть проксирование - выключаем.

Обратите внимание на скриншоте приведён пример с поддоменом, если вы хотите привязать сам домен то вписывайте его туда целиком вместо npm







Вариант 1: Проксируем приложение через NPM по порту

Как я уже написал выше, у этого способа есть один недостаток. Заключается он в том что помимо того что ваше приложение отзывается по проксируемому домену, оно также отзывается по внешнему порту контейнера. То есть другими словами торчат наружу порты. Данный способ более прост в реализации чем проксирование по хостнейму. Но обо всём по порядку.

Возвращаемся в нашу Веб-панель NPM. В ней открываем Proxy Hosts и кликаем Add Proxy Host. И добавляем наш хост.

Вписываем имя домена или поддомена, ip адрес сервера, порт на котором у нас запущена админка NPM - по стандарту 81, я всё таки советую сменить на что нибудь неприметное наподобие 43013

npm addhost by port 1

Сразу добавим наш хост нажатием кнопки Save. Он появится в списке проксируемых хостов. В данный момент он должен открываться по протоколу http проверяем кликнув по хосту в панельке. В результате нам должен открыться сайт http://npm.example.com

Если всё хорошо и необходимый сайт открылся - переходим к следующему шагу - добавление SSL сертификата. Для этого нажимаем на три точки справа от хоста и нажимаем Edit. Переходим на вкладку SSL и запрашиваем новый SSL сертификат нажав на кнопку Save.

Nginx Proxy Manager Add Host 2

Снова кликаем по нашему хосту и проверяем что у нас автоматически редиректнуло на https://npm.example.com и что теперь у домена установлен вилидный SSL сертификат. Об этом сигнализирует знак замка в адресной строке.

Работает.

По мере добавления новых хостов, панелька будет выглядеть вот так.

Nginx Proxy Dashboard

Важно - для IDN-доменов нужно вписывать только punnycode!
Например для домена домен.com нужно вписать xn--d1acufc.com (при этом вписывать домен.com не нужно!).







Вариант 2: Проксируем приложение через хостнейм

Со временем понимаешь что все эти торчащие наружу порты никчему. И мы можем от них избавиться. Оставим открытыми только 80 и 443 порты, а всё остальное будет проксироваться с помощью магии докера.

Для сначала нужно создать отдельную сеть. В эту сеть мы добавим NPM а также все контейнеры, которые хотим проксировать. Создаём сеть

sudo docker network create -d bridge evilcorp

Если вы хотите добавить какой то контейнер в эту сеть есть специальная команда, например вот так это выглядит для portainer.

sudo docker network connect evilcorp portainer

Но лучше описать эту сеть в самом docker-compose.yml в таком случае мы избавимся он необходимости каждый раз добавлять контейнеры через CLI.

Я подготовил специальный фаил docker-compose.yml для NPM. В нём уже добавлены все необходимые параметры.

Отредактируйте старый фаил docker-compose.yml заменив его новым и перезагрузите контейнер

sudo docker-compose up -d --force-recreate

Посмотрим что было добавлено

У каждого контейнера появились директивы container_name:

container_name: nginx-proxy-manager-...

У каждого контейнера появились директивы networks:

networks:
  - default

В самом конце была добавлена определяющая директива

networks:
  default:
    external: true
    name: evilcorp

Мы прямо в docker-compose.yml указали что оба контейнера NPM: app(главное приложение) и db(база данных) находятся в одной сети evilcorp.

Ещё раз все последующие хосты которые мы будем проксировать следует добавлять в эту сеть. В моих фаилах docker-compose.yml это уже будет. Но если вы будете добавлять какой то новый сервис сами - не забудьте его добавить в сеть evilcorp!

Дополнительно мы назначили container_name для каждого контейнера и теперь мы можем обращаться к ним по имени как по DNS, внутри этой сети.

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

В графу Forward Hostname / IP* вписываем имя нашего контейнера nginx-proxy-manager-app

А в графу порт вписываем 81

npm addhost by hostname 1

И нажимаем кнопку Save.

В результате мы получим вот это

npm addhost by hostname 2

Но почему мы вписали порт 81, а не 43013? Дело в том что мы обращаемся к контейнеру из внутренней сети. Представьте что оба контейнера это 2 отдельных компьютера. На одном поднято само приложение, а на другом база данных. Находясь внутри этой сети вы будете обращаться к приложениям по внутреннему порту, который в docker обычно располагается справа. А не по внешнему порту, который располагается слева.

А раз теперь у нас всё общение происходит через внутреннюю сеть, то и порт выставлять наружу нам просто незачем. Поэтому ещё раз заходим в docker-compose.yml и комментируем строку

ports:
  - '80:80'
  # - '43013:81'
  - '443:443'

После чего вновь пересоздадим контейнер

sudo docker-compose up -d

В результате у нас открыты только 2 порта 80 и 443, а всё остальное проксируется средствами NPM. И нету больше никаких торчащих наружу портов.







Защищаем наши хосты NPM

В Nginx Proxy Manager есть встроенный механизм Access-control list(ACL), который позволит улучшить безопасность проксируемых приложений. Создадим для примера такое правило.

Переходим в пункт Access Lists и создаём новое правило Add Access List

Nginx Proxy Manager ACL Creation

Далее у нас будут 2 варианта валидации хорошего пользователя по Login + Password и по ip адресу.

Satisfy Any в выключенном состоянии означает что для успешной авторизации мы должны проходить сразу по двум правилам: Login + Password и по ip адресу. Если же мы включим Satisfy Any то для авторизации будет достаточно выполнения любого из условий.



Переходим на вкладку Authorization

Nginx Proxy Manager ACL Authorization

Тут мы вписываем любые угодные данные для авторизации, которые будем впоследствии вводить в качестве логина и пароля. Если нужно сделать доступ для нескольких пользователей - нажимаем Add.



Переходим на вкладку Access

Nginx Proxy Manager ACL Access

Тут мы перечисляем списки ip адресов, которым хотим разрешить доступ. Поддерживаемый формат просто ip xxx.zzz.ccc.vvv и/или ip+подсеть xxx.zzz.ccc.vvv/24


Вводим данные и сохраняем по кнопке save. Появляется наше правило.

Nginx Proxy Manager ACL Success

Возвращаемся к нашим хостам в Dashboard > Proxy Hosts

Выбираем хост к которому хотим применять только что созданные правила. Нажимаем справа на три точки и Edit попадаем в редактирование хоста. Выбираем только что созданный нами ACL.

Nginx Proxy Manager ACL select

Проверим что у нас получилось. Все проверки настоятельно рекомендую делать в браузере в режиме инкогнито.

В FireFox активируем сочетанием клавиш CTRL + SHIFT + P

В Chrome активируем сочетанием клавиш CTRL + SHIFT + N

Отправляемся по адресу где живёт нашё приложение и видим там

Nginx Proxy Manager ACL select

Введя валидные данные мы попадаем в наше приложение.

Для эксперимента я зашел туда же через VPN, ip адрес которого не в списке разрешённых и в результате получил такой результат

Nginx Proxy Manager ACL

Что говорит о том что мы успешно защитили вход на наши секретные хосты от недоброжелателей. Помним, что идеальной защиты не бывает, но так всё таки лучше чем с дверью нараспашку.







Бесплатный SSL сертификат от cloudflare на 15 лет

Бесплатные SSL/TLS сертификаты выдаёт не только Letsencrypt но и Cloudflare. Причём у CF его можно взять сразу на 15 лет. Но не спешите радоваться, помимо плюсов есть и минусы. Например для таких сертификатов нужно включить обязательное проксирование. То самое которое вместо вашего реального ip адреса выдаёт ip адреса Cloudflare. Это не всегда нужно, а в некоторых случаях вообще не нужно. Во всех остальных случаях это скорее плюс, т.к. улучшает нашу безопасность подменяя настоящий ip.

Основной минус проксирования состоит в том что там есть ограничение на размер передаваемого/загружаемого фаила при включенной проксификации. На бесплатном тарифе он равен 100 MB и срабатывает когда вы что то загружаете на сервер. Какие то виды П.О. разбивают загружаемые фаилы на чанки, тем самым обходя это ограничение, например Nextcloud так делает. А вот в каком то П.О. это не предусмотрено. Например File Browser так не делает и в результате фаилы больше 100 MB не загружаются. В таких случаях можно использовать сертификат от Letsencrypt при этом отключить проксирование на конкретный поддомен.

С минусами разобрались. Теперь переходим непосредственно к получению. Логинимся в свой аккаунт Cloudflare. У вас должен быть уже привязан домен, можно бесплатный от freenom. Отправляемся в раздел SSL/TLS > Origin Server. Изначально там будет пусто.

cloudflare get Origin Server certificate

Нажимаем на кнопку Create Certificate. Попадаем в раздел создания сертификата. Там будет указано его название и в самом низу время на которое мы хотим получить этот сертификат. Указываем 15 лет и нажимаем ok.

cloudflare get Origin Server certificate create

Нас перекинет на специальную страницу. Сохраняем содержимое полей так как это указано на скриншоте в фаилы example.com.pem и example.com.key

Просто скопируйте содержимое и вставьте в блокнот, сохранив в фаил с необходимым именем. Обратите внимание что фаил не должен содержать пустых строк ни в начале ни в конце. Обязательно сохраните оба фаила. Если вы по какой то причине не сохранили оба фаила сразу то придётся перевыпускать сертификат, потому что во зайдя во второй раз на ту же самую страницу вы не увидите там example.com.key!

cloudflare get Origin Server certificate key and pem

Нажав ок мы вернёмся в раздел SSL/TLS > Origin Server на этот раз в графе Hosts будет наш только что созданный сертификат.

cloudflare get Origin Server certificate completed

Теперь переходим в раздел SSL/TLS > Overview. Тут необходимо выставить режим Full strict либо Full. Работать будет в обоих случаях но режим Full strict предпочтительнее.

cloudflare SST/TLS mode

Отправляемся в раздел DNS. Добавляем домен либо поддомен с включённой проксификацией.

cloudflare add new-domain

Далее весь процесс будет происходить в NPM. Идём в раздел SSL Certificates и добавляем новый Custom SSL сертификат.

Nginx Proxy Manager add new Certificate

В появившемся окне заполняем

  • Name * - любое имя для сертификата
  • Certificate Key* - путь до фаила example.com.key
  • Certificate* - путь до фаила example.com.pem

Последний пункт Intermediate Certificate необязательный поэтому его не заполняем. У меня фаил домена для примера называется example.com у вас же будет ваш домен поэтому заполняйте с учётом названия вашего домена. После чего нажимаем Save.

Nginx Proxy Manager add new Certificate 2

Мы добавили новый сертификат в NPM

Nginx Proxy Manager add new Certificate 3

Идём в раздел Hosts > Proxy Hosts

Nginx Proxy Manager add new host

Добавляем новый домен/хост. Я добавлю хост для самого NPM

Nginx Proxy Manager add new host 2

Переходим в раздел SSL и выбираем наш кастомный сертификат

Nginx Proxy Manager add new host 3

Выставляем для него необходимые настройки и применяем

Nginx Proxy Manager add new host 4

В итоге получаем рабочий хост с SSL/TLS сертификатом на 15 лет

Nginx Proxy Manager add new host 5

С CloudFlare всё.







Получаем бесплатный wildcard сертификат от letsencrypt

Wildcard сертификат от letsencrypt это отличная альтернатива сертификату cloudflare, т.к. для этого сертификата не обязательно включать проксирование. На некоторых сервисах принудительное проксирование ограничивает нас в загрузке фаилов не больше чем 100 mb, а тут у нас получается развязаны руки - хотим включаем проксирование не хотим не включаем.

К сожалению этот сертификат нельзя получить для freenom доменов(.cf .tk .gq .ga .ml).

На главной странице Overview прокручиваем в самый низ до раздела API и нажимаем справа Get your API token.

Cloudflare wildcard letsencrypt Certificate 1

На этой странице создаём новый токен нажав на Create Token.

Cloudflare wildcard letsencrypt Certificate 2

Нас перекинет на страницу где уже содержатся разнообразные шаблоны.

В самом низу в разделе Create Custom Token создаём свой шаблон. Нажав на соответствующую кнопку Get started.

Cloudflare wildcard letsencrypt Certificate 3

Придумываем ему название, я написал туда NginxProxyManager, можете написать любое угодное Вам название.

В разделе Permissions в выпадающем списке выбираем Zone. Во втором выпадающем списке выбираем DNS. В третьем Edit.

Cloudflare wildcard letsencrypt Certificate 4

Всё остальное оставляем по умолчанию и нажимаем Continue to summary.

Попадаем на страницу где нам ещё раз показывают какими правами будет наделён наш токен, соглашаемся нажав по кнопке Create Token.

Cloudflare wildcard letsencrypt Certificate 5

После этого нас перекинет на страницу с самим токеном. Обязательно сохраните его, потому что во второй раз попасть на эту страницу Вы не сможете, придётся отзывать токен и создавать сначала если по какой то причине он у вас потеряется.

Cloudflare wildcard letsencrypt Certificate 6

Так же на этой странице будет строка для проверки curl'ом можно протестировать в терминале, но это не обязательно.



Возвращаемся в NPM, идём в пункт SSL Certificates и добавляем сертификат Let's Encrypt

Cloudflare wildcard letsencrypt Certificate 7



В поле Domain Names * вписываем *.example.com и example.com (подставьте свой домен вместо example.com). Можно по желанию также вписать сюда и основной домен, я не стал вписывать.

Нажимаем на радио-кнопки Use a DNS Challenge и I Agree to the Let's Encrypt Terms of Service

В разделе DNS Provider выбираем Cloudflare

В появившемся поле вместо 0123456789abcdef0123456789abcdef01234567 вписываем свой токен и нажимаем Save.

Cloudflare wildcard letsencrypt Certificate 8

Раздел Propagation Seconds можно не заполнять.

Ожидаем несколько минут, обычно около 1 минуты, и получаем готовый wildcard сертификат.

Теперь мы можем использовать его для всех поддоменов. Для этого просто выбираем его в списке ssl сертификатов, вместо того чтобы запрашивать по сертификату для каждого поддомена. Npm в свою очередь сам позаботится об автообновлении этого сертификата.







Как сделать 301 и 302 редирект

Иногда так бывает что вы обновили какой то свой старый сайт и у него изменяется структура и названия страниц. А траффик то идёт на старые страницы где пользователей любезно встречает страница 404. Самым правильным решением в этом случае будет сделать 301 редирект со старой страницы на новую. В этом случае пользователи будут автоматически перенаправлены на нужную страницу. Помимо этого поисковые системы не влепят вам штрафные баллы за такие финты ушами с исчезновением некоторых страниц.

Чтобы сделать такие редиректы открываем NPM далее идём в Proxy Hosts выбираем необходимый домен, справа нажимаем на троеточие и выбираем пункт Edit. В открывшемся окне выбираем пункт Advanced

Остаётся только вписать ваши редиректы. Делается это с помощью синтаксиса NGINX

rewrite ^/old-page$ /new-page permanent;

Приведу пару примеров

rewrite ^/blog/$ /blog.html permanent;
rewrite ^/drugaya_forma\.html$ /different-shape.html permanent;
rewrite ^/deleted\.html$ /404.html permanent;

Ура всё работает!!! Mission Completed!

54 Комментарии

  1. на текущий момент изменилась строка проброса портов:
    ports:
    - '43013:81' - не работает
    у меня заработало:
    ports:
    - '81:81'

    ОтветитьУдалить
  2. непонятно где вводить данные о сертификате от letsencrypt. overview и тд на какой страничке? И если DNS провайдер отличный от Cloudflare ?

    ОтветитьУдалить
    Ответы
    1. На странице Overview справа, смотрите скриншот. Если днс провайдер отличный от cloudflare то привязать к cloudflare либо гуглить для своего случая, писать им в тикеты и т.д.

      Удалить
  3. Спасибо огромное за статью! НО у меня не понятная бага, после авторизации указал свои данные для входа почта/пароль, после перезапуска контейнера данные для авторизации не подходят, пробовал раз 5 заново создавать контейнер с NPM, как итог после перезапуска контейнера данные не подходят

    ОтветитьУдалить
    Ответы
    1. Попробуйте потушить контейнер и опять рекурсивно поменять овнера на папку sudo chown -R $USER:$USER /app/NPM

      а затем снова поднять контейнер.

      Тоже встречался с этой багой, иногда помогает сбросить кэш или просто зайти в инкогнито или в другом браузере, а со временем бага пропадает.

      Удалить
  4. А балансировку нельзя настроить?
    Я не нашел в интерфейсе.
    Если можно, то подскажите как настроить балансировку серверов в NPM.

    ОтветитьУдалить
    Ответы
    1. Такой возможности нет. Можно попробовать поставить что то типа Haproxy перед NPM, я так не пробовал, но думаю что должно сработать.

      Удалить
  5. На шаге ввода команды
    sudo docker-compose up -d --force-recreate
    я получаю ошибку: docker-compose: command not found
    Дистрибутив Ubuntu 22.04 LTS.
    Подскажите как исправить ошибку, чтобы команда прошла успешно?

    ОтветитьУдалить
    Ответы
    1. Необходимо поставить docker-compose https://antoshabrain.blogspot.com/p/virtualization-docker-full-install.html

      Удалить
    2. потому-что в статье ошибка, должно быть docker compose up без -

      Удалить
    3. В посте нет никакой ошибки, и если посмотреть необходимую документацию, то ключ -d нужен для того чтобы запустить контейнер в бекгрануде. Если запускать без этого ключа то контейнер остановится после закрытия процесса породившего его, например при закрытии терминала.

      Удалить
  6. Чтобы управлять Haproxy нужно очень хорошо знать правила или нужно ставить веб-морду Roxi-wi, которая очень навороченная и помогает управлять Haproxy и другими прокси, например Nginx.
    Я пробовал поставить эту морду, но не смог. Все мануалы по установке либо старые, либо фейковые, по ним не ставится.
    Если вы шарите, то сделайте по-шаговый мануал по установке Roxi-wi на Ubuntu 22.04 LTS.
    Тогда у вашего блога будет ещё больше читателей.

    ОтветитьУдалить
    Ответы
    1. Не слышал никогда о Roxi-wi, как по мне это лишнее звено и для решения поставленной задачи можно обойтись без неё.

      Haproxy не такой уж и сложный, в своё время я познакомился с ним посмотрев это видео:
      https://www.youtube.com/watch?v=qYnA2DFEELw

      Удалить
  7. про docker-compose или docker compose без -
    root@omv6-1:~# uname -a
    Linux omv6-1 6.0.0-0.deb11.2-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.0.3-1~bpo11+1 (2022-10-29) x86_64 GNU/Linux
    root@omv6-1:~# docker-compose --version
    -bash: docker-compose: команда не найдена
    root@omv6-1:~# docker compose version
    Docker Compose version v2.12.2

    ОтветитьУдалить
    Ответы
    1. Очевидно что нужно поставить docker-compose. А не отвечать в комментах будто в посте ошибка. Повторяю никакой ошибки нет, читайте внимательнее!

      Удалить
  8. Есть контейнер с Nginx

    Nginx-Host1 0.0.0.0:8080->80/tcp, :::8080->80/tcp

    Добавил его в сеть

    docker network connect evilcorp Nginx-Host1

    Что прописывать в
    Forward Hostname / IP
    и
    Forward Port
    при добавлении в Nginx Proxy Manager?

    Прописывал Nginx-Host1 и 80 выдает ошибку.

    ОтветитьУдалить
    Ответы
    1. Как написано в посте
      1) При создании NPM выбрать docker-compose.yml фаил в котором прописана сеть evilcorp
      https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/ReverseProxy/NginxProxyManager/1-npm-basic-amd64-with-network/docker-compose.yml

      2) Создать например такой контейнер со статикой Nginx https://antoshabrain.blogspot.com/2021/09/nginx-static-docker-compose.html вот сразу фаил docker-compose.yml
      https://github.com/killarbyte/killarbyte-ab-stuff/blob/main/docker/webserver/nginx/2-basic-nginx-static-with-version-and-network/docker-compose.yml

      После нужно прописать имя контейнера и внутренний порт контейнера как на скрине (только тут надо не 81 порт а 80 под статику nginx)
      https://img.zzxc.ru/img/post-19/post19-npm-addhost-hostname-1.png


      Сделать всё в точности как написано в обоих постах, без какой либо отсебятины. У меня ни в одном примере не было никаких 8080 портов! (и не забыть при этом создать index.html опять же это всё написано в посте)

      Удалить
  9. Доброго времени суток. А подскажите пожалуйста, можно ли через него проксировать imap (как обычный nginx). И как можно использовать вкладку advanced ?

    ОтветитьУдалить
    Ответы
    1. Привет, на счёт imap не пробовал не знаю.

      Что касается вкладки advanced, спросил у chatGPT говорит:

      The advanced tab in Nginx Proxy Manager allows you to configure advanced settings for your proxy hosts. Here are some things you can do with the advanced tab:

      Custom nginx configurations: You can add custom Nginx configurations to your host. This can be useful if you need to add custom headers or tweak the proxy settings to better fit your specific use case.

      SSL settings: You can configure SSL settings, including SSL protocols, ciphers, and client certificate requirements.

      Access control: You can configure access control rules to restrict access to your proxy host based on IP addresses, HTTP methods, or request headers.

      Redirects: You can set up redirects for your host, including 301 and 302 redirects.

      Rate limiting: You can set up rate limiting rules to limit the number of requests that can be made to your host over a given time period.

      Overall, the advanced tab provides you with more fine-grained control over your proxy host and allows you to configure it to meet your specific needs. However, be careful when making changes in the advanced tab, as incorrect configurations can lead to issues with your proxy.

      Удалить
  10. так я правильно понимаю, что туда можно вводить все что угодно как в обычном nginx ? синтаксис там точно такой же , и могу не использовать остальные вкладки а полностью описать всю конфигурацию там ?

    ОтветитьУдалить
    Ответы
    1. Ещё не пробовал, думаю да. Если есть возможность проверьте и отпишите результат.

      Удалить
  11. и такой вопрос, не пробовали настраивать связку NPM c MailCow ? возможно я ошибочно понимаю.и мне не надо вообще проксиваровать imap?

    ОтветитьУдалить
    Ответы
    1. Нет. В статье про Mailcow я указал что необходимо настраивать PTR(rDNS) для корректной работы SMTP, чтобы была возможность отправлять почту, а не только получать. Установка PTR записи будет раскрывать реальный ip адрес сервера в виду специфики работы протокола SMTP.

      Я советую ставить Mailcow на отдельный сервер(впс) чтобы раскрытие реального ip адреса никак не влияло на работоспособность остальных приложений и сервисов, т.к. спаливая реальный ip вы открываете целый вектор атаки на вашу инфраструктуру.

      Удалить
  12. После запуска запуска 2 контейнера запустились. И в первом контейнере (nginx-proxy-manager-app) в логах выдаёт ошибку: nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) никак не могу решить эту проблему. В docker-compose.yml прописал другие порты, а он постоянно на 80 пытается выйти. Заранее спасибо

    ОтветитьУдалить
    Ответы
    1. Скорее всего порт 80 уже занят чем то. нужно посмотреть чем и прибить процесс.Также есть вероятность что запускаете без sudo и ему что то не нравится.

      Удалить
  13. Большое спасибо за отличный мануал, и за остальные материалы в блоге - респект. Возникла проблема, описанная зарубежными коллегами, как "nginx proxy manager login issue", а именно: Bad Gateway при попытке залогиниться с дефолтными данными "Email address и Password". Самостоятельно решение пока не нашел. Поможете?

    ОтветитьУдалить
    Ответы
    1. Благодарю, вот несколько способов которые помогали мне устранить проблему с bad gateway:

      1) остановить контейнер + сделать текущего юзера повторно владельцем директории с NPM
      sudo chown -R $USER:$USER /app/NPM
      после этого заново запустить контейнер

      2) открыть npm в другом браузере или на другом компьютере

      3) перезагрузка впс и компьютера с которого открывается NPM

      4) в редких случаях делал сброс кеша в cloudflare но это скорее для себя, т.к. это вряд ли на что то влияет

      Удалить
  14. Спасибо очень помогли всё работает! У меня проблема я забыл логин (e-mail) и пароль, которые ставил место дефолтного. Несколько инструкций в интернете не помогли. Помогите как сбросить пароль без потери настроек. Заранее спасибо

    ОтветитьУдалить
    Ответы
    1. Привет, ещё не доводилось сталкиваться с такой проблемой, я обычно сразу записываю данные, можно попробовать потушить контейнер, заархивировать и всё поднять с нуля, а если что вернуть всё обратно назад, восстановив бекап.

      Удалить
  15. Спасибо за подсказку!

    ОтветитьУдалить
  16. Подскажите, пожалуйста, для чего выносить бд в отдельный контейнер?

    ОтветитьУдалить
    Ответы
    1. Так задумал автор.Например чтобы тестировать новые сборки mysql/postgres, для разработки и т.д.

      Удалить
  17. Тоже столкнулся с проблемой Bad Gateway при попытке залогиниться с дефолтными данными Login: admin@example.com и Password: changeme. Выходом стало использование официального конфига с https://nginxproxymanager.com/setup/#using-mysql-mariadb-database вместо предложенного в статье. Там существенная разница только в самой последней строчке ./mysql:/var/lib/mysql вместо ./data/mysql:/var/lib/mysql Если я правильно понял, там какая-то бага с разрешениями на папку: https://github.com/NginxProxyManager/nginx-proxy-manager/issues/310

    ОтветитьУдалить
    Ответы
    1. Привет, и всё же по данному мануалу у меня работает. Если возникает ошибка с Bad Gateway,

      тушу контейнер:
      sudo docker-compose down

      делаю:
      sudo chown -R $USER:$USER /app/NPM

      и затем сразу поднимаю командой:
      sudo docker-compose up -d

      у меня в большинстве случаев ошибка пропадает. Но если хотите используйте любой конфиг какой захотите)

      Удалить
  18. Привет. Я полдня потратил на решении проблемы с Bad Gateway. Тушение контейнера -> изменение прав на папку -> запуск контейнера => снова Bad Gateway... Судя на тикету на GitHub данная проблема у людей возникала после последнего обновления NPM. Скорее всего, конфиг на официальном сайте как раз учитывает эту багу.

    Спасибо большое за статью, добрый человек!

    ОтветитьУдалить
    Ответы
    1. Привет, пожалуйста. Посмотрел конфиг на официальном сайте, он совпадает

      Сомневаюсь что вышеописанное изменение на что то повлияет
      ./mysql:/var/lib/mysql
      ./data/mysql:/var/lib/mysql

      Удалить
  19. при попытке запустить контейнер получаю ошибку:

    sudo docker-compose up -d
    Recreating nginx-proxy-manager-app ...
    Recreating nginx-proxy-manager-db ... error

    Recreating nginx-proxy-manager-app ... error5: container init caused: process_linux.go:458: setting cgroup config for procHooks process caused: can't load program: operation not permitted: unknown

    ERROR: for nginx-proxy-manager-app Cannot start service app: OCI runtime create failed: container_linux.go:367: starting container process caused: process_linux.go:495: container init caused: process_linux.go:458: setting cgroup config for procHooks process caused: can't load program: operation not permitted: unknown

    ERROR: for db Cannot start service db: OCI runtime create failed: container_linux.go:367: starting container process caused: process_linux.go:495: container init caused: process_linux.go:458: setting cgroup config for procHooks process caused: can't load program: operation not permitted: unknown

    ERROR: for app Cannot start service app: OCI runtime create failed: container_linux.go:367: starting container process caused: process_linux.go:495: container init caused: process_linux.go:458: setting cgroup config for procHooks process caused: can't load program: operation not permitted: unknown
    ERROR: Encountered errors while bringing up the project.


    в чем может быть проблема?

    ОтветитьУдалить
    Ответы
    1. Полагаю что был пропущен какой то шаг из мануала, либо что то сделано неверно. Я уже достаточное количество их поднял на разных хостингах прямо вот по этому мануалу и всё было ок. Процентах в 10 случаев была ошибка Bad Gateway, но она тут же лечилась мной вышеописанным способом.

      Попробуйте поставить на свежую впску с нуля докер и NPM. Ну или загуглить что там не так.

      Удалить
  20. Добрый день!
    Подскажите пожалуйста, если у меня два сервера в локальной сети и на каждом по сайту, то для того чтобы пробрасывать 80 и 443 порты на сервер который хостит соответствующий сайт, мне достаточно функционала Nginx Proxy Manager?
    И если да, то можно его просто поставить на Убунту без всех этих контейнеров?

    ОтветитьУдалить
    Ответы
    1. Привет, если я правильно понял задумку - да можно. Так же как и можно поставить без контейнеров. Хотя я рекомендую ставить именно в контейнере, это быстро и просто.

      Удалить
  21. Насколько понимаю, можно поставить какую-то машинку не очень мощную машинку под такой сервер. С роутера пробросить на нее порты, а дольше она сама. Только не нашел инструкции как поставить прокси-менеджер на чистую систему

    ОтветитьУдалить
    Ответы
    1. Ничего искать не нужно, самый простой вариант установки уже описан в этом посте.

      Удалить
  22. Ответы
    1. Я не планирую пост про установку без докера.

      Удалить
  23. некоторые контейнеры туда не работают и возвращают 502 при включение ufw, без ufw все четко. В чем может быть дело?

    ОтветитьУдалить
  24. Доброго времени суток, господа! Хотелось бы узнать, а как все же проксировать и все остальные приложения в других контейнерах с различными портами наружу, и так чтобы не был сервис доступен по ip:port (например 192.168.1.1:1234)??? У меня получилось это сделать только непосредственно с самим npm. А как сделать так же с другими используя этот npm??? Так как в инструкции к npm у меня не получается, контейнеры просто не работают если им не назначать порт...

    ОтветитьУдалить
    Ответы
    1. Внимательно прочитать этот пост и сделать так как в нём написано. А именно добавить другие контейнеры в ту же самую сеть что и npm, и сделать соответствующие настройки при добавлении нового хоста в npm.

      Удалить
  25. Доброго времени
    Расскажите про API NPM если знаете. Хотелось бы экспортировать сертификаты из npm в другие сервисы. Где взять token для доступа?

    ОтветитьУдалить
  26. Привет! А как реализовать такую схему: NPM стоит на UBUNTU с белым адресом. Нужно, чтобы NPM редиректил соединения на другие белые IP.
    Например, обращаешься на порт 33891, а идёт редирект на другой белый адрес:3389 ?

    ОтветитьУдалить
    Ответы
    1. Привет если я правильно понял задумку, то для такого лучше использовать HAproxy.

      Удалить
  27. Добрый вечер, а не сталкивались с проблемой что когда Access Lists настроил тебя не впускает, бесконечный цикл запроса пароля

    ОтветитьУдалить
    Ответы
    1. Привет, я сталкивался с разными косяками, но такого ещё не видел. Очень часто, если происходит какой то баг, то спасает просто открыть в другом браузере или в режиме инкогнито.

      Удалить

Отправить комментарий