SSD Nodes Learn
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-07-24

VPS এ Jellyfin সেটআপ করার নিয়ম

Docker ব্যবহার করে VPS এ Jellyfin সেটআপ করুন। media permissions এবং CPU transcoding সংক্রান্ত সমস্যা সমাধানের বিস্তারিত গাইড এখানে পাবেন।

আপনি যা তৈরি করছেন

একটি VPS-এ Jellyfin media server: একটি container, তিনটি volume, এবং একটি block-storage disk যা আপনার film এবং show ধারণ করবে। এটি যেকোনো browser বা Jellyfin app থেকে অ্যাক্সেস করা যাবে। এর installation প্রক্রিয়াটি একটি ১৫ লাইনের compose file। পরবর্তীতে যেকোনো সমস্যা মূলত দুটি কারণে হতে পারে — container দ্বারা পড়া সম্ভব নয় এমন file permissions, অথবা একটি GPU-less VPS-কে ভিডিও transcode করার জন্য বলা। এই গাইডটির বেশিরভাগ অংশ এই দুটি বিষয় নিয়ে আলোচনা করবে, কারণ বেশিরভাগ support ticket এখান থেকেই আসে।

Jellyfin সম্পূর্ণ free এবং open source; এতে কোনো account, কোনো paywalled feature, বা telemetry নেই — এই কারণেই এটি things worth self-hosting in 2026 তালিকার প্রায় প্রতিটি তালিকায় স্থান পায়। এটি শুধুমাত্র আপনার মালিকানাধীন media প্লে করে। এটি কোনো content প্রদান করে না, এবং এই গাইডটি কোনো content সংগ্রহ করার বিষয়ে নয়।

কোনো কিছু ভাড়া করার আগে ট্রান্সকোডিংয়ের বাস্তবতা জানুন

এটি প্রথমে পড়ুন, কারণ এটি আপনার কেনাকাটার সিদ্ধান্ত পরিবর্তন করে দেবে। আপনি যখন play বাটনে চাপ দেন, তখন একটি media server দুটি কাজের একটি করে। Direct play ফাইলটিকে হুবহু স্ট্রিম করে: VPS ডিস্ক থেকে bytes পড়ে নেয় এবং সরাসরি পাঠিয়ে দেয়, এতে CPU এর ব্যবহার প্রায় শূন্য। Transcoding ভিডিওটিকে রিয়েল-টাইমে পুনরায় এনকোড করে — যেমন নতুন resolution, নতুন codec, অথবা সাবটাইটেল বার্ন করা — এবং এটি সম্পূর্ণ CPU নির্ভর কাজ।

একটি সাধারণ VPS-এ কোনো GPU থাকে না। তাই প্রতিটি transcode libx264/libx265 সহ CPU-তে চলে এবং software encoding অনেক ব্যয়বহুল। একটি মাত্র 1080p H.264 transcode বেশ কিছু shared vCPU-কে পূর্ণ ক্ষমতা দিয়ে ব্যবহার করতে পারে; 4K বা HEVC transcode সাধারণত রিয়েল-টাইমে চলতে পারে না, ফলে প্লেব্যাক আটকে যায় এবং সারাক্ষণ buffering হতে থাকে। Hardware transcoding — যা Intel iGPU বা Nvidia কার্ড থাকা হোম পিসিতে এই কাজটিকে সস্তা করে তোলে — আপনার জন্য সহজলভ্য নয়, যদি না আপনার প্রোভাইডার GPU instance ভাড়া দেয়।

