Nginx Proxy Manager es una interfaz de administración de Nginx que permite exponer servicios de una manera sencilla y segura usando certificados de Let’s Encrypt.

La instalación en Docker se realiza usando la imagen jc21/nginx-proxy-manager.

La forma más sencilla de hacerlo es usando un fichero docker-compose.yml con el siguiente contenido:

version: '3'
services:
  nginxpm:
    image: jc21/nginx-proxy-manager:latest
    container_name: nginxpm
    environment:
      TZ: 'Europe/Madrid'
      # DB_SQLITE_FILE: "/data/database.sqlite"
      DISABLE_IPV6: 'true'
    volumes:
      - ~/volumes/nginxpm/data:/data
      - ~/volumes/nginxpm/letsencrypt:/etc/letsencrypt
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
    restart: unless-stopped

Nota: En este ejemplo se utiliza SQLite como motor de base de datos. Si se quisiera utilizar MySQL o MariaDB, habría que seguir las instrucciones para añadir la información de conexión al contenedor de estas bases de datos.

Se puede usar docker-compose up -d o usar el contenido del fichero en Portainer.

Configuración inicial

Una vez en marcha, se puede acceder a Nginx Proxy Manager a través del puerto 81 (en este ejemplo http://192.168.1.180:81) y comenzar la configuración.

El usuario inicial es admin@example.com y su contraseña es changeme.

Una vez iniciada la sesión, se editan los datos del usuario:

  • Full Name: Administrator
  • Nickname: Admin
  • Email: nginx@mydomain.com

Y, a continuación, se cambia la contraseña por otra más segura:

  • Current Password: changeme
  • New Password: *********
  • Confirm Password: *********

Certificados SSL

Para pedir un certificado SSL a través de Let’s Encrypt hay que acceder a http://192.168.1.180:81/nginx/certificates y seguir el asistente:

Nota: Antes de comenzar, hay que crear un registro DNS de tipo A para el dominio.

  • Pulsar el botón Add SSL Certificate
  • Rellenar el formulario:
    • Domain names: registro.mydomain.com
    • Email Address for Let’s Encrypt: nginx@mydomain.com
    • Marcar la opción Use a DNS Challenge
    • Escoger el proveedor de DNS: Cloudflare
    • Introducir las credenciales para realizar la operación (en el caso de Cloudflare un token que asigna permisos):
# Cloudflare API token
dns_cloudflare_api_token = 8-3x-wz_B7cZXjMNE3Bz1bLMa4YsYQ-XESthjXe3

Si todo va bien, después de unos segundos, se habrá creado un certificado SSL con una duración de 3 meses para el dominio:

Certificado SSL

Nota: Nginx Proxy Manager se encargará de renovar el certificado de forma automática.

Proxy Host

Para crear un proxy host hay que acceder a http://192.168.1.180:81/nginx/proxy y seguir el asistente.

Nota: Antes de comenzar, hay que crear un registro DNS de tipo A para el dominio.

  • Pulsar el botón Add Proxy Host
  • Rellenar el formulario de la pestaña Details
    • Domain names: registro.mydomain.com
    • Scheme: http
    • Forward Hostname/IP: 192.168.1.180
    • Forward Port: 8989 (en el caso de Sonarr)
    • Habilitar Block Common Exploits
    • (Opcional) Habilitar Websockets
  • Seleccionar el certificado SSL creado anteriormente en la pestaña SSL
    • SSL Certificate: registro.mydomain.com
    • Habilitar Force SSL
    • (Opcional) Habilitar HTTP/2 Support
    • (Opcional) Habilitar HSTS
  • Pulsar el botón Save

Si todo va bien, se habrá creado un proxy host que redirige las peticiones de https://registro.mydomain.com a http://192.168.1.180:8989 de forma transparente:

Proxy Host

Docker network

Al tener servicios ejecutándose en la el mismo Docker host que Nginx Proxy Manager, es recomendable crear una docker network específica.

De esta manera no será necesario publicar los puertos de los servicios a todas las interfaces de red del Docker host.

Primero habría que crear la red usando el comando docker network create tal como se muestra a continuación:

# Red Interna
docker network create nginxpm_network

A continuación se añade al fichero docker-compose.yml de Nginx Proxy Manager y del resto de servicios que se ejecuten en el Docker host la siguiente información:

networks:
  default:
    external: true
    name: nginxpm_network

De esta manera se podría crear un proxy host usando los nombres de los servicios Docker sin tener que exponer los puertos al Docker host fuera de esta red.

Nota: Dado que el service name se utiliza como hostname, éstos tienen que ser únicos al usar la misma red.

Registro DNS en Cloudflare

Para crear un registro DNS de tipo A en Cloudflare para hostname, se accede a Websitesmydomain.comDNSRecords(+) Add record y se introduce la información necesaria:

  • Domain: mydomain.com
  • Type: A
  • Name: hostname
  • IPv4 address: 192.168.1.180
  • Proxy status: DNS only

Actualizar

Si ya se había instalado Nginx Proxy Manager anteriormente, se puede actualizar de la siguiente manera:

docker stop nginxpm
docker rm nginxpm
docker rmi jc21/nginx-proxy-manager
docker-compose up -d

Soporte

Algunos comandos para gestionar la configuración del contenedor:

# Acceder al shell mientras el contenedor está ejecutándose
docker exec -it nginxpm /bin/bash

# Monitorizar los logs del contenedor en tiempo real
docker logs -f nginxpm

Referencias