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
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
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.
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.
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í:
En Lightsail de AWS se ve así:
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.
Y a continuación click en el botón Add Host.
- Details:
- Domain Names: Son los nombres de dominio que van a redireccionar al servicio. Hay que presionar «enter» para que tome el cambio.
- Scheme: Es el protocolo en el cual escucha el servicio hay que elegir entre http o https.
- IP: Ip donde se ejecuta el servicio.
- Forward Port: Puerto en el que escucha el servicio.
- SSL:
- SSL Certificate: Seleccionar un certificado, en caso de que necesitemos crear uno debemos seleccionar «Request a new SSL Certificate (with Let’s Encrypt)«.
- Force SSL: (Redirecciona el tráfico que venga por el puerto 80 (http) al 443 (https).
- Email Address: Una dirección de mail válida que va a ser facilitada a Let’s Encrypt como responsable del dominio.
- 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»
Luego realizamos click en la opción «Custom», esto despliega un nuevo formulario donde tenemos que adjuntar los archivos que componen tel certificado.
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.
Y a continuación click en el botón Add Host.
- Details:
- Domain Names: Son los nombres de dominio que van a redireccionar al servicio. Hay que presionar «enter» para que tome el cambio.
- Scheme: Es el protocolo en el cual escucha el servicio hay que elegir entre http o https.
- IP: Ip donde se ejecuta el servicio.
- Forward Port: Puerto en el que escucha el servicio.
- Websocckets Support: Normalmente esto no es necesario pero el administrador de Unifi utiliza esta tecnología.
- SSL:
- SSL Certificate: Seleccionar un certificado, en este caso seleccionamos el que definimos en el paso 1 «unifi.sismonda.local«.
- 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).