তাই VPS ব্যবহারের মূল কৌশল হলো: transcoding এড়িয়ে চলা। আপনার লাইব্রেরি এমন codec-এ রাখুন যা ক্লায়েন্টরা natively চালাতে পারে — যেমন H.264 ভিডিও, AAC বা AC3 অডিও, এবং MP4 বা MKV container — এবং এমন ক্লায়েন্ট অ্যাপ বেছে নিন যা direct-play সাপোর্ট করে: Android TV, iOS এবং Roku-এর জন্য native Jellyfin অ্যাপ, এছাড়া Infuse, Kodi, এবং desktop Jellyfin Media Player। এটি করলে VPS কখনোই ffmpeg ব্যবহার করবে না এবং একটি সাধারণ 2 vCPU বক্স দিয়ে একসাথে অনেক মানুষের কাছে স্ট্রিম করা সম্ভব। আপনি যদি transcoding করার পরিকল্পনা করেন, তবে আপনার অনেক বড় এবং দামী বক্স প্রয়োজন হবে, এমনকি সেক্ষেত্রেও 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 প্রয়োজন হবে। আপনার প্ল্যানে দুটি বিষয় পরীক্ষা করুন: port speed (এটি কি 30 Mbps upstream পাঠাতে পারে?) এবং মাসিক transfer cap। ১০ Mbps গতির একটি দুই ঘণ্টার চলচ্চিত্র প্রায় 9 GB ডেটা খরচ করে, তাই মাসে ১ TB ডেটা বরাদ্দ থাকলে আপনি মাসে ১০০টির কিছু বেশি চলচ্চিত্র (দিনে ৩ বা ৪টি) দেখতে পারবেন — কিন্তু একটি পরিবার যদি 4K ভিডিও দেখে, যা bitrate-এর দিক থেকে ৪ থেকে ৮ গুণ বেশি, তবে ডেটা অনেক দ্রুত শেষ হয়ে যাবে।

Prerequisites

  • একটি নতুন Ubuntu 24.04 KVM VPS যাতে root বা sudo অ্যাক্সেস আছে, এবং Docker ও Compose plugin ইনস্টল করা আছে।
  • মিডিয়া সংরক্ষণের জন্য একটি block-storage volume, যা আপনার লাইব্রেরির আকার অনুযায়ী নির্ধারণ করতে হবে (নিচে sizing দেখুন)। VPS-এর সাথে থাকা ছোট root disk-এ আপনার ফিল্মগুলো রাখা উচিত নয়।
  • আপনি যদি পাবলিক HTTPS অ্যাক্সেস চান তবে একটি domain name, অথবা সবকিছু প্রাইভেট রাখতে চাইলে একই VPS-এ WireGuard VPN
  • এমন মিডিয়া যা স্ট্রিম করার আইনি অধিকার আপনার আছে — আপনার নিজস্ব rips, আপনার নিজস্ব রেকর্ডিং, অথবা আপনার মালিকানাধীন ফাইল।

প্রথমে block storage mount করুন

আপনার provider-এর panel থেকে volume-টি attach করুন, তারপর এটি খুঁজে বের করে mount করুন। device name-টি lsblk থেকে সংগ্রহ করুন — এটি /dev/sdb বা /dev/vdb এর মতো কিছু হবে, এটি কখনোই root disk হবে না।

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

এটি UUID দিয়ে mount করুন, /dev/sdb দিয়ে নয়; কারণ reboot করার সময় device letter পরিবর্তন হয়ে যায় এবং আপনি ভুল disk format বা mount করে ফেলতে পারেন। /etc/fstab ফাইলে একটি লাইন যোগ করুন:

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

nofail অত্যন্ত গুরুত্বপূর্ণ: এটি না থাকলে, যদি block volume-টি কখনো detach করা হয়, তবে system boot হতে ব্যর্থ হবে এবং emergency shell-এ চলে যাবে। এখানে সবচেয়ে বড় ভুল হলো এমন একটি volume-এ mkfs.ext4 চালানো যাতে ইতিমধ্যে data আছে — এটি সব data মুছে ফেলে। শুধুমাত্র নতুন volume format করুন; যদি disk-এ ইতিমধ্যে আপনার library থাকে, তবে সরাসরি fstab লাইনটি ব্যবহার করুন।

Jellyfin-এর উপযোগী মিডিয়া বিন্যাস তৈরি করুন

