Usando Nginx Proxy Manager
Problematica. Multiples servicios sobre un mismo puerto
Imaginemos que tu tienes un servicio o pagina web la cual quieres exponer a internet, los navegadores al intentar acceder a una pagina por el puerto 80 (puerto inseguro) o 443 (puerto para paginas con certificado SSL) y esta es la razon de porque no vemos url con el siguiente formato https://www.google.com:443, entonces montaremos nuestra pagina sobre el puerto 80 o 443
Imaginemos que tienes 2 aplicaciones y ambas tiene certificado SSL, no podras montar ambas paginas en el puerto 443 por lo que tendras que abrir otro puerto del modem y solo podras llamarlo con una url como la siguiente https://www.google.com:444 ya que el modem solo puede asignar un puerto de un despositivo a un puerto del modem.
Solucion 3. Proxy Inverso
Para montar multiples aplicaciones sobre un puerto podemos usar un servicio de proxy inverso como el de Nginx Proxy Manager, este servicio se basa en tener un dominio con sub dominos, por ejemplo tu dominio puede ser duckdns.org y para agregar un subdominio agregarias un nombre seguido de un punto y tu dominio, myserver.duckdns.org.
Todos los subdominio apuntan realmente a la misma ip publica pero Ng Proxy Manager puede redirigir a diferentes aplicaciones mediante los diferentes nombres de subdomino. esto te pemite tener montado multiples servicios sobre un mimsmo puerto.
Instalacion
Para el proceso de instalacion de Nginx Proxy Manager te recomiendo que uses el siguiente docker compose docker compose y si no tienes idea de como ejecutar el stack puedes usar la Introducción a los comandos de uso comun y considereciones.
Antes de continuar necesitaremos un servicio el cual expondremos a internet, en este caso usaremos FileBrowser como ejemplo, te invito a que generes una instancia de este servicio o cualquier otro listado en Servicios Con Docker Compose.
Ademas tendras que ingresar al panel de control de Nginx Proxy Manager, para esto, estando en la misma red que el servidor ingresaremos a ip-del-servidor:81
Posteriormente para el primer ingreso usaremos las siguientes credenciales
Usuario: admin@example.com
Password: changeme
Al ingresar te pedira cambiar la contraseña y el correo, lo haces (no tienen porque ser reales pero si debe seguir formato de correo electronico) y luego desde la pestaña de Dashboard haces click sobre el boton de Proxy Host y posteriormente en Add Proxy Host
Ejemplos de uso del Proxy Inverso
Aqui veemos como exponer una instancia del servicio filebrowser, su puerto interno lo encontraras en la documentacion oficial aunque en muchas ocaciones podras encontrar un ejemplo en los repositorios de Docker Hub Container Image Library, Ahi buscaras los docker compose y la seccion de puertos.
Veamos el siguiente fragmente de un docker-compose
services:
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
ports:
- 8009:80
En nuestro caso no necesitamos exponer este puerto y comentaremos las lineas de port y la redireccion del puerto. Nos quedaremos con el dato de que el puerto interno (señalado siempre en el lado derecho) es el puerto 80 y tomaremos el nombre del contenedor y los ingresaremos de la siguiente manera.
En la seccion de Domain Names usaras el dominio generado por tu provedor DDNS visto anteriormente y un subdominio a elegir pero que no se repita, en mi caso fue cloud y el dominio es tinyfox.ddns.me.
Posteriormente en la pestaña SSL generamos un certificado y habilitamos las siguientes casillas para forzar la redireccion a el puerto 443
Por ultimo, al ser una aplicacion que usa WevDav para transmicion de archivos seleccionamos el engranaje para ir a la pestaña de Custom Nginx Configuration y agregamos el contenido mencionado previamente en la documentacion de Nginx Proxy Manager
Pruebas
Para probar que todo quedo bien ingresa a la pagina que escribiste en la seccion de Domain Names y veras el servicio que creaste o no.
Extras
Recuerda que Nginx Proxy Manager es para servicios HTTP, si quieres exponer un servicio que no sea de este estilo tendras que abrir otros puertos del modem que apunten al puerto del servidor o puedes usar Nginx Proxy Manager para redirigir este flujo a otros puertos y abrir estos de igual forma en tu modem; Esto solo por si quisieras cambiar el puerto por defecto de una aplicacion y esta no te lo permitiera.
Si decides redirigir puertos con Nginx Proxy Manager tendras que alterar el docker compose de Nginx Proxy Manager y agregar los puertos internos y externos correspondiendes en su docker compose, ademas de que si el servicio usa UDP tendras que señalarlo en el docker compose de forma explicita ya que docker compose por defecto infiere que todos los puertos son TCP.
A continuacion veremos un ejemplo para redireccionar el puerto de wireguard mediante Ngix Proxy Manager, Si bien puedes redirigir puerto de la misma red que el servidor, ya que es otro servicio de docker recominedo no exponer el puerto de wireguard a la red del servidor, es mejor usar la red creada en docker para montar servicios en Ngix Proxy Manager, en mi ejemplo de repositorio de docker se llamada sky_net.
Como puedes ver en este ejemplo estoy redirigiendo el puerto por dejecto de wireguard (51820) al puerto 2000 y habro este puerto en Nginx Proxy Manager a con el mismo puerto interno y externo del contenedor para evitar confuciones al abrir el puerto del modem.
services:
nginx-proxy:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
ports:
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web
- '2000:2000/UDP' # Admin Web






