Edge Shield für Jellyfin — Anleitung
Installation
Du brauchst Jellyfin Server 12.2 oder neuer und ein MediaLab-Works-Konto mit einer Lizenz, die das Plugin abdeckt (ein aktives Abonnement, eine Lifetime-Lizenz innerhalb ihres Update-Zeitraums, das Jellyfin-Paket oder den kostenlosen 30-tägigen Testzeitraum).
Aus deinem Plugin-Repository (empfohlen). Jellyfin installiert und aktualisiert das Plugin dann von selbst.
- Öffne in deinem MediaLab-Works-Konto Lizenzen → Jellyfin-Plugin-Repository und klicke auf Repository-URL erstellen. Kopiere sie: Sie ist privat (sie enthält einen Token), also teile sie nicht; du kannst sie jederzeit neu erzeugen oder widerrufen.
- Öffne in Jellyfin Dashboard → Plugins → Repositories, klicke auf +, gib einen Namen ein (zum Beispiel MediaLab Works), füge die Adresse ein und speichere.
- Suche in Dashboard → Plugins → Catalog nach Edge Shield by MediaLab, klicke auf Install und starte Jellyfin neu.
Das Repository listet nur die Plugins, die deine Lizenzen abdecken, und nur die erlaubten Versionen. Seine Download-Links sind signiert und laufen nach wenigen Stunden ab, sodass Jellyfin immer eine frische Liste liest.
Aus dem öffentlichen Katalog. https://medialab.works/jellyfin/manifest.json listet jedes veröffentlichte MediaLab-Works-Plugin mit seinem öffentlichen Build; medialab Server fügt ihn von selbst hinzu. Du kannst ihn auf dieselbe Weise hinzufügen, um ein Plugin zu installieren, bevor du einen Schlüssel hast: Das Plugin fragt dann auf seiner Lizenz-Seite nach der Lizenz oder startet den Testzeitraum. Bei einer Lifetime-Lizenz mit abgelaufenem Update-Zeitraum bleib bei deinem privaten Repository, das nur die Versionen anbietet, die deine Lizenz erlaubt.
Manuell, aus einer Zip-Datei.
- Lade in Konto → Lizenzen
jf-edgeshield_x.y.z.zipherunter (die SHA-256 der Datei steht neben dem Button). - Entpacke sie in einen neuen Ordner
Edge Shield by MediaLab_x.y.z.0im Jellyfin-Plugin-Ordner:- Linux (Paket):
/var/lib/jellyfin/plugins/ - Docker (offizielles Image):
/config/plugins/im Config-Volume - Windows:
%ProgramData%\Jellyfin\Server\plugins\
- Linux (Paket):
- Starte Jellyfin neu.
Lizenzaktivierung
- Öffne die Plugin-Seite unter Dashboard → Plugins → Edge Shield by MediaLab und klicke auf License.
- Füge deinen Lizenzschlüssel ein und klicke auf Activate with key. Das Plugin kontaktiert den Lizenzserver, bindet den Schlüssel an diesen Jellyfin-Server und zeigt die Lizenz als Active an.
- Noch kein Schlüssel? Gib auf derselben Seite deine E-Mail-Adresse ein und starte den kostenlosen 30-tägigen Testzeitraum (Karte erforderlich, heute nichts zu zahlen) oder kauf eine Lizenz; das Plugin aktiviert sich, sobald die Zahlung durch ist.
Die Lizenz wird einmal am Tag und bei jedem Jellyfin-Start geprüft. Ohne Internet läuft das Plugin nach der letzten erfolgreichen Prüfung noch 7 Tage weiter. Ohne gültige Lizenz stoppt das Plugin seine Arbeit; nur seine License-Seite funktioniert weiter (Test, Schlüssel, Verlängerung). Es wird nichts gelöscht, und alles läuft weiter, sobald die Lizenz wieder gültig ist. Move license (release this server) auf derselben Seite gibt den Schlüssel für einen anderen Server frei.
Updates und Rollback
- Aus dem Repository: Jellyfin zeigt neue Versionen unter Dashboard → Plugins an und kann das Plugin automatisch aktualisieren; starte Jellyfin neu, um die neue Version zu laden.
- Über die Lizenz-Seite des Plugins: Mit gültiger Lizenz installiert Install update die neueste Version, die deine Lizenz erlaubt, und mit Roll back to x.y.z kehrst du zur vorherigen Version zurück (zum Beispiel, wenn nach einem Update etwas nicht mehr funktioniert). Starte Jellyfin danach jeweils neu. Beide Pakete werden gegen die Prüfsumme geprüft, die der Lizenzserver veröffentlicht.
- Eine Lifetime-Lizenz erhält die Versionen, die während ihres Update-Zeitraums veröffentlicht wurden; danach läuft das Plugin mit der letzten Version weiter, die es nutzen darf.
- Nach einem Rollback installiert Jellyfins geplante Aufgabe Update Plugins (beim Start und täglich) die neueste Version wieder, wenn dein Plugin-Repository in Jellyfin hinzugefügt ist. Um eine Weile auf der vorherigen Version zu bleiben, entferne die Auslöser dieser Aufgabe unter Dashboard → Scheduled Tasks und füge sie später wieder hinzu.
Quellcode
Der GPL-3.0-Quellcode jeder Version liegt in Konto → Lizenzen (Quellcode) neben dem Download als .tar.gz-Archiv vor, das aus dem exakten Commit dieser Version erstellt wurde.
Konfiguration
- Connection: Erstelle in Cloudflare einen API-Token (Create Token → Custom token), auf deine Zone beschränkt, mit den Berechtigungen, die die Seite auflistet: 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 und Account · Account Filter Lists · Edit. Füge ihn ein und wähle dann die Zone (deine Domain). Der Token wird verschlüsselt auf dem Server gespeichert und nie wieder angezeigt; eine fehlende Berechtigung wird auf der Statusseite genannt.
- Mode:
- Empfohlen: UI über Cloudflare, Video direkt („Stream Offload“). Der App-Host geht über den Cloudflare-Proxy; Video-, Audio- und Download-Anfragen werden (307) zum Streaming-Host umgeleitet, der „DNS only“ ist und direkt zu deinem Server geht.
- DNS only (kein Proxy): Cloudflare nur für DNS, DDNS und das Zertifikat. WAF-Regeln und Edge-Blocking greifen nicht, weil der Traffic nicht durch Cloudflare läuft.
- Names and ports: der App-Host (zum Beispiel
media.example.com) mit dem HTTPS-Port, den deine Clients nutzen (443 oder einer der Ports, die Cloudflare proxied: 2053, 2083, 2087, 2096, 8443), der externe Port, den dein Router an den Server weiterleitet (falls er abweicht, fügt Edge Shield eine Origin-Regel hinzu), und der Streaming-Host (zum Beispieldirect.example.com) mit seinem externen HTTPS-Port. Die öffentliche IPv4 wird erkannt, wenn das Feld leer ist; DDNS hält die Einträge aktuell, wenn sie sich ändert. - Serverzertifikat: Let's Encrypt automatically (DNS-01, with the token) für beide Namen oder eines, das du selbst verwaltest. Full (strict) braucht ein gültiges Zertifikat auf dem Server. Das Zertifikat wird 30 Tage vor Ablauf erneuert.
- TLS: minimale TLS-Version und optional HSTS auf dem App-Host (schalte es erst ein, wenn HTTPS zuverlässig funktioniert; es lässt sich nur schwer rückgängig machen).
- Protection: automatisches Blockieren von IPs mit fehlgeschlagenen Anmeldungen (standardmäßig 5 in 10 Minuten und 24 Stunden, ×4 bei jeder Wiederholung), die IPs oder CIDR-Bereiche, die nie blockiert werden sollen, das Login-Rate-Limit (mehr als 10 Anfragen in 10 s von einer IP → 10 s Block), das Blockieren clientseitig gesendeter IP-Header und die erlaubten Länder (ISO-Codes; leer heißt alle). The streaming host accepts media paths only (standardmäßig an): Jede andere Anfrage darauf bekommt 403.
- Speichere, öffne dann Status and fixes und klicke auf Fix everything, damit die Einstellungen und Regeln Cloudflare und Jellyfin erreichen. Starte Jellyfin neu, wenn die Seite es verlangt (HTTPS, das Zertifikat und die Cloudflare-Bereiche in Jellyfins Known Proxies greifen erst nach einem Neustart; die Bereiche werden täglich aktualisiert, und die Seite fragt nach einem Neustart, wenn sie sich ändern).
Im Alltag
- Die Statusseite prüft den Token, die DNS-Einträge, die TLS-Einstellungen, das Zertifikat, die Regeln, die echte Client-IP und HTTPS in Jellyfin; jedes Problem hat einen Button Fix.
- Blocked IPs: Die Liste zeigt die Adresse, den Grund und das Ablaufdatum; du kannst eine IP entsperren oder von Hand sperren, mit Notiz und Dauer. Dein LAN, die Cloudflare-Bereiche und die Allowlist werden nie blockiert.
- Under Attack: Schalte es während eines Angriffs für 30 Minuten bis 12 Stunden ein; es schaltet sich selbst wieder ab. Solange es an ist, können native Apps (Android TV, Roku, iOS, Kodi …) keine Verbindung aufbauen.
- Port-Beschränkung (Firewall): Die Seite zeigt fertige Befehle, mit denen nur Cloudflare den Port des App-Hosts erreicht; Edge Shield ändert deine Firewall selbst nie.
- Remove the Edge Shield rules löscht nur die Regeln, die das Plugin erstellt hat; DNS- und TLS-Einstellungen bleiben, wie sie sind.
Was es wohin sendet
- An Cloudflare, mit deinem Token: Zone-Einstellungen, DNS-Einträge mit deiner öffentlichen IP, Regeln und die zu blockierenden IPs. Der Kommentar eines Blocklist-Eintrags enthält nur das Ablaufdatum und den Grund (die Anzahl fehlgeschlagener Anmeldungen oder „manual“ mit deiner Notiz). Seit 0.1.1 wird der versuchte Benutzername nicht an Cloudflare gesendet; er bleibt in der Blockliste und im Log auf deinem Server.
https://www.cloudflare.com/cdn-cgi/trace, um die öffentliche IP zu erkennen, und die öffentliche Cloudflare-API für ihre IP-Bereiche (täglich).- An Let's Encrypt: die Zertifikatsanfrage für deine Hostnamen; der private Schlüssel bleibt auf deinem Server.
- An medialab.works geht nichts außer der Lizenzprüfung.
Fehlerbehebung
- „The token lacks the … permission“: Bearbeite den Token in Cloudflare, füge die gezeigte Berechtigung hinzu und klicke erneut auf Fix.
- „Video would flow through the Cloudflare CDN“: Der App-Host ist proxied, aber es ist kein Streaming-Host gesetzt. Setze einen Streaming-Host („DNS only“) oder wechsle in den Modus DNS only.
- „The server's public IP could not be detected“: Trage die öffentliche IPv4 in den Einstellungen ein.
- Die Apps können keine Verbindung aufbauen: Prüfe, dass Under Attack aus ist und dass der externe Port des Streaming-Hosts an Jellyfins HTTPS-Port weitergeleitet ist.
- Änderungen erscheinen nicht in Jellyfin: Die Statusseite sagt Restart needed; starte Jellyfin neu.