Jellyfin ফোল্ডার এবং ফাইলের নামের মাধ্যমে metadata শনাক্ত করে। বিন্যাস ভুল হলে মুভিগুলো কোনো পোস্টার ছাড়াই untitled ফাইল হিসেবে দেখাবে, অথবা কোনো এপিসোড ভুল সিরিজের সাথে মিলে যেতে পারে। এখানে তিনটি নিয়ম রয়েছে: প্রতিটি মুভি তার নিজস্ব Name (Year) ফোল্ডারে থাকতে হবে এবং ফাইলের নাম মিল থাকতে হবে; season ফোল্ডারগুলোর নাম Season 01 হতে হবে, S01 নয়; এপিসোড ফাইলগুলোতে S01E01 ব্যবহার করতে হবে; এবং specials ফাইলগুলো 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 কে আলাদা top-level ফোল্ডার হিসেবে রাখুন, কারণ প্রতিটি আলাদা Jellyfin library হিসেবে কাজ করে। এগুলো মিশিয়ে ফেললে metadata provider বিভ্রান্ত হতে পারে।

Permissions: লাইব্রেরি খালি হওয়ার প্রধান কারণ

এটি একটি ভুল ধারণা যা মানুষের অনেক সময় নষ্ট করে। অফিসিয়াল jellyfin/jellyfin ইমেজে PUID/PGID environment variables কাজ করে না — এগুলো LinuxServer.io ইমেজের (lscr.io/linuxserver/jellyfin) বৈশিষ্ট্য। অফিসিয়াল ইমেজে আপনি compose-এর user: key ব্যবহার করে ইউজার নিয়ন্ত্রণ করতে পারেন; এটি না দিলে কন্টেইনারটি root হিসেবে চলবে। আপনি যে ইমেজই ব্যবহার করুন না কেন, নিয়মটি একই: কন্টেইনারটি যে uid/gid হিসেবে চলছে, তাকে অবশ্যই প্রতিটি media directory পড়তে এবং traverse করতে সক্ষম হতে হবে।

আমরা uid/gid 1000 হিসেবে চালাবো, যা একটি standard Ubuntu বক্সের প্রথম non-root ইউজার। আপনার ইউজার আইডি নিশ্চিত করুন এবং 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 bit (755-এ x) প্রয়োজন — এটি না থাকলে কন্টেইনার ফোল্ডারের নাম দেখতে পারলেও ফোল্ডারের ভেতরে প্রবেশ করতে পারবে না। পুরো লাইব্রেরি খালি হয়ে যাওয়ার মূল কারণ হলো parent directory: যদি কন্টেইনারের uid মাউন্ট করা ফোল্ডারের ভেতর প্রবেশ করতে না পারে, তবে এটি /media/Movies বা /media/Shows-এ পৌঁছাতে পারবে না। ফলে লগ-এ Access to the path ... is denied দেখাবে এবং লাইব্রেরিটি সম্পূর্ণ খালি হয়ে যাবে। যে media folderটি পড়া সম্ভব নয়, সেটি লগ-এ রেকর্ড করা হয় এবং স্কিপ করা হয়; ফলে root হিসেবে কপি করা ফাইলের একটি বড় সেট লাইব্রেরি থেকে অদৃশ্য হয়ে যায়। এই কারণেই আমরা একটি ফোল্ডার ঠিক করার পরিবর্তে রিকার্সিভভাবে chown করি এবং প্রতিটি ডিরেক্টরিতে execute bit সেট করি।

The docker-compose file

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

Line by line: user: "1000:1000" আসলে file permissions সেট করে, যা উপরের ownership-এর সাথে সামঞ্জস্যপূর্ণ। /config পুরো server-টি ধারণ করে — accounts, libraries, metadata, এবং watch state — তাই এটি writable হতে হবে এবং এটিই আপনি backup হিসেবে ব্যবহার করবেন। /cache হলো throwaway working space। Media mount টি উদ্দেশ্যমূলকভাবে :ro (read-only) রাখা হয়েছে: Jellyfin ডিফল্টভাবে artwork এবং metadata /config-এর অধীনে স্টোর করে, তাই আপনার library-তে লেখার প্রয়োজন হয় না; read-only মোড আপনার ফাইলগুলোকে accidental delete বা কোনো bad plugin থেকে রক্ষা করে। Port টি ইচ্ছা করেই 127.0.0.1-এর সাথে bind করা হয়েছে — Jellyfin-এর web login হলো plain HTTP, তাই আমরা 8096 কে public internet-এ publish করি না। JELLYFIN_PublishedServerUrl হলো সেই address যা serverটি local autodiscovery-এর জন্য ব্যবহার করে — এটি একটি LAN UDP broadcast, তাই internet-এর ক্লায়েন্টরা এটি দেখতে পায় না এবং সরাসরি আপনার অ্যাপে টাইপ করা URL ব্যবহার করে। এটিকে সেই address হিসেবে সেট করুন যা ক্লায়েন্টদের জানানো উচিত, এবং রিমোট ডিভাইসে সেই URL হাতে টাইপ করার জন্য প্রস্তুত থাকুন।

