Edge Shield para Jellyfin

Para Jellyfin: configura Cloudflare desde el panel: DNS y DDNS, SSL Full (strict), un certificado de Let's Encrypt, reglas en el borde y bloqueo de inicios de sesión fallidos.

Connect once with a Cloudflare API token limited to your zone: it is kept encrypted on the server and never shown again1 de 8

Poner un servidor de Jellyfin detrás de Cloudflare suele significar una docena de pasos manuales en dos sitios, y un error fácil: enviar el vídeo a través de la CDN de Cloudflare, que las condiciones de Cloudflare para los planes Free, Pro y Business no permiten. Edge Shield para Cloudflare® hace toda la configuración desde el panel de Jellyfin, con tu propio token de API de Cloudflare, y mantiene los streams de vídeo yendo directos a tu servidor.

Qué hace

  • Connection: un token de API restringido a tu zona, guardado cifrado (AES-256-GCM) en el servidor y nunca más mostrado en el navegador; elección de la zona y comprobación de cada permiso que necesita el token.
  • «Stream offload» (modo recomendado): el app host (por ejemplo media.example.com) pasa por el proxy de Cloudflare para la interfaz web, la API y el inicio de sesión, mientras las solicitudes de vídeo, audio y descarga se redirigen (307) a un streaming host (por ejemplo direct.example.com) que es «DNS only» y va directo a tu servidor. Hay un modo «DNS only» para quien no quiera el proxy.
  • DNS: los registros A / AAAA de ambos nombres, con la IP pública detectada y mantenida actualizada automáticamente (DDNS).
  • TLS en Cloudflare: SSL Full (strict), Always Use HTTPS, versión mínima de TLS, TLS 1.3, HSTS opcional.
  • Certificado de Let's Encrypt para ambos nombres mediante ACME DNS-01 (con el mismo token, sin necesidad del puerto 80), renovado automáticamente 30 días antes de que caduque e instalado en Jellyfin como archivo .pfx.
  • Reglas de Cloudflare que encajan en el plan Free: la redirección del stream, la ausencia de caché en las rutas de medios, la lista de bloqueo, el bloqueo de cabeceras IP enviadas por el cliente, los países permitidos, un límite de frecuencia de inicio de sesión y el puerto de origen (por ejemplo, cuando tu router usa el 2096 hacia fuera). Tus propias reglas quedan intactas; Remove the Edge Shield rules elimina solo lo que creó el plugin.
  • IP real del cliente: los rangos de IP de Cloudflare se escriben en los proxies conocidos de Jellyfin y se actualizan a diario, así que Jellyfin ve la dirección del visitante y no se le puede mostrar una falsa.
  • The streaming host accepts media paths only: cualquier otra solicitud a ese nombre recibe un 403, y las IP bloqueadas las rechaza el propio Jellyfin, también en el host directo.
  • Protección dinámica: una IP con demasiados inicios de sesión fallidos (por defecto 5 en 10 minutos) entra en la lista de Cloudflare medialab_blocked y se bloquea en el borde durante 24 horas, ×4 en cada repetición (como máximo 30 días); las entradas caducan solas. Lista de permisión, bloqueo y desbloqueo manuales, y un interruptor Under Attack con temporizador que se apaga solo.
  • Status and fixes: cada punto comprobado, con un botón Fix por fila y Fix everything; los comandos de firewall para restringir el puerto se muestran listos para copiar.
  • En inglés y rumano.

Qué envía y adónde

  • A Cloudflare, a través de su API y con tu propio token: los ajustes de la zona, los registros DNS (con la IP pública de tu servidor), las reglas y las direcciones IP que bloquear. El comentario de una entrada de la lista de bloqueo guarda la hora de caducidad y el motivo (el número de inicios de sesión fallidos, o «manual» con la nota que escribiste en un bloqueo manual). Desde la 0.1.1 el nombre de usuario intentado ya no se envía a Cloudflare: se queda solo en tu servidor, en la lista de bloqueo y en el registro de la página del plugin.
  • Para averiguar tu IP pública (DDNS), el servidor lee https://www.cloudflare.com/cdn-cgi/trace; la lista de rangos de IP de Cloudflare se lee a diario desde la API pública de Cloudflare.
  • A Let's Encrypt: la solicitud del certificado para tus dos nombres de host (y la dirección de correo, si introduces una). La clave privada se crea en tu servidor y nunca lo abandona.
  • El token se guarda solo cifrado en tu servidor y nunca se envía al navegador.
  • No va nada a medialab.works salvo la comprobación de la licencia.

Detalles completos de cada producto, incluido lo que se queda en tu servidor: Licencias, privacidad y compatibilidad.

Compatibilidad con clientes

Edge Shield actúa a nivel de servidor y de red, así que se aplica a cada app. Lo verificado hasta ahora:

  • Jellyfin Web y medialab Server: reproducción real mediante «stream offload», sin bytes de vídeo a través de Cloudflare.
  • Apps de Jellyfin (Android, Android TV, Swiftfin, Findroid, Kodi/JellyCon, Infuse, Streamyfin) y navegadores de TV: todavía no probadas. En el modo «stream offload», una app debe seguir la redirección 307 para los medios; si alguna no lo hace, usa el modo «DNS only».
  • Edge Shield se ha comprobado contra un simulador de la API de Cloudflare; la comprobación contra la API real de Cloudflare sigue en curso.

