Как запустить прокси-сервер для сервисов?

Потребность и актуальность

Из схемы понятно, что нам необходимо открывать порты на роутере, чтобы получить доступы к сервисам, но очень не хочется этого делать, а в идеале хотелось бы обращаться к нашим сервисам по следующей схеме: <service>.<my_domain> или <service>.<my_domain>.duckdns.org. Ниже опишем как это сделать. system

Решение

Nginx Proxy Manager (далее NPM) - это решение на котором будем основываться. Общая схема взаимодействия выглядит таким образом:

NGINX Proxy Manager

Если коротко, то мы через наш прокси-сервер получаем запросы от роутера, которые отсылают нам пользователи и перенаправляем их на необходимые нам сервисы. Необходимо открыть порты на роутере 80 и 443 для работы прокси-сервера. У каждого роутера могут быть свои особенности, но нам моем роутере TP-Link Archer A6это делается так: |800

Создаем необходимые папки и файлы:

mkdir {data,letsencrypt}
touch docker-compose.yml

Для начала работы создадим сеть:

docker network create -d bridge test

Далее создаем наш прокси-сервер через nano docker-compose.yml:

services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy-manager-app
    restart: unless-stopped
    ports:
      - '80:80'
      - '43013:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "<secret>"
      DB_MYSQL_PASSWORD: "<secret>"
      DB_MYSQL_NAME: "<secret>"
      # Uncomment this if IPv6 is not enabled on your host
      #DISABLE_IPV6: 'true'
      #отображение реальных ip клиентов в логах sudo docker logs containername
      REAL_IP_HEADER: "X-Real-IP"
      TRUSTED_PROXIES: "172.0.0.0/8, 10.0.0.0/8, 192.168.0.0/16"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - default

  db:
    image: mariadb:latest
    container_name: nginx-proxy-manager-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: '<secret>'
      MYSQL_DATABASE: '<secret>'
      MYSQL_USER: '<secret>'
      MYSQL_PASSWORD: '<secret>'
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      - default

networks:
  default:
    external: true
    name: test

Теперь можем зайти по адресу: http://<ip>:43013 и указать

Email: admin@example.com
Password: changeme

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

SSL

В самом начале настроим ssl-сертификат на вкладке «SSL Certificates». Настраиваем так: |500

Данное действие позволит нам выпустить ssl-сертификат и не заботиться о сроке его действия, так как NPM сама его выпустит заново. Если совсем упрощенно, то мы сможем заходить на наши сервисы не только по http, но и по https.

Базовая проверки подлинности

Заходим во вкладку «Access Lists» и добавляем название нашей базовой проверки. На вкладке «Authorization» заполняем какие пользователи и под какими login-password могут входить. Данное действие необходимо выполнить для случаев когда у наших сервисов по каким-то причинам нет авторизации и они будут открыты всему интернету.

Добавление нового сервиса

На вкладке « Dashboard» добавляем наш первый сервис:

|500

Если выполнили все верно, то сможем обращаться как и планировали htps://<service>.<my_domain>.duckdns.org. Если сервис находится в 1 сети с сервисом прокси-сервера, то возможно обращаться к сервису не оп IP, а по его названию. Именно для этой цели мы создавали отдельную сеть (см. выше).

Ошибки

На вкладке «Settings» можем настроить поведение, если NPM получит host, о котором она ничего не знает. Я сделал так:

      <iframe
        width="720"
        height="405"
        src="https://vk.com/video_ext.php?oid=708854916&id=456241709&hash=3c9f00d96cf169d6"
        frameBorder="0"
        allow="clipboard-write; autoplay"
        webkitAllowFullScreen
        mozallowfullscreen
        allowFullScreen
      ></iframe>

Пусть люди слушают музыку и смотрят видео c ДВ:).

Дополнительные возможности

Существует отдельный сервис для мониторинга NPM . Я этим сервисом не пользуюсь, но знаю о его существовании.

ИТОГ

Какие преимущества получаем при использовании NPM:

  • Упрощение настройки Nginx. Инструмент предоставляет удобный веб-интерфейс, который позволяет создавать и управлять прокси-серверами без необходимости редактировать конфигурационные файлы вручную.

  • Управление обратным прокси. Nginx Proxy Manager позволяет устанавливать обратные прокси для веб-приложений, размещать несколько приложений на одном сервере и проксировать запросы на соответствующие приложения на основе URL-адресов или доменных имён.

  • Управление SSL-сертификатами. Инструмент обеспечивает удобный способ управления SSL-сертификатами, что позволяет администраторам легко настраивать HTTPS для своих веб-сайтов.

  • Логирование и статистика. Nginx Proxy Manager предоставляет возможность просмотра логов и статистики обратного прокси, что позволяет отслеживать и анализировать трафик и запросы к приложениям.

  • Защита. Инструмент может использоваться для настройки аутентификации и авторизации, чтобы ограничить доступ к веб-приложениям.

  • Дополнительные функции. В Nginx Proxy Manager есть такие функции, как настройка перенаправлений, работа с доменными именами и обработка различных типов запросов.

Ссылки:

  1. Как бесплатно получить собственный домен?.

  2. Как установить Proxmox?

  3. Как установить Docker?

  4. Зачем нужен собственный сервер в 2025?