App - Nginx Proxy Manager

Instalación, configuración y gestión.

Versión 1.1

Última modificación: 23/09/2026 18:14

Nginx Proxy Manager ⮴

Este contenedor permite publicar servicios de forma segura (por ejemplo, Jellyfin) en Internet utilizando los certificados Let’s Encrypt.

Como requisito especial, Nginx Proxy Manager (NPM) necesita utilizar los puertos 80 y 443 en el servidor. Hay dos opciones:

  1. Puertos libres 80 y 443 en el servidor

    De forma predeterminada, la GUI OMV utiliza estos puertos, por lo que se deben liberar antes de iniciar el contenedor. Para hacer esto en Sistema - Área de trabajo - Configuración cambie los puertos HTTP y HTTPS a unos no utilizados. Por ejemplo:

    • HTTP: 80 → 8888

    • HTTPS: 443 → 8443

    En el router hay que redirigir (orwarding ) los puertos 80 y 443 al servidor

  2. Utilizar el reenvío de puertos en el router

    Si prefiere mantener OMV utilizando los puertos 80 y 443, puede reenviar diferentes puertos externos en el router al contenedor.

    Ejemplo:

    • Puerto externo reenviado 80 → puerto de servidor 30080

    • Puerto externo reenviado 443 → puerto de servidor 30443

      En el archivo de composición, NPM usaría:

      • 30080:80

      • 30443:443

    El resultado es el mismo: el contenedor recibe tráfico en los puertos 80 y 443 internamente, mientras que OMV mantiene los puertos 80 y 443 en la red local.

Instalación ⮴

YML Nginx Proxy Manager ⮴

Tomando como referencia el propuesto por el ejemplo de OMV 8 y aportaciones para generar la red interna proxy_net para los contenedores.

Esta instalación usará su propia base de datos SQLite integrada, guardada simplemente como un archivo dentro del volumen /data. Esto es suficiente para un entrono doméstico.


# Date: 2025-06-01
# https://github.com/NginxProxyManager/nginx-proxy-manager
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81'
    environment:
      TZ: ${{ tz }}
    volumes:
      - CHANGE_TO_COMPOSE_DATA_PATH/nginxproxymanager/data:/data
      - CHANGE_TO_COMPOSE_DATA_PATH/nginxproxymanager/letsencrypt:/etc/letsencrypt
    networks:
      - default
      - proxy_net

networks:
  proxy_net:
    name: proxy_net
    driver: bridge

En el caso de querer usar una base de datos como Maria DB habría que añadir:


... 

environment:

      # Mysql/MariaDB connection parameters:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # Optional SSL (see NPM website)
      # DB_MYSQL_SSL: 'true'
      # DB_MYSQL_SSL_REJECT_UNAUTHORIZED: 'true'
      # DB_MYSQL_SSL_VERIFY_IDENTITY: 'true'
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'

    depends_on:
      - db
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
      MARIADB_AUTO_UPGRADE: '1'
    volumes:
      - ${{ sf:"appdata" }}/nginxproxymanager/mysql:/var/lib/mysql

... 

Gestión del tráfico: WAN vs LAN ⮴

Acceso WAN (desde Internet) ⮴


