SSD Nodes Learn Hosting plans →
Przewodniki Matt ConnorAutor: Matt Connor

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ż zmienia to podejście do zakupów. Serwer multimediów wykonuje jedną z dwóch czynności po naciśnięciu przycisku odtwarzania. Direct play przesyła plik w niezmienionej formie: 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 procesem intensywnie obciążającym CPU.

Typowy VPS nie posiada GPU. Dlatego każde transkodowanie wideo odbywa się 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 czasem rzeczywistym, przez co odtwarzanie zacina się i stale buforuje. Transkodowanie sprzętowe, które czyni ten proces tanim na domowym sprzęcie z Intel iGPU lub kartą Nvidia, jest niedostępne, chyba że dostawca oferuje instancje z GPU.

Cała strategia na 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, które obsługują 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 musi uruchamiać transkodowania ffmpeg podczas odtwarzania, a skromna maszyna z 2 vCPU może przesyłać strumień do kilku osób jednocześnie. Planowanie transkodowania wymaga znacznie większego i droższego serwera, a nawet wtedy 4K pozostaje ryzykownym wyborem.

Wykonaj również obliczenia przepustowości, ponieważ jest to kolejne zaskoczenie. Direct play wysyła plik z jego własnym bitrate. Skompresowany plik 1080p wymaga 8-12 Mbps; remux Blu-ray 1080p 20-30 Mbps; 4K HDR 40-80 Mbps. Trzy osoby korzystające z direct play przy plikach 10 Mbps generują 30 Mbps stałego wysyłania z VPS. Sprawdź dwie wartości w swoim planie: prędkość portu (czy może wysyłać 30 Mbps?) oraz miesięczny limit transferu. Dwugodzinny film 10 Mbps to około 9 GB danych, więc limit 1 TB/miesiąc pozwala na obejrzenie nieco ponad stu takich filmów miesięcznie, czyli trzech lub czterech dziennie. Gospodarstwo domowe oglądające 4K, przy bitrate od czterech do ośmiu razy wyższym, wyczerpie ten limit znacznie szybciej. Uwzględnij również inne usługi generujące ruch z tego samego serwera w tym samym budżecie, w tym własny przekaźnik RustDesk, który obsługuje całą sesję zdalnego pulpitu, gdy dwaj klienci nie mogą 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.

Najpierw zamontuj pamięć masową typu block

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 i nigdy nie powinna odnosić się do dysku systemowego.

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 device

Zamontuj go za pomocą UUID, a nie /dev/sdb, ponieważ litery przypisane do urządzeń mogą ulec zmianie po restarcie, co grozi sformatowaniem lub zamontowaniem niewłaściwego dysku. Dodaj jeden wiersz do /etc/fstab:

UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  /mnt/media  ext4  defaults,nofail  0  2
sudo mount -a
df -h /mnt/media

nofail ma kluczowe znaczenie: bez tego parametru, w przypadku odłączenia wolumenu, serwer nie uruchomi się i przejdzie do powłoki awaryjnej. Najpoważniejszym błędem jest uruchomienie mkfs.ext4 na wolumenie zawierającym już dane, ponieważ powoduje to ich usunięcie. Formatuj tylko nowe wolumeny; jeśli dysk zawiera już Twoje zasoby, przejdź bezpośrednio do edycji pliku fstab.

Przygotowanie struktury plików zgodnie z wymaganiami Jellyfin

Jellyfin dopasowuje metadane na podstawie nazw folderów i plików. Nieprawidłowa struktura powoduje, że filmy są rozpoznawane jako pliki bez tytułu i okładek, a odcinki są przypisywane do niewłaściwych seriali. Cztery konwencje zapewniają poprawne działanie: każdy film powinien znajdować się w osobnym folderze o pasującej nazwie, sformatowanej jako Name (Year) (Jellyfin traktuje rok jako opcjonalny, jednak znacząco zwiększa on niezawodność dopasowania); foldery sezonów należy nazywać Season 01, a nie S01; pliki odcinków powinny używać 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, lecz służy do rozróżniania remake'ów, co pozwala mechanizmowi dopasowywania na pobranie właściwego tytułu. Foldery Movies oraz Shows należy utrzymywać jako oddzielne foldery głównego poziomu, 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 zaindeksuje również trzeci folder ze zdjęciami, jednak oferuje on znacznie mniejsze możliwości niż dedykowany serwer zdjęć. Jeśli albumy są istotne, należy uruchomić dla nich osobne rozwiązanie, takie jak PhotoPrism lub Immich, a ten serwer 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 ~/jellyfin

