
Configurare Jellyfin cu Docker: server media pe VPS
Platformele de streaming isi tot schimba catalogul, cresc preturile si iti imprastie serialele preferate prin tot mai multe abonamente. Intre timp, filmele copiate de pe propriile DVD-uri si Blu-ray-uri, filmarile de familie si colectia de muzica pe care ai etichetat-o ani de zile stau pe un hard disk intr-un sertar. Jellyfin transforma gramada aceea de fisiere in propriul tau serviciu de streaming, cu postere, descrieri, “continua vizionarea” si aplicatii pentru televizoare si telefoane. Singurul cost este serverul pe care ruleaza.
Jellyfin este software liber si open source: fara cont de creat, fara telemetrie, fara un abonament premium care sa ascunda functiile utile. Proiectul se gaseste la jellyfin.org , iar codul la github.com/jellyfin/jellyfin . In acest ghid de jellyfin docker setup il instalam pe un VPS, in spatele HTTPS cu certificate automate, organizam bibliotecile de filme, seriale si muzica astfel incat metadatele sa se potriveasca din prima, cream conturi pentru familie si prieteni si vorbim deschis despre singura sarcina care poate pune un VPS la treaba serios: transcodarea.
Ce este Jellyfin si cateva concepte de care ai nevoie
Un server media este un program care scaneaza foldere cu fisiere video si audio, recunoaste ce contine fiecare fisier, descarca metadate (postere, descrieri, actori, titluri de episoade) din baze de date publice precum TheMovieDb si MusicBrainz, apoi transmite continutul catre aplicatiile client. Jellyfin face toate acestea si tine minte progresul vizionarii pentru fiecare utilizator, deci fiecare membru al familiei are propriul rand “continua vizionarea”.
Il vom rula cu Docker. Un container este un pachet izolat care contine aplicatia plus tot ce ii trebuie (biblioteci, runtime, propria versiune de ffmpeg), asa ca se comporta la fel pe orice server Linux si nu imprastie fisiere prin sistem. Un container porneste dintr-o imagine, un sablon read-only publicat de proiect. Docker Compose ne permite sa descriem mai multe containere intr-un singur fisier YAML si sa le pornim cu o singura comanda, ceea ce face configuratia usor de citit, de salvat si de refacut.
Un port este o “usa” numerotata a serverului, prin care asculta un serviciu de retea. Jellyfin asculta pe portul 8096, cu HTTP simplu, necriptat. Nu vom expune acest port in internet. In schimb, un reverse proxy numit Caddy
asculta pe porturile web standard 80 si 443, obtine automat un certificat TLS gratuit de la Let’s Encrypt si trimite vizitatorii, deja criptati, catre Jellyfin in interiorul serverului. Rezultatul este o adresa curata precum https://media.exemplu.ro, cu lacatul afisat in browser.
In fine, transcodarea inseamna conversia unui video din mers intr-un format, o rezolutie sau un bitrate pe care dispozitivul client il poate reda. E comoda, dar este munca pura pentru procesor, iar pe un VPS fara placa video este principalul lucru de planificat. Pasul 8 trateaza subiectul pe larg.
De ce sa pui Jellyfin pe un VPS
Un server de acasa are stocare ieftina, dar sta de obicei in spatele unei conexiuni rezidentiale, adesea cu CGNAT si cu upload slab, exact directia de care are nevoie streamingul. Un VPS dintr-un data center este pornit permanent, are IP public si latime de banda din belsug, asa ca biblioteca ta functioneaza la fel dintr-un hotel, de pe un telefon pe 4G sau de pe televizorul unei rude. Compromisurile sunt cinstite: spatiul pe disc costa mai mult per GB decat un hard disk acasa, iar planurile VPS standard nu au GPU. Un VPS straluceste cu o biblioteca atent aleasa si cativa spectatori; colectiile 4K de mai multi terabytes isi au locul pe un server dedicat.
Cum se leaga componentele
Spectatorii vorbesc doar cu portul 443. Firewall-ul lasa sa treaca SSH, HTTP si HTTPS si nimic altceva, Caddy termina conexiunea TLS si trimite cererile printr-o retea Docker privata, iar Jellyfin isi tine baza de date in /config, scrie segmentele temporare de transcodare in /cache si citeste fisierele media dintr-un folder montat doar pentru citire. Acest ultim detaliu inseamna ca nici un bug si nici un cont compromis nu iti poate sterge filmele.
De ce ai nevoie
- Un VPS cu Debian 13 sau Ubuntu 24.04 si un utilizator obisnuit cu drepturi
sudo. Recomandam un VPS KVM. 2 vCPU si 2 GB RAM sunt suficiente pentru redare directa; planifica 4 vCPU sau mai mult daca te astepti la transcodare. - Spatiu pe disc pentru biblioteca. Un film 1080p are de obicei intre 4 si 15 GB, un sezon de serial 10 pana la 40 GB, un album in FLAC in jur de 300 pana la 500 MB.
- Un domeniu sau subdomeniu pe care il controlezi, de exemplu
media.exemplu.ro, unde poti crea o inregistrare DNS. - Porturile 80 si 443 accesibile din internet (pe un VPS DreamServer proaspat, sunt).
- Continut pe care ai dreptul sa il folosesti: copii ale discurilor pe care le detii, filmari personale, opere in domeniul public sau sub licenta Creative Commons.
- Cam 30 pana la 45 de minute, plus timpul de upload pentru fisiere.
O nota despre LXC: Docker intr-un container LXC neprivilegiat are nevoie de nesting activat pe host, se poate lovi de probleme cu driverul de stocare si cu permisiunile, iar parametrii de kernel precum limitele inotify nu pot fi modificati din interiorul containerului. Transcodarea hardware prin /dev/dri nu este disponibila deloc acolo. Daca ai de ales, foloseste un VPS KVM pentru acest ghid.
Pasul 1: Pregateste serverul (Docker, firewall, DNS)
Incepem cu actualizarea sistemului si instalarea catorva unelte. Pe Ubuntu 24.04, ufw este deja instalat (dar inactiv); pe Debian 13 nu este, asa ca il instalam cu comanda de mai jos.
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y curl ca-certificates ufw
Daca actualizarea a adus un kernel nou, reporneste serverul. Pe Ubuntu poti verifica cu ls /var/run/reboot-required: daca fisierul exista, e nevoie de restart. Debian nu creeaza acest fisier implicit, asa ca acolo regula simpla este sa repornesti ori de cate ori s-a actualizat un pachet linux-image.
Acum instalam Docker Engine si pluginul Compose cu scriptul oficial de instalare de la Docker. Acesta detecteaza daca rulezi Debian sau Ubuntu si adauga depozitul Docker potrivit.
curl -fsSL https://get.docker.com -o get-docker.sh
less get-docker.sh # optional, dar e bine sa citesti ce rulezi
sudo sh get-docker.sh
sudo docker version
sudo docker compose version
Ultima comanda ar trebui sa afiseze ceva de genul Docker Compose version v2.x.x. Atentie la spatiu: este docker compose, pluginul v2 actual, nu vechiul docker-compose. In acest ghid punem sudo in fata comenzilor Docker. Ai putea adauga utilizatorul in grupul docker, dar apartenenta la acest grup echivaleaza cu acces root, deci fa-o in cunostinta de cauza.
Urmeaza firewall-ul. Permite SSH primul, altfel activarea firewall-ului te poate bloca afara din propriul server:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw enable
sudo ufw status verbose
Daca ai mutat SSH pe un port personalizat, permite acel port in loc de OpenSSH. Portul 443/udp este pentru HTTP/3, pe care Caddy il suporta din start. In rezultat ar trebui sa vezi 22, 80 si 443 cu ALLOW IN.
La final, DNS-ul. La registrar sau la furnizorul DNS, creeaza o inregistrare A pentru media.exemplu.ro care sa indice adresa IPv4 publica a VPS-ului (plus o inregistrare AAAA daca folosesti IPv6). Dupa cateva minute, verifica de pe server:
getent hosts media.exemplu.ro
Comanda trebuie sa afiseze IP-ul VPS-ului. Caddy are nevoie ca acest lucru sa fie corect inainte sa poata obtine certificatul.
Pasul 2: Creeaza folderele si structura media
Tinem fisierele Docker in /opt/jellyfin si continutul media in /srv/media, cu cate un folder pentru fiecare tip de continut. Separarea filmelor, serialelor si muzicii nu e un moft: Jellyfin aplica reguli de denumire si surse de metadate diferite pentru fiecare tip de biblioteca, iar folderele amestecate sunt cauza numarul unu a potrivirilor gresite.
sudo mkdir -p /opt/jellyfin /srv/media/movies /srv/media/shows /srv/media/music
sudo chown -R "$USER":"$USER" /opt/jellyfin /srv/media
cd /opt/jellyfin
mkdir config cache
id -u; id -g
Ultima linie afiseaza ID-ul de utilizator si de grup, de obicei 1000 si 1000 pentru primul utilizator de pe VPS. Noteaza-le: Jellyfin va rula ca acest utilizator, deci va putea citi fisierele pe care le urci si isi va putea scrie configuratia fara sa ruleze ca root. Cream intentionat config si cache noi insine: daca Docker trebuie sa creeze un folder lipsa, il face cu proprietar root, iar asta apare mai tarziu ca eroare “permission denied”.
Denumiri care fac metadatele sa se potriveasca
Jellyfin identifica continutul in principal dupa numele folderelor si fisierelor. Respecta structura de mai jos si aproape totul se va potrivi de la prima scanare:
/srv/media/
movies/
Nosferatu (1922) [imdbid-tt0013442]/
Nosferatu (1922).mkv
Nosferatu (1922).ro.srt
Night of the Living Dead (1968)/
Night of the Living Dead (1968).mp4
shows/
Example Show (2019)/
Season 00/
Example Show S00E01.mkv
Season 01/
Example Show S01E01.mkv
Example Show S01E02.mkv
music/
Nume Artist/
Nume Album (2004)/
01 - Prima piesa.flac
02 - A doua piesa.flac
cover.jpg
Regulile din spatele structurii:
- Filme: cate un folder pentru fiecare film, numit
Titlu (An), cu fisierul video denumit la fel. Anul face diferenta intre un remake si original. Daca adaugi[imdbid-tt...]sau[tmdbid-...]in numele folderului, fixezi potrivirea exacta, util pentru filme cu titluri comune. Foloseste titlul original sau cel international, nu traducerea romaneasca, pentru potriviri sigure. - Seriale:
Nume Serial (An)/Season 01/, iar fiecare fisier de episod contineS01E01. Episoadele speciale merg inSeason 00. Un episod dublu poate fi denumitS01E01-E02. - Subtitrari: un fisier extern cu acelasi nume de baza plus codul limbii, de exemplu
.ro.srt,.en.srtsau.ro.forced.srtpentru subtitrari fortate. - Muzica: Jellyfin are mai multa incredere in etichetele din fisiere decat in numele folderelor. Asigura-te ca Album Artist este completat, mai ales la compilatii, altfel un album se imparte in zeci de bucati. Un program de etichetare precum MusicBrainz Picard poate curata o colectie intreaga.
Pentru upload, foloseste rsync de pe calculatorul tau (Linux, macOS sau WSL pe Windows):
rsync -avP "Nosferatu (1922) [imdbid-tt0013442]" utilizator@ip-vps:/srv/media/movies/
-a pastreaza structura folderelor, -v afiseaza fisierele pe masura ce sunt copiate, iar -P arata progresul si permite reluarea unui transfer intrerupt, foarte util la fisiere de 10 GB. Pe Windows, orice client SFTP precum WinSCP sau FileZilla functioneaza cu aceleasi date de logare SSH.
Pasul 3: Scrie fisierul Docker Compose
Creeaza fisierul Compose in /opt/jellyfin:
cd /opt/jellyfin
nano compose.yaml
Lipeste continutul de mai jos, inlocuind media.exemplu.ro cu domeniul tau si 1000:1000 cu ID-urile notate la Pasul 2:
services:
jellyfin:
image: jellyfin/jellyfin:10.11.0
container_name: jellyfin
user: "1000:1000"
restart: unless-stopped
environment:
- TZ=Europe/Bucharest
- JELLYFIN_PublishedServerUrl=https://media.exemplu.ro
volumes:
- ./config:/config
- ./cache:/cache
- /srv/media:/media:ro
ports:
- "127.0.0.1:8096:8096"
networks:
media:
ipv4_address: 172.30.0.20
caddy:
image: caddy:2.10
container_name: caddy
restart: unless-stopped
depends_on:
- jellyfin
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
networks:
media:
ipv4_address: 172.30.0.10
networks:
media:
ipam:
config:
- subnet: 172.30.0.0/24
volumes:
caddy_data:
caddy_config:
Salveaza cu Ctrl+O, Enter si iesi cu Ctrl+X. Ce face fiecare parte:
image: jellyfin/jellyfin:10.11.0fixeaza o versiune anume. Verifica pagina de release-uri si foloseste cel mai nou patch 10.11.x disponibil. Evitam:latestpentru ca upgrade-urile majore (de exemplu de la 10.10 la 10.11, care a migrat toata baza de date) ruleaza automat la pornire si nu pot fi anulate. Cu o versiune fixata, faci upgrade cand decizi tu, dupa un backup.userruleaza Jellyfin ca utilizatorul tau obisnuit, nu ca root.ports: "127.0.0.1:8096:8096"publica Jellyfin doar pe interfata locala. Conteaza mai mult decat pare: Docker isi scrie propriile reguli de firewall si ocoleste ufw pentru porturile publicate, deci un simplu8096:8096ar fi deschis intregului internet chiar si cu ufw activ. Legarea la 127.0.0.1 il pastreaza privat, dar permite in continuare un tunel SSH pentru depanare./srv/media:/media:roface continutul vizibil in container la/media, doar pentru citire.JELLYFIN_PublishedServerUrlspune aplicatiilor client ce adresa publica sa foloseasca.- IP-urile fixe din reteaua
mediane permit sa ii spunem exact lui Jellyfin, la Pasul 5, care adresa este proxy-ul de incredere. caddy_dataeste locul unde Caddy pastreaza certificatele. Nu il sterge din joaca: cererile repetate de certificate pot atinge limitele impuse de Let’s Encrypt.
Pasul 4: Adauga HTTPS cu Caddy
Creeaza configuratia Caddy in acelasi folder. Fisierul trebuie sa existe inainte de prima pornire, altfel Docker creeaza in locul lui un folder gol numit Caddyfile.
nano /opt/jellyfin/Caddyfile
media.exemplu.ro {
reverse_proxy jellyfin:8096
}
Asta e tot fisierul. Cand scrii un nume de domeniu ca adresa a site-ului, Caddy obtine automat un certificat Let’s Encrypt, redirectioneaza HTTP catre HTTPS si reinnoieste certificatul inainte sa expire. reverse_proxy jellyfin:8096 trimite traficul catre containerul numit jellyfin, pe care Docker il rezolva in reteaua privata. Conexiunile WebSocket, folosite de Jellyfin pentru actualizari live si control de la distanta intre dispozitive, trec fara configurare suplimentara.
Pasul 5: Porneste stack-ul si parcurge asistentul initial
Porneste ambele containere in fundal:
cd /opt/jellyfin
sudo docker compose up -d
sudo docker compose ps
La prima rulare se descarca imaginile, apoi ps ar trebui sa arate jellyfin si caddy cu starea Up. Jellyfin poate afisa (health: starting) pentru un minut, inainte sa treaca la (healthy). Acum urmareste cum Caddy cere certificatul:
sudo docker compose logs -f caddy
Cauta o linie care contine certificate obtained successfully si domeniul tau, apoi apasa Ctrl+C ca sa opresti urmarirea logului. Doua verificari rapide:
curl -s http://127.0.0.1:8096/health; echo
curl -sI https://media.exemplu.ro | head -n 1
Prima ar trebui sa afiseze Healthy, a doua HTTP/2 302 (o redirectionare catre interfata web) sau HTTP/2 200.
Deschide https://media.exemplu.ro in browser si termina asistentul imediat: pana cand exista un cont de administrator, oricine gaseste adresa ar putea revendica serverul. Daca preferi sa faci asta in privat, deschide un tunel SSH de pe calculatorul tau cu ssh -L 8096:127.0.0.1:8096 utilizator@ip-vps si intra pe http://localhost:8096.
Asistentul iti cere:
- Limba interfetei.
- Numele administratorului si o parola puternica. Evita nume evidente precum
admin. - Bibliotecile media: sari peste acest pas deocamdata, le adaugam cum trebuie la Pasul 6.
- Limba preferata pentru metadate si tara.
- Accesul la distanta: lasa activata optiunea Allow remote connections to this server, pentru ca toti spectatorii vin prin proxy.
Apoi autentifica-te si seteaza proxy-ul de incredere. Deschide Dashboard, apoi Networking, gaseste campul Known proxies si introdu 172.30.0.10, IP-ul fix al lui Caddy. Salveaza, apoi reporneste Jellyfin:
sudo docker compose restart jellyfin
Fara acest pas, Jellyfin vede fiecare spectator ca venind de la IP-ul privat al lui Caddy: ii considera pe toti in reteaua locala, ignora limitele de bitrate pentru internet pe care le setam la Pasul 7, iar in loguri apare o singura adresa inutila in loc de IP-urile reale. Numele meniurilor (le dam aici in engleza, ca in interfata implicita) se pot schimba putin intre versiuni, dar setarea se afla mereu in sectiunea de retea.
Pasul 6: Adauga bibliotecile ca metadatele sa se potriveasca
Mergi la Dashboard, Libraries, Add Media Library. Pentru fiecare biblioteca:
- Alege intai tipul de continut (Movies, Shows sau Music). El decide ce reguli de denumire si ce surse de metadate se aplica, deci conteaza mult mai mult decat numele afisat.
- Folders: apasa pe plus si introdu calea asa cum o vede containerul:
/media/movies,/media/showssau/media/music. A scrie/srv/media/movieseste o greseala clasica: acea cale nu exista in interiorul containerului. - Limba si tara: seteaza limba preferata pentru metadate (romana, engleza si asa mai departe) si tara, care influenteaza si clasificarile de varsta.
- Surse de metadate: lasa valorile implicite: TheMovieDb si OMDb pentru filme si seriale, MusicBrainz si TheAudioDB pentru muzica.
- Enable real-time monitoring: lasa-l activ, ca fisierele noi sa apara fara scanare manuala.
- Pe un VPS, dezactiveaza extragerea imaginilor de capitol si a imaginilor trickplay (miniaturile afisate cand derulezi). Ambele ruleaza ffmpeg peste fiecare video si pot tine procesorul la 100% ore intregi pe o biblioteca mare. Le poti activa mai tarziu si le poti lasa sa ruleze noaptea, din Scheduled Tasks.
Dupa ce ai creat toate cele trei biblioteci, apasa Scan All Libraries. Progresul apare in dashboard; cateva sute de titluri dureaza de obicei cateva minute.
Daca ceva se potriveste gresit, deschide titlul, foloseste meniul cu trei puncte si alege Identify. Cauta dupa titlu si an sau lipeste ID-ul IMDb ori TMDb, alege rezultatul corect si permite inlocuirea imaginilor existente. Alternativ, corecteaza numele folderului si ruleaza Refresh metadata cu “Replace all metadata”. Vinovatii obisnuiti: anul lipsa, resturi de la grupurile de release in numele fisierelor, episoade fara S01E01 si compilatii muzicale fara eticheta Album Artist.
Pasul 7: Creeaza conturi de utilizator
Nu imparti niciodata contul de administrator. Mergi la Dashboard, Users si apasa pe plus. Introdu un nume si o parola, iar la Library access debifeaza “Enable access to all libraries” daca persoana respectiva trebuie sa vada doar unele dintre ele. Apoi deschide utilizatorul nou si verifica:
- Allow this user to manage the server: las-o nebifata pentru toata lumea in afara de tine.
- Internet streaming bitrate limit (Mbps): de exemplu 8 pentru un 1080p confortabil. Astfel un singur spectator nu iti satureaza banda, iar limita functioneaza corect doar dupa ce ai setat proxy-ul de incredere de la Pasul 5.
- Permisiunile de transcodare: daca debifezi “Allow video playback that requires transcoding”, utilizatorul este fortat la redare directa. Pe un fisier incompatibil primeste o eroare, in loc sa iti ocupe in tacere procesorul. Transcodarea audio e ieftina, o poti lasa permisa.
- Numarul maxim de sesiuni simultane: util daca un cont ajunge sa fie impartit mai departe decat ai vrut.
- Parental control: seteaza o clasificare maxima pentru conturile copiilor.
- Incercari de autentificare esuate inainte de blocare: un numar mic protejeaza impotriva ghicirii parolelor.
Pentru televizoare, activeaza Quick Connect din Dashboard, General: aplicatia de pe TV afiseaza un cod scurt, iar utilizatorul il aproba de pe un telefon sau browser deja autentificat, deci nimeni nu mai tasteaza parole cu telecomanda. Spectatorii instaleaza apoi aplicatiile oficiale Jellyfin (Android, Android TV, iOS, desktop) si introduc https://media.exemplu.ro ca adresa a serverului.
Pasul 8: Regleaza transcodarea pentru un VPS
Orice redare intra in unul din trei moduri, iar intelegerea lor e cheia unui VPS sanatos:
- Redare directa (direct play): clientul suporta containerul, codecul video, codecul audio si subtitrarile, deci fisierul este trimis ca atare. Consumul de procesor e aproape zero; singura limita este latimea de banda.
- Direct stream (remux): codecurile sunt in regula, dar containerul nu (de exemplu MKV in unele browsere), asa ca Jellyfin reambaleaza fluxurile fara sa le recodeze. Tot ieftin.
- Transcodare: video-ul este recodat in timp real. O transcodare software 1080p H.264 tine ocupate aproximativ 2-3 vCPU, iar 4K HDR la 1080p cu tone mapping poate depasi 8.
Motivele obisnuite pentru transcodare: un codec video pe care clientul nu il poate decoda (HEVC in multe browsere, AV1 pe televizoare mai vechi), formate audio precum DTS sau TrueHD (se converteste doar sunetul, ceea ce e ieftin), subtitrari bazate pe imagini (PGS, VobSub) sau subtitrari ASS stilizate pe care clientul nu le poate afisa, asa ca sunt “arse” in imagine, si un bitrate al fisierului peste limita utilizatorului.
Ca sa vezi ce se intampla, deschide dashboard-ul in timpul redarii: sesiunea activa arata daca este redare directa sau transcodare, iar iconita de informatii afiseaza motivul. Pe server, urmareste containerul:
sudo docker stats jellyfin
In coloana CPU %, 100% inseamna un nucleu intreg. Apasa Ctrl+C ca sa iesi. Apoi ajusteaza setarile din Dashboard, Playback, Transcoding:
- Hardware acceleration: None. Planurile VPS standard nu au GPU.
- Enable throttling: activ. Jellyfin pune pe pauza codarea cand e suficient de inaintea redarii, eliberand procesorul.
- Enable segment deletion: activ, ca segmentele vechi de transcodare sa nu umple
/cache. - Encoding preset:
veryfastsaufaster. Preseturile mai lente comprima mai bine, dar costa mult mai mult procesor. - Allow encoding in HEVC format: dezactivat. Codarea HEVC software este mult prea grea pentru un VPS.
- Tone mapping: lasa-l dezactivat pe un VPS si pastreaza in schimb versiuni SDR ale filmelor HDR.
Ca transcodarea sa nu sufoce niciodata SSH-ul si restul sistemului, limiteaza procesorul containerului. Adauga o linie in serviciul jellyfin din compose.yaml, la aceeasi indentare ca restart::
cpus: "1.5"
Foloseste o valoare sub numarul de vCPU: in jur de 1.5 pe un VPS cu 2 vCPU, 3 pe unul cu 4 vCPU. Docker refuza o valoare mai mare decat procesoarele disponibile. Aplica schimbarea cu sudo docker compose up -d, care recreeaza doar containerul modificat.
Strategia cea mai eficienta ramane insa pregatirea fisierelor pentru redare directa: video H.264 (HEVC doar daca toti spectatorii folosesc televizoare sau aplicatii native care il suporta), audio AAC sau AC3, subtitrari SRT, in container MKV sau MP4. Cu o astfel de biblioteca, chiar si un VPS cu 2 vCPU poate servi multe streamuri simultane, limitat in principal de latimea de banda (aproximativ 8-10 Mbps pentru un stream 1080p). Daca ai nevoie cu adevarat de mai multe transcodari simultan sau de 4K, uita-te la un server dedicat cu iGPU Intel si Quick Sync, cu /dev/dri transmis in container. Asta nu este posibil pe un VPS standard si nici intr-un container LXC neprivilegiat.
Actualizare si backup pentru Jellyfin
Tot ce nu este continut media sta in /opt/jellyfin/config: baza de date, utilizatorii, istoricul vizionarilor, setarile si imaginile descarcate. Fa-i backup regulat, iar pentru fisierele media pastreaza un backup separat.
cd /opt/jellyfin
sudo docker compose stop jellyfin
sudo tar czf ~/jellyfin-config-$(date +%F).tar.gz -C /opt/jellyfin config
sudo docker compose start jellyfin
Oprirea lui Jellyfin inainte de arhivare garanteaza o copie consistenta a bazei de date. Copiaza arhiva rezultata in afara serverului, de exemplu cu rsync pe calculatorul tau sau pe un spatiu de stocare separat.
Pentru actualizare, citeste notele de release, fa backup-ul de mai sus, schimba versiunea din linia image: si ruleaza:
sudo docker compose pull
sudo docker compose up -d
sudo docker compose logs -f jellyfin
Prima pornire dupa o schimbare de versiune poate dura cateva minute cat timp baza de date este migrata, deci nu o intrerupe. Actualizeaza din cand in cand si versiunea Caddy in acelasi fel, iar imaginile vechi le poti sterge cu sudo docker image prune.
Depanare: greseli frecvente
- Caddy nu obtine certificatul. Verifica
sudo docker compose logs caddy. De obicei inregistrarea DNS nu indica inca spre VPS (verifica cugetent hosts) sau portul 80 este blocat. Let’s Encrypt trebuie sa poata ajunge la portul 80 sau 443 al domeniului tau. - “502 Bad Gateway” in browser. Caddy functioneaza, dar Jellyfin nu raspunde. Verifica
sudo docker compose pssisudo docker compose logs jellyfin; dupa un upgrade, poate inca migreaza baza de date. - Eroarea “Is a directory” pentru Caddyfile. Ai pornit stack-ul inainte sa creezi fisierul, iar Docker a creat un folder in locul lui. Ruleaza
sudo docker compose down, apoisudo rmdir Caddyfile, creeaza fisierul si porneste din nou. - Permission denied pe /config sau /cache. Folderele apartin altui utilizator. Corecteaza cu
sudo chown -R 1000:1000 /opt/jellyfin/config /opt/jellyfin/cache, folosind ID-urile tale. - O biblioteca ramane goala. Confirma ca fisierele sunt vizibile in container:
sudo docker compose exec jellyfin ls /media/movies. Daca lista e goala, verifica ce cale ai folosit si daca fisierele pot fi citite de utilizatorul tau. - Eroare “Pool overlaps” la pornire. O alta retea Docker foloseste deja 172.30.0.0/24. Alege alt subnet, de exemplu 172.31.0.0/24, si actualizeaza ambele IP-uri fixe plus valoarea din Known proxies.
- Toti spectatorii apar cu IP-ul 172.30.0.10. Lipseste proxy-ul de incredere de la Pasul 5 sau Jellyfin nu a fost repornit dupa setare.
- Buffering doar la unele fisiere. Aproape mereu e vorba de transcodare. Verifica motivul in dashboard, apoi converteste fisierul, adauga o subtitrare SRT sau foloseste o aplicatie nativa in loc de browser.
- Fisierele noi nu sunt detectate automat. Bibliotecile foarte mari pot depasi limita de urmarire inotify. Pe un VPS KVM poti creste
fs.inotify.max_user_watchescu sysctl; in LXC, foloseste in schimb o scanare programata a bibliotecii.
Note de securitate
- Docker ocoleste ufw pentru porturile publicate. Publica public doar 80 si 443. Orice altceva, precum 8096, trebuie legat la 127.0.0.1, exact ca in fisierul nostru Compose.
- Un singur administrator, cu parola puternica, restul utilizatori obisnuiti. Foloseste o parola lunga si unica pentru admin si un cont separat, fara drepturi de administrare, pentru vizionarile tale de zi cu zi.
- Blocheaza ghicirea parolelor cu limita de incercari esuate per utilizator si arunca din cand in cand o privire la jurnalul de activitate din dashboard.
- Continutul media este montat doar pentru citire, deci nici Jellyfin, nici vreun cont nu il poate sterge sau suprascrie.
- Fixeaza versiunile si actualizeaza deliberat, dupa un backup. Jellyfin primeste corecturi de securitate in versiunile patch, asa ca nu il lasa sa ramana in urma multe luni.
- Tine sistemul actualizat cu
sudo apt update && sudo apt upgradesau activeaza unattended-upgrades. - Ramai in legalitate. Foloseste continut pe care il detii sau pe care ai dreptul sa il distribui si pastreaza serverul privat, pentru familie si prieteni. Distribuirea publica a materialelor protejate de drepturi de autor este ilegala si incalca termenii nostri de utilizare.
Deci, merita Jellyfin pe un VPS?
Daca vrei propriul serviciu de streaming, accesibil de oriunde prin HTTPS, cu postere ca lumea si istoric de vizionare pentru fiecare persoana, si esti dispus sa investesti o jumatate de ora in configurare si putina atentie la formatele fisierelor, un jellyfin docker setup pe VPS este unul dintre cele mai satisfacatoare proiecte de self-hosting. Pastreaza biblioteca prietenoasa cu redarea directa si un VPS modest va servi toata familia; cand cererea de transcodare creste, acela este momentul pentru mai multe nuclee sau pentru un server dedicat cu GPU.
Poti porni acest stack pe un VPS de la noi in cateva minute, pe hardware din propriul nostru data center din Romania. Daca preferi ca altcineva sa se ocupe de instalare, actualizari, backup si securitate, echipa noastra de administrare servere il poate construi si intretine pentru tine.
Intrebari frecvente
De cat procesor si RAM are nevoie Jellyfin pe un VPS?
Pentru redare directa, 2 vCPU si 2 GB RAM sunt suficiente pentru o biblioteca de familie si mai multi spectatori. Jellyfin foloseste singur cateva sute de MB de RAM, plus ceva mai mult in timpul scanarilor. Costul real este transcodarea: socoteste aproximativ 2-3 vCPU pentru fiecare transcodare 1080p simultana.
Pot folosi transcodare hardware pe un VPS?
In general nu, pentru ca planurile VPS standard nu au GPU. Transcodarea hardware are nevoie de un GPU fizic, de exemplu un iGPU Intel cu Quick Sync, expus containerului prin /dev/dri. Este posibil pe un server dedicat, dar nu pe un VPS standard si nici intr-un container LXC neprivilegiat.
Este Jellyfin o alternativa buna la Plex?
Da, pentru majoritatea utilizarilor de acasa. Jellyfin este complet gratuit si open source, nu cere cont online si nu ascunde functii in spatele unui abonament. Plex are un ecosistem mai slefuit pe unele televizoare smart; Jellyfin are aplicatii oficiale pentru platformele principale si functioneaza in orice browser modern.
Cate persoane pot viziona in acelasi timp?
La redare directa, limita este latimea de banda: aproximativ 8-10 Mbps pentru fiecare stream 1080p. La transcodare, limita este procesorul, de multe ori doar unul sau doua streamuri pe un VPS mic. De aceea conteaza limitele de bitrate per utilizator si fisierele pregatite pentru redare directa.