VPS वर Jellyfin मीडिया सर्व्हर कसा सेटअप करावा
Docker वापरून VPS वर Jellyfin इन्स्टॉल करा. फाईल परवानग्या, ब्लॉक स्टोरेज आणि CPU ट्रान्सकोडिंगच्या समस्या टाळून स्वतःचे मीडिया लायब्ररी सुरक्षितपणे स्ट्रीम करण्याची संपूर्ण पद्धत.
तुम्ही काय तयार करत आहात
एका VPS वर Jellyfin मीडिया सर्व्हर: एक कंटेनर, तीन volumes आणि तुमच्या चित्रपट व मालिका साठवण्यासाठी एक block-storage डिस्क, जी कोणत्याही ब्राउझर किंवा Jellyfin ॲपवरून वापरता येईल. हे इन्स्टॉलेशन पंधरा ओळींच्या compose फाईलमध्ये पूर्ण होते. त्यानंतर उद्भवणाऱ्या सर्व समस्या दोन कारणांमुळे असतात: कंटेनरला वाचता न येणाऱ्या फाईल परवानग्या आणि GPU नसलेल्या VPS कडे व्हिडिओ ट्रान्सकोडिंगचे काम सोपवणे. या मार्गदर्शकाचा बराचसा भाग या दोन गोष्टींवर केंद्रित आहे, कारण बहुतेक तांत्रिक समस्या याच कारणांमुळे निर्माण होतात.
Jellyfin हे मोफत आणि पूर्णपणे open source आहे. यात कोणतेही खाते, सशुल्क फीचर्स किंवा telemetry नाही, म्हणूनच हे 2026 मध्ये self-host करण्यासारख्या गोष्टींच्या जवळजवळ प्रत्येक यादीत समाविष्ट आहे. हे तुमच्या मालकीचे मीडिया प्ले करते. हे कोणतेही कंटेंट पुरवत नाही आणि हे मार्गदर्शक ते मिळवण्याबद्दल नाही.
ट्रान्सकोडिंगचे वास्तव, काहीही भाड्याने घेण्यापूर्वी
हे आधी वाचा, कारण यामुळे तुम्ही काय खरेदी करता हे बदलते. जेव्हा तुम्ही प्ले बटण दाबता, तेव्हा मीडिया सर्व्हर दोनपैकी एक गोष्ट करतो. Direct play फाईल जशी आहे तशी स्ट्रीम करते: VPS डिस्कवरून बाइट्स वाचतो आणि ते नेटवर्कवर पाठवतो, ज्यासाठी जवळजवळ शून्य CPU वापरला जातो. Transcoding व्हिडिओला रिअल-टाइममध्ये पुन्हा एन्कोड करते, नवीन रिझोल्यूशन, नवीन कोडेक किंवा सबटायटल्स त्यात समाविष्ट करते आणि हे पूर्णपणे CPU चे काम आहे.
सामान्य VPS मध्ये GPU नसतो. त्यामुळे प्रत्येक ट्रान्सकोड CPU वर libx264/libx265 सह चालतो आणि सॉफ्टवेअर एन्कोडिंग खूप महाग पडते. एक सिंगल 1080p H.264 ट्रान्सकोड अनेक शेअर्ड vCPUs चा वापर पूर्णपणे करू शकतो; 4K किंवा HEVC ट्रान्सकोड सहसा रिअल-टाइममध्ये चालू शकत नाही, त्यामुळे प्लेबॅक थांबतो आणि सतत बफर होतो. हार्डवेअर ट्रान्सकोडिंग, ज्यामुळे Intel iGPU किंवा Nvidia कार्ड असलेल्या होम बॉक्सवर हे स्वस्त पडते, ते तुम्हाला उपलब्ध नसते, जोपर्यंत तुमचा प्रोव्हायडर GPU इन्स्टन्स भाड्याने देत नाही.
त्यामुळे VPS वरील संपूर्ण धोरण हेच आहे: ट्रान्सकोडिंग टाळा. तुमची लायब्ररी अशा कोडेक्समध्ये ठेवा जे तुमचे क्लायंट नेटिव्हली प्ले करू शकतात, जसे की H.264 व्हिडिओ, AAC किंवा AC3 ऑडिओ, MP4 किंवा MKV कंटेनरमध्ये. तसेच, असे क्लायंट ॲप्स निवडा जे direct-play करतात: Android TV, iOS आणि Roku साठी नेटिव्ह Jellyfin ॲप्स, तसेच Infuse, Kodi आणि डेस्कटॉप Jellyfin Media Player. असे केल्यास VPS कधीही ffmpeg ला स्पर्श करणार नाही आणि एक साधा 2 vCPU असलेला बॉक्स एकाच वेळी अनेक लोकांना स्ट्रीम करू शकेल. जर तुम्ही ट्रान्सकोडिंगचे नियोजन केले, तर तुम्हाला खूप मोठा आणि महागडा बॉक्स लागेल आणि तरीही 4K साठी ते फायदेशीर ठरणार नाही.
बँडविड्थचे गणितही करा, कारण हा आणखी एक अनपेक्षित मुद्दा आहे. Direct play मध्ये फाइल तिच्या मूळ bitrate ने पाठवली जाते. Compressed 1080p फाइलसाठी 8-12 Mbps, 1080p Blu-ray remux साठी 20-30 Mbps आणि 4K HDR साठी 40-80 Mbps बँडविड्थ लागते. 10 Mbps च्या फाइल्स तीन जण direct play करत असल्यास, तुमच्या VPS कडून सातत्याने 30 Mbps upload traffic बाहेर जाईल. तुमच्या प्लॅनमधील दोन आकडे तपासा: port speed (तो upstream दिशेने 30 Mbps पाठवू शकतो का?) आणि monthly transfer cap. दोन तासांचा 10 Mbps चित्रपट बाहेर जाणाऱ्या traffic मध्ये सुमारे 9 GB वापरतो. त्यामुळे metered 1 TB/month allowance मध्ये महिन्याला अशा शंभरपेक्षा थोडे अधिक चित्रपट, म्हणजे दररोज तीन किंवा चार चित्रपट, पाहता येतात. चार ते आठ पट bitrate असलेला 4K content पाहणारे household हा quota त्याहून खूप जलद संपवते. त्याच box मधून बाहेर जाणारा traffic निर्माण करणारी इतर कोणतीही सेवा याच budget मध्ये मोजा. यात self-hosted RustDesk relay चाही समावेश करा. दोन peers थेट connect होऊ शकत नसतील, तेव्हा तो संपूर्ण remote desktop session वाहून नेतो.
पूर्वअटी
- Ubuntu 24.04 चा नवीन KVM VPS, ज्यावर root किंवा sudo प्रवेश आणि Docker सह Compose plugin स्थापित आहे.
- मीडियासाठी एक block-storage volume, जो तुमच्या लायब्ररीच्या आकारानुसार असावा (खालील sizing पहा). VPS सोबत मिळणाऱ्या लहान root disk वर चित्रपट साठवू नका.
- जर तुम्हाला सार्वजनिक HTTPS प्रवेश हवा असेल तर एक domain name, किंवा जर तुम्हाला संपूर्ण सेटअप खाजगी ठेवायचा असेल तर त्याच VPS वर WireGuard VPN.
- असा मीडिया ज्याचे स्ट्रीमिंग करण्यासाठी तुम्ही कायदेशीररित्या पात्र आहात, जसे की तुमच्या स्वतःच्या rips, स्वतःचे रेकॉर्डिंग किंवा तुमच्या मालकीच्या फाइल्स.
प्रथम ब्लॉक स्टोरेज माउंट करा
तुमच्या प्रोव्हायडरच्या पॅनेलमध्ये व्हॉल्यूम जोडा, त्यानंतर तो शोधा आणि माउंट करा. lsblk मधून डिव्हाइसचे नाव मिळवा, ते /dev/sdb किंवा /dev/vdb सारखे असेल, ते कधीही रूट डिस्क नसेल.
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ते /dev/sdb द्वारे नव्हे, तर UUID द्वारे माउंट करा, कारण रीबूट दरम्यान डिव्हाइसची अक्षरे बदलू शकतात आणि तुम्ही चुकीची डिस्क फॉरमॅट किंवा माउंट करू शकता. /etc/fstab मध्ये एक ओळ जोडा:
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/media ext4 defaults,nofail 0 2sudo mount -a
df -h /mnt/medianofail महत्त्वाचे आहे: त्याशिवाय, जर ब्लॉक व्हॉल्यूम कधीही वेगळे केले गेले, तर सर्व्हर बूट होण्यास नकार देईल आणि आपत्कालीन शेलमध्ये (emergency shell) जाईल. येथे सर्वात मोठी चूक म्हणजे ज्या व्हॉल्यूममध्ये आधीच डेटा आहे त्यावर mkfs.ext4 चालवणे, यामुळे तो डेटा पुसला जातो. फक्त नवीन व्हॉल्यूम फॉरमॅट करा; जर डिस्कवर आधीच तुमची लायब्ररी असेल, तर थेट fstab ओळीवर जा.
Jellyfin ला अपेक्षित असलेल्या पद्धतीने मीडियाची मांडणी करा
Jellyfin फोल्डर आणि फाईलच्या नावांवरून मेटाडेटा जुळवते. जर मांडणी चुकीची असेल, तर चित्रपट विना-शीर्षक फाईल्स म्हणून दिसतात किंवा त्यांना पोस्टर मिळत नाही, किंवा एखादा भाग चुकीच्या मालिकेमध्ये समाविष्ट होतो. यासाठी नेमके तीन नियम आहेत: प्रत्येक चित्रपट त्याच्या स्वतःच्या Name (Year) फोल्डरमध्ये असावा आणि फाईलचे नावही तसेच असावे; सीझन फोल्डरना Season 01 असे नाव द्यावे, S01 असे नाही; भागांच्या फाईल्ससाठी S01E01 वापरावे; आणि विशेष भागांसाठी 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) हे केवळ सजावटीसाठी नसून, ते रिमेक ओळखण्यासाठी मदत करते जेणेकरून मॅचर योग्य शीर्षक निवडू शकेल. Movies आणि Shows यांना स्वतंत्र टॉप-लेव्हल फोल्डर्स म्हणून ठेवा, कारण प्रत्येक फोल्डर एका विशिष्ट प्रकारच्या आशयासाठी Jellyfin लायब्ररी बनते आणि त्यांना एकत्र केल्यास मेटाडेटा प्रोव्हायडर गोंधळू शकतो. Jellyfin फोटोंचे तिसरे फोल्डर देखील आनंदाने इंडेक्स करेल, परंतु हे एका समर्पित फोटो सर्व्हरच्या तुलनेत मर्यादित अनुभव देते. त्यामुळे जर तुमचे अल्बम्स महत्त्वाचे असतील, तर त्यांना PhotoPrism किंवा Immich चालवणाऱ्या स्वतंत्र सर्व्हरवर ठेवा आणि या सर्व्हरला फक्त चित्रपट आणि टीव्ही शोसाठी मर्यादित ठेवा.
परवानग्या: लायब्ररी रिकामी दिसण्याचे मुख्य कारण
हा तो गैरसमज आहे ज्यामुळे लोकांचा बराच वेळ वाया जातो. अधिकृत jellyfin/jellyfin इमेज PUID/PGID एन्वायरमेंट व्हेरिएबल्सचा आदर करत नाही, ते व्हेरिएबल्स LinuxServer.io इमेजशी (lscr.io/linuxserver/jellyfin) संबंधित आहेत. अधिकृत इमेजवर तुम्ही compose मधील user: की (key) द्वारे युजर नियंत्रित करता आणि जर तुम्ही ती वगळली, तर कंटेनर root म्हणून चालतो. तुम्ही कोणतीही इमेज वापरली तरी नियम एकच आहे: कंटेनर ज्या uid/gid वर चालतो, त्याला प्रत्येक मीडिया डिरेक्टरी वाचता आणि त्यात प्रवेश करता आली पाहिजे.
आम्ही uid/gid 1000 वर रन करू, जो स्टँडर्ड Ubuntu सिस्टमवरील पहिला नॉन-रूट युजर आहे. तुमचा uid/gid तपासा आणि मालकी हक्क (ownership) सेट करा:
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डिरेक्टरीजना केवळ रीड (read) परमिशन असून चालत नाही, तर त्यांना execute बिटची (755 मधील x) आवश्यकता असते. त्याशिवाय, कंटेनर फोल्डरमधील फाईल्सची यादी पाहू शकला तरी फोल्डरमध्ये प्रवेश करू शकत नाही. संपूर्ण लायब्ररी रिकामी राहण्यामागे मुख्य कारण म्हणजे पेरेंट डिरेक्टरी: जर कंटेनरच्या uid ला माऊंट पॉईंटमध्येच प्रवेश नसेल, तर तो /media/Movies किंवा /media/Shows पर्यंत पोहोचूच शकत नाही आणि लॉगमध्ये Access to the path ... is denied एरर येऊन संपूर्ण लायब्ररी रिकामी दिसते. ज्या मीडिया फोल्डरला कंटेनर वाचू शकत नाही, त्याची नोंद लॉगमध्ये होते आणि तो फोल्डर वगळला जातो. म्हणूनच, एका फोल्डरमध्ये बदल करण्याऐवजी आम्ही रिकर्सिव्हली (recursively) chown करतो आणि प्रत्येक डिरेक्टरीवर execute बिट सेट करतो.
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.comएका ओळीचा अर्थ: user: "1000:1000" हे प्रत्यक्ष फाईल परवानग्या सेट करते, जे वरील मालकी हक्काशी (ownership) जुळते. /config मध्ये संपूर्ण सर्व्हर, अकाउंट्स, लायब्ररी, मेटाडेटा आणि वॉच स्टेट असते, त्यामुळे ते writable असणे आवश्यक आहे आणि याच गोष्टीचा तुम्ही बॅकअप घेता. /cache हे तात्पुरते काम करण्यासाठीचे (working space) ठिकाण आहे. मीडिया माउंट :ro हे हेतुपुरस्सर read-only ठेवले आहे: Jellyfin डीफॉल्टनुसार आर्टवर्क आणि मेटाडेटा /config अंतर्गत साठवते, त्यामुळे त्याला तुमच्या लायब्ररीमध्ये काहीही लिहिण्याची गरज नसते. read-only स्वरूप तुमच्या फाईल्सना चुकून होणाऱ्या डिलीटपासून किंवा खराब प्लगइनपासून सुरक्षित ठेवते. पोर्ट हेतुपुरस्सर 127.0.0.1 वर बाइंड केला आहे, कारण Jellyfin चे वेब लॉगिन साध्या HTTP वर चालते, म्हणून आपण 8096 हे पोर्ट सार्वजनिक इंटरनेटवर कधीही उघड करत नाही. JELLYFIN_PublishedServerUrl हा तो पत्ता आहे जो सर्व्हर लोकल ऑटो-डिस्कव्हरीसाठी (LAN UDP ब्रॉडकास्ट) वापरतो. त्यामुळे इंटरनेटवरील क्लायंटना तो दिसत नाही आणि ते फक्त तुम्ही ॲपमध्ये टाईप केलेल्या URL चा वापर करतात. हा पत्ता क्लायंटना माहिती असावा अशा प्रकारे सेट करा आणि रिमोट उपकरणांवर ती URL स्वतः हाताने टाकण्याची अपेक्षा ठेवा.
compose डिरेक्टरीमधून सर्व्हिस सुरू करा:
docker compose up -d
docker logs -f jellyfinपहिली वेळ: सेटअप विझार्ड आणि तुमच्या लायब्ररी
पोर्ट localhost ला बाइंड केलेला असल्याने, फायरवॉलमध्ये छिद्र पाडण्याऐवजी तुमच्या लॅपटॉपवरून SSH टनेलद्वारे विझार्ड उघडा:
ssh -L 8096:127.0.0.1:8096 you@your-vps-ipआता http://localhost:8096 वर ब्राउझ करा. विझार्ड तुम्हाला भाषेची निवड करण्यास सांगेल, त्यानंतर strong password असलेला admin user तयार करण्यास सांगेल. हे खाते तुमच्या सर्व्हरचे मुख्य खाते आहे, त्यामुळे जुना किंवा असुरक्षित पासवर्ड वापरू नका. तुमची पहिली लायब्ररी जोडा: आशयाचा प्रकार Movies निवडा, त्याला /media/Movies कडे निर्देशित करा (हे कंटेनरच्या आतला मार्ग आहे, होस्टचा मार्ग नाही), आणि Shows साठी /media/Shows वापरून हीच प्रक्रिया पुन्हा करा. प्रक्रिया पूर्ण करा, त्यानंतर Jellyfin स्कॅन सुरू करेल. जर सर्व काही व्यवस्थित असेल, तर लहान लायब्ररीसाठी एक-दोन मिनिटांत पोस्टर्स आणि शीर्षके दिसू लागतील. लायब्ररी नंतर जोडण्यासाठी किंवा संपादित करण्यासाठी Dashboard → Libraries वर जा आणि Scan All Libraries वापरून स्कॅन सक्तीने पूर्ण करा.
जर तुम्ही ट्रान्सकोडिंगवर अवलंबून असाल, तर Dashboard → Playback → Transcoding उघडा आणि transcode temp path /cache/transcodes वर सेट करा, जेणेकरून तात्पुरती फाईल्स /config ची जागा न भरता कॅशे व्हॉल्यूमवर राहतील. हार्डवेअर ॲक्सिलरेशन None वरच ठेवा, कारण ट्रान्सकोडिंगसाठी येथे कोणताही GPU उपलब्ध नाही.
रिमोट ॲक्सेस: TLS रिव्हर्स प्रॉक्सी, किंवा VPN वर सुरक्षित ठेवा
Jellyfin बाहेरून ॲक्सेस करण्यासाठी तुमच्याकडे दोन सुरक्षित मार्ग आहेत आणि एक असुरक्षित मार्ग आहे जो टाळला पाहिजे. पोर्ट 8096 थेट इंटरनेटवर उघडे ठेवणे हा असुरक्षित मार्ग आहे: यामध्ये लॉगिन माहिती प्लेन टेक्स्टमध्ये जाते आणि काही तासांतच पोर्टवर ब्रूट-फोर्स हल्ले सुरू होतात.
पर्याय A, TLS रिव्हर्स प्रॉक्सी. Jellyfin ला एका सबडोमेनवर Docker ॲप्ससाठी स्वयंचलित TLS सह Traefik च्या मागे ठेवा, किंवा Certbot द्वारे जारी केलेल्या Let's Encrypt प्रमाणपत्रासह nginx च्या मागे ठेवा. Jellyfin रिअल-टाइम अपडेट्ससाठी WebSockets वापरते, त्यामुळे प्रॉक्सीने अपग्रेड हेडर्स फॉरवर्ड करणे आवश्यक आहे. Traefik हे आपोआप करते; nginx मध्ये हे स्पष्टपणे नमूद करावे लागते आणि अपस्ट्रीमसाठी HTTP/1.1 आवश्यक असते, अन्यथा अपग्रेड कधीच होत नाही:
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";
}JELLYFIN_PublishedServerUrl ला https:// पत्त्यावर सेट करा जेणेकरून स्थानिक ऑटो-डिस्कव्हरी योग्य URL दर्शवेल, रिमोट ॲप्स तुम्ही दिलेल्या पत्त्याचा वापर करतील, आणि लॉगिनवर होणारे ब्रूट-फोर्स हल्ले रोखण्यासाठी fail2ban जोडा. सर्व्हर सार्वजनिक झाल्यावर, Uptime Kuma ला त्या URL वर पॉइंट करा जेणेकरून वापरकर्त्यांना समजण्याआधी तुम्हाला सर्व्हर डाउन झाल्याची माहिती मिळेल.
पर्याय B, VPN द्वारे खाजगी ठेवा. पोर्ट 8096 अजिबात सार्वजनिक करू नका; Jellyfin पर्यंत पोहोचण्यासाठी फक्त त्याच बॉक्सवर टर्मिनेट होणाऱ्या WireGuard टनेलचा वापर करा. घरगुती वापरासाठी हा सर्वात सोपा आणि सुरक्षित पर्याय आहे, ज्यामध्ये प्रमाणपत्राची गरज नाही, सार्वजनिक एक्सपोजर नाही आणि ब्रूट-फोर्सचा धोका नाही. कंटेनरला टनेल ॲड्रेस किंवा localhost वर बाइंड करा आणि VPN द्वारे कनेक्ट करा. टनेल सेटअपसाठी खाजगी VPS साठी WireGuard VPN सेटअप पहा.
स्टोरेज आकार आणि बॅकअप
फाईलच्या संख्येपेक्षा गुणवत्तेनुसार बजेट ठरवा. कॉम्प्रेस केलेल्या 1080p फिल्म्स प्रत्येकी 4-15 GB च्या असतात; 1080p remux 20-40 GB; 1080p टीव्ही मालिकेचा एक सीझन 15-40 GB; आणि 4K मधील कोणतीही गोष्ट प्रति फिल्म 40-100 GB घेते. काही शंभर फिल्म्स आणि काही मालिकांच्या लायब्ररीसाठी 2-4 TB व्हॉल्यूमची आवश्यकता असते. नंतर स्थलांतर (migrate) करण्यापेक्षा एकदाच जास्त क्षमतेचा ब्लॉक व्हॉल्यूम घेणे स्वस्त पडते.
/config ही संपूर्ण सर्व्हरची स्थिती आहे, त्यामुळे ती एकमेव गोष्ट आहे ज्याचा बॅकअप तुम्ही घेतलाच पाहिजे. स्नॅपशॉट घ्या किंवा tar वापरून ती थांबवा आणि त्याची प्रत सर्व्हरच्या बाहेर ठेवा:
docker compose down
sudo tar czf jellyfin-config-$(date +%F).tgz -C ~/jellyfin config
docker compose up -d/cache आणि ट्रान्सकोड फोल्डर हे पुन्हा तयार करता येण्याजोगे (disposable) असतात. /mnt/media वरील मीडियाचा बॅकअप तुम्ही स्वतंत्रपणे घेऊ शकता किंवा तो पुन्हा रिप (re-rippable) करता येईल हे स्वीकारू शकता; आकार मोठा असल्याने बहुतेक लोक दुसरा पर्याय निवडतात. अपग्रेड्स docker compose pull && docker compose up -d असतात; वरील :10 टॅग 10.x मेजर व्हर्जनमध्येच राहतो, त्यामुळे पुढील मेजर व्हर्जनवर जाणे हा एक जाणीवपूर्वक केलेला टॅग बदल असतो. बदल करण्यापूर्वी Jellyfin रिलीज नोट्स वाचा, कारण मेजर व्हर्जनमध्ये लायब्ररी स्कीमा मायग्रेशन होऊ शकते. एक पिन केलेला टॅग आणि एक बॅकअप घेतलेली स्टेट डिरेक्टरी हे कोणत्याही नेहमी चालू राहणाऱ्या कंटेनरसाठीचे संपूर्ण सूत्र आहे, आणि रीबूटनंतरही सेल्फ-होस्टेड एजंटची मेमरी आणि शेड्युल जिवंत ठेवण्यासाठी हेच पॅटर्न वापरले जाते.
अपयशाचे प्रकार आणि दिसणारे संदेश
स्कॅन केल्यानंतर लायब्ररी रिकामी दिसते. Dashboard → Logs (किंवा ~/jellyfin/config/log/log_*.log) मधील लॉगमध्ये खालीलप्रमाणे संदेश दिसतो:
System.UnauthorizedAccessException: Access to the path '/media/Movies' is denied.कंटेनरचा uid त्या पाथला वाचू शकत नाही. कारण: मीडियाची मालकी root कडे असणे किंवा तुमच्या user: मूल्यापेक्षा वेगळा uid असणे, डिरेक्टरीचा execute bit गहाळ असणे, किंवा मूळ mount पॉइंट त्या uid साठी प्रवेशयोग्य नसणे. उपाय: chown -R 1000:1000 /mnt/media, डिरेक्टरी 755, फाइल्स 644 साठी योग्य परवानग्या सेट करा आणि पुन्हा स्कॅन करा.
प्लेबॅकमुळे CPU वर ताण येतो आणि बफरिंग होते. docker stats jellyfin मध्ये CPU वापर तुमच्या कोअर संख्येच्या 100% च्या जवळ दिसतो आणि Dashboard → Playback मध्ये सेशन Transcode म्हणून दिसते, ज्याचा वेग 1.0x पेक्षा कमी आहे. क्लायंट थेट प्ले (direct-play) करत नाहीये, त्यामुळे VPS CPU-transcoding रिअल-टाइमपेक्षा संथ करत आहे आणि मागे पडत आहे. कारण: असमर्थित (unsupported) कोडेक किंवा कंटेनर, सबटायटल बर्न-इन, किंवा HDR टोन-मॅपिंग. उपाय: डायरेक्ट-प्ले क्लायंट वापरा, सोर्स फाइल्स H.264/AAC फॉरमॅटमध्ये ठेवा, इमेज सबटायटल्स (PGS/VOBSUB) ऐवजी text सबटायटल्स (SRT) वापरा (कारण इमेज सबटायटल्स बर्न-इन करण्यास भाग पाडतात), आणि केवळ CPU असलेल्या सर्व्हरवर 4K HDR वापरणे टाळा.
"No compatible streams are available." हा पूर्ण संदेश सहसा असा असतो: "This client isn't compatible with the media and the server isn't sending a compatible media format." क्लायंटने सोर्स नाकारला आहे आणि फॉलबॅक ट्रान्सकोड देखील सुरू होऊ शकला नाही. कारण: सदोष ffmpeg कमांड, वाचता न येणारी फाइल, किंवा वापरकर्त्याच्या प्रोफाइलमध्ये व्हिडिओ कन्व्हर्जनवर घातलेली बंदी. उपाय: Dashboard → Logs मधील ffmpeg ओळ वाचा, फाइल प्ले होतेय का ते तपासा, जर तुम्ही ट्रान्सकोडिंगवर अवलंबून असाल तर वापरकर्त्याच्या प्लेबॅक परवानग्या तपासा, आणि ब्राउझर कोडेकच्या समस्या दूर करण्यासाठी दुसऱ्या क्लायंटवर प्रयत्न करा.
चित्रपटांचे पोस्टर दिसत नाही किंवा चुकीचे पोस्टर दिसते. मेटाडेटा जुळला नाही. कारण: चित्रपट त्याच्या स्वतःच्या Name (Year) फोल्डरमध्ये नसणे, सीझन फोल्डरचे नाव Season 01 ऐवजी S01 असणे, एपिसोड्स S01E01 फॉरमॅटमध्ये नसणे, किंवा वर्षाचा उल्लेख नसणे. उपाय: वरील रचनेनुसार नावे बदला, त्यानंतर Refresh metadata → Replace all करा, किंवा योग्य TMDB/TVDB एन्ट्री निवडण्यासाठी एका विशिष्ट आयटमवर Identify वापरा.
FAQ
GPU शिवाय VPS वर व्हिडिओ ट्रान्सकोड करणे शक्य आहे का?
हो, पण ते फक्त CPU वर अवलंबून असते आणि ते खर्चिक आहे. एक 1080p सॉफ्टवेअर ट्रान्सकोड अनेक vCPUs चा वापर करू शकतो. 4K किंवा HEVC फॉरमॅट रिअल-टाइममध्ये ट्रान्सकोड करणे कठीण असते, ज्यामुळे प्लेबॅक बफर होतो. ट्रान्सकोडिंग टाळणे हाच उत्तम पर्याय आहे: तुमची लायब्ररी H.264/AAC फॉरमॅटमध्ये ठेवा आणि अशा क्लायंट ॲप्सचा वापर करा जे थेट प्ले (direct-play) करू शकतात, जेणेकरून VPS फक्त डेटा स्ट्रीम करेल. जर तुम्हाला खरोखरच ऑन-द-फ्लाय ट्रान्सकोडिंगची गरज असेल, तरच GPU इन्स्टन्स भाड्याने घ्या.
स्कॅन केल्यानंतर माझी Jellyfin लायब्ररी रिकामी का दिसते?
याचे मुख्य कारण सहसा परवानग्या (permissions) हे असते. अधिकृत jellyfin/jellyfin इमेज तुम्ही सेट केलेल्या user: (किंवा root) नुसार चालते. जर त्या फाइल्स त्या uid ला वाचता येत नसतील, तर स्कॅन लॉगमध्ये Access to the path ... is denied त्रुटी येते आणि त्या फाइल्स वगळल्या जातात. chown -R 1000:1000 /mnt/media वापरून मालकी हक्क (ownership) दुरुस्त करा, डिरेक्टरीजना एक्झिक्युट बिट (755) द्या आणि पुन्हा स्कॅन करा. पॅरेंट डिरेक्टरी देखील तपासा, कारण जर कंटेनरच्या uid ला /mnt/media मध्ये प्रवेश नसेल, तर तो लायब्ररी फोल्डरपर्यंत पोहोचू शकत नाही आणि सर्व काही रिकामे दिसते. दुसरे सामान्य कारण म्हणजे फोल्डरची रचना Jellyfin च्या अपेक्षेप्रमाणे नसणे.
मी Jellyfin ला सुरक्षितपणे रिमोट ॲक्सेस कसे करू शकतो?
यासाठी दोन चांगले पर्याय आहेत. एक म्हणजे, त्याला सबडोमेनवर TLS रिव्हर्स प्रॉक्सीच्या मागे ठेवा, जेणेकरून लॉगिन आणि स्ट्रीम एनक्रिप्टेड राहतील. तसेच fail2ban वापरा. पोर्ट 8096 कधीही उघडे ठेवू नका, कारण ते पासवर्ड प्लेन-टेक्स्टमध्ये पाठवते. दुसरा पर्याय म्हणजे, ते पूर्णपणे खाजगी ठेवा आणि फक्त VPN द्वारे ॲक्सेस करा, जे घरगुती वापरासाठी सर्वात सोपा आणि सुरक्षित पर्याय आहे. ॲप्सना थेट सार्वजनिक पत्ता द्या, कारण ऑटो-डिस्कव्हरी ही स्थानिक नेटवर्क ब्रॉडकास्ट असते आणि ती इंटरनेटवरून येणाऱ्या क्लायंटपर्यंत पोहोचत नाही.
Jellyfin VPS साठी किती डिस्क आणि बँडविड्थ लागते?
डिस्कची गरज गुणवत्तेवर अवलंबून असते: 1080p कॉम्प्रेस्ड फिल्मसाठी 4-15 GB, रिमक्ससाठी 20-40 GB आणि 4K साठी 40-100 GB गृहीत धरा. त्यामुळे बहुतेक लायब्ररीसाठी 2-4 TB ब्लॉक व्हॉल्यूमची गरज असते. बँडविड्थ ही डायरेक्ट-प्ले बिटरेटवर ठरते; 1080p स्ट्रीमसाठी 8-12 Mbps आणि 4K साठी त्यापेक्षा जास्त लागते. त्यामुळे तुमच्या पोर्टची गती एकाच वेळी किती प्रेक्षक पाहू शकतात हे हाताळू शकते का ते तपासा आणि मासिक ट्रान्सफर मर्यादेवर लक्ष ठेवा. जर तुम्ही ट्रान्सकोडिंग करणार असाल, तर CPU ची क्षमता वाढवा; जर तुम्ही डायरेक्ट-प्ले करणार असाल, तर कोअर्सपेक्षा बँडविड्थला प्राधान्य द्या.
VPS वर Jellyfin चालवणे कायदेशीर आहे का?
Jellyfin हे स्वतः एक मोफत आणि ओपन-सोर्स सॉफ्टवेअर आहे आणि ते चालवणे पूर्णपणे कायदेशीर आहे. महत्त्वाचे म्हणजे तुम्ही काय स्ट्रीम करता: फक्त तुमच्या मालकीचे किंवा ज्याचे परवाने तुमच्याकडे आहेत असे मीडिया, स्वतःचे डिस्क रिप्स, रेकॉर्डिंग किंवा ज्या फाइल्स ठेवण्याचा तुम्हाला अधिकार आहे, अशाच फाइल्स स्ट्रीम करा. Jellyfin स्वतः कोणताही मीडिया पुरवत नाही किंवा मिळवण्याचा मार्गही देत नाही; हे फक्त तुमच्या मालकीच्या लायब्ररीसाठी एक प्लेयर आहे.