Nginx Proxy Manager (NPM) es una interfaz web para ejecutar un proxy inverso Nginx con certificados gratuitos de Let’s Encrypt. En un VPS, puedes desplegarlo con un solo archivo de Docker Compose, dirigir tus dominios al servidor y agregar cada app como proxy host. No necesitas editar a mano la configuración de Nginx y un solo proxy puede gestionar muchas apps de Docker.
Qué es Nginx Proxy Manager y cuándo usarlo
NPM es un front end para Nginx empaquetado en Docker que convierte los proxy hosts, redireccionamientos, streams y certificados TLS en formularios del navegador. Escucha en los puertos 80 y 443 y reenvía cada solicitud al contenedor correcto. Para conocer el contexto, consulta qué es Nginx y la comparación entre un balanceador de carga y un proxy inverso.
Te conviene si ejecutas varias apps de Docker en un VPS y quieres HTTPS en cada una sin escribir bloques de servidor. Considera Traefik o Caddy si prefieres configurar el proxy en archivos con control de versiones o crear rutas automáticamente cuando se inicien los contenedores.
Requisitos y puertos de Nginx Proxy Manager
La página de instalación del proyecto presupone que tienes Docker y Docker Compose y usa tres puertos. No especifica requisitos mínimos de CPU o RAM, por lo que aquí tampoco se indican.
| Requisito | Detalle | Por qué importa |
| Puerto 80 | HTTP público | Tráfico HTTP y validación de Let’s Encrypt |
| Puerto 443 | HTTPS público | Todo el tráfico TLS hacia tus apps |
| Puerto 81 | Interfaz web de administración | Mantenlo fuera de internet público |
| DNS | Un registro A por hostname | Es necesario antes de que Let’s Encrypt pueda validar |
| Software | Docker y Docker Compose | NPM se distribuye como una imagen de contenedor |
| Arquitectura de CPU | amd64 o arm64 | Las imágenes armv7 terminaron en la versión 2.14; usa la etiqueta 2.13.7 en esa arquitectura |
Configuración de Nginx Proxy Manager con Docker Compose
Primero instala Docker. La guía para instalar Docker en Ubuntu explica el proceso. Después, guarda el siguiente archivo como docker-compose.yml. Sigue la estructura recomendada por el proyecto, con los puertos 80, 443 y 81 y dos volúmenes bind mount, pero incorpora dos cambios: el puerto 81 se vincula a localhost y el contenedor se conecta a una red de Docker con nombre que volverás a usar más adelante.
services:
app:
image: ‘jc21/nginx-proxy-manager:2.16.0’
restart: unless-stopped
ports:
– ’80:80′ # public HTTP
– ‘443:443’ # public HTTPS
– ‘127.0.0.1:81:81’ # admin UI, reachable from the server itself only
environment:
TZ: ‘Europe/Berlin’
volumes:
– ./data:/data
– ./letsencrypt:/etc/letsencrypt
networks:
– proxy
networks:
proxy:
name: proxy
De forma predeterminada, NPM guarda su configuración en SQLite dentro del volumen ./data. Si prefieres una base de datos externa, la documentación muestra una variante con MariaDB (linuxserver/mariadb), configurada mediante DB_MYSQL_HOST, DB_MYSQL_PORT, DB_MYSQL_USER, DB_MYSQL_PASSWORD y DB_MYSQL_NAME. Cualquier variable DB_MYSQL_ tiene prioridad sobre las de SQLite.
mkdir -p ~/npm && cd ~/npm
# save the file above as docker-compose.yml, then:
docker compose up -d
docker compose ps
docker compose logs -f app
- Ejecuta docker compose up -d para descargar la imagen e iniciar el stack.
- Ejecuta docker compose ps y confirma que el servicio app tenga el estado Up.
- Revisa docker compose logs -f app. Durante el primer inicio se generan las claves JWT, se crean las tablas de la base de datos y se agrega un usuario administrador predeterminado. Según la documentación, el proceso puede tardar un par de minutos.
- Abre la interfaz de administración en el puerto 81 cuando se estabilicen los logs. La siguiente sección explica cómo acceder de forma segura.
Inicio de sesión predeterminado y seguridad inicial de Nginx Proxy Manager
La página de instalación actual solo indica que se creará un usuario administrador predeterminado y no proporciona credenciales. La página de configuración adicional señala que INITIAL_ADMIN_EMAIL e INITIAL_ADMIN_PASSWORD crean el usuario durante el arranque y omiten la pantalla para configurar el primer usuario. Por eso, una instalación nueva puede mostrar una pantalla donde creas tu propio administrador. Algunos tutoriales antiguos indican que debes iniciar sesión con [email protected] y changeme. Como esto cambió entre versiones, sigue las indicaciones de la pantalla que muestre tu contenedor.
- Desde tu computadora, abre un túnel SSH al puerto de administración: ssh -L 8081:127.0.0.1:81 user@your-server-ip.
- Abre http://localhost:8081 en el navegador de tu computadora.
- Si NPM te pide crear el primer usuario, escribe tu correo electrónico y una contraseña segura y única.
- Si aparece un formulario de inicio de sesión clásico, quizá estés ejecutando una versión anterior. Las guías antiguas indican [email protected] y changeme. Inicia sesión una vez y cambia ambos datos de inmediato.
- También puedes definir INITIAL_ADMIN_EMAIL e INITIAL_ADMIN_PASSWORD antes del primer inicio para omitir la pantalla de configuración. Después, elimina la contraseña del archivo.
El túnel protege una interfaz de administración que controla todos tus certificados y rutas, por lo que no debe quedar expuesta en internet. Docker publica los puertos mediante sus propias reglas de firewall. Según su documentación, este tráfico se procesa antes de aplicar las reglas de UFW, por lo que bloquear el puerto 81 en UFW quizá no impida el acceso a un puerto publicado. Vincularlo a 127.0.0.1, como en el archivo de Compose, resuelve el problema. Permite solo los puertos 22, 80 y 443 con la guía de UFW y protege SSH con Fail2Ban en un VPS.
Agrega tu primer proxy host con un certificado SSL gratuito
NPM solicita certificados a Let’s Encrypt, la autoridad de certificación gratuita. La guía de Let’s Encrypt explica cómo funciona. Sigue estos pasos para configurar una app.
- Crea un registro A, por ejemplo app.example.com, que apunte a la dirección IPv4 de tu VPS y espera a que se propague.
- En NPM, ve a Hosts, luego a Proxy Hosts y selecciona Add Proxy Host.
- Escribe el dominio, elige el esquema (http para la mayoría de los contenedores) y configura el hostname y el puerto de destino de la app. Si el contenedor está en la red de Docker compartida, usa el nombre de su servicio.
- Activa Websockets Support si la app usa WebSockets y, de forma opcional, Block Common Exploits.
- Abre la pestaña SSL, selecciona Request a new SSL Certificate, activa Force SSL y HTTP/2 Support, escribe tu correo electrónico y acepta los términos de Let’s Encrypt.
- Guarda los cambios. NPM valida el dominio mediante HTTP en el puerto 80, emite el certificado y comienza a servir la app por HTTPS.
Listas de acceso, streams y certificados wildcard en NPM
- Listas de acceso: agrega autenticación HTTP básica delante de un host que no tenga su propio inicio de sesión, como un dashboard o un visor de logs. Las preguntas frecuentes del proyecto advierten que la autenticación básica usa el encabezado Authorization, que la mayoría de las apps no puede compartir. Por eso, las apps con inicio de sesión propio suelen dejar de funcionar detrás de esta autenticación.
- Streams: reenvía puertos TCP o UDP sin procesar mediante NPM en lugar de HTTP. Por ejemplo, dirige un puerto público a un servicio SSH de Git o a un servidor de juegos dentro de un contenedor. También debes publicar ese puerto en el archivo de Compose.
- Certificados wildcard: Let’s Encrypt solo emite certificados wildcard mediante el desafío DNS. NPM lo admite: selecciona tu proveedor DNS y proporciona sus credenciales de API. Solicita una vez *.example.com y example.com para reutilizar el certificado en varios hosts.
Coloca tus apps de Docker detrás de NPM
Una red compartida es la forma más clara de configurar un proxy inverso con Docker. La documentación del proyecto recomienda una red de Docker personalizada para que los servicios upstream no necesiten publicar puertos en el host. En NPM, escribes el nombre del servicio como hostname de destino. Los nombres deben ser únicos dentro de esa red. El archivo de Compose anterior ya creó una red llamada proxy, así que las apps conectadas permanecen fuera de internet excepto a través de NPM.
Toma como ejemplo el stack de la guía para alojar n8n por tu cuenta. Conserva la instalación y edita el archivo de Compose para que el servicio se conecte a la red proxy y elimine la línea ports:
services:
n8n:
# image, volumes and environment stay as in your existing file
# ports: removed – NPM reaches the container over the proxy network
networks:
– proxy
networks:
proxy:
external: true
Reinicia ese stack y agrega un proxy host con n8n como hostname de destino y 5678 como puerto de destino, que es el puerto predeterminado de n8n. Activa Websockets Support. Nunca uses localhost como hostname de destino para un contenedor: dentro del contenedor de NPM, esa dirección apunta al propio NPM. Este patrón de Nginx Proxy Manager con Docker, basado en una red compartida y sin puertos publicados para las apps, admite tantas apps como permita tu RAM.
Nginx Proxy Manager vs. Traefik vs. Caddy vs. Pangolin
Las cuatro herramientas colocan HTTPS delante de tus servicios, pero se configuran de formas distintas. Pangolin se diferencia de las demás: es un proxy inverso con túneles basado en WireGuard que resuelve otro tipo de problema de acceso. La guía para alojar Pangolin por tu cuenta explica ese enfoque.
| Herramienta | Tipo de configuración | HTTPS automático | Interfaz | Detección de contenedores | Recomendado para |
| NPM | Formularios en una interfaz web; SQLite o MariaDB | Let’s Encrypt desde la interfaz | Sí, en el puerto 81 | No; debes indicar el host y el puerto | Inicio sencillo y pocas apps |
| Traefik | Configuración estática y etiquetas de Docker | Compatibilidad integrada con ACME | Dashboard para las rutas | Sí, mediante etiquetas de Docker; protege el socket | Muchos contenedores que cambian y configuración como código (curva más pronunciada) |
| Caddy | Caddyfile o JSON | Activado de forma predeterminada; Let’s Encrypt y ZeroSSL | Sin interfaz web | No está integrada | Archivos de configuración breves (curva moderada) |
| Pangolin | Dashboard y túneles WireGuard | Let’s Encrypt automatizado | Sí, con usuarios, roles y SSO | Basada en túneles | Servicios privados detrás de NAT (un modelo distinto) |
Elige según tu caso: NPM para una interfaz gráfica y pocas apps, Traefik para muchos contenedores con las rutas junto a cada servicio, Caddy para un archivo de configuración breve que gestione HTTPS y Pangolin para servicios detrás de un firewall o NAT.
Cómo corregir errores 502 y fallas de certificados SSL en Nginx Proxy Manager
- ¿Por qué aparece «502 Bad Gateway»? Nginx no pudo conectarse al servicio upstream. Comprueba el hostname y el puerto de destino, el esquema http/https, que el contenedor esté en ejecución y que comparta una red de Docker con NPM (docker network inspect proxy). Usar localhost como hostname es una causa frecuente.
- ¿Por qué Let’s Encrypt muestra «DNS problem: NXDOMAIN looking up A for …»? El dominio no tiene un registro A que se resuelva públicamente. Corrige el registro y espera a que se propague el DNS antes de volver a intentarlo.
- ¿Por qué aparece «Timeout during connect (likely firewall problem)» o «The server could not connect to the client to verify the domain»? Let’s Encrypt no puede acceder al puerto 80. Ábrelo en todas las capas del firewall. El estado del firewall local no demuestra que sea accesible desde internet.
- ¿Por qué aparece «too many certificates (5) already issued for this exact set of domains in the last 168 hours»? Alcanzaste el límite de cinco certificados duplicados por semana para los mismos hostnames. Corrige la causa y espera antes de intentarlo de nuevo.
- ¿Por qué una app con WebSocket carga, pero después falla o deja de responder? Debes activar Websockets Support en el proxy host.
- ¿Por qué se produce un bucle de redirección (ERR_TOO_MANY_REDIRECTS) detrás de Cloudflare? En el modo Flexible, Cloudflare se comunica con tu servidor de origen mediante HTTP y Force SSL vuelve a redirigir la conexión. Cloudflare recomienda Full o Full (strict) con un certificado de origen. Otra opción es eliminar la redirección en el servidor de origen.
Crea backups y actualiza NPM
- Crea backups de ./data, que contiene la base de datos SQLite y la configuración, y de ./letsencrypt, que contiene los certificados. Si usas MariaDB, exporta también esa base de datos. La guía de estrategias de backup para servidores explica cómo guardar copias fuera del servidor.
- Para actualizar, cambia la etiqueta de la imagen en docker-compose.yml. Después, ejecuta docker compose pull y luego docker compose up -d. Lee primero las notas de la versión del proyecto.
- Fija la etiqueta de la imagen en lugar de usar latest. Así, las actualizaciones se aplicarán cuando tú decidas. Anota también la etiqueta anterior para poder revertir los cambios.
cd ~/npm
tar czf npm-backup-$(date +%F).tar.gz data letsencrypt
docker compose pull
docker compose up -d
Por qué ejecutar Nginx Proxy Manager en un VPS de Contabo
El proxy consume pocos recursos, por lo que casi toda la memoria del servidor queda disponible para las apps. Ahí importa la cantidad de RAM por euro que ofrece Contabo: un Cloud VPS con algunos gigabytes de RAM basta para NPM y varias apps pequeñas de Docker. Un plan mayor brinda espacio para que crezcan las apps más pesadas sin un gran aumento de precio. Los planes se facturan con un precio mensual fijo, lo que permite prever el costo de un stack alojado por tu cuenta.
El acceso root te permite instalar Docker y vincular los puertos 80 y 443 tal como se muestra arriba.
Preguntas frecuentes: Nginx Proxy Manager en Docker
¿Cuál es el inicio de sesión predeterminado de Nginx Proxy Manager?
La documentación actual solo indica que se crea un usuario administrador predeterminado y no proporciona credenciales. Una instalación nueva puede mostrar una pantalla donde eliges tu correo electrónico y contraseña para el primer usuario. Los tutoriales antiguos mencionan [email protected] y changeme; cámbialos de inmediato si aparecen.
¿Nginx Proxy Manager es mejor que Traefik o Caddy?
Depende de cómo prefieras trabajar. NPM es la opción más sencilla si quieres una interfaz web y tienes pocas apps. Traefik se adapta a muchos contenedores que cambian y usan etiquetas, mientras que Caddy funciona bien con archivos de configuración breves y HTTPS automático. Ninguno es mejor en todos los casos.
¿Por qué NPM muestra un error 502 Bad Gateway?
Un error 502 Bad Gateway indica que Nginx no pudo conectarse a la app upstream. Las causas habituales son un hostname o puerto de destino incorrectos, el esquema http o https equivocado, un contenedor detenido o una app que no comparte una red de Docker con el proxy. Nunca uses localhost para un contenedor.
¿Cómo obtengo un certificado SSL gratuito en NPM?
Dirige un registro A a tu servidor, crea un proxy host, abre su pestaña SSL y solicita un certificado nuevo de Let’s Encrypt. El puerto 80 debe ser accesible para la validación HTTP. Para certificados wildcard, usa el desafío DNS con las credenciales de API de tu proveedor DNS.
¿Puedo ejecutar NPM y otras apps en el mismo VPS?
Sí, ese es el uso previsto. Ejecuta NPM en los puertos 80 y 443, conecta tus otras apps de Docker a la red proxy compartida sin publicar sus puertos y agrega un proxy host por app. La memoria suele ser el límite, así que elige el VPS según las apps, no según el proxy.
Aviso: Las especificaciones, funciones y precios de los productos mencionados en este artículo pueden cambiar y variar según la región, el periodo de facturación y las promociones activas. Consulta el sitio web oficial de cada proveedor o marca para conocer las cifras, precios y tipos de cambio locales vigentes.