Entrada

Nginx Proxy Manager con certificados SSL

Instalación y configuración de NPM en Docker Swarm

Nginx Proxy Manager con certificados SSL

Una de las cosas que considero imprescindibles en entornos de trabajo o HomeLab es poder contar con un sistema de nombres de dominio (DNS) para la asignación de registros y sus respectivos certificados SSL al acceder a las aplicativos web. Siempre es posible acceder por dirección IP pero una URL tipo http://192.168.1.1/web carece del nivel mínimo aceptable a mi parecer.

En esta ocasión estaremos instalando Nginx Proxy Manager en un entorno Docker Swarm con dos nodos. Este nos servirá para -en conjunto con nuestro DNS- enrutar las consultas de registros DNS a las aplicaciones correspondientes y además agregar seguridad adicional al incorporar un certificado SSL gratis que será obtenido a través de Let’s Encrypt.

Instalación

Para la instalación de Nginx Proxy Manager (NPM) hay varias opciones, lo más sencillo es desplegarlo utilizando docker compose. En mi caso al tener un cluster de Docker Swarm, lo instalaré utilizando Docker Stack, para esto crearé el archivo nginx.yaml en el nodo principal de Swarm con el siguiente contenido:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
version: '3.8'

services:
  app:
    image: jc21/nginx-proxy-manager:latest
    ports:
      - target: 80
        published: 80
        mode: host
      - target: 443
        published: 443 # HTTPS
        mode: host
      - target: 81
        published: 81 # Panel de administración
        mode: host
    volumes:
      - npm_data:/data
      - npm_letsencrypt:/etc/letsencrypt
    environment:
      DISABLE_IPV6: 'true'
    deploy:
      replicas: 1
      placement:
        constraints:
          - "node.role==manager"
      restart_policy:
        condition: on-failure
    networks:
      - swarm-frontend

volumes:
  npm_data:
  npm_letsencrypt:

networks:
  swarm-frontend:
    external: true

Previamente, ya tengo creada la red swarm-frontend en Docker Swarm con el siguiente comando:

1
docker network create swarm-frontend --driver overlay

Es fundamental que la red se cree con el controlador overlay, ya que este tipo de red permite la comunicación entre servicios en diferentes nodos dentro del clúster de Docker Swarm. A diferencia de una red bridge, que solo funciona en un único nodo.

Teniendo claro lo anterior, desplegaré el stack con docker stack deploy.

1
docker stack deploy -c nginx.yaml nginx-proxy --detach=false

Configuración

Una vez instalado el stack, deberíamos poder acceder a la IP del nodo de Docker Swarm (192.168.1.121 en mi caso) y ver lo siguiente.

Para entrar al panel de administración es por el puerto 81. Utilizando las credenciales por defecto.

En el primer inicio de sesión solicitará actualizar el usuario administrador y su contraseña.

Certificados SSL

Prerrequisitos

  • Un dominio, yo utilizaré cervant.net
  • Proveedor DNS, en mi caso Cloudflare

Para crear nuestro primer certificado SSL iremos a SSL Certificates y luego Add SSL Certificate

  1. Habilitar Use a DNS Challenge
  2. Agregar el o los dominios que se quieran utilizar para certificados SSL, yo en mi caso tengo todo publicado en mi DNS bajo home.cervant.net si que crearé un wildcard (*) que utilizaé para todas las aplicaciones de mi HomeLab
  3. Seleccionar DNS Provider
  4. Reemplazar el valor con tu API Token, para cloudflare hay una guía aquí
  5. Finalmente aceptar los términos de Let’s Encrypt y guardar
Recomiendo totalmente utilizar Cloudflare, su tier free es más que generoso y es lo que estaré usando para construir mi HomeLab y otros proyectos.

Al cabo de unos minutos si todo salió bien tendremos el certificado SSL creado con un estado Inactive. Esto solo significa que no está siendo utilizando aún.

Proxy Host

Antes de finalizar le daremos un uso al certificado SSL y a NPM para gestionar el acceso a las aplicaciones web por nombre. Configuraremos el acceso seguro a la web de mi DNS Aguard adguard.home.cervant.net. Ya cuento con el registro creado apuntando a la IP de Nginx. Lo que se quiere lograr es lo siguiente.

Para ello iremos a la pestaña Hosts > Proxy Hosts.

  • Como Domain Name agregar el registro con el que queremos acceder a la web.
  • en Scheme es importante dejarlo como http, ya que el panel de administración del host responde por http.
  • en Forward Hostname / IP se debe ingresar la dirección IP del servicio al que queremos acceder.
  • Para Forward Port es el puerto 3000 en nuestro caso.

  • Pasando a la pestaña SSL podremos agregar el certificado SSL que creamos previamente.
  • Finalmente activaré Force SSL ya que solo me interesa que se acceda de forma segura a este host.

Construye, automatiza, repite. ¡Nos vemos en el próximo post!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.