Tapando agujeros (o de cómo y por qué montar Nginx Proxy Manager)

La semana pasada no hubo fiesta, porque… porque no todos los días, pueden ser fiesta, pero vamos a darle un empujoncito a nuestro ecosistema casero servidoril.

De momento, nos habíamos hecho con un server de cualquier pelo, zambullido en docker y docker-compose, de paso, montado un server de streaming musical para escuchar toda nuestra música digital y habíamos solucionado lo de que dentro y fuera de la red de nuestra casa pudiéramos usar la misma URL, que no sólo venía bien para las cosas de la usación si no que además, nos quitaba de nuestra navegación por Internet las publicidades molestas que nosotros escogiésemos.

Nos queda una cosa por gestionar. Si habíamos dado un nombre a nuestro servidor musical y aquello iba bien, lo que no habíamos gestionado es lo del tema del puerto. Si quieren recordar ustedes, gentes de bien del Internet, usábamos la URL https://navimegatron.quieroserpropietario.com para acceder a nuestro servidor musical, peeeeeeeeeeeeeeeeeeeero, teníamos que poner un nombre de puerto. En concreto el 666 porque todos los días hay que escuchar a Black Sabbath.

Lo de poner un número de puerto para acceder a nuestras cosas self-hosted está feo, pero lo que está más feo que hacer mociones de censura a tontas y a locas es tener que abrir ése puerto en el router.

Porque claro, de momento nos hemos montado una única cosa, pero el plan aquí es montar mogollón de divertidos cachivaches, ¿Qué vamos a hacer?, ¿Abrir tantos puertos en nuestro router como cachivaches montemos?, ¿Invitamos a la gente a que se nos cuele en nuestra red casera con un letrero luminoso también?

No.

Está feo.

Está muy feo.

Como que te dejen en visto

La manera pro de solucionar ésto es ser una persona de provecho y montarte un Apache o un NGINX como Dio manda e ir por la vida con la frente bien alta. Pero la vida es demasiado breve como para hacer las cosas bien y no tener problemas así que vamos a apuntar más bajo, les presento, gentes de la gleba a Nginx Proxy Manager: https://nginxproxymanager.com/

Nginx Proxy Manager (en adelante NPM) es una versión canija y ligera de algo que se llama un proxy inverso.

¿Qué es un proxy inverso?

Pues en el punto en el que estamos se entiende bien. Nosotros tenemos un cachivache con una IP (la del server) y un puerto (el 666) y lo que queremos que pase es que la gente y nosotros mismos, que también somos bastante gente, ponga en su navegador o app https://navimegatron.quieroserpropietario.com y… «taca, a comer». Ni puertos, ni puertas ni historias. Y sobre todo no tener que ir abriendo agujeros en nuestro router.

Un proxy inverso, simplificando mucho burdamente pero yendo con ello, hace exáctamente éso, recibe una petición de una URL a un puerto (como es https, es el puerto 443) y lo traduce a una IP de nuestra red al puerto que nosotros le digamos. Y además es tan apañado que nos pide y renueva el certificado SSL necesario para que se pueda acceder por httpS:// en lugar de http://. Que hoy en día no se puede ir a ninguna parte sin certificado. Ni de navegación, ni de vacunación, ni de nada… hay que certificarse para no ser un tolili.

Visto lo que es, para lo que vale y por qué queremos una carretilla de proxys inversos, veamos como se monta.

Tiene poco misterio, lo de siempre, vamos a ver nuestro docker-compose de turno, aupa ahí:

version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
    environment:
      TZ: 'Europe/Madrid'
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "su_usuario_de_base_de_datos"
      DB_MYSQL_PASSWORD: "su_password_de_base_de_datos"
      DB_MYSQL_NAME: "su_nombre_de_base_de_datos"
      DISABLE_IPV6: 'true' #Dependiendo de lo que tengais
    volumes:
      - ruta_a_la_carpeta_de_npm/data:/data
      - ruta_a_la_carpeta_de_npm/letsencrypt:/etc/letsencrypt
      # - ruta_a_la_carpeta_de_npm/snippets:/config/nginx/snippets
      # - ruta_a_la_carpeta_de_npm/site-confs:/config/nginx/site-confs:ro
    depends_on:
      - db
    restart: always

  db:
    image: 'jc21/mariadb-aria:latest'
    container_name: npm_db
    environment:
      TZ: 'Europe/Madrid'
      MYSQL_ROOT_PASSWORD: 'su_password_de_base_de_datos para el root'
      MYSQL_DATABASE: 'su_nombre_de_base_de_datos'
      MYSQL_USER: 'su_usuario_de_base_de_datos'
      MYSQL_PASSWORD: 'su_password_de_base_de_datos'
    volumes:
      - ruta_a_la_carpeta_de_npm/db:/var/lib/mysql
    restart: always

Como véis, hay poca mandanga. Dos contenedores, uno de servicio y otro de base de datos. Las credenciales tienen que ser las mismas, claramente, porque si no, aquello no chufla y éste será el único contenedor que expondremos en el puerto 80 y 443. ¿Por qué?

Porque nos va a gestionar el acceso seguro al resto de cachivaches que montemos en nuestra red.

Cuando lo desplegueis si os vais a la IP del servidor en el puerto 81 os encontraréis una pantalla de login en la que podéis crear un usuario de administración.

Dentro de la administración, vamos a ver un ejemplo, que es el de nuestro servidor musical.

Nos vamos a ir a Proxy Hosts, que no tendremos ninguno (la caja verde) y le damos al botoncito de arriba a la derecha que pone Add Proxy Host.

Éste es el paso común que seguiremos para cada proxy, en éste caso que nos ocupa teníamos un nombre de dominio que queremos usar, un puerto en el que está y una IP de servidor, pues ésto es lo que vamos a hacer. Vamos a indicarle a NPM que todas las peticiones que lleguen a navimegatron.quieroserpropietario.com las mande a la IP del server al puerto 666, tal que así:

Que es algo muy hermoso.

NPM nos permite cachear objetos, bloquear algunos exploits y activart el soporte a Websockets. Ya sólo nos queda una cosa, que es gestionar el certificado SSL, para éso nos vamos a la tercera pestañita empezando por la izquierda:

Y le pedimos que nos pida (inception) un certificado SSL chachi pistachi.

No sólo lo va a pedir, también lo va a renovar cuando toque. Un gozo y una maravilla, oigan ustedes.

Y ya está. Le damos a guardar y a funcionar.

De ésta manera sólo tenemos un puerto abierto en el router (el 443), no tenemos que exponer el 666 de nuestro servidor musical y nos va a solucionar toda la mandanga de andar pidiendo certificados.

Con ésto ya podemos dar por cerrado el tema de redes, peticiones, cacharros, dominios, nombres y demás historias. Al menos de momento.

A partir de aquí, la fiesta del cachivache auto-desplegado electropositrónico.

Tenga ustedes buena semana, gentes de la gleba.