Categorías
20.04 Docker HowTos

Nginx Proxy Manager sobre Docker en Ubuntu 20.04

Nginx Proxy Manager Logo

Nginx Proxy Manager es una solución que disponibiliza un proxy basado en Nginx que nos permite exponer servicios web en forma fácil, permitiendo utilizar certificados SSL de letsencrypt.org o propios.

Instalar Docker (si no esta instalado previamente):

El primer paso es actualizar la biblioteca de software disponible y descargar docker y docker-compose.

sudo apt update && sudo apt install docker.io docker-compose -y

Asumo que tenes instaladas las utilidades básicas para linux que documenté acá (voy actualizando este post en el tiempo).

A continuación iniciamos el servicio de docker y configuramos para que inicie el mismo con el sistema.

sudo systemctl daemon-reload
sudo systemctl enable docker.service
sudo systemctl start docker.service
sudo systemctl status docker.service
Captura de pantalla de verificación del servicio de Docker corriendo.
Captura de pantalla de verificación del servicio de Docker corriendo.

Desplegando Nginx Proxy Manager:

La solución la voy a desplegar en el directorio «/opt/docker/» el docker compose lo voy a bajar de github

sudo mkdir -p /opt/docker/NginxProxyManager
cd /opt/docker/NginxProxyManager
sudo curl -O https://raw.githubusercontent.com/fsismo/docker-compose/main/NginxProxyManager/docker-compose.yaml

Editamos el archivo para adecuarlo a nuestras necesidades (de mínima cambiamos las contraseñas del motor de base de datos).

sudo vi docker-compose.yaml

Se tiene que ver así (hay que respetar indentación)

version: '3'

networks:
  containers:
    ipam:
      config:
        - subnet: 172.31.0.0/24

services:
  app:
    image: 'jc21/nginx-proxy-manager:2.8.1'
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.31.0.7"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "S3cr3t0"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./npm/data:/data
      - ./npm/letsencrypt:/etc/letsencrypt
    networks:
      containers:
        ipv4_address: 172.31.0.6
  db:
    image: 'jc21/mariadb-aria:10.4.15'
    environment:
      MYSQL_ROOT_PASSWORD: 'Sup3rS3cr3t0'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'S3cr3t0'
    volumes:
      - ./mariadb/data/mysql:/var/lib/mysql
    networks:
      containers:
        ipv4_address: 172.31.0.7

Ahora procedemos a realizar el despliegue propiamente dicho ejecutando el comando:

sudo docker-compose up -d
Captura de pantalla del comando sudo docker-compose up -d instalando Nginx Proxy Manager
Captura de pantalla del comando sudo docker-compose up -d instalando Nginx Proxy Manager

Una vez finalizada la descarga inicia la solución que queda accesible en la ip del equipo (10.0.0.44 en el ejemplo) puerto 81.

En este caso como esta en la misma red donde estoy trabajando se accede directamente poniendo http://10.0.0.44:81.

Captura de pantalla de Nginx Proxy Manager página de login.
Captura de pantalla de Nginx Proxy Manager página de login.

Las credenciales de acceso por defecto son «Email: admin@example.com» y «Password: changeme».

El software ofrece actualizar los dato de usuario y exige cambiar la contraseña al acceder al panel.

Finalizada la configuración del usuario se presenta el dashboard de Nginx Proxy Manager.

Captura de pantalla del dashboard del Nginx Proxy Manager.
Captura de pantalla del dashboard del Nginx Proxy Manager.

Con la aplicación ya funcionando vamos a proceder a configurar la misma para que inicie como servicio.

Primero paramos la ejecución de nuestro compose.

sudo docker-compose down

Y configuramos el sistema para poder iniciar el servicio con systemctl. Para eso creamos el archivo con la configuración

sudo curl -o /etc/systemd/system/docker-NginxProxyManager.service https://raw.githubusercontent.com/fsismo/docker-compose/main/NginxProxyManager/docker-NginxProxyManager.service

El contenido del archivo es el siguiente:

[Unit]
Description=Docker Nginx Proxy Manager Service
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/docker/NginxProxyManager/
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target

Le damos permisos de ejecución