Requisitos

  • Jellyfin Server 12.2 o posterior.
  • Una cuenta de Cloudflare con la zona de tu dominio; el plan Free es suficiente.
  • Un token de API de Cloudflare («Custom token», restringido a tu zona) con: Zone · Zone · Read, Zone · DNS · Edit, Zone · Zone Settings · Edit, Zone · SSL and Certificates · Edit, Zone · Zone WAF · Edit, Zone · Single Redirect · Edit, Zone · Cache Rules · Edit, Zone · Origin Rules · Edit, Account · Account Filter Lists · Edit. La página del plugin los enumera y los comprueba.
  • Para «stream offload»: puertos HTTPS redirigidos desde tu router a Jellyfin para el app host y para el streaming host.

Límites

  • El streaming host es «DNS only», así que la IP pública de tu servidor es visible para quien la consulte. En él, Jellyfin solo responde a solicitudes de medios, que igualmente necesitan un token de Jellyfin válido.
  • Under Attack pide a cada visitante una comprobación de JavaScript: las apps nativas (Android TV, Roku, iOS, Kodi…) no pueden superarla y no conectarán mientras esté activo. Úsalo solo durante un ataque y brevemente.
  • Sin Cloudflare Tunnel ni certificado Origin CA en esta versión: ambos enviarían el vídeo a través de Cloudflare o necesitarían un certificado en el que los navegadores no confían en el host directo.
  • Jellyfin lee sus ajustes de red al arrancar: el certificado, HTTPS y los rangos de Cloudflare en los proxies conocidos surten efecto tras reiniciar Jellyfin.

Licencia

El plugin es de código abierto (GPL-3.0). Las compilaciones listas para instalar son públicas, igual que el código fuente. Lo que compras es la suscripción: la licencia para usar el plugin en un servidor de Jellyfin, las actualizaciones que incluye tu plan y el soporte: cada actualización mientras la suscripción esté activa, a través de tu repositorio privado de plugins, y ayuda cuando algo no funcione. El plugin comprueba la clave de suscripción una vez al día; sin una suscripción válida se detiene hasta que renueves (no se borra nada). Mensual, anual o de por vida (la de por vida incluye un año de actualizaciones), o incluido en el paquete para Jellyfin. 30 días de prueba gratis.

Código fuente. Para cada versión, el código fuente correspondiente completo es público, junto a la compilación, en el registro de cambios, y también en tu cuenta (Cuenta → Licencias, Código fuente); cada archivo comprimido contiene el texto completo de la GPL-3.0 (LICENSE). Si necesitas el código fuente de una versión que ya no puedes descargar, pídenoslo y te lo enviamos. Consulta la sección 10 del EULA.

Código propio, escrito desde cero por MediaLab Works; no contiene código de terceros. Cloudflare es una marca registrada de Cloudflare, Inc.; Edge Shield no está afiliado a Cloudflare ni cuenta con su respaldo.

Funciona mejor con medialab Server

Este plugin funciona en Jellyfin oficial 12.2 o posterior. En medialab Server, nuestro servidor basado en Jellyfin con los mismos datos, bibliotecas, usuarios y apps, funciona mejor:

  • Verified – medialab. El servidor comprueba la firma de nuestros plugins y te muestra que los archivos son exactamente los que publicamos. Si un plugin se modifica después de publicarse, se marca.
  • Integrado en la interfaz. Los plugins pueden añadir botones y enlaces al menú de tus usuarios (por ejemplo, "TV", "Share") sin configurar nada a mano en la web.
  • Prioridad de forma predeterminada. Los plugins de medialab aparecen primero donde importa: sintonizadores de TV en directo, fuentes de guía y proveedores de subtítulos. El orden lo decides tú: puedes cambiarlo en cualquier momento.
  • El catálogo de medialab.works incluido, con instalación sin confirmaciones adicionales.
  • Actualizaciones desde la interfaz web, sin terminal (con Self-Update de MediaLab): comprueba, actualiza y vuelve a la versión anterior desde el panel de control; si una versión nueva no arranca, el servidor vuelve por sí solo a la anterior con tus datos intactos.
  • El mismo Jellyfin, al día. medialab Server sigue cada semana las versiones estables de Jellyfin 12.x; una versión nueva solo se publica después de superar todas las pruebas, incluidas las de nuestros plugins.

Las apps de Jellyfin (Android, iOS, TV, web) se conectan exactamente igual que a Jellyfin oficial.

Para instalarlo, ejecuta la imagen del contenedor (guía) o, en Debian 12, los paquetes apt, que sustituyen a jellyfin-server y jellyfin-web y conservan tus datos donde están (guía).

medialab Server es software libre (GPL-2.0), basado en Jellyfin. El código fuente es público: medialab-server y medialab-server-web.

Requisitos

  • Jellyfin Server 12.2 o posterior (Linux, Windows o Docker)
  • Una cuenta de Cloudflare con la zona de tu dominio (basta el plan Free)
  • Un token de API de Cloudflare restringido a la zona, con los permisos indicados en la página del plugin
  • Para la descarga del streaming: puertos HTTPS redirigidos al servidor para el host de la app y el host de streaming
  • Código abierto (GPL-3.0): el código fuente de cada versión está en tu cuenta

Última versión

0.1.5
publicada el 20 oct 2026
Ver todos los cambios →