Compose directory থেকে এটি চালু করুন:

docker compose up -d
docker logs -f jellyfin

প্রথমবার চালানো: setup wizard এবং আপনার libraries

যেহেতু port টি localhost এর সাথে bound করা আছে, তাই firewall-এ hole খোলার পরিবর্তে আপনার laptop থেকে একটি SSH tunnel এর মাধ্যমে wizard টি অ্যাক্সেস করুন:

ssh -L 8096:127.0.0.1:8096 you@your-vps-ip

এখন http://localhost:8096 লিঙ্কে যান। Wizard টি আপনাকে প্রথমে ভাষা নির্বাচন করতে এবং তারপর একটি strong password সহ admin user তৈরি করতে সাহায্য করবে — এই অ্যাকাউন্টটি আপনার server, তাই কোনো অস্থায়ী password ব্যবহার করবেন না। আপনার প্রথম library যোগ করুন: content type হিসেবে Movies নির্বাচন করুন, /media/Movies পাথটি নির্দেশ করুন (এটি container এর ভেতরের পাথ, host path নয়), এবং /media/Shows পাথে Shows এর জন্য একই প্রক্রিয়া অনুসরণ করুন। কাজ শেষ হলে Jellyfin স্ক্যান শুরু করবে। ছোট library এর ক্ষেত্রে এক বা দুই মিনিটের মধ্যে poster এবং title চলে আসা মানে স্ক্যান সফল হয়েছে। পরবর্তীতে library যোগ বা পরিবর্তন করতে Dashboard → Libraries ব্যবহার করুন, এবং Scan All Libraries দিয়ে পুনরায় স্ক্যান করতে বাধ্য করুন।

আপনি যদি transcoding ব্যবহার করেন, তবে Dashboard → Playback → Transcoding ওপেন করুন এবং transcode temp path হিসেবে /cache/transcodes সেট করুন। এতে অতিরিক্ত ফাইলগুলো cache volume-এ জমা হবে এবং /config এর জায়গা দখল করবে না। Hardware acceleration None হিসেবে রাখুন — কারণ এখানে acceleration করার জন্য কোনো GPU নেই।

Remote access: TLS reverse proxy, অথবা VPN ব্যবহার করুন

বাইরে থেকে Jellyfin ব্যবহার করার জন্য আপনার কাছে দুটি নিরাপদ পদ্ধতি আছে এবং একটি অনিরাপদ পদ্ধতি আছে যা এড়িয়ে চলা উচিত। অনিরাপদ পদ্ধতিটি হলো সরাসরি ইন্টারনেটে port 8096 পাবলিশ করা: এতে login তথ্য cleartext হিসেবে আদান-প্রদান হয় এবং কয়েক ঘণ্টার মধ্যেই port-টি brute-force আক্রমণের শিকার হয়।

Option A — TLS reverse proxy. Jellyfin-কে একটি subdomain-এ রাখুন। এটি Traefik with automatic TLS for your Docker apps অথবা Let's Encrypt certificate issued by Certbot সহ nginx-এর পেছনে রাখতে পারেন। Jellyfin রিয়েল-টাইম আপডেটের জন্য WebSockets ব্যবহার করে, তাই proxy-কে অবশ্যই upgrade headers ফরওয়ার্ড করতে হবে। Traefik এটি স্বয়ংক্রিয়ভাবে করে; কিন্তু nginx-এর ক্ষেত্রে এগুলো স্পষ্টভাবে উল্লেখ করতে হয় এবং upstream-এর জন্য HTTP/1.1 প্রয়োজন, অন্যথায় upgrade সম্পন্ন হবে না:

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:// অ্যাড্রেসে সেট করুন যাতে যেকোনো local autodiscovery সঠিক URL প্রদান করতে পারে — রিমোট অ্যাপগুলো আপনার দেওয়া অ্যাড্রেসটিই ব্যবহার করে — এবং login সুরক্ষিত করতে fail2ban to slow brute-force attempts যোগ করুন। সার্ভারটি পাবলিক করার পর, Uptime Kuma-কে ওই URL-এ পয়েন্ট করুন যাতে ভিউয়ারদের আগে আপনি ডাউনটাইম সম্পর্কে জানতে পারেন।

