Placer un serveur Jellyfin derrière Cloudflare demande en général une douzaine d’étapes manuelles à deux endroits, avec une erreur facile : envoyer la vidéo à travers le CDN de Cloudflare, ce que les conditions d’utilisation de Cloudflare pour les formules Free, Pro et Business ne permettent pas. Edge Shield pour Cloudflare® effectue toute la configuration depuis le tableau de bord de Jellyfin, avec votre propre token API Cloudflare, et garde les flux vidéo en direction directe de votre serveur.
Ce qu’il fait
- Connexion : un token API limité à votre zone, stocké chiffré (AES-256-GCM) sur le serveur et ne plus jamais affiché dans le navigateur ; choix de la zone et vérification de chaque permission dont le token a besoin.
- « stream offload » (mode recommandé) : le domaine d’application (app host, par exemple
media.example.com) passe par le proxy Cloudflare pour l’interface web, l’API et la connexion, tandis que les requêtes vidéo, audio et de téléchargement sont redirigées (307) vers un domaine de streaming (streaming host, par exempledirect.example.com) en « DNS only », qui va directement à votre serveur. Un mode « DNS only » existe pour ceux qui ne veulent pas du proxy. - DNS : les enregistrements A / AAAA des deux noms, avec l’IP publique détectée et tenue à jour automatiquement (DDNS).
- TLS dans Cloudflare : SSL Full (strict), Always Use HTTPS (toujours utiliser HTTPS), version TLS minimale, TLS 1.3, HSTS facultatif.
- Certificat Let’s Encrypt pour les deux noms via ACME DNS-01 (avec le même token, sans avoir besoin du port 80), renouvelé automatiquement 30 jours avant son expiration et installé dans Jellyfin comme fichier
.pfx. - Règles Cloudflare compatibles avec la formule Free : la redirection des flux, l’absence de mise en cache des chemins média, la liste de blocage, le blocage des en-têtes IP envoyés par le client, les pays autorisés, une limite de débit pour la connexion et le port d’origine (par exemple quand votre routeur utilise le port 2096 côté extérieur). Vos propres règles restent intactes ; Remove the Edge Shield rules ne supprime que ce que le plugin a créé.
- IP client réelle : les plages d’IP de Cloudflare sont écrites dans les proxys connus de Jellyfin et actualisées chaque jour, pour que Jellyfin voie l’adresse du visiteur et qu’on ne puisse pas lui en présenter une fausse.
- Le domaine de streaming n’accepte que les chemins média : toute autre requête sur ce nom reçoit un 403, et les IP bloquées sont également refusées par Jellyfin lui-même, y compris sur le domaine direct.
- Protection dynamique : une IP avec trop d’échecs de connexion (5 en 10 minutes par défaut) entre dans la liste Cloudflare
medialab_blockedet est bloquée en périphérie pendant 24 h, ×4 à chaque récidive (30 jours au maximum) ; les entrées expirent d’elles-mêmes. Liste d’autorisation (allowlist), blocage et déblocage manuels, et un commutateur Under Attack programmé dans le temps qui s’éteint tout seul. - Status and fixes : chaque point est vérifié, avec un bouton Fix par ligne et un Fix everything ; les commandes de pare-feu pour restreindre le port sont affichées, prêtes à copier.
- En anglais et en roumain.
Ce qu’il envoie, où
- Vers Cloudflare, via son API et avec votre propre token : les réglages de zone, les enregistrements DNS (avec l’IP publique de votre serveur), les règles et les adresses IP à bloquer. Le commentaire d’une entrée de la liste de blocage contient l’heure d’expiration et la raison (le nombre d’échecs de connexion, ou « manual » avec la note que vous avez écrite pour un blocage manuel). Depuis la version 0.1.1, le nom d’utilisateur tenté n’est plus envoyé à Cloudflare : il reste uniquement sur votre serveur, dans la liste de blocage et le journal de la page du plugin.
- Pour trouver votre IP publique (DDNS), le serveur lit
https://www.cloudflare.com/cdn-cgi/trace; la liste des plages d’IP de Cloudflare est lue chaque jour depuis l’API publique de Cloudflare. - Vers Let’s Encrypt : la demande de certificat pour vos deux noms d’hôte (et l’adresse e-mail, si vous en saisissez une). La clé privée est créée sur votre serveur et ne le quitte jamais.
- Le token n’est stocké que chiffré sur votre serveur et n’est jamais envoyé au navigateur.
- Rien ne va vers medialab.works, si ce n’est la vérification de licence.
Détails complets pour chaque produit, y compris ce qui reste sur votre serveur : Licence, confidentialité et compatibilité.
Compatibilité des clients
Edge Shield agit au niveau du serveur et du réseau, donc il s’applique à toute application. Ce qui a été vérifié jusqu’ici :
- Jellyfin Web et medialab Server : lecture réelle en mode « stream offload », sans aucun octet vidéo passant par Cloudflare.
- Applications Jellyfin (Android, Android TV, Swiftfin, Findroid, Kodi/JellyCon, Infuse, Streamyfin) et navigateurs de téléviseurs : pas encore testés. En mode « stream offload », une application doit suivre la redirection 307 pour les médias ; si ce n’est pas le cas, utilisez le mode « DNS only ».
- Edge Shield a été testé contre un simulateur de l’API Cloudflare ; le test contre la véritable API Cloudflare est toujours en cours.
Prérequis
- Jellyfin Server 12.2 ou plus récent.
- Un compte Cloudflare contenant la zone de votre domaine ; la formule Free suffit.
- Un token API Cloudflare (« Custom token », limité à votre zone) avec : 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 page du plugin les liste et les vérifie.
- Pour le « stream offload » : des ports HTTPS transférés de votre routeur vers Jellyfin, pour le domaine d’application et pour le domaine de streaming.
Limites
- Le domaine de streaming est en « DNS only » : l’IP publique de votre serveur est donc visible de quiconque la recherche. Sur ce nom, Jellyfin ne répond qu’aux requêtes média, qui nécessitent quand même un token Jellyfin valide.
- Under Attack impose à chaque visiteur une vérification JavaScript : les applications natives (Android TV, Roku, iOS, Kodi…) ne peuvent pas la passer et ne se connecteront pas tant qu’il est actif. Ne l’utilisez que pendant une attaque, brièvement.
- Pas de Cloudflare Tunnel ni de certificat Origin CA dans cette version : l’un et l’autre enverraient la vidéo via Cloudflare ou nécessiteraient un certificat non reconnu par les navigateurs sur le domaine direct.
- Jellyfin lit ses réglages réseau au démarrage : le certificat, HTTPS et les plages Cloudflare dans les proxys connus ne prennent effet qu’après un redémarrage de Jellyfin.
Licence
Le plugin est open source (GPL-3.0). Les versions compilées prêtes à l’installation sont publiques, comme le code source. Ce que vous achetez, c’est l’abonnement : la licence d’utilisation du plugin sur un serveur Jellyfin, les mises à jour incluses dans votre formule et le support : chaque mise à jour tant que l’abonnement est actif, via votre dépôt de plugins privé, et de l’aide quand quelque chose ne fonctionne pas. Le plugin vérifie la clé d’abonnement une fois par jour ; sans abonnement valide, il s’arrête jusqu’au renouvellement (rien n’est supprimé). Mensuel, annuel ou à vie (la licence à vie inclut un an de mises à jour), ou inclus dans le pack Jellyfin. Essai gratuit de 30 jours.
Code source. Pour chaque version, le code source complet correspondant est public, à côté de la version compilée, dans l’historique des versions, et aussi dans votre compte (Compte → Licences, Code source) ; chaque archive contient le texte intégral de la GPL-3.0 (LICENSE). Si vous avez besoin du code source d’une version que vous ne pouvez plus télécharger, demandez-nous et nous vous l’envoyons. Voir la section 10 de la Licence (CLUF).
Code écrit par nos soins, à partir de zéro, par MediaLab Works ; il ne contient aucun code tiers. Cloudflare est une marque déposée de Cloudflare, Inc. ; Edge Shield n’est ni affilié à Cloudflare ni approuvé par elle.