sudo chmod 640 /etc/systemd/system/docker-NginxProxyManager.service

Y por último recargamos los servicios disponibles, habilitamos el servicio, lo iniciamos y verificamos que se ejecute correctamente.

sudo systemctl daemon-reload
sudo systemctl enable docker-NginxProxyManager
sudo systemctl start docker-NginxProxyManager
sudo systemctl status docker-NginxProxyManager

Puesta en marcha:

Configuración del Firewall:

Si necesitamos crear certificados para uso público provistos por letsencrypt.org debemos abrir los puertos 80 y 443 en nuestro firewall y redireccionarlo a la ip del equipo donde corre nuestro NPM (NginxProxyManager).

En pfsense se ve así:

Captura de pantalla de la las reglas de fw necesarias para el correcto funcionamiento de NPM en PFSENSE.

En Lightsail de AWS se ve así:

Captura de pantalla de la las reglas de fw necesarias para el correcto funcionamiento de NPM en AWS.

Configurando de Nginx Proxy Manager.

Volvemos a ingresar a la página de Nginx Proxy Manager, en este caso http://10.0.0.44:81

Definir un proxy con un certificado PÚBLICO (Let’s Encrypt):

Para esto hacemos click en la caja de Proxy Hosts.

Captura de pantalla del dashboard.

Y a continuación click en el botón Add Host.

Captura de pantalla de la sección de configuración de Proxy Hosts
  • Details:
    1. Domain Names: Son los nombres de dominio que van a redireccionar al servicio. Hay que presionar «enter» para que tome el cambio.
    2. Scheme: Es el protocolo en el cual escucha el servicio hay que elegir entre http o https.
    3. IP: Ip donde se ejecuta el servicio.
    4. Forward Port: Puerto en el que escucha el servicio.
  • SSL:
    1. SSL Certificate: Seleccionar un certificado, en caso de que necesitemos crear uno debemos seleccionar «Request a new SSL Certificate (with Let’s Encrypt)«.
    2. Force SSL: (Redirecciona el tráfico que venga por el puerto 80 (http) al 443 (https).
    3. Email Address: Una dirección de mail válida que va a ser facilitada a Let’s Encrypt como responsable del dominio.
    4. I Agree: Aceptar los términos y condiciones de Let’s Encrypt.

Definir un proxy con certificado PRIVADO:

Creamos los certificados privados utilizando el procedimiento documentado en CA interna (Certification Authority) OpenSSL en Ubuntu.

El primer paso es dar de alta los certificados, esto se hace haciendo click en «SSL Certificates»

Pantalla principal del Nginx Proxy Manager»

Luego realizamos click en la opción «Custom», esto despliega un nuevo formulario donde tenemos que adjuntar los archivos que componen tel certificado.

Captura de pantalla con la explicación para el alta de certificados privados.

Y procedemos a dar de alta el certificado que vamos a utilizar en la definición del proxy.

Por último (punto 2) procedemos a dar de alta la configuración del Proxy.

Pantalla principal del Nginx Proxy Manager»

Y a continuación click en el botón Add Host.

Captura de pantalla de la sección de configuración de Proxy Hosts
  • Details:
    1. Domain Names: Son los nombres de dominio que van a redireccionar al servicio. Hay que presionar «enter» para que tome el cambio.
    2. Scheme: Es el protocolo en el cual escucha el servicio hay que elegir entre http o https.
    3. IP: Ip donde se ejecuta el servicio.
    4. Forward Port: Puerto en el que escucha el servicio.
    5. Websocckets Support: Normalmente esto no es necesario pero el administrador de Unifi utiliza esta tecnología.
  • SSL:
    1. SSL Certificate: Seleccionar un certificado, en este caso seleccionamos el que definimos en el paso 1 «unifi.sismonda.local«.
    2. Force SSL: (Redirecciona el tráfico que venga por el puerto 80 (http) al 443 (https).

Finalizando probamos el correcto funcionamiento (en forma previa configuramos el dns interno para que resuelva el dominio unifi.sismonda.local con la ip de nuestro Nginx Network Manager).

Prueba del correcto funcionamiento del Nginx Proxy Manager.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.