Option B — VPN ব্যবহার করে প্রাইভেট রাখুন। 8096 পোর্টটি একেবারেই পাবলিশ করবেন না; শুধুমাত্র একই মেশিনে থাকা একটি WireGuard tunnel-এর মাধ্যমে Jellyfin ব্যবহার করুন। একটি পরিবারের জন্য এটি সবচেয়ে সহজ এবং নিরাপদ পছন্দ — কোনো certificate প্রয়োজন নেই, কোনো public exposure নেই এবং brute-force আক্রমণের ঝুঁকি নেই। container-টিকে tunnel address অথবা localhost-এর সাথে bind করুন এবং VPN-এর মাধ্যমে কানেক্ট করুন। tunnel সেটআপ করার জন্য WireGuard VPN setup for a private VPS দেখুন।

Storage sizing এবং backups

ফাইলের সংখ্যার বদলে গুণমান অনুযায়ী বাজেট নির্ধারণ করুন। Compressed 1080p film প্রতিটির সাইজ 4-15 GB; একটি 1080p remux 20-40 GB; একটি 1080p TV season 15-40 GB; যেকোনো 4K ফাইল প্রতিটির সাইজ 40-100 GB। কয়েকশ film এবং কিছু show এর লাইব্রেরির জন্য 2-4 TB volume প্রয়োজন। পরবর্তীতে ডেটা মাইগ্রেট করার চেয়ে একবারেই বেশি জায়গা (over-provision) রাখা সাশ্রয়ী।

/config হলো সম্পূর্ণ সার্ভারের অবস্থা, তাই এটিই একমাত্র জিনিস যা আপনাকে অবশ্যই ব্যাকআপ নিতে হবে। Snapshot নিন অথবা stop-and-tar করে কপিটি সার্ভারের বাইরে রাখুন:

docker compose down
sudo tar czf jellyfin-config-$(date +%F).tgz -C ~/jellyfin config
docker compose up -d

/cache এবং transcode folder হলো disposable। /mnt/media এ থাকা media আলাদাভাবে ব্যাকআপ নিন অথবা পুনরায় রিপ (re-rippable) করার ঝুঁকি গ্রহণ করুন — ফাইলের বিশাল আকারের কারণে বেশিরভাগ মানুষ দ্বিতীয়টিই করেন। Upgrades হলো docker compose pull && docker compose up -d; উপরের :10 tag টি 10.x major ভার্সনের মধ্যেই থাকবে, তাই পরবর্তী major ভার্সনে যেতে হলে আপনাকে ইচ্ছাকৃতভাবে tag এডিট করতে হবে — এটি করার আগে Jellyfin release notes দেখে নিন, কারণ major version পরিবর্তনের সময় library schema migration ঘটে।

Failure modes, with the strings you will see

Library is empty after a scan. Dashboard → Logs (অথবা ~/jellyfin/config/log/log_*.log) এ লগটি দেখায়:

System.UnauthorizedAccessException: Access to the path '/media/Movies' is denied.

কন্টেইনারের uid ওই পাথটি পড়তে পারছে না। কারণ: media ফাইলটি root অথবা আপনার user: ভ্যালু ব্যতীত অন্য কোনো uid দ্বারা মালিকানাধীন, কোনো ডিরেক্টরির execute bit নেই, অথবা প্যারেন্ট mount টি ওই uid দ্বারা অ্যাক্সেস করা যাচ্ছে না। সমাধান: chown -R 1000:1000 /mnt/media, ডিরেক্টরিগুলো 755, ফাইলগুলো 644, তারপর পুনরায় scan করুন।