Katalogi 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:12
    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.com

Analiza wiersz po wierszu: jellyfin/jellyfin:12 śledzi bieżącą linię wydawniczą 12.x (wersja 12.2 na dzień 2026-10-10). user: "1000:1000" ustawia uid/gid, z którymi uruchamiany jest proces Jellyfin. Nie zmienia to uprawnień ani trybu żadnego pliku, ponieważ Docker zachowuje uid/gid hosta dla zamontowanych katalogów, dlatego chown powyżej musi być z nimi zgodne. /config przechowuje cały serwer, konta, biblioteki, metadane oraz stan odtwarzania, więc musi mieć uprawnienia do zapisu i jest to element podlegający backupowi. /cache to tymczasowa przestrzeń robocza. Montowanie mediów jako :ro (tylko do odczytu) jest celowe: Jellyfin domyślnie przechowuje grafiki i metadane w /config, więc nigdy nie musi zapisywać danych w bibliotece, a tryb tylko do odczytu chroni pliki przed przypadkowym usunięciem lub działaniem wadliwej wtyczki. Port jest powiązany z 127.0.0.1 celowo, ponieważ logowanie do panelu webowego Jellyfin odbywa się przez zwykłe HTTP, dlatego nigdy nie należy wystawiać portu 8096 bezpośrednio do publicznego Internetu. JELLYFIN_PublishedServerUrl to adres, który serwer ogłasza w celu lokalnego wykrywania (lokalny broadcast UDP w sieci LAN), 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; w przypadku urządzeń zdalnych należy spodziewać się konieczności ręcznego wpisania adresu URL.

Uruchomienie z poziomu katalogu z plikiem compose:

docker compose up -d
docker logs -f jellyfin

Pierwsze 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-ip

Teraz przejdź do http://localhost:8096. Kreator przeprowadzi użytkownika przez wybór języka, a następnie utworzenie konta administratora z silnym hasłem. To konto stanowi dostęp do serwera, więc 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 /media/Shows. Po zakończeniu Jellyfin rozpocznie skanowanie. Poprawny 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. Plakaty te sprawiają również, że alternatywny interfejs staje się warty uwagi, gdy podstawy działają, ponieważ Halcyon przebudowuje tę samą bibliotekę na wzór wypożyczalni wideo z lat 90. przy użyciu grafik pobranych już przez Jellyfin.

W przypadku korzystania z transkodowania należy otworzyć Dashboard → Playback → Transcoding i ustawić ścieżkę tymczasową transkodowania na /cache/transcodes, aby pliki tymczasowe trafiały na wolumen cache zamiast obciążać /config. Ustawienie akceleracji sprzętowej należy pozostawić jako None, ponieważ brak jest GPU do obsługi akceleracji.

Zdalny dostęp: odwrotne proxy TLS lub utrzymanie w sieci VPN

Istnieją dwa bezpieczne sposoby na uzyskanie dostępu do Jellyfin z zewnątrz oraz jeden, 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 typu 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 używa WebSockets do aktualizacji w czasie rzeczywistym, więc 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 nastąpi:

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, skieruj Uptime Kuma na ten adres URL, aby otrzymywać powiadomienia o przestojach przed użytkownikami. Skonfiguruj powiadomienia w samodzielnie hostowanym serwerze ntfy, dzięki czemu informacja o nieudanym teście dotrze jako powiadomienie push na telefon, zamiast wiadomości e-mail odczytanej następnego dnia. Udostępnienie panelu logowania w publicznym Internecie to również dobry moment na audyt pozostałych usług na serwerze, zamiast polegania wyłącznie na tym, że port 443 odpowiada: sudo ss -tlnp wyświetla listę wszystkich nasłuchujących portów oraz procesy, które je obsługują. Jeśli na serwerze wdrażasz również własny kod, open-kritt skanuje repozytoria i ich zależności pod kątem podatności; narzędzie to audytuje kod źródłowy, a nie nasłuchujące porty.

