Jellyfin na VPS: instalacja Docker i konfiguracja
Instrukcja uruchomienia Jellyfin w Docker na VPS. Wyjaśnienie problemów z uprawnieniami plików oraz różnic między Direct Play a transkodowaniem CPU przy braku wsparcia GPU.
Co jest budowane
Serwer multimedialny Jellyfin na VPS: jeden kontener, trzy wolumeny oraz dysk typu block-storage przechowujący filmy i seriale, dostępny z poziomu dowolnej przeglądarki lub aplikacji Jellyfin. Instalacja opiera się na piętnastoliniowym pliku compose. Wszystkie późniejsze problemy wynikają z dwóch przyczyn: uprawnień do plików, których kontener nie może odczytać, oraz prób transkodowania wideo na serwerze VPS bez GPU, co jest nieuzasadnione. Niniejszy przewodnik poświęca większość miejsca tym dwóm kwestiom, ponieważ to one generują najwięcej zgłoszeń do wsparcia technicznego.
Jellyfin jest darmowy i w pełni otwartoźródłowy, nie wymaga konta, nie posiada płatnych funkcji ani telemetrii, co sprawia, że znajduje się na niemal każdej liście rzeczy wartych samodzielnego hostowania w 2026 roku. Odtwarza posiadane multimedia. Oprogramowanie nie zawiera żadnych treści, a niniejszy przewodnik nie dotyczy ich pozyskiwania.
Rzeczywistość transkodowania przed wynajęciem zasobów
Przeczytaj to najpierw, ponieważ wpływa to na decyzje zakupowe. Serwer multimediów wykonuje jedną z dwóch czynności po naciśnięciu przycisku odtwarzania. Direct play przesyła plik w niezmienionej postaci: VPS odczytuje bajty z dysku i wysyła je przez sieć, co niemal nie obciąża procesora. Transkodowanie polega na ponownym kodowaniu wideo w locie, zmianie rozdzielczości, kodeka lub wtopieniu napisów, co jest zadaniem wymagającym dużej mocy obliczeniowej procesora.
Typowy VPS nie posiada GPU. Każde transkodowanie odbywa się zatem na procesorze przy użyciu libx264/libx265, a kodowanie programowe jest kosztowne. Pojedyncze transkodowanie 1080p H.264 może w pełni obciążyć kilka współdzielonych vCPU; transkodowanie 4K lub HEVC zazwyczaj nie nadąża za odtwarzaniem w czasie rzeczywistym, co powoduje zacinanie się obrazu i ciągłe buforowanie. Transkodowanie sprzętowe, które czyni to rozwiązanie tanim w przypadku domowych serwerów z iGPU Intel lub kartami Nvidia, jest niedostępne, chyba że dostawca oferuje instancje z GPU.
Cała strategia w przypadku VPS sprowadza się zatem do: unikania transkodowania. Utrzymuj bibliotekę w kodekach obsługiwanych natywnie przez klientów: wideo H.264, audio AAC lub AC3 w kontenerze MP4 lub MKV. Wybieraj aplikacje klienckie obsługujące direct play: natywne aplikacje Jellyfin dla Android TV, iOS i Roku, a także Infuse, Kodi oraz desktopowy Jellyfin Media Player. Dzięki temu VPS nigdy nie użyje ffmpeg, a skromna maszyna z 2 vCPU obsłuży kilku użytkowników jednocześnie. Planowanie transkodowania wymaga znacznie większego i droższego serwera, a nawet wtedy obsługa 4K jest ryzykowna.
Oblicz również zapotrzebowanie na pasmo, ponieważ to kolejna często pomijana kwestia. W trybie direct play plik jest przesyłany z własną przepływnością. Skompresowany plik 1080p wymaga 8-12 Mbps, remuks Blu-ray 1080p — 20-30 Mbps, a materiał 4K HDR — 40-80 Mbps. Trzy osoby odtwarzające bezpośrednio pliki o przepływności 10 Mbps generują łącznie 30 Mbps stałego ruchu wychodzącego z VPS. W planie należy sprawdzić dwie wartości: szybkość portu (czy umożliwia wysyłanie z przepływnością 30 Mbps?) oraz miesięczny limit transferu. Jeden dwugodzinny film o przepływności 10 Mbps generuje około 9 GB ruchu wychodzącego, więc limit 1 TB/miesiąc przy rozliczaniu transferu wystarcza na nieco ponad sto takich filmów miesięcznie, czyli na trzy lub cztery dziennie. Gospodarstwo domowe oglądające materiały 4K, przy przepływności od czterech do ośmiu razy większej, wyczerpie ten limit znacznie szybciej. Do tego samego budżetu należy wliczyć każdy inny ruch wychodzący z tego samego serwera, w tym samodzielnie hostowany relay RustDesk, który przenosi całą sesję zdalnego pulpitu, gdy dwóch peerów nie może połączyć się bezpośrednio.
Wymagania wstępne
- Świeża instancja VPS KVM z systemem Ubuntu 24.04, dostępem root lub sudo oraz zainstalowanym środowiskiem Docker wraz z wtyczką Compose.
- Wolumen pamięci masowej typu block storage przeznaczony na multimedia, o rozmiarze dostosowanym do biblioteki (zobacz sekcję dotyczącą rozmiaru poniżej). Mały dysk systemowy, który jest dostarczany z VPS, nie jest odpowiednim miejscem na pliki wideo.
- Nazwa domeny, jeśli wymagany jest publiczny dostęp przez HTTPS, lub VPN WireGuard na tym samym VPS, jeśli preferowane jest utrzymanie całości w sieci prywatnej.
- Pliki multimedialne, do których strumieniowania użytkownik posiada prawo, własne kopie cyfrowe, własne nagrania lub pliki stanowiące własność użytkownika.
Zamontuj pamięć blokową
Podłącz wolumen w panelu dostawcy, a następnie zlokalizuj go i zamontuj. Pobierz nazwę urządzenia z lsblk; będzie ona wyglądać jak /dev/sdb lub /dev/vdb. Nigdy nie wybieraj dysku głównego (root).
lsblk
sudo mkfs.ext4 /dev/sdb # ONLY on a new, empty volume — this ERASES it
sudo mkdir -p /mnt/media
sudo blkid /dev/sdb # copy the UUID shown for this deviceZamontuj dysk przy użyciu UUID, a nie /dev/sdb, ponieważ litery przypisane do urządzeń mogą zmieniać się po restarcie systemu, co grozi sformatowaniem lub zamontowaniem niewłaściwego dysku. Dodaj jeden wiersz do pliku /etc/fstab:
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/media ext4 defaults,nofail 0 2sudo mount -a
df -h /mnt/mediaParametr nofail jest istotny: bez niego, w przypadku odłączenia wolumenu blokowego, serwer nie uruchomi się i przejdzie do powłoki awaryjnej. Najczęstszym błędem jest uruchomienie mkfs.ext4 na wolumenie zawierającym już dane, co prowadzi do ich usunięcia. Formatuj tylko nowe wolumeny; jeśli na dysku znajdują się już dane, przejdź bezpośrednio do edycji pliku fstab.
Uporządkowanie plików multimedialnych zgodnie z wymaganiami Jellyfin
Jellyfin dopasowuje metadane na podstawie nazw folderów i plików. Błędna struktura powoduje, że filmy są rozpoznawane jako pliki bez tytułu i okładek, a odcinki są przypisywane do niewłaściwych seriali. Obowiązują trzy główne zasady: każdy film musi znajdować się w osobnym folderze Name (Year) o pasującej nazwie pliku; foldery sezonów nazywa się Season 01, a nie S01; pliki odcinków używają formatu S01E01, natomiast odcinki specjalne umieszcza się w Season 00.
/mnt/media
├── Movies
│ ├── Blade Runner (1982)
│ │ └── Blade Runner (1982).mkv
│ └── Arrival (2016)
│ └── Arrival (2016).mkv
└── Shows
└── Severance (2022)
├── Season 01
│ ├── Severance - S01E01.mkv
│ └── Severance - S01E02.mkv
└── Season 00
└── Severance - The Lexington Letter.mkv(Year) w nazwach filmów nie jest elementem dekoracyjnym; pozwala rozróżnić remaki, dzięki czemu mechanizm dopasowywania wybiera właściwy tytuł. Foldery Movies oraz Shows należy utrzymywać jako osobne katalogi główne, ponieważ każdy z nich staje się w Jellyfin biblioteką określonego typu zawartości, a ich mieszanie wprowadza w błąd dostawcę metadanych. Jellyfin bez problemu zindeksuje również trzeci folder ze zdjęciami, jednak funkcjonalność ta jest ograniczona w porównaniu z dedykowanym serwerem zdjęć. Jeśli zbiory fotografii są istotne, warto uruchomić dla nich osobne rozwiązanie, takie jak PhotoPrism lub Immich, a serwer Jellyfin pozostawić wyłącznie do obsługi filmów i seriali.
Uprawnienia: najczęstsza przyczyna pustych bibliotek
To błędne przekonanie kosztuje użytkowników cały wieczór. Oficjalny obraz jellyfin/jellyfin nie uwzględnia zmiennych środowiskowych PUID/PGID; należą one do obrazu LinuxServer.io (lscr.io/linuxserver/jellyfin). W oficjalnym obrazie użytkownika określa się za pomocą klucza user: w pliku compose, a w przypadku jego pominięcia kontener działa jako root. Niezależnie od wybranego rozwiązania, zasada pozostaje taka sama: uid/gid, z jakim działa kontener, musi mieć uprawnienia do odczytu i przeglądania każdego katalogu z mediami.
Uruchomimy proces z uid/gid 1000, czyli pierwszym użytkownikiem niebędącym rootem w standardowej instalacji Ubuntu. Należy potwierdzić własne wartości i ustawić właściciela:
id # confirm your user is uid=1000 gid=1000
sudo chown -R 1000:1000 /mnt/media
sudo find /mnt/media -type d -exec chmod 755 {} \;
sudo find /mnt/media -type f -exec chmod 644 {} \;
mkdir -p ~/jellyfin/config ~/jellyfin/cache
sudo chown -R 1000:1000 ~/jellyfinKatalogi wymagają bitu execute (x w 755), a nie tylko uprawnień do odczytu. Bez tego kontener nie może wejść do folderu, nawet jeśli potrafi wyświetlić jego nazwę. Pułapką, która powoduje opróżnienie całej biblioteki, jest katalog nadrzędny: jeśli uid kontenera nie może przejść przez sam punkt montowania, nigdy nie dotrze do /media/Movies ani /media/Shows, a każda biblioteka będzie pusta, co zostanie odnotowane w logach jako Access to the path ... is denied. Każdy pojedynczy folder z mediami, którego nie można odczytać, jest logowany i pomijany, dlatego zestaw plików skopiowanych jako root znika z biblioteki bez żadnego komunikatu o błędzie. Z tego powodu wykonuje się rekurencyjne polecenie chown oraz ustawia bit execute dla każdego katalogu, zamiast naprawiać tylko jeden folder.
Plik docker-compose
services:
jellyfin:
image: jellyfin/jellyfin:10
container_name: jellyfin
user: "1000:1000"
restart: unless-stopped
ports:
- "127.0.0.1:8096:8096"
volumes:
- ./config:/config
- ./cache:/cache
- /mnt/media:/media:ro
environment:
- JELLYFIN_PublishedServerUrl=https://jellyfin.example.comAnaliza wiersz po wierszu: user: "1000:1000" faktycznie ustawia uprawnienia do plików, dopasowując je do powyższego właściciela. /config przechowuje cały serwer, konta, biblioteki, metadane oraz stan odtwarzania, dlatego musi mieć możliwość zapisu i jest to element podlegający backupowi. /cache to tymczasowa przestrzeń robocza. Montowanie multimediów :ro jest celowo ustawione w trybie tylko do odczytu (read-only): Jellyfin domyślnie przechowuje okładki i metadane w /config, więc nie musi zapisywać danych w bibliotece, a tryb tylko do odczytu chroni pliki przed przypadkowym usunięciem lub błędnym działaniem wtyczki. Port jest celowo powiązany z 127.0.0.1, ponieważ interfejs logowania Jellyfin działa w oparciu o zwykły protokół HTTP, więc nie należy wystawiać portu 8096 bezpośrednio do publicznego Internetu. JELLYFIN_PublishedServerUrl to adres, który serwer ogłasza w celu lokalnego wykrywania usług (lokalne rozgłaszanie UDP), dzięki czemu klienci w Internecie go nie widzą i po prostu używają adresu URL wpisanego w aplikacji. Należy ustawić go na adres, który mają otrzymywać klienci, pamiętając, że na urządzeniach zdalnych adres URL trzeba będzie wprowadzić ręcznie.
Uruchom usługę z poziomu katalogu compose:
docker compose up -d
docker logs -f jellyfinPierwsze uruchomienie: kreator konfiguracji i biblioteki
Ponieważ port jest powiązany z localhost, należy uzyskać dostęp do kreatora poprzez tunel SSH z laptopa, zamiast otwierać port w zaporze sieciowej:
ssh -L 8096:127.0.0.1:8096 you@your-vps-ipTeraz przejdź pod adres http://localhost:8096. Kreator przeprowadzi użytkownika przez wybór języka, a następnie tworzenie konta administratora z silnym hasłem. To konto jest tożsame z serwerem, dlatego nie należy używać haseł tymczasowych. Dodaj pierwszą bibliotekę: wybierz typ zawartości Movies, wskaż ścieżkę /media/Movies (ścieżka wewnątrz kontenera, a nie ścieżka hosta) i powtórz czynność dla Shows w lokalizacji /media/Shows. Po zakończeniu Jellyfin rozpocznie skanowanie. Prawidłowy wynik to pojawienie się plakatów i tytułów w ciągu minuty lub dwóch w przypadku małej biblioteki. Biblioteki można dodawać lub edytować później w sekcji Dashboard → Libraries, a wymuszenie ponownego skanowania odbywa się przez Scan All Libraries.
Jeśli planowane jest korzystanie z transkodowania, należy otworzyć Dashboard → Playback → Transcoding i ustawić ścieżkę tymczasową transkodowania na /cache/transcodes, aby dane trafiały na wolumen cache zamiast zapełniać /config. Ustawienie akceleracji sprzętowej należy pozostawić jako None, ponieważ brak jest GPU do obsługi tego procesu.
Dostęp zdalny: odwrotne proxy TLS lub utrzymanie w sieci VPN
Istnieją dwa bezpieczne sposoby uzyskania dostępu do Jellyfin z zewnątrz oraz jeden niebezpieczny, którego należy unikać. Sposobem niebezpiecznym jest wystawienie portu 8096 bezpośrednio do Internetu: dane logowania są przesyłane otwartym tekstem, a port staje się celem ataków brute-force w ciągu kilku godzin.
Opcja A, odwrotne proxy TLS. Umieść Jellyfin w subdomenie za Traefik z automatycznym TLS dla aplikacji Docker lub za nginx z certyfikatem Let's Encrypt wystawionym przez Certbot. Jellyfin wykorzystuje WebSockets do aktualizacji w czasie rzeczywistym, dlatego proxy musi przekazywać nagłówki upgrade. Traefik wykonuje to automatycznie; nginx wymaga ich jawnego zdefiniowania oraz użycia HTTP/1.1 w komunikacji z upstreamem, w przeciwnym razie proces upgrade nie zostanie zainicjowany:
location / {
proxy_pass http://127.0.0.1:8096;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}Ustaw JELLYFIN_PublishedServerUrl na adres https://, aby lokalne mechanizmy autodiscovery ogłaszały poprawny adres URL, aplikacje zdalne korzystały z podanego adresu, oraz dodaj fail2ban w celu spowolnienia prób brute-force wymierzonych w panel logowania. Gdy serwer stanie się publiczny, skonfiguruj Uptime Kuma pod tym adresem URL, aby otrzymywać powiadomienia o przestojach, zanim dowiedzą się o nich użytkownicy.
Opcja B, utrzymanie prywatności w sieci VPN. Nie wystawiaj portu 8096; uzyskuj dostęp do Jellyfin wyłącznie przez tunel WireGuard kończący się na tym samym serwerze. Dla użytku domowego jest to najprostsze bezpieczne rozwiązanie: brak certyfikatów, brak ekspozycji publicznej i brak powierzchni ataku dla brute-force. Powiąż kontener z adresem tunelu lub localhost i łącz się przez VPN. Zobacz konfigurację WireGuard VPN dla prywatnego VPS, aby przygotować tunel.
Planowanie przestrzeni dyskowej i kopie zapasowe
Budżet należy planować w oparciu o jakość, a nie liczbę plików. Skompresowane filmy w rozdzielczości 1080p zajmują od 4 do 15 GB każdy; remux 1080p to 20-40 GB; sezon serialu w 1080p zajmuje 15-40 GB; natomiast materiały 4K wymagają 40-100 GB na film. Biblioteka składająca się z kilkuset filmów oraz kilku seriali wymaga wolumenu o rozmiarze 2-4 TB. Tańszym rozwiązaniem jest jednorazowe przewymiarowanie wolumenu blokowego niż późniejsza migracja danych.
/config zawiera pełny stan serwera, dlatego jest to jedyny element, który należy archiwizować. Należy wykonać snapshot lub zatrzymać kontener i spakować katalog za pomocą tar, a następnie przechowywać kopię poza serwerem:
docker compose down
sudo tar czf jellyfin-config-$(date +%F).tgz -C ~/jellyfin config
docker compose up -d/cache oraz folder transkodowania są danymi tymczasowymi. Media znajdujące się w /mnt/media należy archiwizować oddzielnie lub zaakceptować możliwość ich ponownego zgrania; ze względu na rozmiar większość użytkowników wybiera to drugie rozwiązanie. Aktualizacje są docker compose pull && docker compose up -d; znacznik :10 pozostaje w obrębie głównej wersji 10.x, więc przejście na kolejną wersję główną wymaga celowej zmiany znacznika. Przed wykonaniem tej czynności należy zapoznać się z informacjami o wydaniu Jellyfin, ponieważ w wersjach głównych często dochodzi do migracji schematu biblioteki. Przypięty znacznik oraz jeden katalog z kopią zapasową stanu to kompletna recepta dla każdego kontenera działającego w trybie ciągłym. Jest to ten sam schemat, który stoi za utrzymaniem pamięci i harmonogramów agenta self-hosted po restarcie.
Tryby awarii i towarzyszące im komunikaty
Biblioteka jest pusta po skanowaniu. Dziennik w Dashboard → Logs (lub ~/jellyfin/config/log/log_*.log) zawiera:
System.UnauthorizedAccessException: Access to the path '/media/Movies' is denied.Identyfikator uid kontenera nie ma uprawnień do odczytu tej ścieżki. Przyczyna: pliki multimedialne należą do root lub innego użytkownika niż wartość user:, katalog nie posiada bitu wykonywalności lub nadrzędny punkt montowania jest niedostępny dla tego uid. Rozwiązanie: chown -R 1000:1000 /mnt/media, katalogi 755, pliki 644, a następnie wykonaj ponowne skanowanie.
Odtwarzanie obciąża procesor i powoduje buforowanie. docker stats jellyfin wskazuje użycie procesora bliskie 100% pomnożone przez liczbę rdzeni, a Dashboard → Playback oznacza sesję jako Transcode z prędkością poniżej 1.0x. Klient nie korzysta z bezpośredniego odtwarzania (direct-play), więc VPS wykonuje transkodowanie programowe wolniej niż w czasie rzeczywistym. Przyczyna: nieobsługiwany kodek lub kontener, wypalanie napisów w obrazie lub mapowanie tonów HDR. Rozwiązanie: użyj klienta obsługującego direct-play, przechowuj źródła w formacie H.264/AAC, stosuj napisy tekstowe (SRT) zamiast graficznych (PGS/VOBSUB), które wymuszają transkodowanie, oraz unikaj odtwarzania 4K HDR na serwerach bez wsparcia sprzętowego.
"No compatible streams are available." Pełny komunikat zazwyczaj brzmi: "This client isn't compatible with the media and the server isn't sending a compatible media format." Klient odrzucił źródło, a awaryjne transkodowanie również nie zostało uruchomione. Przyczyna: błędne polecenie ffmpeg, nieczytelny plik lub profil użytkownika blokujący konwersję wideo. Rozwiązanie: sprawdź linię ffmpeg w Dashboard → Logs, upewnij się, że plik jest poprawny, zweryfikuj uprawnienia użytkownika do odtwarzania, jeśli korzystasz z transkodowania, i przetestuj innego klienta, aby wykluczyć problemy z kodekami przeglądarki.
Filmy nie mają plakatu lub wyświetlają niewłaściwy. Metadane nie zostały dopasowane. Przyczyna: film nie znajduje się w dedykowanym folderze Name (Year), folder sezonu nazwany jest S01 zamiast Season 01, odcinki nie mają formatu S01E01 lub brakuje roku produkcji. Rozwiązanie: zmień nazewnictwo zgodnie z powyższym schematem, a następnie wybierz Refresh metadata → Replace all lub użyj funkcji Identify dla konkretnego elementu, aby wskazać właściwy wpis w TMDB/TVDB.
FAQ
Czy VPS może transkodować wideo bez GPU?
Tak, ale wyłącznie przy użyciu CPU, co jest kosztowne. Pojedyncze programowe transkodowanie 1080p może w pełni obciążyć kilka vCPU, a w przypadku 4K lub HEVC zazwyczaj nie da się uzyskać wydajności w czasie rzeczywistym, co powoduje buforowanie odtwarzania. Najlepszym rozwiązaniem jest unikanie transkodowania: należy przechowywać bibliotekę w formacie H.264/AAC i korzystać z aplikacji klienckich obsługujących direct-play, dzięki czemu VPS jedynie przesyła bajty. Instancję z GPU warto wynająć tylko wtedy, gdy transkodowanie w locie jest rzeczywiście niezbędne.
Dlaczego biblioteka Jellyfin jest pusta po skanowaniu?
Prawie zawsze przyczyną są uprawnienia. Oficjalny obraz jellyfin/jellyfin działa jako user: określony w konfiguracji (lub root), a jeśli pliki nie są czytelne dla tego uid, skanowanie loguje Access to the path ... is denied i pomija je. Należy naprawić właściciela plików za pomocą chown -R 1000:1000 /mnt/media, nadać katalogom bit wykonywalności (755) i ponownie uruchomić skanowanie. Warto sprawdzić również katalog nadrzędny, ponieważ jeśli uid kontenera nie może przejść przez /mnt/media, nigdy nie dotrze do folderów biblioteki, co skutkuje pustymi wynikami. Drugą najczęstszą przyczyną jest struktura folderów niezgodna z oczekiwaniami Jellyfin.
Jak uzyskać bezpieczny zdalny dostęp do Jellyfin?
Istnieją dwie dobre opcje. Pierwszą jest umieszczenie usługi za odwrotnym proxy z TLS na subdomenie, co szyfruje logowanie i strumień, oraz dodanie fail2ban. Nigdy nie należy wystawiać bezpośrednio portu 8096, który przesyła hasło otwartym tekstem. Drugą opcją jest utrzymanie całkowitej prywatności i dostęp wyłącznie przez VPN, co jest najprostszym bezpiecznym wyborem dla gospodarstwa domowego. Aplikacjom należy podać adres publiczny bezpośrednio, ponieważ autodiscovery opiera się na rozgłoszeniach w sieci lokalnej i nie dociera do klientów łączących się przez Internet.
Ile miejsca na dysku i przepustowości potrzebuje VPS dla Jellyfin?
Zapotrzebowanie na miejsce zależy od jakości: należy przyjąć 4-15 GB na skompresowany film 1080p, 20-40 GB na remux oraz 40-100 GB na 4K, dlatego większość bibliotek wymaga wolumenu blokowego o pojemności 2-4 TB. Przepustowość zależy od bitrate'u direct-play: 8-12 Mbps na strumień 1080p, znacznie więcej dla 4K. Należy upewnić się, że prędkość portu obsłuży liczbę jednoczesnych widzów oraz monitorować miesięczny limit transferu. W przypadku planowanego transkodowania należy zapewnić zapas mocy CPU; jeśli planowane jest korzystanie z direct-play, priorytetem powinna być przepustowość, a nie liczba rdzeni.
Czy uruchamianie Jellyfin na VPS jest legalne?
Jellyfin to darmowe oprogramowanie typu open-source i jego uruchamianie jest całkowicie legalne. Istotna jest zawartość: należy przesyłać tylko te media, do których posiada się prawa lub licencję, własne kopie płyt, nagrania lub pliki, do których posiada się odpowiednie uprawnienia. Jellyfin nie dostarcza żadnych mediów ani nie oferuje sposobów ich pozyskiwania; jest to odtwarzacz dla biblioteki, którą użytkownik już posiada.