Clone
3
Home
groales edited this page 2025-12-02 19:20:07 +01:00

NGINX Proxy Manager - Documentación

Bienvenido a la documentación del despliegue de NGINX Proxy Manager usando Docker Compose.

¿Qué es NGINX Proxy Manager?

NGINX Proxy Manager (NPM) es una interfaz de gestión intuitiva para configurar y administrar proxy inversos NGINX sin necesidad de conocimientos profundos de NGINX. Ideal para:

  • 🏠 Self-hosting casero - Exponer servicios locales a Internet de forma segura
  • 🔒 Certificados SSL automáticos - Let's Encrypt integrado con renovación automática
  • 🌐 Múltiples dominios - Gestionar decenas o cientos de proxy hosts desde una UI
  • 📱 Interfaz moderna - Administración web responsive y fácil de usar
  • 🔐 Control de acceso - Listas de acceso y autenticación básica HTTP

Características Principales

Gestión de Proxy Hosts

  • Proxy Hosts: Redirigir dominios a servicios backend (HTTP/HTTPS)
  • Redirection Hosts: Redirecciones 301/302 permanentes o temporales
  • 404 Hosts: Páginas personalizadas para dominios no configurados
  • Streams: Proxy TCP/UDP para servicios no-HTTP (SSH, bases de datos, etc.)

SSL/TLS

  • Let's Encrypt gratuito con renovación automática
  • Certificados personalizados (upload de cert + key)
  • Wildcard certificates vía DNS challenge
  • HTTP/2 y HTTP/3 (QUIC) support
  • Force SSL (redirección automática HTTP → HTTPS)
  • HSTS (HTTP Strict Transport Security)

Seguridad

  • 🔐 Access Lists - Restricción por IP, username/password
  • 🛡️ Headers personalizados - X-Frame-Options, CSP, CORS
  • 🚫 Bloqueo de exploits comunes - Configuración NGINX hardening
  • 🔑 Gestión de usuarios - Multi-usuario con roles y permisos

Componentes del Stack

Este repositorio despliega NPM con la siguiente configuración:

Servicio Principal

  • Imagen: jc21/nginx-proxy-manager:latest
  • Contenedor: nginx-proxy-manager
  • Reinicio: unless-stopped

Puertos Expuestos

  • 80: HTTP público (redirige automáticamente a HTTPS)
  • 81: Interfaz web de administración
  • 443: HTTPS público

Volúmenes

  • npm_data/data - Base de datos SQLite, configuraciones, logs
  • npm_letsencrypt/etc/letsencrypt - Certificados SSL de Let's Encrypt

Red

  • proxy - Red externa compartida con otros servicios

Requisitos Previos

Antes de desplegar NPM, asegúrate de tener:

  • Docker Engine y Docker Compose instalados
  • Puertos 80, 443 y 81 disponibles (o configurar puertos alternativos)
  • Dominio(s) apuntando al servidor (para certificados SSL)
  • Acceso a Internet (para validación de Let's Encrypt)
  • Firewall configurado para permitir tráfico en puertos 80/443

Despliegue Rápido

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
docker logs nginx-proxy-manager

4. Acceder a la Interfaz Web

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

⏱️ Primera vez: El inicio puede tardar 1-2 minutos. Espera a ver en los logs:

[setup ] Starting backend

5. Login Inicial

Credenciales por defecto:

Email:    admin@example.com
Password: changeme

🔒 Obligatorio: Al primer login, se te pedirá:

  1. Cambiar el email
  2. Cambiar el nombre de usuario
  3. Establecer una nueva contraseña

Primer Proxy Host (Guía Rápida)

Ejemplo: Exponer Portainer con SSL

Supongamos que tienes Portainer corriendo en 192.168.1.100:9443 y quieres acceder via https://portainer.tudominio.com.

  1. Ir a "Hosts" → "Proxy Hosts" → "Add Proxy Host"

  2. Pestaña "Details":

    • Domain Names: portainer.tudominio.com
    • Scheme: https (Portainer usa HTTPS)
    • Forward Hostname / IP: 192.168.1.100
    • Forward Port: 9443
    • Cache Assets: (opcional)
    • Block Common Exploits:
    • Websockets Support: (necesario para Portainer)
  3. Pestaña "SSL":

    • Request a new SSL Certificate with Let's Encrypt
    • Force SSL (redirigir HTTP → HTTPS)
    • HTTP/2 Support
    • HSTS Enabled (opcional, recomendado)
    • Email: tu@email.com (para notificaciones de Let's Encrypt)
    • I Agree to the Let's Encrypt Terms of Service
  4. Save

En 10-30 segundos, el certificado SSL se generará y el proxy estará activo.

Accede a: https://portainer.tudominio.com 🎉

Casos de Uso Comunes

1. Proxy a Contenedores Docker en la Misma Red

Si tienes servicios corriendo en Docker en el mismo host:

# En el docker-compose.yml de tu servicio
networks:
  - proxy

networks:
  proxy:
    external: true

Luego en NPM:

  • Forward Hostname: Nombre del contenedor (ej: portainer)
  • Forward Port: Puerto interno del contenedor (no el publicado)

2. Redirección Permanente

Ejemplo: Redirigir www.tudominio.comtudominio.com

  1. "Hosts" → "Redirection Hosts" → "Add Redirection Host"
  2. Domain Names: www.tudominio.com
  3. Scheme: https
  4. Forward Domain Name: tudominio.com
  5. Preserve Path:
  6. HTTP Code: 301 (permanente)
  7. SSL: Solicitar certificado para www.tudominio.com

3. Stream TCP (Ejemplo: SSH)

Objetivo: Acceder a SSH del servidor via puerto 2222 externo.

  1. "Streams" → "Add Stream"
  2. Incoming Port: 2222
  3. Forwarding Host: 127.0.0.1 (localhost)
  4. Forwarding Port: 22 (SSH)
  5. TCP Forwarding:
  6. Save

Añadir puerto al docker-compose.yml:

ports:
  - "80:80"
  - "81:81"
  - "443:443"
  - "2222:2222"  # Stream SSH

Reiniciar: docker compose up -d

Conectar: ssh usuario@IP-servidor -p 2222

4. Access List (Restringir por IP)

  1. "Access Lists" → "Add Access List"
  2. Name: Solo oficina
  3. Pass Auth: (si quieres autenticación adicional)
  4. AuthorizationAddUsername: admin, Password: ***
  5. AccessAllow192.168.1.0/24 (red local)
  6. AccessDeny0.0.0.0/0 (todo lo demás)
  7. Save

Aplicar a Proxy Host:

  • Editar Proxy Host → Access List: Seleccionar "Solo oficina"

Próximos Pasos

Troubleshooting Rápido

Problema Solución
Puerto 80/443 ocupado Ver proceso: sudo netstat -tulpn | grep :80, cambiar puertos en compose
No se genera certificado SSL Verificar DNS apunta al servidor, puertos 80/443 abiertos en firewall
Olvido de contraseña Resetear credenciales a valores por defecto (ver documentación oficial)
Error "Address family not supported" Añadir DISABLE_IPV6: 'true' en environment
502 Bad Gateway Verificar que el backend esté corriendo y el puerto correcto

Recursos Oficiales


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