Nginx Proxy Manager: 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!