Playback pins the CPU and buffers. docker stats jellyfin এ CPU ব্যবহার আপনার core count এর তুলনায় প্রায় 100% দেখাচ্ছে, এবং Dashboard → Playback এ সেশনটি Transcode হিসেবে তালিকাভুক্ত এবং এর স্পিড 1.0x এর নিচে। ক্লায়েন্টটি direct-play করছে না, তাই VPS রিয়েল টাইম এর চেয়ে ধীরগতিতে CPU-transcoding করছে এবং বাফারিং হচ্ছে। কারণ: কোনো unsupported codec বা container, subtitle burn-in, অথবা HDR tone-mapping। সমাধান: direct-play সমর্থিত ক্লায়েন্ট ব্যবহার করুন, সোর্স ফাইলগুলো H.264/AAC ফরম্যাটে রাখুন, image subtitle (PGS/VOBSUB) এর পরিবর্তে text subtitle (SRT) ব্যবহার করুন (কারণ image subtitle burn-in বাধ্য করে), এবং শুধুমাত্র 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." ক্লায়েন্টটি সোর্সটি গ্রহণ করেনি এবং fallback transcode শুরু করতে ব্যর্থ হয়েছে। কারণ: একটি ত্রুটিযুক্ত ffmpeg কমান্ড, একটি অযোগ্য ফাইল, অথবা ইউজারের প্রোফাইল ভিডিও কনভার্সন ব্লক করছে। সমাধান: Dashboard → Logs এ ffmpeg লাইনটি পড়ুন, ফাইলটি আদৌ প্লে হয় কিনা নিশ্চিত করুন, আপনি যদি transcoding এর ওপর নির্ভর করেন তবে ইউজারের playback permissions চেক করুন, এবং ব্রাউজার codec এর সমস্যা বাদ দিতে অন্য একটি ক্লায়েন্ট দিয়ে চেষ্টা করুন।

Films have no poster or the wrong one. মেটাডেটা মিলছে না। কারণ: মুভিটি তার নিজস্ব Name (Year) ফোল্ডারে নেই, সিজন ফোল্ডারের নাম Season 01 এর পরিবর্তে S01, এপিসোডগুলো S01E01 ফরম্যাটে নেই, অথবা বছর (year) উল্লেখ করা নেই। সমাধান: উপরের লেআউট অনুযায়ী রিনেম করুন, তারপর Refresh metadata → Replace all করুন, অথবা সঠিক TMDB/TVDB এন্ট্রি নিশ্চিত করতে কোনো একটি আইটেমের ওপর Identify ব্যবহার করুন।

FAQ

GPU ছাড়া কি VPS দিয়ে ভিডিও ট্রান্সকোড করা সম্ভব?

হ্যাঁ, তবে এটি শুধুমাত্র CPU দিয়ে করতে হবে এবং এটি ব্যয়বহুল। একটি মাত্র 1080p সফটওয়্যার ট্রান্সকোড করার সময় বেশ কিছু vCPU পূর্ণ ক্ষমতা ব্যবহার করতে পারে। 4K বা HEVC ভিডিও সাধারণত রিয়েল-টাইমে প্রসেস করা সম্ভব হয় না, যার ফলে প্লেব্যাক বাফারিং হয়। সবচেয়ে ভালো উপায় হলো ট্রান্সকোডিং এড়িয়ে চলা: আপনার লাইব্রেরি H.264/AAC ফরম্যাটে রাখুন এবং এমন ক্লায়েন্ট অ্যাপ ব্যবহার করুন যা direct-play সাপোর্ট করে। এতে VPS শুধুমাত্র ডেটা স্ট্রিম করবে। আপনার যদি সত্যিই অন-দ্য-ফ্লাই ট্রান্সকোডিং প্রয়োজন হয়, তবেই কেবল একটি GPU instance রেন্ট করুন।

স্ক্যান করার পর আমার Jellyfin লাইব্রেরি কেন খালি দেখাচ্ছে?