Opcja B, utrzymanie w prywatnej sieci VPN. Nie wystawiaj portu 8096 do publicznego Internetu; uzyskuj dostęp do Jellyfin wyłącznie przez tunel WireGuard zakończony na tym samym serwerze. Dla gospodarstwa domowego jest to najprostsze bezpieczne rozwiązanie: brak certyfikatów, brak publicznej ekspozycji i brak powierzchni ataku dla brute-force. Samo powiązanie z localhost w pliku compose jest tutaj niewystarczające, ponieważ port opublikowany na 127.0.0.1 jest osiągalny tylko z poziomu samego VPS, a nie z węzłów sieci VPN. Opublikuj usługę na adresie tunelu serwera (na przykład "10.8.0.1:8096:8096", używając własnego adresu IP serwera WireGuard) lub zachowaj localhost i umieść przed nim proxy nasłuchujące na adresie tunelu, a następnie łącz się przez VPN. Zobacz konfigurację WireGuard VPN dla prywatnego VPS, aby przygotować sam tunel.

Planowanie pojemności pamięci masowej 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; materiały 4K to 40-100 GB na film. Biblioteka składająca się z kilkuset filmów i kilku seriali wymaga wolumenu o rozmiarze 2-4 TB. Taniej jest przewymiarować wolumen blokowy raz, niż przeprowadzać migrację w przyszłości.

/config zawiera pełny stan serwera, dlatego jest to jedyny element, który należy archiwizować. Należy wykonać migawkę (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 katalog 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 :12 pozostaje w obrębie linii 12.x, więc przejście na kolejną wersję główną wymaga celowej edycji znacznika. Przed wykonaniem tej operacji należy przejrzeć informacje o wydaniu Jellyfin, ponieważ przy wersjach głównych dochodzi do migracji schematu biblioteki. Wraz z wydaniem 12.0 (wrzesień 2026) Jellyfin zrezygnował z wiodącego "10." w numeracji wersji: 12.0 to wersja, która byłaby oznaczona jako 10.12. Nie istnieje linia 11.x, a 10.11.x była ostatnią linią w starym schemacie. Jeśli starszy plik Compose nadal zawiera jellyfin/jellyfin:10, jest on zamrożony na wersji 10.11 (znacznik ten ostatni raz zmienił się 2026-06-06, na 10.11.11) i nigdy nie pobierze wersji 12.x. Przejście na :12 to coś więcej niż edycja znacznika: 12.0 zmienia schemat bazy danych i nadpisuje dane przy pierwszym uruchomieniu. Należy zatem zatrzymać serwer i wykonać kopię zapasową wspomnianą powyżej, ponieważ jest to jedyna droga powrotu. Wersja 12.0 aktualizuje się bezpośrednio z 10.10.7 lub dowolnego wydania 10.11.x i wymaga po tym pełnego skanowania biblioteki, co trwa zauważalnie dłużej niż zwykle. Przypięty znacznik oraz jeden katalog stanu z kopią zapasową to kompletna recepta dla każdego kontenera działającego w trybie ciągłym. Jest to ten sam wzorzec, 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.

Kontener z określonym uid nie ma uprawnień do odczytu tej ścieżki. Przyczyna: pliki multimedialne należą do użytkownika root lub innego uid 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 (burn-in) lub mapowanie tonów HDR. Rozwiązanie: zmień klienta na obsługującego direct-play, przechowuj pliki źródłowe w formacie H.264/AAC, używaj napisów tekstowych (SRT) zamiast graficznych (PGS/VOBSUB), których większość klientów Jellyfin nie potrafi renderować samodzielnie, co wymusza ich wypalanie. Unikaj odtwarzania materiałów 4K HDR na serwerach opartych wyłącznie na procesorze CPU.

"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, oraz przetestuj innego klienta, aby wykluczyć problemy z obsługą kodeków przez przeglądarkę.

Filmy nie mają plakatu lub wyświetlany jest błędny. Metadane nie zostały dopasowane. Przyczyna: nazwa folderu lub pliku nie zgadza się z tytułem w bazie dostawcy metadanych, remake lub popularny tytuł bez roku wydania pozwalającego na rozróżnienie wersji, folder sezonu nazwany S01 zamiast Season 01 lub odcinki nieposiadające formatu S01E01. Rozwiązanie: zmień nazwy zgodnie z powyższym schematem, a następnie wybierz Refresh metadata → Replace all lub użyj funkcji Identify dla pojedynczego 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.