كيفية تثبيت Jellyfin على خادم VPS باستخدام Docker
تعلم كيفية تشغيل Jellyfin على خادم VPS مع ضبط صلاحيات المجلدات وتجنب مشاكل تحويل الترميز. اكتشف إعدادات Docker الصحيحة لضمان التشغيل المباشر لملفاتك دون استهلاك معالج الخادم.
ما الذي تقوم ببنائه
خادم وسائط Jellyfin على خادم افتراضي خاص (VPS): حاوية واحدة، وثلاثة مجلدات (volumes)، وقرص تخزين كتل (block-storage) يحتوي على أفلامك وعروضك، ويمكن الوصول إليه من أي متصفح أو تطبيق Jellyfin. يتكون التثبيت من ملف compose بطول 15 سطراً. كل ما قد يسوء لاحقاً ينبع من مصدرين: صلاحيات ملفات لا تستطيع الحاوية قراءتها، ومطالبة خادم افتراضي لا يملك وحدة معالجة رسوميات (GPU) بتحويل ترميز الفيديو وهو أمر لا يخصه. يقضي هذا الدليل معظم وقته في معالجة هاتين النقطتين، لأنهما مصدر معظم تذاكر الدعم الفني.
Jellyfin مجاني ومفتوح المصدر بالكامل، بدون حسابات، وبدون ميزات مقفلة خلف دفع مالي، وبدون تتبع، وهذا هو سبب ظهوره في كل قائمة تقريباً حول أشياء تستحق الاستضافة الذاتية في 2026. يقوم بتشغيل الوسائط التي تمتلكها. هو لا يأتي بأي محتوى، وهذا الدليل لا يتناول كيفية الحصول على أي محتوى.
واقع تحويل الترميز، قبل استئجار أي شيء
اقرأ هذا أولاً، لأنّه يغيّر ما ستشتريه. يقوم خادم الوسائط بأحد أمرين عند الضغط على زر التشغيل. التشغيل المباشر (Direct play) يبث الملف كما هو: يقرأ الـVPS البايتات من القرص ويدفعها عبر الشبكة، وهو ما لا يستهلك تقريباً أي قدرة معالجة (CPU). تحويل الترميز (Transcoding) يعيد ترميز الفيديو أثناء التشغيل، بدقة جديدة، أو بترميز جديد، أو مع دمج الترجمة، وهذا عمل يستهلك الـCPU بالكامل.
لا يحتوي الـVPS النموذجي على وحدة معالجة رسوميات (GPU). لذا، يتم تشغيل كل عملية تحويل ترميز للفيديو على الـCPU باستخدام libx264/libx265، والترميز البرمجي مكلف. يمكن لعملية تحويل ترميز واحدة بدقة 1080p بترميز H.264 أن تستهلك قدرة عدة أنوية افتراضية (vCPUs) مشتركة؛ بينما لا يمكن لعملية تحويل ترميز بدقة 4K أو بترميز HEVC مواكبة التشغيل الفعلي في العادة، مما يؤدي إلى توقف التشغيل والتخزين المؤقت إلى الأبد. تحويل الترميز العتادي، وهو الميزة التي تجعل هذا الأمر رخيصاً على جهاز منزلي مزود بـIntel iGPU أو بطاقة Nvidia، ببساطة غير متاح لك ما لم يوفر مزود الخدمة مثيلات (instances) مزودة بـGPU.
لذا، الاستراتيجية الكاملة على الـVPS هي: تجنب تحويل الترميز. احتفظ بمكتبتك بترميزات تشغلها تطبيقاتك محلياً (natively)، مثل فيديو H.264، وصوت AAC أو AC3، داخل حاوية MP4 أو MKV، واختر تطبيقات عميلة تدعم التشغيل المباشر: تطبيقات Jellyfin الأصلية لأجهزة Android TV وiOS وRoku، بالإضافة إلى Infuse وKodi وJellyfin Media Player المكتبي. إذا فعلت ذلك، فلن يضطر الـVPS أبداً إلى تشغيل ffmpeg لتحويل الترميز أثناء العرض، ويمكن لجهاز متواضع بـ2 vCPU البث لعدة أشخاص في وقت واحد. إذا خططت لتحويل الترميز، فستحتاج إلى جهاز أكبر وأغلى بكثير، وحتى في هذه الحالة، تظل دقة 4K خياراً غير مضمون.
احسب أيضاً عرض النطاق الترددي (bandwidth)، لأنّه المفاجأة الأخرى. يرسل التشغيل المباشر الملف بمعدل البت (bitrate) الخاص به. ملف 1080p مضغوط يستهلك 8-12 Mbps؛ ونسخة Blu-ray remux بدقة 1080p تستهلك 20-30 Mbps؛ أما 4K HDR فتستهلك 40-80 Mbps. ثلاثة أشخاص يشغلون ملفات 10 Mbps مباشرة يعني 30 Mbps من الرفع المستمر من الـVPS الخاص بك. تحقق من رقمين في خطتك: سرعة المنفذ (هل يمكنه دفع 30 Mbps للرفع؟) وسقف النقل الشهري. فيلم واحد مدته ساعتان بمعدل 10 Mbps يستهلك حوالي 9 GB من البيانات، لذا فإن سعة 1 TB/شهر تسمح بأكثر من مئة فيلم شهرياً، أي ثلاثة أو أربعة أفلام يومياً، بينما تستنزف الأسرة التي تشاهد دقة 4K، بمعدل بت أعلى بأربع إلى ثماني مرات، هذه السعة بشكل أسرع بكثير. احسب أي شيء آخر يدفع حركة مرور خارج نفس الجهاز ضمن تلك الميزانية، بما في ذلك مرحل RustDesk ذاتي الاستضافة، الذي ينقل جلسة سطح مكتب بعيد كاملة كلما تعذر على طرفين الاتصال ببعضهما مباشرة.
المتطلبات الأساسية
- خادم افتراضي (VPS) بنظام Ubuntu 24.04 حديث مع صلاحيات root أو sudo، وتثبيت Docker مع إضافة Compose.
- وحدة تخزين (block-storage volume) للوسائط، بحجم يتناسب مع مكتبتك (راجع تقدير الأحجام أدناه). لا تخزّن أفلامك على قرص النظام الصغير الذي يأتي مع الخادم الافتراضي.
- اسم نطاق إذا كنت ترغب في وصول عام عبر HTTPS، أو شبكة WireGuard VPN على نفس الخادم إذا كنت تفضل إبقاء كل شيء خاصاً.
- وسائط تمتلك الحق القانوني في بثها، أو نسخك الخاصة، أو تسجيلاتك الشخصية، أو ملفات تملكها.
وصّل وحدة التخزين الكتلي أولاً
أرفق وحدة التخزين من لوحة مزود الخدمة، ثم حدّدها ووصلها. احصل على اسم الجهاز من lsblk؛ سيكون اسماً مثل /dev/sdb أو /dev/vdb، وليس قرص 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 deviceوصّلها باستخدام UUID، وليس باستخدام /dev/sdb، لأن أحرف الأجهزة قد تتغير بعد إعادة التشغيل، وقد ينتهي بك الأمر إلى تهيئة القرص الخطأ أو وصله. أضف سطراً واحداً إلى /etc/fstab:
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/media ext4 defaults,nofail 0 2sudo mount -a
df -h /mnt/mediaيهم nofail لأن النظام، إذا فُصلت وحدة التخزين الكتلية، سيرفض الإقلاع وينتقل إلى shell للطوارئ. أكبر خطأ هنا هو تشغيل mkfs.ext4 على وحدة تخزين تحتوي بيانات بالفعل؛ فهذا يمسحها. هيّئ وحدات التخزين الجديدة فقط. إذا كان القرص يحتوي مكتبتك بالفعل، فتخطَّ مباشرةً إلى سطر fstab.
رتّب الوسائط بالطريقة التي يتوقعها Jellyfin
يطابق Jellyfin البيانات الوصفية وفق أسماء المجلدات والملفات. إذا كان الترتيب غير صحيح، فستظهر الأفلام كملفات بلا عناوين أو ملصقات، أو ستُطابق إحدى الحلقات مع مسلسل غير صحيح. تكفي أربع قواعد في معظم الحالات: ضَع كل فيلم في مجلد مستقل، واستخدم له اسم ملف مطابقاً باسم المجلد، على النحو Name (Year) (يتعامل Jellyfin مع السنة على أنها اختيارية، لكنها تجعل المطابقة أكثر موثوقية بكثير)؛ سمِّ مجلدات المواسم على النحو 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). في الصورة الرسمية، أنت تتحكم في المستخدم عبر المفتاح user: في ملف compose، وإذا أغفلته، سيعمل الحاوية بصلاحيات root. أياً كان الخيار الذي تستخدمه، القاعدة ثابتة: يجب أن يمتلك معرف المستخدم/المجموعة (uid/gid) الذي تعمل به الحاوية صلاحية القراءة والوصول إلى كل مجلد وسائط.
سنقوم بالتشغيل باستخدام uid/gid 1000، وهو أول مستخدم غير جذر (non-root) في نظام Ubuntu قياسي. تأكد من قيمتك الخاصة واضبط الملكية:
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تحتاج المجلدات إلى بت التنفيذ (الرمز x في 755)، وليس فقط القراءة؛ فبدونه لا تستطيع الحاوية الدخول إلى المجلد حتى لو تمكنت من سرد أسماء الملفات بداخله. الفخ الذي يؤدي إلى إفراغ مكتبة كاملة هو المجلد الأب: إذا لم يستطع uid الحاوية الوصول إلى نقطة الربط (mount) نفسها، فلن يصل أبداً إلى /media/Movies أو /media/Shows، وستظهر كل المكتبات فارغة فوراً مع ظهور Access to the path ... is denied في السجلات. أي مجلد وسائط لا تستطيع الحاوية قراءته يتم تسجيله وتخطيه، لذا فإن مجموعة الملفات التي نُسخت بصلاحيات root تختفي بصمت من المكتبة. لهذا السبب نقوم بتنفيذ chown بشكل متكرر (recursively) ونضبط بت التنفيذ على كل مجلد بدلاً من إصلاح مجلد واحد فقط.
ملف 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سطرًا بسطر: يتتبع jellyfin/jellyfin:12 سلسلة الإصدار الحالية 12.x، وهي 12.2 في 2026-10-10. يحدد user: "1000:1000" uid/gid الذي تعمل به عملية Jellyfin. لا يغيّر ملكية أي ملف أو وضعه، لأن Docker يحافظ على uid/gid الخاصين بالمضيف في الأدلة المركّبة، ولذلك يجب أن يطابقه chown أعلاه. يحتوي /config على الخادم بالكامل، والحسابات، والمكتبات، والبيانات الوصفية، وحالة المشاهدة، ولذلك يجب أن يكون قابلاً للكتابة، وهو العنصر الذي تنشئ له نسخة احتياطية. أما /cache فهو مساحة عمل مؤقتة يمكن التخلص منها. نقطة تركيب الوسائط هي :ro، وهي للقراءة فقط عن قصد: يخزّن Jellyfin الرسومات والبيانات الوصفية افتراضياً ضمن /config، ولذلك لا يحتاج أبداً إلى الكتابة في مكتبتك. كما تحمي صلاحية القراءة فقط ملفاتك من الحذف غير المقصود أو من إضافة سيئة. رُبط المنفذ بـ127.0.0.1 عمداً. تسجيل الدخول إلى واجهة Jellyfin يتم عبر HTTP عادي، ولذلك لا نعرض المنفذ 8096 على الإنترنت العام. يمثل JELLYFIN_PublishedServerUrl العنوان الذي يعلنه الخادم للاكتشاف التلقائي المحلي، عبر بث 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. سيرشدك المعالج لاختيار اللغة، ثم إنشاء مستخدم إداري بكلمة مرور قوية؛ هذا الحساب هو خادمك، لذا لا تستخدم كلمة مرور مؤقتة. أضف مكتبتك الأولى: اختر نوع المحتوى Movies، ووجّهه إلى /media/Movies (المسار داخل الحاوية، وليس مسار المضيف)، وكرر العملية مع Shows في /media/Shows. عند الانتهاء، سيبدأ Jellyfin في المسح. النتيجة الصحيحة هي ظهور الملصقات والعناوين في غضون دقيقة أو دقيقتين للمكتبات الصغيرة. يمكنك إضافة أو تعديل المكتبات لاحقاً عبر Dashboard → Libraries، وإجبار النظام على إعادة المسح عبر Scan All Libraries. هذه الملصقات هي أيضاً ما يجعل تجربة واجهة بديلة أمراً يستحق العناء بمجرد عمل الأساسيات، حيث يعيد Halcyon بناء المكتبة ذاتها كمتجر فيديو من التسعينات يمكن التجول فيه اعتماداً على الأعمال الفنية التي جلبها Jellyfin مسبقاً.
إذا كنت تعتمد على أي تحويل ترميز (transcoding)، افتح Dashboard → Playback → Transcoding واضبط مسار ملفات التحويل المؤقتة على /cache/transcodes لضمان توجيه البيانات المتغيرة إلى وحدة التخزين المؤقت (cache volume) بدلاً من تضخيم /config. اترك تسريع العتاد (hardware acceleration) مضبوطاً على None، إذ لا يوجد معالج رسوميات (GPU) للقيام بالتسريع.
الوصول عن بُعد: Reverse Proxy مع TLS، أو إبقاؤه على VPN
لديك طريقتان آمنتان للوصول إلى Jellyfin من خارج الشبكة، وطريقة واحدة غير آمنة يجب تجنبها. الطريقة غير الآمنة هي نشر المنفذ 8096 مباشرة على الإنترنت؛ إذ ينتقل تسجيل الدخول بنص واضح، ويتعرض المنفذ لهجمات التخمين المكثفة خلال ساعات.
الخيار A، Reverse Proxy مع TLS. ضع Jellyfin على نطاق فرعي خلف Traefik مع TLS تلقائي لتطبيقات Docker، أو خلف nginx باستخدام شهادة Let's Encrypt يصدرها Certbot. يستخدم Jellyfin WebSockets للتحديثات الفورية، لذلك يجب على الـproxy تمرير رؤوس الترقية. ينفذ 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 حتى تعرف بتوقف الخدمة قبل مشاهديك. وجّه إشعاراته إلى خادم ntfy مستضاف ذاتياً، وعند فشل الفحص سيصلك إشعار فوري على الهاتف بدلاً من رسالة بريد إلكتروني تقرؤها في صباح اليوم التالي. كما أن وضع صفحة تسجيل دخول على الإنترنت العام هو وقت مناسب لتدقيق بقية الخادم، بدلاً من افتراض أن المنفذ 443 وحده يستقبل الاتصالات: يسرد sudo ss -tlnp كل منفذ يستقبل الاتصالات والعملية المرتبطة به. وإذا نشرت أيضاً شيفرة خاصة بك على الخادم، فإن open-kritt يفحص المستودعات وتبعياتها بحثاً عن الثغرات؛ فهو يدقق الشيفرة المصدرية، وليس المنافذ التي تستقبل الاتصالات.
الخيار B، إبقاؤه خاصاً على VPN. لا تنشر 8096 على الإنترنت العام إطلاقاً؛ صِل إلى Jellyfin فقط عبر نفق WireGuard ينتهي على الخادم نفسه. بالنسبة إلى المنزل، هذا هو الخيار الآمن الأبسط: لا شهادة، ولا إتاحة عامة، ولا سطح متاح لهجمات التخمين المكثفة. لا يكفي ربط localhost من ملف compose هنا، لأن المنفذ المنشور على 127.0.0.1 يمكن الوصول إليه من VPS نفسه فقط، وليس من أقران VPN. انشره على عنوان نفق الخادم بدلاً من ذلك، مثل "10.8.0.1:8096:8096" باستخدام عنوان IP الخاص بخادم WireGuard لديك، أو أبقِه على localhost وضع proxy يستقبل الاتصالات على عنوان النفق أمامه، ثم اتصل عبر VPN. راجع إعداد WireGuard VPN لخادم VPS خاص لمعرفة طريقة إعداد النفق نفسه.
تحديد سعة التخزين والنسخ الاحتياطية
حدّد الميزانية وفق الجودة، لا وفق عدد الملفات. تتراوح أحجام الأفلام بدقة 1080p بعد الضغط بين 4 و15 GB للفيلم؛ ويتراوح حجم نسخة remux بدقة 1080p بين 20 و40 GB؛ ويتراوح حجم موسم من مسلسل بدقة 1080p بين 15 و40 GB؛ أما أفلام 4K فأي فيلم منها يحتاج إلى 40-100 GB. تحتاج مكتبة تضم بضع مئات من الأفلام وبعض المسلسلات إلى وحدة تخزين بسعة 2-4 TB، ومن الأرخص زيادة سعة وحدة التخزين الكتلية مرة واحدة بدلاً من ترحيل البيانات لاحقاً.
/config هي حالة الخادم بالكامل، لذلك فهي الشيء الوحيد الذي يجب أن تنشئ له نسخة احتياطية. أنشئ snapshot لها، أو أوقف الخادم ثم أنشئ أرشيفاً باستخدام tar، واحتفظ بالنسخة خارج الخادم:
docker compose down
sudo tar czf jellyfin-config-$(date +%F).tgz -C ~/jellyfin config
docker compose up -d/cache ومجلد transcoding قابلان لإعادة الإنشاء. أما الوسائط الموجودة على /mnt/media فإما أن تنشئ لها نسخة احتياطية منفصلة، أو تقبل إمكانية إعادة نسخها؛ ومعظم الناس يختارون الخيار الثاني بسبب حجمها. تكون الترقيات عبر docker compose pull && docker compose up -d؛ وتبقى العلامة :12 المذكورة أعلاه ضمن سلسلة 12.x، لذلك يتطلب الانتقال إلى الإصدار الرئيسي التالي تعديل العلامة عمداً. راجع ملاحظات إصدار Jellyfin قبل تنفيذ ذلك، لأن ترحيل مخطط المكتبة يحدث في الإصدارات الرئيسية. أزال Jellyfin البادئة "10." من أرقام إصداراته مع الإصدار 12.0 في سبتمبر 2026: الإصدار 12.0 هو ما كان سيُسمى 10.12، ولا توجد سلسلة 11.x، وكانت 10.11.x آخر سلسلة وفق النظام القديم. إذا كان أحد ملفات compose القديمة لديك لا يزال يحتوي على jellyfin/jellyfin:10، فهو ثابت على الإصدار 10.11، وقد تحركت تلك العلامة آخر مرة في 2026-06-06 إلى 10.11.11، ولن يسحب الإصدار 12.x أبداً. إن نقلها إلى :12 ليس مجرد تعديل للعلامة: يغيّر الإصدار 12.0 مخطط قاعدة البيانات ويعيد كتابة البيانات عند أول تشغيل، لذلك أوقف الخادم وأنشئ النسخة الاحتياطية المذكورة أعلاه أولاً، لأن تلك النسخة هي وسيلة الرجوع الوحيدة. يرقّي الإصدار 12.0 مباشرة من 10.10.7 أو أي إصدار من سلسلة 10.11.x، ويحتاج بعد ذلك إلى فحص كامل للمكتبة، ويستغرق ذلك وقتاً أطول بوضوح من المعتاد. إن تثبيت العلامة مع إنشاء نسخة احتياطية واحدة من مجلد الحالة هو الوصفة الكاملة لأي حاوية تعمل باستمرار، وهو النمط نفسه الذي يضمن بقاء ذاكرة agent المستضاف ذاتياً وجدوله الزمني فعالين بعد إعادة التشغيل.
أوضاع الفشل، والرسائل التي ستظهر لك
المكتبة فارغة بعد الفحص. يعرض السجل في Dashboard → Logs (أو ~/jellyfin/config/log/log_*.log) ما يلي:
System.UnauthorizedAccessException: Access to the path '/media/Movies' is denied.لا يستطيع uid الخاص بالحاوية قراءة هذا المسار. السبب: ملكية الوسائط تعود إلى root أو إلى uid يختلف عن قيمة user:، أو أن دليلاً يفتقد بت التنفيذ، أو أن mount الأب نفسه غير قابل للعبور بواسطة ذلك uid. أصلح ذلك باستخدام chown -R 1000:1000 /mnt/media، واضبط الدلائل على 755 والملفات على 644، ثم أعد الفحص.
يستهلك التشغيل CPU بالكامل ويتوقف مؤقتاً. يعرض docker stats jellyfin استخدام CPU قريباً من 100% مضروباً في عدد أنويتك، وتدرج Dashboard → Playback الجلسة بالحالة Transcode وبسرعة أقل من 1.0x. لا يستخدم العميل التشغيل المباشر، لذلك ينفذ VPS عملية تحويل الترميز بواسطة CPU بسرعة أقل من الزمن الفعلي، ويتأخر عن التشغيل. السبب: برنامج ترميز أو حاوية غير مدعومين، أو دمج الترجمة داخل الفيديو، أو تحويل ألوان HDR. أصلح ذلك بالتبديل إلى عميل يدعم التشغيل المباشر، والحفاظ على المصادر بتنسيق H.264/AAC، واستخدام ترجمات نصية (SRT) بدلاً من ترجمات صورية (PGS/VOBSUB)، إذ لا يستطيع معظم عملاء Jellyfin رسمها بأنفسهم، ما يفرض دمجها داخل الفيديو، وتعطيل تشغيل 4K HDR بالكامل على خادم يعتمد على CPU فقط.
"لا تتوفر تدفقات متوافقة." تكون الرسالة الكاملة عادةً "هذا العميل غير متوافق مع الوسائط، والخادم لا يرسل تنسيق وسائط متوافقاً." رفض العميل المصدر، كما فشل التحويل الاحتياطي للترميز في البدء. السبب: أمر ffmpeg معطّل، أو ملف غير قابل للقراءة، أو أن ملف تعريف المستخدم يمنع تحويل الفيديو. أصلح ذلك بقراءة سطر ffmpeg في Dashboard → Logs، والتأكد من إمكانية تشغيل الملف أصلاً، والتحقق من أذونات تشغيل المستخدم إذا كنت تعتمد على تحويل الترميز، وتجربة عميل ثانٍ لاستبعاد مشكلات برامج الترميز الخاصة بالمتصفح.
لا تحتوي الأفلام على ملصق، أو يظهر لها ملصق خاطئ. لم تتطابق البيانات الوصفية. السبب: مجلد أو اسم ملف لا يطابق العنوان كما يدرجه موفر البيانات الوصفية، أو إعادة إنتاج أو عنوان شائع لا يحتوي على سنة للتمييز بين الإصدارات، أو مجلد موسم اسمه S01 بدلاً من Season 01، أو أن الحلقات ليست بالتنسيق S01E01. أصلح ذلك بإعادة التسمية وفق البنية الموضحة أعلاه، ثم اختر Refresh metadata → Replace all، أو استخدم Identify على عنصر واحد لتثبيت الإدخال الصحيح في TMDB/TVDB.
FAQ
هل يمكن لخادم VPS تحويل ترميز الفيديو دون وحدة معالجة رسومية (GPU)؟
نعم، ولكن باستخدام المعالج (CPU) فقط، وهي عملية مكلفة. يمكن لعملية تحويل ترميز واحدة بدقة 1080p برمجياً أن تستهلك قدرة عدة أنوية افتراضية (vCPUs)، وعادةً لا يمكن لدقة 4K أو ترميز HEVC مواكبة البث المباشر، مما يؤدي إلى توقف التشغيل مؤقتاً للتخزين المؤقت. الخيار الأفضل هو تجنب تحويل الترميز: احتفظ بمكتبتك بصيغة H.264/AAC واستخدم تطبيقات عميلة تدعم التشغيل المباشر (direct-play)، بحيث يكتفي الـVPS ببث البيانات. استأجر خادماً مزوداً بـGPU فقط إذا كنت بحاجة فعلية لتحويل الترميز أثناء التشغيل.
لماذا تظهر مكتبة Jellyfin فارغة بعد الفحص؟
السبب في الغالب هو صلاحيات الوصول. تعمل حاوية jellyfin/jellyfin الرسمية باستخدام الـuser: الذي تحدده (أو root)، وإذا لم تكن الملفات قابلة للقراءة بواسطة هذا المعرّف (uid)، فإن سجلات الفحص تسجّل Access to the path ... is denied وتتخطى تلك الملفات. صحّح ملكية الملفات باستخدام chown -R 1000:1000 /mnt/media، وامنح المجلدات صلاحية التنفيذ (755)، ثم أعد الفحص. تحقق أيضاً من المجلد الأب، لأنه إذا لم يتمكن معرّف المستخدم الخاص بالحاوية من الوصول إلى /mnt/media نفسه، فلن يصل أبداً إلى مجلدات المكتبة وستظهر النتائج فارغة. السبب الثاني الأكثر شيوعاً هو هيكلية المجلدات التي لا تتوافق مع ما يتوقعه Jellyfin.
كيف يمكنني الوصول إلى Jellyfin عن بُعد وبأمان؟
هناك خياران جيدان. ضع الخدمة خلف وكيل عكسي (Reverse Proxy) مع تشفير TLS على نطاق فرعي لضمان تشفير تسجيل الدخول والبث، وأضف fail2ban، ولا تعرض أبداً المنفذ 8096 الخام، لأنه يرسل كلمة مرورك كنص واضح. أو اجعل الخدمة خاصة تماماً ولا تصل إليها إلا عبر VPN، وهو الخيار الأكثر أماناً وبساطة للاستخدام المنزلي. امنح التطبيقات العنوان العام مباشرة، فخاصية الاكتشاف التلقائي (autodiscovery) تعتمد على البث داخل الشبكة المحلية، لذا فهي لا تصل إلى العملاء القادمين عبر الإنترنت.
ما هي مساحة القرص وعرض النطاق الترددي التي يحتاجها خادم Jellyfin VPS؟
تعتمد مساحة القرص على الجودة: خصص 4-15 جيجابايت لكل فيلم 1080p مضغوط، و20-40 جيجابايت لكل نسخة remux، و40-100 جيجابايت لدقة 4K، لذا تحتاج معظم المكتبات إلى وحدة تخزين بسعة 2-4 تيرابايت. يتم تحديد عرض النطاق الترددي حسب معدل البت للتشغيل المباشر، وهو 8-12 ميجابت في الثانية لكل بث 1080p، وأكثر من ذلك بكثير لدقة 4K، لذا تأكد من أن سرعة المنفذ لديك تتحمل عدد المشاهدين المتزامنين وراقب سقف نقل البيانات الشهري. أضف سعة معالجة إضافية إذا كنت تخطط لتحويل الترميز؛ وأعطِ الأولوية لعرض النطاق الترددي على عدد الأنوية إذا كنت تخطط للتشغيل المباشر.
هل تشغيل Jellyfin على خادم VPS قانوني؟
Jellyfin بحد ذاته برنامج مجاني ومفتوح المصدر وتشغيله قانوني تماماً. ما يهم هو المحتوى: ابث فقط الوسائط التي تمتلكها أو المرخص لك بحيازتها، مثل نسخ الأقراص الخاصة بك، أو التسجيلات، أو الملفات التي تملك الحق في استخدامها. لا يأتي Jellyfin مع أي وسائط ولا يوفر أي وسيلة للحصول عليها؛ إنه مجرد مشغل لمكتبة تمتلكها بالفعل.