Clone
1
NPM
groales edited this page 2025-12-02 19:35:25 +01:00

Integración con NGINX Proxy Manager

Esta guía explica cómo integrar Portainer CE con NGINX Proxy Manager (NPM) como proxy inverso para obtener:

  • 🔒 Certificados SSL/TLS automáticos con Let's Encrypt
  • 🌐 Acceso mediante dominio en lugar de IP:puerto
  • 📊 Interfaz gráfica para gestión de proxies

Requisitos Previos

  • NPM desplegado desde el repositorio groales/npm
  • Red Docker compartida proxy
  • Dominio apuntando a tu servidor
  • Puertos 80 y 443 accesibles desde Internet

Arquitectura

Internet → NPM (80/443) → Portainer (9443)
              ↓
          Let's Encrypt

Configuración

1. Verificar Red Compartida

Asegúrate de que la red proxy existe (creada por el repo de NPM):

docker network ls | grep proxy

2. Crear docker-compose.override.yml

En el directorio de Portainer, copia el ejemplo:

cd ~/portainer  # O tu ruta local
cp docker-compose.override.npm.yml.example docker-compose.override.yml

El archivo solo conecta Portainer a la red proxy:

services:
  portainer:
    networks:
      - proxy

networks:
  proxy:
    external: true

3. Reiniciar Portainer

docker compose down
docker compose up -d

4. Verificar Conectividad

# Ver que Portainer está en la red proxy
docker network inspect proxy | grep portainer

5. Configurar Proxy Host en NPM

Accede a la interfaz de NPM (puerto 81) y crea un nuevo Proxy Host:

Pestaña "Details"

  • Domain Names: portainer.tudominio.com
  • Scheme: https (Portainer usa HTTPS)
  • Forward Hostname / IP: portainer (nombre del contenedor)
  • Forward Port: 9443
  • Cache Assets: (no recomendado para apps dinámicas)
  • Block Common Exploits:
  • Websockets Support: (necesario para Portainer)

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

Pestaña "Advanced" (Opcional)

Si tienes problemas con el certificado autofirmado de Portainer, añade:

proxy_ssl_verify off;

Nota: NPM maneja automáticamente las conexiones HTTPS al backend.

6. Guardar y Verificar

  • Click en Save
  • Espera 10-30 segundos para la generación del certificado
  • Accede a: https://portainer.tudominio.com

Configuración Avanzada

Restricción por IP

En NPM, puedes crear una Access List para restringir el acceso:

  1. Access ListsAdd Access List
  2. Name: Solo oficina
  3. AccessAllow → Añadir IPs/rangos permitidos (ej: 192.168.1.0/24)
  4. AccessDeny0.0.0.0/0 (denegar todo lo demás)
  5. Save

Luego aplícala al Proxy Host de Portainer:

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

Autenticación HTTP Básica

Si quieres capa adicional de autenticación:

  1. En la Access List, marca Pass Auth
  2. AuthorizationAdd
    • Username: admin
    • Password: tu_password
  3. Save

Custom NGINX Configuration

En la pestaña Advanced del Proxy Host, puedes añadir configuración personalizada:

# Rate limiting
limit_req zone=general burst=20 nodelay;

# Headers de seguridad adicionales
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;

Troubleshooting

Error 502 Bad Gateway

  1. Verificar red compartida:

    docker network inspect proxy
    
  2. Verificar que Portainer está corriendo:

    docker ps | grep portainer
    
  3. Ver logs de NPM:

    docker logs nginx-proxy-manager
    
  4. Ver logs de Portainer:

    docker logs portainer
    

Error 503 Service Unavailable

  • Verifica el nombre del contenedor: debe ser portainer (coincide con Forward Hostname)
  • Verifica el puerto: debe ser 9443
  • Asegúrate de que Portainer está en la red proxy

Certificado No Se Genera

  1. Verificar DNS:

    nslookup portainer.tudominio.com
    
  2. Verificar puertos 80/443 accesibles desde Internet

  3. Ver logs de certificados en NPM:

    • NPM UI → SSL Certificates → Ver estado del certificado

Error de Certificado Autofirmado

Si NPM no puede conectar con el backend HTTPS de Portainer:

En Advanced del Proxy Host, añade:

proxy_ssl_verify off;

Esto hace que NPM acepte el certificado autofirmado de Portainer.

Nota: El usuario final ve el certificado válido de Let's Encrypt, no el autofirmado.

Websockets No Funcionan

Asegúrate de que Websockets Support está habilitado en el Proxy Host. Sin esto, Portainer puede mostrar errores de conexión en tiempo real.

Comparación NPM vs Traefik

Característica NPM Traefik
Configuración Interfaz gráfica Archivos YAML/labels
Curva de aprendizaje Baja Media
Automatización Manual Automática (labels)
Wildcards SSL Sí (DNS challenge) Sí (DNS challenge)
Middlewares Custom NGINX Middlewares integrados
Mejor para Pocos servicios, gestión manual Muchos servicios, infraestructura dinámica

Ejemplo Completo

docker-compose.override.yml

services:
  portainer:
    networks:
      - proxy

networks:
  proxy:
    external: true

Configuración en NPM (UI)

Proxy Host:

  • Domain: portainer.tudominio.com
  • Forward: https://portainer:9443
  • SSL Certificate (Let's Encrypt)
  • Force SSL
  • Websockets Support

Access List (opcional):

  • Allow: 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8
  • Deny: 0.0.0.0/0

Recursos adicionales:

Volver a: Página Principal