Al finalizar el anterior articulo y dejando configurado el contenedor de WordPress, quedó pendiente la configuración de NGINX Proxy Manager (NPM).
¿Que es esto de NPM?... Es un proxy inverso que nos permite administrar el tráfico hacia nuestra web de forma segura y sin editar archivos de configuración manuales. Dicho de otro modo, permite acceder a tus servicios o contenedores locales (como Portainer o WordPress) usando nombres de dominio amigables (ej. http://tudominio.com) en lugar de recordar direcciones IP y puertos específicos. Además evita tener que abrir puertos en el router y dejar agujeros inseguros, ya que se puede centralizar todas las peticiones externas a los puertos estándar 80 (HTTP) y 443 (HTTPS) en lugar de abrir un puerto diferente en la red para cada aplicación instalada. También instala y renueva de forma automática los certificados gratuitos de Let's Encrypt para garantizar conexiones cifradas y seguras por el protocolo HTTPS.
En resumen, voy a decirle a NPM que ante cualquier peticion de acceso a mi dominio mixstuffs.com, que está redirigido desde mi proveedor de dominio a mi IP Publica (a través de pasarelas de Clouflare, pero esto es otra historia), intercepte estas solicitudes de acceso y las redirija al contenedor WordPress de Docker para mostrar la pagina web configurada y sin permitir el acceso a ningún otro servicio de mi servidor.
Empecemos por conectar por ssh al servidor y procedamos con la configuración:
Instrucciones
1. Crear el directorio para el contenedor.
Como en los dos post anteriores sobre Docker, tenemos creada una carpeta llamada "docker" para dejar dentro los compose (archivos de configuración de los contenedores) y las carpetas de cada contenedor, así que vamos a acceder de nuevo a esa carpeta y crear las subcarpetas que necesitamos para dejar NPM funcionando.
cd docker
mkdir npm
cd npm
mkdir mysql && mkdir data && mkdir letsencrypt
cd mysql
mkdir npm
cd ..
Con estas instrucciones hemos creado la carpeta "npm" (nginx proxy manager) que guardará sus archivos de configuración dentro de la subcarpeta "data". También hemos creado la carpeta "mysql" y dentro la subcarpeta "npm" donde se guardará la base de datos de NGINX. Por ultimo hemos creado la carpeta "letsencrypt" para guardar los certificados seguros.
2. Crear el archivo docker-compose.
Este es el archivo que contiene las instrucciones para instalar y configurar inicialmente el contenedor de NPM y su base de datos.
sudo nano docker-compose.yml
Dentro del archivo compose copiamos la siguiente configuración:
services:
app:
container_name: nginx-proxy-manager
image: "jc21/nginx-proxy-manager:latest"
networks:
- npm
restart: unless-stopped
ports:
- 80:80 # Public HTTP Port
- 81:81 # Admin Web Port
- 443:443 # Public HTTPS Port
- 21:21 # Public FTP Port
depends_on:
- db
environment:
# Mysql/Mariadb connection parameters:
- DB_MYSQL_HOST=$MYSQL_HOST
- DB_MYSQL_PORT=$MYSQL_PORT
- DB_MYSQL_USER=$MYSQL_USER
- DB_MYSQL_PASSWORD=$MYSQL_PASSWORD
- DB_MYSQL_NAME=$MYSQL_DATABASE
volumes:
- ~/docker/npm/ddata:/data
- ~/docker/npm/letsencrypt:/etc/letsencrypt
db:
container_name: nmp-db
image: "jc21/mariadb-aria:latest"
networks:
- npm
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=$MYSQL_PASSWORD
- MYSQL_DATABASE=$MYSQL_DATABASE
- MYSQL_USER=$MYSQL_USER
- MYSQL_PASSWORD=$MYSQL_PASSWORD
- MARIADB_AUTO_UPGRADE=1
volumes:
- ~/docker/mysql/npm:/var/lib/mysql/npm
networks:
npm:
external: true
volumes:
npm:
driver: local
data:
driver: local
letsencrypt:
driver: local
Dentro del apartado "services" he incluido los dos servicios que va a ejecutar docker, el primero es el contenedor de NGINX Proxy Manager y el segundo la base de datos (mariadb, como la base de datos de WordPress, al ya tener el servicio instalado en el contenedor de WordPress no es necesario instalar otro controlador diferente y ahorramos en recursos).
Después tenemos el apartado "networks" donde estamos diciendo que la red "npm" es externa (external:true), pero recordar que necesita estar creada con anterioridad, por lo tanto en Portainer entramos en el apartado de redes y creamos una red nueva llamada "npm", dejando todas la opciones predeterminadas.
El ultimo apartado es "volumes" donde configuramos las carpetas de la base de datos y de npm como locales.
3. Crear archivo oculto de variables.
Como ya vimos en el anterior articulo de WordPress, dentro del apartado de entorno (environment) hemos ocultado la información que queremos se mantenga segura, por si alguien que no debe consigue acceder hasta este compose que estamos creando.
Vamos a crear el archivo oculto con los datos que queremos mantener ocultos:
sudo nano .env
Con esta orden creamos el archivo de variables oculto y dentro indicamos cual es el dato de cada variable. Incluir lo siguiente en el archivo oculto .env (modificar los datos de user y password a unos propios).
MYSQL_HOST=db # El nombre del servicio
MYSQL_PORT=3306 # El puerto de la base de datos
MYSQL_USER=npm # Usuario de la base de datos
MYSQL_PASSWORD=mixstuffs # Contraseña de la base de datos
MYSQL_DATABASE=npm # Nombre de la base de datos
En la misma linea, después del símbolo #, se explica que es cada variable. Recuerda que en docker todo lo que vaya a la derecha del símbolo # es de solo lectura.
4. Ejecución y acceso.
Ahora ejecutamos el compose para poner en marcha los contenedores.
docker compose up -d
Una vez arrancados los contenedores (revisar el estado en Portainer), podeis acceder al portal web de NGINX Proxy Manager, crear el usuario administrador y empezar con la configuracion del proxy.
http://ip_del_servidor:81
5. Configuración del host
Con los pasos anteriores ya tenemos NGINX Proxy Manager funcionando como un proxy inverso en el Servidor, ahora vamos a configurar el proxy host para que cada vez que alguien pida acceder al dominio mixstuffs.com nuestro servidor sepa donde tiene que dirigir la petición.
- En la pantalla principal pulsamos sobre "Hosts Proxy".
- Creamos un host nuevo pulsando en "Añadir Host Proxy".
- En "Nombre de Dominio" escribimos el dominio sobre el que va a responder el servidor (en mi caso mixstuffs.com) y pulsar "enter" (importante pulsarlo para que se quede grabado).
- En "Nombre de Host/IP de reenvío" añadimos la ip interna del servidor y en "Puerto" escribimos el numero del puerto que configuramos en el contenedor WordPress (8080).
- Marcar "Bloquear Exploits Comunes" y "Soporte de Websockets" y pulsar el botón "Guardar".
- Una vez creado el Host, pulsamos en los tres puntos de la derecha y seleccionamos "Editar" para acceder a la configuración de nuevo.
- Seleccionar la pestaña "SSL" y en "Certificado SSL" seleccionar "Solicitar un nuevo certificado con Let's Encrypt". Marcar también las opciones de "Forzar SSL", "HSTS Habilitado" y "Soporte HTTP/2".
- Pulsar "Guardar" de nuevo.
Al salir de la configuración, NPM solicitará un certificado gratuito SSL a Let´s Encrypt y lo configurará para que cada vez que alguien pida acceder al dominio, se acceda siempre a través de HTTPS, evitando problemas de acceso seguro en los navegadores clientes. Con esto ya tenemos configurado el proxy inverso local y cada vez que se intente acceder a la web a través del dominio, NPM hará su labor de proxy y dirigirá hacia el contenedor de WordPress mostrando la pagina web publicada con el CMS.