Wsiadasz w pociąg do Wrocławia. Trzy godziny jazdy, masz pobrany jeden odcinek na Netflixa, ale pamiętasz, że w domowym Jellyfinie czeka kompletny sezon „Severance" w 1080p. Łączysz się z Wi-Fi w wagonie restauracyjnym, otwierasz aplikację Jellyfin na telefonie. Pierwsze 8 sekund leci ładnie. Potem buffering. Bitrate spada z 8 Mbps do 2. Z 1080p do 480p. Twarz Bena Stillera staje się szachownicą JPEGów. Klikasz pause, restart - to samo. WireGuard? Jeszcze gorzej, bo dochodzi szyfrowanie i fragmentacja MTU. Wracasz do pobranego Netflixa. Większość metod zdalnego streamingu jest po prostu skopana - i to nie wina Twojego Wi-Fi.
Dlaczego Jellyfin jest trudniejszy do streamowania niż HA czy Nextcloud#
Home Assistant przesyła kilka kilobajtów telemetrii i okazjonalny snapshot z kamery. Nextcloud sync uruchamia się raz dziennie i może poczekać. Jellyfin musi dostarczyć strumień stały o gwarantowanym throughput, bez gubienia ramek i bez przerwy dłuższej niż bufor playera (typowo 10 sekund).
Bandwidth to bezlitosne równanie. 4K HDR HEVC = 25 Mbps stałego transferu. 1080p H.264 = 8 Mbps. WireGuard + UDP fragmentation + retransmisje = realny narzut 20-30% na link end-to-end. Twoje domowe 50 Mbps upload nagle robi się 35 Mbps użytecznych - a to już krytycznie blisko 25 Mbps potrzebnych dla 4K.
HTTPS jest wymagany przez nowoczesne playery. Chromecast od 2023 odmówi cast streamu HTTP. Jellyfin Mobile (iOS/Android) wymaga TLS dla background playback. Jellyfin Web w Chrome blokuje mixed content. Bez HTTPS - działa Ci tylko desktop browser z --disable-web-security. Czyli nic.
Cloudflare Tunnel ma zapisany w ToS limit dla streamingu mediów - sekcja 2.8 Self-Serve Subscription Agreement zabrania używania bezpłatnych usług do „caching or serving disproportionate amounts of non-HTML content". W praktyce: powyżej ~50 GB/mies wideo dostajesz najpierw warning, potem ban subdomeny. Jellyfin z rodziną oglądającą serial po pracy = 200 GB/mies bez problemu.
DLNA / uPnP zakłada lokalny broadcast UDP na porcie 1900. Przez VPN nie działa, przez tunel HTTP nie działa, w ogóle zapomnij o DLNA przy zdalnym dostępie.
4 sposoby zdalnego dostępu do Jellyfin - brutalny ranking#
1. Port forwarding 8096#
Jak działa: otwierasz port 8096 (HTTP) lub 8920 (HTTPS) na routerze, kierujesz na maszynę z Jellyfinem. Konfigurujesz DynDNS (mojeflicki.duckdns.org), generujesz cert Let's Encrypt przez certbot lub reverse proxy, i już - Jellyfin pod publicznym adresem.
Plusy: zero zewnętrznych zależności, pełna kontrola, najniższe latency (1 hop).
Minusy:
- Bez HTTPS by default - port 8096 to plain HTTP, musisz osobno postawić Caddy/Nginx + LE.
- Wystawiasz panel admina Jellyfin na publiczny internet. CVE-2023-49096 (path traversal) i podobne pojawiają się regularnie.
- Nie działa za CGNAT (mobilni operatorzy, część światłowodów). Sprawdź IP routera w panelu - jeśli zaczyna się od
100.64.x.xdo100.127.x.x, jesteś za CGNAT. - Boty Shodanowe znajdą Twój Jellyfin w 6 godzin po opublikowaniu portu.
Werdykt: jak HA przez port forwarding - niebezpieczne i bez HTTPS by default.
2. WireGuard VPN#
Jak działa: stawiasz WG na routerze (UniFi, MikroTik, OpenWRT) lub na osobnym kontenerze. Każde urządzenie domowników ma aplikację WG i config peer. Łączą się jakby byli w domu, Jellyfin pod LAN-em (http://192.168.1.50:8096).
Plusy: silne szyfrowanie ChaCha20, zero ekspozycji Jellyfin, dostęp też do innych usług w domu.
Minusy:
- Aplikacja na każdym urządzeniu. Twoja żona ma odpalać WireGuard zanim włączy serial w niedzielę? Powodzenia. Twoje dzieci na Switchu? Tam WG nie ma.
- Chromecast / smart TV nie obsługują WG. Brak natywnej aplikacji = brak streamingu na duży ekran w hotelu.
- Overhead ~20-30% na throughput dla streamingu HD/4K.
- Nie działa za CGNAT od strony serwera WG - Twój router za CGNAT = zewnętrzni klienci nie połączą się.
Werdykt: dobre dla solo-developera oglądającego sam na laptopie. Kiepskie dla rodziny i dla większych ekranów.
3. Cloudflare Tunnel#
Jak działa: instalujesz cloudflared na maszynie z Jellyfin, autoryzujesz tunel, w panelu CF mapujesz mojeflicki.twojadomena.pl → http://localhost:8096. HTTPS automatyczny po Cloudflare CDN.
Plusy: darmowe, działa za CGNAT, własna domena, wbudowany DDoS shield.
Minusy, o których docs nie mówią:
- ToS Section 2.8 zabrania streamingu wideo > ~50 GB/mies na free tier. Cloudflare banuje subdomeny po wykryciu, czasem po miesiącu, czasem po roku - loteria.
- Nieprzewidywalny throttling. CF w pewnym momencie zaczyna dławić Twój ruch wideo, bitrate spada, player robi buffering bez powodu.
- Limit 100 MB per HTTP request na free planie - niektóre operacje Jellyfin (initial library scan z metadata images) mogą się wywalać.
- WAF czasem blokuje legitne requesty playera (HLS chunks, range requests) - debug to gra w „dlaczego seria z 2009 nie streamuje".
Werdykt: darmowe, ALE Cloudflare ToS zabrania streamingu większego niż ~50 GB/mies - banują. Szersze porównanie.
4. Reverse SSH tunnel (SmartHomeEntry)#
Jak działa: agent na maszynie z Jellyfin otwiera wychodzący tunel SSH do serwera relay. Relay wystawia Twój Jellyfin pod stałą subdomeną HTTPS, np. mojeflicki.smarthomeentry.com. Zero portów u Ciebie.
Plusy:
- Bez transcoding overhead - relay tylko forwarduje TCP, nie dekoduje wideo. Bitrate bez strat.
- Bez ToS issues - żadnych limitów na transfer wideo.
- Działa z każdym client app - Jellyfin Web, Jellyfin Mobile, Findroid, Streamyfin, Chromecast, Apple TV, smart TV (przez przeglądarkę).
- Stała subdomena HTTPS, automatyczny LE cert na poziomie relay.
- Działa za CGNAT (tunel wychodzący).
Minusy:
- Zależność od relay (uptime managed).
- Płatne - od 29 zł/mies dla planu hobby.
Werdykt: dla większości użytkowników Jellyfin - najlepszy stosunek jakość/wygoda/bezpieczeństwo.
| Metoda | Działa za CGNAT | HTTPS | ToS limit | Rodzina/TV apps | Setup |
|---|---|---|---|---|---|
| Port forwarding 8096 | nie | ręczny | brak | tak | trudny |
| WireGuard | nie | n/d | brak | nie | średni |
| Cloudflare Tunnel | tak | auto | ~50 GB/mies | tak | średni |
| Reverse SSH (SHE) | tak | auto | brak | tak | 60 sek |
Setup Jellyfin + tunel SSH w 60 sekund#
Zakładam, że masz działającego Jellyfina lokalnie pod http://192.168.1.50:8096 lub http://jellyfin.local:8096. Jeśli nie - najpierw pillar HA o instalacji self-hosted (proces jest analogiczny).
-
Załóż konto SmartHomeEntry i wybierz subdomenę (np.
mojeflicki.smarthomeentry.com). Przy zapisie alokujemy unikalny port relay i przypisujemy subdomenę do Twojego tunelu w bazie. -
Ustaw adres lokalny Jellyfina w panelu (pole „Adres lokalny" w onboardingu). To adres, pod którym Jellyfin nasłuchuje w Twojej sieci - agent będzie tam kierował ruch z tunelu. Jellyfin domyślnie stoi na porcie 8096, więc wpisz
localhost:8096. Domyślna wartość pola tolocalhost:8080i na niej tunel nie zadziała. Sprawdzenie na maszynie z Jellyfin:sudo ss -tlnp | grep 8096 -
Pobierz komendę instalacyjną z dashboardu i wklej do terminala maszyny z Jellyfin:
curl -sSL https://api.smarthomeentry.com/api/install/TWOJ_TOKEN | sudo bashSkrypt instaluje agenta jako systemd service, zaciąga klucz SSH przez jednorazowy install token (TTL 15 min), zapisuje adres lokalny do
/etc/smarthomeentry/agent.envi otwiera tunel do relay. -
Edytuj
/etc/jellyfin/network.xml- dodaj subdomenę doBaseUrl(puste = root) i IP relay doKnownProxies, żeby Jellyfin poprawnie czytał real client IP z X-Forwarded-For:<NetworkConfiguration> <BaseUrl></BaseUrl> <RequireHttps>false</RequireHttps> <EnableHttps>false</EnableHttps> <KnownProxies> <string>relay.smarthomeentry.com</string> </KnownProxies> <PublishedServerUriBySubnet> <string>external=https://mojeflicki.smarthomeentry.com</string> </PublishedServerUriBySubnet> </NetworkConfiguration> -
W Jellyfin Dashboard → Networking ustaw:
- Public HTTPS port:
443 - External Domain:
mojeflicki.smarthomeentry.com - Enable automatic port mapping: OFF (zbędne, robi to relay)
- Public HTTPS port:
-
Restart Jellyfin (
systemctl restart jellyfin) i otwórzhttps://mojeflicki.smarthomeentry.com. Powinieneś zobaczyć ekran logowania Jellyfin po HTTPS - bez ostrzeżeń certyfikatu, bez konfiguracji routera.
Cloudflare Tunnel free tier zabrania w ToS Section 2.8 streamingu wideo > ~50 GB/mies. Jellyfin z rodziną przekracza ten limit w pierwszym tygodniu. Ban subdomeny przychodzi bez ostrzeżenia - tracisz dostęp do wszystkich tunelów na koncie naraz.
Best practices po setupie#
Tunel działa, możesz oglądać z hotelu. Teraz 5 minut higieny żebyś nie wracał do tego za pół roku.
- Wyłącz transcoding zewnętrzny (Dashboard → Playback → Transcoding) chyba że masz Hardware Acceleration NVENC (Nvidia), QSV (Intel) lub VAAPI (AMD). CPU transcoding 4K → 1080p zżera 100% rdzeni i tak czy siak nie wyrobi w realtime.
- Ustaw maksymalny bitrate per user (Dashboard → Users → wybierz user → Playback → Internet streaming bitrate). Dla rodziców 4 Mbps, dla siebie 20 Mbps. Chroni przed sytuacją „dziecko włącza 4K na komórce z 100 GB pakietem i kończy go w 8 godzin".
- Włącz HTTPS-only redirect w Jellyfin (Dashboard → Networking → Require HTTPS dla external connections).
- Wyłącz DLNA (Dashboard → DLNA → wszystko OFF). Przez tunel i tak nie działa, a lokalnie jest wektorem ataku (CVE w SSDP discovery).
- Backup biblioteki: tylko metadata DB, nie media files. Backup
/var/lib/jellyfin/data/library.db+metadata/przez Borg / Restic. Plików .mkv nie tunelujesz na backup - masz petabajty, tunel służy do streamu, nie do offsite backupu. - Update Jellyfin co miesiąc - security patches dla web UI (XSS w opisach filmów to klasyk).
Jeśli masz Intel CPU od 7-mej generacji, włącz QSV transcoding (Dashboard → Playback → Hardware acceleration → Intel QuickSync). Single-pass HEVC encode przy 4K → 1080p zjada ~3% CPU zamiast 100%. Kompletnie zmienia ekonomię remote streamingu z laptopem-serwerem.
Logi Jellyfin (/var/log/jellyfin/) na produkcji ustaw na poziom Information, nie Debug. Debug zapisuje każdy chunk HLS i każdy seek - kilka godzin streamingu = setki MB logów dziennie i niepotrzebne IO na dysku.
FAQ#
| Pytanie | Odpowiedź |
|---|---|
| Czy 4K streaming działa przez tunel? | Tak, ale potrzebujesz upload home > 25 Mbps stałego. Sprawdź Speedtest upload w godzinach prime time, nie o 3 w nocy. Realistycznie potrzebujesz 30-35 Mbps żeby mieć margines na narzut TCP + SSH. |
| Chromecast i TV apps działają? | Tak - wpisujesz https://mojeflicki.smarthomeentry.com jako adres serwera w Jellyfin Mobile, cast działa przez HTTPS subdomenę. Smart TV (LG, Samsung, Android TV) odpalają Jellyfin Web w przeglądarce. |
| Live TV / DVR przez tunel? | Tak, ale tuner DVB-T/DVB-C zostaje fizycznie w domu (USB do maszyny z Jellyfin). Tunel przekazuje strumień z tunera tak samo jak nagrane pliki. Nagrania też zapisują się lokalnie, nie w chmurze. |
| Co z subtitles / HDR? | Tunel jest transparent - przekazuje strumień bit po bicie. SRT, ASS, VobSub, PGS, HDR10, HDR10+, Dolby Vision (jeśli player obsługuje) - bez zmian. |
| Plex vs Jellyfin przez tunel - różnice? | Plex Remote ma wbudowany relay przez plex.tv (transcoding po ich stronie, wymaga konta), działa bez konfiguracji ale jest bandwidth-throttled na free tier i wymaga Plex Pass dla niektórych funkcji ($120 lifetime). Jellyfin nie ma wbudowanego remote - musisz sam ekspozować przez tunel/VPN/port-fw. Plus: pełna kontrola, brak konta zewnętrznego, FOSS. |
| Czy mogę tunelować też inne usługi z tej samej maszyny? | Tak. Jeden agent obsługuje wiele subdomen - mojeflicki.smarthomeentry.com → Jellyfin, chmurka.smarthomeentry.com → Nextcloud, ha.smarthomeentry.com → Home Assistant. |
Werdykt#
Reverse SSH tunnel jest najlepszym wyborem dla Jellyfin, jeśli chcesz: streamingu bez ToS-loterii Cloudflare, działania za CGNAT, HTTPS z każdym client app (Chromecast, mobile, TV), zachowania pełnej kontroli nad biblioteką, bez wpięcia w plex.tv. Plus rodzina otwiera link w przeglądarce - bez instalowania VPN-ów.
Alternatywa? Plex Remote, jeśli nie chcesz się męczyć i akceptujesz konto plex.tv plus ich throttling. WireGuard, jeśli oglądasz tylko sam. Port forwarding tylko jeśli IT to Twoja praca i monitorujesz auth.log codziennie. Dla całej reszty - Jellyfin + SmartHomeEntry - link w przeglądarce, działa wszędzie, 60 sekund setupu.



