Infraestructura: NGINX Proxy Manager

NGINX Proxy Manager — Despliegue con Docker Compose

Este repositorio proporciona una forma sencilla de desplegar NGINX Proxy Manager usando Docker Compose, siguiendo las recomendaciones oficiales del proyecto.

¿Qué es NGINX Proxy Manager?

NGINX Proxy Manager es una herramienta de gestión de proxy inverso fácil de usar que te permite:

  • 🌐 Gestionar hosts proxy sin conocimientos avanzados de NGINX
  • 🔒 Certificados SSL/TLS gratuitos con Let's Encrypt automático
  • 🔐 Listas de acceso y autenticación HTTP básica
  • 📊 Interfaz web moderna basada en Tabler
  • 🔄 Redirecciones y streams configurables fácilmente
  • 👥 Gestión de usuarios y permisos

Requisitos

  • Docker y Docker Compose instalados en el host
  • Puertos 80, 443 y 81 disponibles
  • Dominio apuntando al servidor (para certificados Let's Encrypt)
  • (Opcional) Acceso a los puertos 80/443 desde Internet para validación de certificados

Qué incluye este stack

  • Servicio: nginx-proxy-manager con la imagen jc21/nginx-proxy-manager:latest
  • Puertos:
    • 80: HTTP (redirige automáticamente a HTTPS)
    • 81: Interfaz web de administración
    • 443: HTTPS
  • Volúmenes:
    • npm_data: Datos de configuración, base de datos y logs
    • npm_letsencrypt: Certificados SSL de Let's Encrypt
  • Red: npm_network dedicada para el stack

Pasos de despliegue

1. Clonar el repositorio

git clone https://git.ictiberia.com/groales/npm
cd npm

2. Levantar el stack

docker compose up -d

3. Verificar el estado

docker ps --filter name=nginx-proxy-manager

4. Acceder a la interfaz de administración

Abre tu navegador en: http://IP-del-servidor:81

⏱️ Primera vez: El inicio puede tardar 1-2 minutos dependiendo del hardware.

5. Login inicial

Credenciales por defecto:

  • Email: admin@example.com
  • Password: changeme

🔐 Importante: Al primer login, se te pedirá cambiar estas credenciales inmediatamente.

Uso básico

Crear un Proxy Host

  1. Login en la interfaz web (puerto 81)
  2. Click en "Hosts""Proxy Hosts""Add Proxy Host"
  3. Configurar:
    • Domain Names: ejemplo.tudominio.com
    • Scheme: http o https
    • Forward Hostname/IP: IP del servicio backend (ej: 192.168.1.100)
    • Forward Port: Puerto del servicio (ej: 8080)
  4. Pestaña "SSL":
    • Marcar "Request a new SSL Certificate"
    • Marcar "Force SSL"
    • Marcar "HTTP/2 Support"
    • Aceptar términos de Let's Encrypt
  5. Save

En pocos segundos tendrás un proxy HTTPS funcionando con certificado válido.

Configuración avanzada

Variables de entorno

Crea un archivo .env para personalizar:

# Zona horaria
TZ=Europe/Madrid

# Puertos personalizados (si los defaults están ocupados)
HTTP_PORT=80
HTTPS_PORT=443
ADMIN_PORT=81

Luego modifica docker-compose.yaml:

environment:
  TZ: "${TZ:-Europe/Madrid}"
ports:
  - "${HTTP_PORT:-80}:80"
  - "${ADMIN_PORT:-81}:81"
  - "${HTTPS_PORT:-443}:443"

Integración con redes Docker

Para proxy a contenedores en otras redes Docker:

services:
  app:
    # ... configuración existente ...
    networks:
      - npm_network
      - otra_red_docker

networks:
  npm_network:
    name: npm_network
  otra_red_docker:
    external: true

Luego en NPM usa el nombre del contenedor como Forward Hostname (ej: portainer).

Documentación adicional

Consulta la Wiki del proyecto para documentación detallada:

Solución de problemas

Puerto ocupado

Si algún puerto está en uso:

# Ver qué proceso usa el puerto
Get-NetTCPConnection -LocalPort 80
# o en Linux
sudo netstat -tulpn | grep :80

# Cambiar puerto en docker-compose.yaml
ports:
  - "8080:80"  # HTTP en puerto 8080

Contenedor no arranca

# Ver logs
docker logs nginx-proxy-manager

# Logs en tiempo real
docker logs -f nginx-proxy-manager

Certificado SSL no se genera

Verifica que:

  1. El dominio apunta correctamente al servidor (DNS)
  2. Puertos 80 y 443 accesibles desde Internet
  3. No hay firewall bloqueando el tráfico
  4. El dominio no supera los límites de Let's Encrypt (5 certs/semana)
# Test de accesibilidad desde exterior
curl -I http://tudominio.com

# Verificar DNS
nslookup tudominio.com
dig tudominio.com

Olvido de credenciales

Resetear contraseña del admin:

docker exec -it nginx-proxy-manager /bin/bash

# Dentro del contenedor
cd /app
npx knex migrate:latest --env production
npx knex seed:run --env production

# Credenciales vuelven a:
# Email: admin@example.com
# Password: changeme

Personalización

Cambiar base de datos a MySQL/PostgreSQL

Por defecto NPM usa SQLite. Para usar MySQL:

services:
  app:
    environment:
      DB_MYSQL_HOST: "mysql"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm_password"
      DB_MYSQL_NAME: "npm"
    depends_on:
      - mysql

  mysql:
    image: mysql:8.0
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: npm
      MYSQL_USER: npm
      MYSQL_PASSWORD: npm_password
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  npm_data:
  npm_letsencrypt:
  mysql_data:

Deshabilitar IPv6

Si tienes problemas con IPv6:

environment:
  DISABLE_IPV6: "true"

Recursos oficiales

Seguridad

Recomendaciones

  1. Cambiar credenciales por defecto inmediatamente
  2. Restringir acceso al puerto 81 (admin) con firewall
  3. Usar certificados SSL para todos los hosts
  4. Habilitar listas de acceso para hosts sensibles
  5. Actualizar regularmente con docker compose pull && docker compose up -d
  6. Backup periódico del volumen npm_data

Proteger puerto de administración

Limitar acceso al puerto 81 solo desde IP local:

ports:
  - "80:80"
  - "127.0.0.1:81:81"  # Solo accesible desde localhost
  - "443:443"

Luego accede via túnel SSH:

ssh -L 8081:localhost:81 usuario@servidor
# Abre http://localhost:8081 en tu navegador

O usa VPN (WireGuard, Tailscale) para acceso seguro remoto.

Actualización

# Pull nueva imagen
docker compose pull

# Reiniciar con nueva versión
docker compose up -d

# Ver logs
docker logs -f nginx-proxy-manager

NPM mantiene compatibilidad de base de datos entre versiones, las actualizaciones suelen ser sin problemas.


Versión: Latest (imagen Docker rolling)
Última actualización: Noviembre 2025

Description
No description provided
Readme MIT 51 KiB