এর প্রধান কারণ হলো permissions। অফিসিয়াল jellyfin/jellyfin ইমেজটি আপনার সেট করা user: (অথবা root) হিসেবে চলে। যদি ফাইলগুলো ওই uid দিয়ে পড়া না যায়, তবে স্ক্যান লগ Access to the path ... is denied এবং ফাইলগুলো স্কিপ করে। chown -R 1000:1000 /mnt/media দিয়ে মালিকানা ঠিক করুন, ডিরেক্টরিগুলোকে execute bit (755) দিন এবং পুনরায় স্ক্যান করুন। এছাড়া প্যারেন্ট ডিরেক্টরিও চেক করুন; যদি কন্টেইনারের uid /mnt/media traversing করতে না পারে, তবে এটি লাইব্রেরি ফোল্ডারে পৌঁছাতে পারবে না এবং সবকিছু খালি দেখাবে। দ্বিতীয় সাধারণ কারণ হলো ফোল্ডার লেআউট Jellyfin এর প্রত্যাশিত ফরম্যাটের সাথে না মেলা।

আমি কীভাবে নিরাপদে রিমোটলি Jellyfin অ্যাক্সেস করতে পারি?

এর দুটি ভালো উপায় আছে। লগইন এবং স্ট্রিম এনক্রিপ্ট করার জন্য একটি সাবডোমেনে TLS reverse proxy ব্যবহার করুন এবং fail2ban যোগ করুন। কখনোই সরাসরি port 8096 এক্সপোজ করবেন না, কারণ এতে আপনার পাসওয়ার্ড cleartext হিসেবে চলে যায়। অথবা এটি সম্পূর্ণ প্রাইভেট রাখুন এবং শুধুমাত্র VPN এর মাধ্যমে অ্যাক্সেস করুন; এটি একটি পরিবারের জন্য সবচেয়ে সহজ ও নিরাপদ উপায়। অ্যাপগুলোতে সরাসরি পাবলিক অ্যাড্রেস দিন — autodiscovery শুধুমাত্র লোকাল নেটওয়ার্ক ব্রডকাস্ট হিসেবে কাজ করে, তাই এটি ইন্টারনেট থেকে আসা ক্লায়েন্টদের কাছে পৌঁছাবে না।

Jellyfin VPS এর জন্য কতটুকু disk এবং bandwidth প্রয়োজন?

Disk স্পেস ভিডিওর কোয়ালিটির ওপর নির্ভর করে: প্রতিটি কমপ্রেসড 1080p ফিল্মের জন্য 4-15 GB, প্রতিটি remux এর জন্য 20-40 GB, এবং 4K এর জন্য 40-100 GB ধরে রাখুন। তাই বেশিরভাগ লাইব্রেরির জন্য 2-4 TB ব্লক ভলিউম প্রয়োজন। Bandwidth নির্ভর করে direct-play bitrate এর ওপর — প্রতি 1080p স্ট্রিমের জন্য 8-12 Mbps, এবং 4K এর জন্য এর চেয়ে অনেক বেশি প্রয়োজন। তাই আপনার পোর্টের স্পিড একই সাথে কতজন দর্শক সামলাতে পারবে তা নিশ্চিত করুন এবং মাসিক ট্রান্সফার লিমিট খেয়াল রাখুন। আপনি যদি ট্রান্সকোড করতে চান তবে CPU headroom বাড়িয়ে নিন; আর যদি direct-play করতে চান তবে cores এর চেয়ে bandwidth কে বেশি গুরুত্ব দিন।

VPS এ Jellyfin চালানো কি বৈধ?

Jellyfin নিজেই একটি ফ্রি এবং ওপেন-সোর্স সফটওয়্যার এবং এটি চালানো সম্পূর্ণ বৈধ। আসল বিষয়টি হলো কন্টেন্ট: শুধুমাত্র সেই মিডিয়া স্ট্রিম করুন যার মালিক আপনি অথবা যার লাইসেন্স আপনার কাছে আছে — যেমন আপনার নিজের ডিস্ক রিপ, রেকর্ডিং বা ফাইল যা ব্যবহারের অধিকার আপনার আছে। Jellyfin কোনো মিডিয়া প্রদান করে না এবং কোনো মিডিয়া পাওয়ার উপায়ও দেয় না; এটি শুধুমাত্র আপনার নিজস্ব লাইব্রেরির জন্য একটি প্লেয়ার।

#jellyfin#media-server#docker#self-hosting#transcoding