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 ejemplodirect.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_blockedy 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.