┌─────────────────────────────────────────────────────────────┐
│                   CLIENTE WAN (Internet)                    │
│                   Escribe en navegador:                     │
│                   https://midominio.com                     │
└────────────────────────┬────────────────────────────────────┘
                          │
                          ↓
          ┌──────────────────────────────┐
          │   Resolución DNS público     │
          │  midominio.com → IP pública  │
          │   (ej: 203.0.113.50)         │
          └────────────┬─────────────────┘
                        │
                        ↓
        ┌───────────────────────────────────┐
        │  Internet / ISP / Router público  │
        │                                   │
        │  Port Forwarding 443 →            │
        │  Mi servidor OMV (192.168.0.5)    │
        └────────────┬──────────────────────┘
                      │
                      ↓
    ┌────────────────────────────────────────────┐
    │         RED LAN (192.168.0.x/24)           │
    │                                            │
    │  ┌──────────────────────────────────────┐  │
    │  │  OMV 8 - 192.168.0.5                 │  │
    │  │                                      │  │
    │  │  ┌────────────────────────────────┐  │  │
    │  │  │ NPM (Puerto 443 HTTPS)         │  │  │
    │  │  │                                │  │  │
    │  │  │ Recibe:                        │  │  │
    │  │  │ - IP destino: 192.168.0.5      │  │  │
    │  │  │ - Puerto: 443                  │  │  │
    │  │  │ - SNI: midominio.com           │  │  │
    │  │  │                                │  │  │
    │  │  │ Selecciona certificado para:   │  │  │
    │  │  │ midominio.com (Let's Encrypt)  │  │  │
    │  │  │                                │  │  │
    │  │  │ Busca regla proxy:             │  │  │
    │  │  │ "midominio.com → jellyfin"     │  │  │
    │  │  │                                │  │  │
    │  │  │ Reenvía internamente:          │  │  │
    │  │  │ http://jellyfin:8096           │  │  │
    │  │  └────────────┬───────────────────┘  │  │
    │  │               │                      │  │
    │  │               ↓ (via docker network) │  │
    │  │  ┌────────────────────────────────┐  │  │
    │  │  │ Contenedor Jellyfin            │  │  │
    │  │  │ Puerto 8096 (HTTP interno)     │  │  │
    │  │  │                                │  │  │
    │  │  │ JELLYFIN_PublishedServerUrl:   │  │  │
    │  │  │ https://midominio.com          │  │  │
    │  │  │                                │  │  │
    │  │  │ (Jellyfin genera links con     │  │  │
    │  │  │  este FQDN para streaming      │  │  │
    │  │  │  remoto)                       │  │  │
    │  │  └────────────┬───────────────────┘  │  │
    │  │               │                      │  │
    │  │               ↓ (respuesta)          │  │
    │  │  ┌────────────────────────────────┐  │  │
    │  │  │ NPM encripta con HTTPS         │  │  │
    │  │  │ (certificado válido)           │  │  │
    │  │  └────────────┬───────────────────┘  │  │
    │  │               │                      │  │
    │  └───────────────┼──────────────────────┘  │
    │                  │                         │
    └──────────────────┼─────────────────────────┘
                        │
                        ↓
        ┌──────────────────────────────────┐
        │  Internet / ISP / Router público │
        │                                  │
        │  Respuesta HTTPS devuelta al     │
        │  cliente WAN                     │
        └──────────────────────────────────┘
                      │
                      ↓
┌─────────────────────────────────────────────────────────────┐
│          CLIENTE WAN recibe HTTPS válido                    │
│          Ve contenido de Jellyfin                           │
│          Los links de streaming usan HTTPS://midominio.com  │
└─────────────────────────────────────────────────────────────┘

Acceso LAN (desde la red local) ⮴


┌─────────────────────────────────────────────────────────────┐
│              CLIENTE LAN (Máquina local)                    │
│                 Escribe en navegador:                       │
│               https://midominio.com                         │
└────────────────────────┬────────────────────────────────────┘
                          │
                          ↓
          ┌──────────────────────────────┐
          │  Resolución DNS local        │
          │  (Archivo /etc/hosts)        │
          │  midominio.com → 192.168.0.5 │
          │                              │
          │  ¡NO consulta DNS público!   │
          └────────────┬─────────────────┘
                        │
                        ↓
    ┌────────────────────────────────────────────┐
    │         RED LAN (192.168.0.x/24)           │
    │                                            │
    │  ┌──────────────────────────────────────┐  │
    │  │  OMV 8 - 192.168.0.5                 │  │
    │  │                                      │  │
    │  │  ┌────────────────────────────────┐  │  │
    │  │  │ NPM (Puerto 443 HTTPS)         │  │  │
    │  │  │                                │  │  │
    │  │  │ Recibe:                        │  │  │
    │  │  │ - IP destino: 192.168.0.5      │  │  │
    │  │  │ - Puerto: 443                  │  │  │
    │  │  │ - SNI: midominio.com           │  │  │
    │  │  │                                │  │  │
    │  │  │ Selecciona certificado para:   │  │  │
    │  │  │ midominio.com (Let's Encrypt)  │  │  │
    │  │  │ ← MISMO certificado que WAN    │  │  │
    │  │  │                                │  │  │
    │  │  │ Busca regla proxy:             │  │  │
    │  │  │ "midominio.com → jellyfin"     │  │  │
    │  │  │ ← MISMA regla que WAN          │  │  │
    │  │  │                                │  │  │
    │  │  │ Reenvía internamente:          │  │  │
    │  │  │ http://jellyfin:8096           │  │  │
    │  │  └────────────┬───────────────────┘  │  │
    │  │               │                      │  │
    │  │               ↓ (via docker network) │  │
    │  │  ┌────────────────────────────────┐  │  │
    │  │  │ Contenedor Jellyfin            │  │  │
    │  │  │ Puerto 8096 (HTTP interno)     │  │  │
    │  │  │                                │  │  │
    │  │  │ JELLYFIN_PublishedServerUrl:   │  │  │
    │  │  │ https://midominio.com          │  │  │
    │  │  │                                │  │  │
    │  │  │ (Jellyfin genera links con     │  │  │
    │  │  │  este FQDN para streaming)     │  │  │
    │  │  └────────────┬───────────────────┘  │  │
    │  │               │                      │  │
    │  │               ↓ (respuesta)          │  │
    │  │  ┌────────────────────────────────┐  │  │
    │  │  │ NPM encripta con HTTPS         │  │  │
    │  │  │ (certificado válido)           │  │  │
    │  │  └────────────┬───────────────────┘  │  │
    │  │               │                      │  │
    │  └───────────────┼──────────────────────┘  │
    │                  │                         │
    └──────────────────┼─────────────────────────┘
                        │
                        ↓
┌─────────────────────────────────────────────────────────────┐
│         CLIENTE LAN recibe HTTPS válido                     │
│         Ve contenido de Jellyfin                            │
│         Los links de streaming usan HTTPS://midominio.com   │
│         (Misma experiencia que WAN, pero con latencia baja) │
└─────────────────────────────────────────────────────────────┘

Comparación ⮴

Aspecto WAN LAN
Resolución DNS DNS público (hacia midominio.com → IP pública) Archivo /etc/hosts local (midominio.com → 192.168.0.5)
Ruta externa Internet → Port Forwarding → 192.168.0.5:443 Red LAN directa → 192.168.0.5:443
NPM recibe HTTPS en 192.168.0.5:443 con SNI: midominio.com HTTPS en 192.168.0.5:443 con SNI: midominio.com
Certificado usado Let's Encrypt (midominio.com) Let's Encrypt (midominio.com)
Regla proxy midominio.com → jellyfin:8096 midominio.com → jellyfin:8096
Reenvío interno http://jellyfin:8096 http://jellyfin:8096
JELLYFIN_PublishedServerUrl https://midominio.com https://midominio.com
Latencia Más alta (atraviesa Internet) Muy baja (red local)
Flujo total Idéntico en ambos casos una vez llega a NPM Idéntico

Resumen ⮴

La única diferencia es cómo llega la petición a NPM:

- WAN: DNS público + Port Forwarding

- LAN: Archivo hosts local

Una vez en NPM, todo es exactamente igual para ambos casos:

- Mismo certificado

- Misma configuración proxy

- Mismo contenedor Jellyfin

- Misma JELLYFIN_PublishedServerUrl

Configuración de Hosts ⮴