Nginx Proxy Manager: Docker

3 minuto(s) de lectura

Docker

Nginx Proxy Manager en adelante NPM, es un Proxy inverso con el cual podremos redirigir las solicitudes a las distintas aplicaciones del sistema a un servicio web.

Integra una sencilla gesti贸n sobre los certificados SSL, usando por ejemplo Let鈥檚 Encrypt como autoridad certificadora para acceso https y con renovaci贸n de forma automatizada de los mismos.

Es una alternativa a Traefik y como ambos usan los mismos puertos de comunicaci贸n externos no son compatibles en el mismo sistema.

Como proxy inverso no tendremos que abrir los puertos espec铆ficos de nuestros contenedores Docker en la NAT de nuestro Router, sino que seran accesibles a traves de los puertos 80 (HTTP) y 443 (HTTPS) que si deberemos de abrirlos antes de continuar (espec铆ficamente TCP, no UDP)

Instalaci贸n

Vamos a realizar unos pasos previos para preparar el entorno. En primer lugar creamos las carpetas donde alojar el proyecto:

mkdir -p $HOME/docker/npm && \
cd $HOME/docker/npm

Ahora vamos a crear el fichero de configuraci贸n docker-compose.yml lanzando el siguiente comando:

cat << EOF > $HOME/docker/npm/docker-compose.yml
version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: NginxProxy
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./datos:/data
      - ./certificados:/etc/letsencrypt
    restart: always

  db:
    image: 'jc21/mariadb-aria:latest'
    container_name: MariaDB_NPM
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./bdatos:/var/lib/mysql
    restart: always
EOF

Si queremos instalar NPM en una RPi o equipo con procesador ARM, tendremos que cambiar el docker de Base de Datos jc21/mariadb-aria:latest por yobasystems/alpine-mariadb:latest

Vamos a repasar los principales par谩metros que hemos a帽adido sobre la anterior base, para poder adaptarlos a nuestro sistema y configuraci贸n especifica:

Par谩metro Funci贸n
80:80 Puerto de comunicaci贸n p煤blico
81:81 Puerto de acceso interfaz Web configuraci贸n
443:443 Puerto de comunicaci贸n p煤blico con certificados SSL
Parametros MYSQL Usuario, contrase帽a, ruta y puerto comunicaci贸n Base de datos
./datos:/data Ruta donde almacena la configuraci贸n
./certificados:/etc/letsencrypt Ruta donde almacena los certificados SSL
./bdatos:/var/lib/mysql Ruta donde almacena la Base de datos
restart: always Habilitamos que tras reiniciar la maquina anfitrion vuelva a cargar el servicio

Una vez configurado, levantamos el servicio para ser configurado y ejecutado:

docker-compose up -d

Configuraci贸n

En mi caso, el servicio estar铆a disponible en la direcci贸n web http://192.168.1.90:81

NOTA: El usuario por defecto para el primer acceso es admin@example.com y la contrase帽a changeme

General

Durante el primer inicio de sesi贸n se nos solicitara la configuraci贸n del usuario:

Otro aspecto interesante a configurar es la redirecci贸n a otro dominio en caso de introducir un dominio inexistente:

Certificados

Vamos a generar un certicado comod铆n para todos nuestros microservicios y de esa forma no tener que generar certificados indivuales.

Para ello introducimos nuestra DNS como muestro en el video adjunto.

Seleccionamos la casilla DNS Challenge y del listado clicamos en DuckDNS como proveedor.

En las opciones de configuraci贸n debemos de proveer el Token del servicio DuckDNS:

Tras finalizar, tendremos configurado el certificado comod铆n de forma satisfactoria y con renovaci贸n autom谩tica.

Microservicios

Llega el turno de agregar nuestro microservicios para externalizarlos:

Como ejemplo, planteo dos microservicios y las diferencias a la hora de configurarlos en la pesta帽a detalles:

Par谩metro Funci贸n
Domain Names Nombre que elegimos para el microservicio + DNS
Scheme Elegimos si la configuraci贸n la realiza de forma interna por HTTP o HTTPS
Forward Hostname / IP Definimos la IP de nuestra red donde se aloja el servicio
Forward Port Puerto de comunicaci贸n del microservicio
Cache Assets Habilitamos el uso de cache
Block Common Exploits Habilitamos bloqueos contra ataques gen茅ricos
Websockets Support Habilitamos la interacci贸n Web con el microservicio, no siempre requerido

A continuaci贸n configuramos el certificado SSL antes de hacer clic en Save y aplicamos reglas de seguridad:

Par谩metro Funci贸n
SSL Certificate Seleccionamos el certificado comod铆n que anteriormente configuramos
Force SSL Forzamos que toda la comunicaci贸n externa sea a traves del certificado SSL
HTTP/2 Support Habilitamos compatibilidad con protocolo HTTP 2.0
HSTS Enable Forzamos la comunicaci贸n a traves de HTTPS en dominio principal
HSTS Subdomains Forzamos la comunicaci贸n a traves de HTTPS en subdominios

Y listo!