Instalación, configuración y gestión.
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:
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
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.
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
...
┌─────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 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) │
└─────────────────────────────────────────────────────────────┘
| 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 |
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