لماذا Jellyfin في 2026
تغيّر مشهد خوادم الوسائط الشخصية خلال سنوات قليلة. رفعت Plex سعر اشتراكها مدى الحياة (Lifetime Pass) في 2025، ثم ضاعفته ثلاث مرات في 1 يوليو 2026 (من 249.99 إلى 749.99 دولارًا، وهي زيادة أُعلنت في مايو 2026)، فصار الدخول مكلفًا للاستخدام العائلي. أما Emby، البديل التاريخي الآخر، فيعمل هو أيضًا بنموذج مجاني جزئيًا: بعض الميزات الأساسية مثل الترميز عبر العتاد وDVR والتنزيل للمشاهدة دون اتصال على الجوال محجوزة لمشتركي Emby Premiere.
وُلد Jellyfin عام 2018 كفرع من Emby، تحديدًا ليبقى حرًا. يمنع ترخيص GPLv2 إغلاق الشيفرة من جديد: فإذا أعاد مساهم إدخال شيفرة مملوكة، يحق للمستخدمين قانونيًا أن يتفرعوا عنها. وهذه ضمانة بنيوية لا توفرها Plex ولا Emby.
من جهة الإصدارات، خلفت السلسلة 12.x السلسلة 10.11: صدر الإصدار 12.0 في 8 سبتمبر 2026، والإصدار 12.4 الذي نُشر في 26 أكتوبر 2026 هو آخر إصدار مستقر لوحظ وقت كتابة هذا الدليل. وللقفزة بين إصدارين رئيسيين نتيجة عملية: ترحيل لقاعدة البيانات قد يطول كثيرًا، نعالجه أدناه في هذا الدليل.
ومن جهة الميزات، يغطي Jellyfin تقريبًا كل الاستخدامات الشائعة: بث تكيفي، وترميز برمجي وعتادي، وتطبيقات أصلية لـ iOS وAndroid وAndroid TV وRoku، والتلفزيون المباشر وتسجيل DVR، وترجمات تلقائية، ومصادقة موحدة SSO عبر OIDC وLDAP، ونظام إضافات يوسّع التطبيق دون المساس بالنواة.
ما يقدمه Jellyfin
- البث عبر DLNA وHLS — يرسل الأفلام والمسلسلات والموسيقى إلى جميع أجهزتك، بما فيها التلفزيونات التي بلا تطبيق أصلي.
- تطبيقات رسمية — iOS وAndroid وAndroid TV وRoku وFire TV وKodi، وواجهة ويب متجاوبة لكل ما سواها.
- الترميز الفوري — يحوّل التنسيق المصدر إذا كان الجهاز المستهدف لا يدعمه، برمجيًا أو عبر وحدة المعالجة الرسومية.
- التلفزيون المباشر وتسجيل DVR — وصّل موالفًا عبر USB أو مصدر IPTV لمشاهدة البث المباشر وتسجيله.
- SSO عبر OIDC وLDAP — اربط دليل المستخدمين الحالي أو موفر هوية مثل Authentik أو Keycloak.
- ترجمات تلقائية — إضافة OpenSubtitles، واستخراج المسارات المضمنة، وعرض WebVTT.
- إضافات موسّعة — تكاملات LastFM، وscrobbling، وبيانات الموسيقى الوصفية، والمقاطع الدعائية، وإدارة المجموعات.
- لا سحابة مملوكة إطلاقًا — لا مصادقة عبر خوادم Plex، ولا بيانات تشغيل تُرسل إلى طرف ثالث.
المتطلبات الرقمية حسب حالة الاستخدام
تختلف الاحتياجات كثيرًا بحسب ما تنوي فعله.
SD و1080p بلا ترميز (التشغيل المباشر): إذا كانت أجهزتك تشغّل ترميز المصدر (H.264 أو H.265) أصلًا، فلا يرمّز Jellyfin شيئًا، بل يقدّم الملف كخادم ملفات ذكي. يكفي نواتان افتراضيتان و2 غيغابايت من الذاكرة لمكتبة من مئات العناوين. وهذه أكثر حالات الاستخدام شيوعًا على VPS.
1080p مع ترميز برمجي: عندما لا يدعم العميل الترميز أو عندما تحدّ من معدل البت، يرمّز Jellyfin فوريًا. يستهلك تدفق واحد بدقة 1080p وH.264 ما بين 2 و4 أنوية بحسب دقة المصدر. استهدف 4 أنوية و4 غيغابايت ذاكرة كحد أدنى لمستخدمَين متزامنين.
4K HDR مع ترميز برمجي: تحويل HDR إلى SDR للشاشات التي لا تدعم HDR (tone-mapping) شديد الاستهلاك. قد يُشبع تدفق واحد 4K HDR ثماني أنوية. لا تناسب هذه الحالة VPS سحابيًا عاديًا؛ فضّل التشغيل المباشر 4K (يجب أن يدعم العميل HEVC/HDR) أو خادمًا مخصصًا بوحدة رسومية.
الترميز عبر العتاد (VAAPI/NVENC): يخفّض حمل المعالج بقدر كبير، لكنه يتطلب الوصول إلى الجهاز /dev/dri أو بطاقة NVIDIA. لا تتيح خوادم VPS السحابية العادية وحدة رسومية؛ فهذا الخيار محجوز للخوادم المخصصة أو لخوادم VPS الرسومية المتخصصة.
قرص لترقية الإصدار: احسب مساحة تكفي لنسخة كاملة من مجلد الإعدادات (بما فيه قاعدة البيانات) بجانب الأصل. تشترط وثائق النسخ الاحتياطي في Jellyfin 5 غيغابايت حرة على الأقل للنسخة المدمجة، وأكثر إن أدرجت الترجمات وtrickplay.
تثبيت Jellyfin على VPS بنظام Ubuntu/Debian باستخدام Docker Compose
تجهيز الـ VPS وتثبيت Docker
اتصل بالـ VPS عبر SSH (Ubuntu 22.04 أو Debian 12). حدّث النظام ثم ثبّت Docker:
apt update && apt upgrade -ycurl -fsSL https://get.docker.com | shsystemctl enable --now dockerتحقق من عمل Docker:
docker info. أجرِ هذا التحديث الآن والخادم ما زال فارغًا: فلاحقًا، على جهاز يستضيف Jellyfin مثبتًا بحزمة، قد يعيدapt upgradeتشغيل الخدمة في أسوأ لحظة (راجع قسم ترقية الإصدار).إنشاء شجرة المجلدات
اختر مكان حفظ إعدادات Jellyfin ووسائطك:
mkdir -p /opt/jellyfin/{config,cache}mkdir -p /mnt/media/{films,series,music}chown -R 1000:1000 /opt/jellyfin /mnt/mediaالمعرّف UID 1000 هو الذي يمنحه ملف Compose أدناه لحاوية Jellyfin (المعامل
user، اختياري بحسب الوثائق: بدونه تعمل الحاوية بصلاحية root).كتابة ملف docker-compose.yml
أنشئ الملف
/opt/jellyfin/docker-compose.yml. تحتservices:ثمjellyfin:(إزاحة YAML بمسافتين لكل مستوى) ضع هذه الأسطر:image: jellyfin/jellyfin:12.4container_name: jellyfinuser: "1000:1000"ports:ثم تحتها- "127.0.0.1:8096:8096"restart: unless-stoppedvolumes:ثم تحتها- /opt/jellyfin/config:/configو- /opt/jellyfin/cache:/cacheو- /mnt/media:/media:roenvironment:ثم تحتها- JELLYFIN_PublishedServerUrl=https://jellyfin.your-domain.comلا تكتب
latest. بحسب الوثائق الرسمية، يتتبع هذا الوسم «دائمًا آخر إصدار مستقر، بما في ذلك عبر قفزات الإصدارات الرئيسية والفرعية»: فيكفي حينها أمرdocker compose pullبسيط لإطلاق ترحيل لقاعدة البيانات لم تستعد له. ثبّت إصدارًا: الوسمX.Y(مثل12.4) يتبع تصحيحات ذلك الفرع، والوسمX.Y.Zيجمّد إصدارًا بعينه. تحقق من الوسم الحالي في سجل الصور قبل نسخ12.4.لا يُنشَر المنفذ إلا على
127.0.0.1: فلا يصل إليه إلا nginx على الجهاز نفسه، ولا يمكن بلوغ Jellyfin عبر HTTP غير مشفّر على عنوان IP العام. والوضعnetwork_mode: hostلا يلزم إلا لاكتشاف DLNA بحسب الوثائق؛ وDLNA لا يعمل إلا على شبكة محلية، وعلى VPS قد يكشف هذا الوضع المنفذ 8096 على كل الواجهات.تشغيل الحاوية
cd /opt/jellyfindocker compose up -ddocker compose logs -fيستمع Jellyfin على المنفذ 8096. انتظر ظهور السطر
Startup completeفي السجلات قبل المتابعة.ضبط nginx كوكيل عكسي
ثبّت nginx وcertbot:
apt install -y nginx certbot python3-certbot-nginxأنشئ الملف
/etc/nginx/sites-available/jellyfinبكتلةserverواحدة على المنفذ 80:listen 80;وserver_name jellyfin.your-domain.com;، ثم داخلlocation / {ضعproxy_pass http://localhost:8096;والترويسات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;، ثم لدعم WebSockets أضفproxy_http_version 1.1;وproxy_set_header Upgrade $http_upgrade;وproxy_set_header Connection "upgrade";. لا تكتب كتلة المنفذ 443 الآن: ستشير أسطرssl_certificateفيها إلى ملفات لا توجد قبل تشغيل certbot، وسيرفض nginx تحميل الإعدادات.فعّل الموقع وتحقق منه، ثم احصل على الشهادة:
ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/nginx -t && systemctl reload nginxcertbot --nginx -d jellyfin.your-domain.comتحصل إضافة nginx في certbot على الشهادة وتحفظها في
/etc/letsencrypt/live/jellyfin.your-domain.com/(fullchain.pemوprivkey.pem)، ثم تثبّتها: تضيف بنفسها إلى الكتلة الاستماع على المنفذ 443 وسطرَيssl_certificateوssl_certificate_key، مع إعادة التوجيه من HTTP إلى HTTPS المفعّلة افتراضيًا. تحقق من النتيجة بالأمرnginx -t.إذا فضّلت
certbot certonly --nginx -d jellyfin.your-domain.com، الذي يحصل على الشهادة دون المساس بالإعدادات، فاكتب بعد ذلك كتلة المنفذ 443 بنفسك:listen 443 ssl;وقيمةserver_nameنفسها وssl_certificate /etc/letsencrypt/live/jellyfin.your-domain.com/fullchain.pem;وssl_certificate_key /etc/letsencrypt/live/jellyfin.your-domain.com/privkey.pem;وlocation /نفسها. ثم استبدلlocation /في كتلة المنفذ 80 بالسطرreturn 301 https://$host$request_uri;، ونفّذnginx -t && systemctl reload nginx.معالج الإعداد الأولي
افتح
https://jellyfin.your-domain.comفي متصفحك. يرشدك المعالج إلى:1. إنشاء حساب المدير
2. إضافة مكتبتك (وجّهها إلى/media/filmsو/media/series)
3. اختيار اللغة ومزوّدي البيانات الوصفية (TheMovieDB للأفلام وTheTVDB للمسلسلات)أجرِ مسحًا كاملًا بعد انتهاء الإعداد: لوحة التحكم > المكتبات > مسح كل المكتبات.
الإضافات غير موجودة — تحقق من المستودع
هذا من أكثر الأسئلة تكرارًا بعد ترقية الإصدار: يظهر كتالوج الإضافات فارغًا، أو تعرض كل إضافة الرسالة «An error occurred while getting the plugin details from the repository»، بينما بقية النسخة تعمل.
ما يقوله المشروع الأصلي. تصف المشكلة #16654 على GitHub («No longer access plugins»، المبلَّغ عنها على الإصدار 10.11.8) هذا الخطأ رغم أن عناوين المستودعات لدى صاحبها كانت صحيحة. أغلقها روبوت دون إصلاح («not planned») لانعدام النشاط. ويقترح مساهم فيها أن بعض الدول تحجب raw.githubusercontent.com الذي يستضيف عدة manifests لإضافات أطراف ثالثة؛ ويروي مستخدم أنه حلّ حالته بإلغاء تثبيت الإضافات ثم إعادة التشغيل ثم إعادة تثبيتها. لا يوجد سبب واحد مؤكَّد: التفسير السابق في هذا الدليل، أي تغيّر العنوان بين إصدارين، ليس ما تقوله المشكلة وقد حُذف.
الفحوصات بالترتيب:
1. افتح لوحة التحكم > الإضافات > المستودعات. يجب أن يشير المستودع الرسمي المستقر إلى https://repo.jellyfin.org/files/plugin/manifest.json. وإن كنت قد انتقلت إلى المستودع «unstable» فارجع إلى المستقر
2. من الـ VPS، تحقق من أن الـ manifest يستجيب: curl -sI https://repo.jellyfin.org/files/plugin/manifest.json. ولمستودع طرف ثالث مستضاف على GitHub اختبر أيضًا curl -sI https://raw.githubusercontent.com
3. اضغط «حفظ» ثم أعد تشغيل Jellyfin لإجبار البيانات الوصفية على إعادة التحميل: docker compose -f /opt/jellyfin/docker-compose.yml restart
4. كحل أخير، ألغِ تثبيت الإضافات المعنية، وأعد التشغيل، وأعد تثبيتها، ثم أعد التشغيل مرة أخرى
استراتيجية التخزين لـ Jellyfin على VPS
التخزين هو غالبًا القيد الرئيسي. أحجام تقريبية يجدر بك معرفتها (تقديرات معتادة):
- فيلم 1080p بصيغة MKV وH.264: من 5 إلى 15 غيغابايت بحسب المدة ومعدل البت
- فيلم 4K HDR وH.265: من 15 إلى 60 غيغابايت، وأكثر في نسخ Blu-ray المُعاد إخراجها
- حلقة مسلسل 1080p: من 1 إلى 4 غيغابايت
مثال حسابي: 100 فيلم 1080p × 8 غيغابايت (متوسط) = 800 غيغابايت كحد أدنى. لمكتبة من 300 فيلم متنوع + 10 مسلسلات كاملة، احسب من 3 إلى 5 تيرابايت.
الخيار 1 — وحدة تخزين إضافية للـ VPS (موصى به للبداية): يتيح معظم مزودي VPS وحدات كتل (Block Storage) تُركَّب أثناء التشغيل وتُفوتر بالغيغابايت شهريًا. ركّبها بنظام ext4 على /mnt/media ومرّرها إلى Docker كـ bind mount. الميزة: إدخال/إخراج مباشر على قرص محلي بلا عبور شبكي. العيب: التكلفة تنمو خطيًا مع الحجم.
بعد إرفاق الوحدة (هنا /dev/sdb):
mkfs.ext4 /dev/sdbmount /dev/sdb /mnt/mediaecho '/dev/sdb /mnt/media ext4 defaults 0 2' >> /etc/fstab
الخيار 2 — Hetzner Storage Box (CIFS/Samba): حل هجين — يبقى الـ VPS خفيفًا ويعيش التخزين في الـ Storage Box. ركّبه عبر CIFS:
apt install -y cifs-utilsinstall -m 600 /dev/null /root/.storagebox-credentials ثم اكتب فيه سطرين: username=uXXXXXX وpassword=…mount -t cifs //uXXXXXX.your-storagebox.de/backup /mnt/media -o seal,credentials=/root/.storagebox-credentials,uid=1000,gid=1000,iocharset=utf8
يُبقي ملف بيانات الاعتماد كلمة المرور خارج سجل الصدفة وقائمة العمليات؛ ويشفّر الخيار seal اتصال SMB، الذي لا يكون مشفّرًا بالضرورة افتراضيًا. فعّل أولًا SMB في لوحة Hetzner، وفعّل كذلك الوصول الخارجي إن لم يكن الـ VPS لدى Hetzner.
زمن الاستجابة الشبكي مقبول للبث المخزَّن مسبقًا (يقرأ Jellyfin مقدمًا)، لكنه غير مناسب للترميز المباشر — فسعة CIFS لا تجاريه.
الخيار 3 — NAS محلي مع نفق Tailscale أو Cloudflare Tunnel: إن كان لديك NAS منزلي، يمكنك إتاحة مكتبتك لـ VPS بعيد عبر نفق مشفّر. تنشئ Tailscale شبكة افتراضية خاصة بين الـ NAS والـ VPS في أقل من عشر دقائق. ويمرّ البث بعدها من الـ NAS ← إلى الـ VPS ← إلى المستخدم بزمن استجابة مضبوط. خصّص هذا الخيار للمكتبات الضخمة المكوَّنة مسبقًا.
عتبة الجدوى: قارن سعر التيرابايت لوحدة الكتل بسعر Storage Box في قوائم أسعار مزودك السارية. فوق 500 غيغابايت يكون التخزين الخارجي في الغالب أرخص، بشرط أن تقبل زمن الاستجابة الشبكي.
الترميز عبر العتاد — VAAPI وNVENC
يناسب الترميز البرمجي جلسة أو جلستين متزامنتين على VPS جيد. وفوق ذلك، أو لـ 4K HDR بانتظام، يصبح الترميز عبر العتاد ضروريًا.
VAAPI (إنتل/AMD): على خادم مخصص بوحدة رسومية Intel مدمجة أو وحدة رسومية AMD، يتيح الجهاز /dev/dri/renderD128 المرمِّز. أضف إلى خدمة Docker السطرين devices: ثم - /dev/dri/renderD128:/dev/dri/renderD128، وgroup_add: مع معرّف المجموعة render على المضيف (getent group render | cut -d: -f3).
ثم فعّل التسريع العتادي من لوحة التحكم > التشغيل > الترميز: اختر QSV (Intel Quick Sync، المفضَّل على وحدات Intel الرسومية الحديثة في Linux) أو VA-API (وحدات AMD الرسومية ووحدات Intel القديمة).
NVENC (NVIDIA): يتطلب على المضيف تعريف NVIDIA وNVIDIA Container Toolkit (الحزمة القديمة nvidia-docker2 متقادمة). أضف إلى الخدمة كتلة deploy: > resources: > reservations: > devices: تحتوي على - driver: nvidia وcount: 1 وcapabilities: [gpu].
تذكير: لا تتيح خوادم VPS السحابية العادية وحدة رسومية ولا الجهاز /dev/dri. هذا الوضع محجوز للخوادم المخصصة ببطاقة رسومية أو بمعالج ذي وحدة رسومية مدمجة يمكن الوصول إليها.
حدّد الحِمل لتفادي الإشباع: لا يضع Jellyfin حدًا عامًا لعمليات الترميز، لكن يمكنك أن تحدّد لكل مستخدم عددًا أقصى للجلسات المتزامنة (لوحة التحكم > المستخدمون > ملف المستخدم) وأن تقيّد معدّل البت للعملاء البعيدين في إعدادات التشغيل. وفي VPS بأربع أنوية، استهدف عمليتي ترميز أو ثلاثًا متزامنة على الأكثر — وفوق ذلك يلحظ بقية المستخدمين تدهورًا واضحًا.
الترقية إلى إصدار رئيسي: ما يفرضه Jellyfin 12
الانتقال من 10.11 إلى 12.x ليس تحديثًا روتينيًا. تضع ملاحظات الإصدار 12.0 (8 سبتمبر 2026) الإطار:
مسارات الترقية. يمكن الترقية مباشرة من 10.10.7 أو من أي 10.11.x دون مرحلة وسيطة. وأي إصدار أقدم من 10.10.7 يجب أن يمر أولًا بـ 10.10.7.
النسخ الاحتياطي. توصي الملاحظات «بشدة» بنسخة كاملة من مجلد البيانات، لأن التراجع يستلزم استعادة كاملة. وتؤكد وثائق النسخ الاحتياطي ذلك: ليس لدى Jellyfin آلية للرجوع إلى إصدار أقدم.
المدة. يتحقق الترحيل من مسارات كل عناصر المكتبة، وقد يستغرق ذلك وقتًا بحسب حجمها، وسيكون أول مسح للمكتبة أطول بكثير من المعتاد.
آثار جانبية معلنة. تُحذف النسخ البديلة التي حُلّت تلقائيًا (لا المدموجة يدويًا) وتعود بعد مسح كامل؛ وقد تظهر بعض الأفلام كأنها أُضيفت حديثًا؛ ويجب تصحيح أسماء المستخدمين التي تختلف بحالة الأحرف فقط قبل الترقية؛ وتختفي المسارات القديمة /emby/* و/mediabrowser/* مما قد يعطّل عملاء أطراف ثالثة قدامى؛ ويُعطَّل التفويض القديم؛ وتُستبدل إعدادات الترجمة العامة بإعدادات لكل مكتبة.
هذه النقاط مأخوذة من ملاحظات 12.0 وتخص 12.0؛ أعد قراءة ملاحظات الإصدار الذي تستهدفه.
إجراء دائم للترقية دون خسارة مكتبتك
قراءة ملاحظات الإصدار والتحقق من مسار الترقية
افتح صفحة الإصدار المستهدف في مستودع Jellyfin على GitHub واقرأ «upgrade notes» فيه. حدّد إصدارك الحالي (
docker compose imagesأو لوحة التحكم). إن كان أقدم من 10.10.7 فمرّ أولًا بـ 10.10.7. أزل الإضافات القادمة من مستودعات أطراف ثالثة قبل الترحيل كما تطلب ملاحظات 12.0.منع أي تحديث تلقائي
الترحيل المقاطَع هو السبب الموثَّق لأسوأ الحالات (راجع القسم التالي). عطّل إذًا كل ما يستطيع إعادة تشغيل الخدمة أو استبدالها دون علمك:
- Docker: ثبّت الوسم في
docker-compose.yml(لاlatestأبدًا) وأوقف Watchtower أو أي مهمة تشغّلdocker compose pull
- حزم Debian/Ubuntu: اعرض الحزم بالأمرdpkg -l | grep -i jellyfin، وجمّدها بـapt-mark hold <الحزمة>، وتحقق بـapt-mark showhold. الحزمة المجمَّدة لا يحدّثهاapt upgradeولاunattended-upgrades
- تجنب كذلك تشغيلapt upgradeعلى الجهاز أثناء الترحيل، حتى لحزم أخرى، إلى أن تتأكد من سلوك توزيعتكإيقاف Jellyfin ونسخ مجلد البيانات
قد تكون النسخة الساخنة لقاعدة بيانات مفتوحة غير صالحة للاستخدام: تنص الوثائق على أن الخادم يجب أن يكون متوقفًا في النسخ اليدوي، وإلا قد تُقفل القاعدة وتتعذر استعادتها.
cd /opt/jellyfindocker compose stopdf -h /optوdu -sh /opt/jellyfin/configللتحقق من المساحةcp -a /opt/jellyfin /opt/jellyfin.before-upgradeإذا كانت إعداداتك في وحدة تخزين مسماة (وهذه حال قالب كتالوج ServOrbit الذي يركّب
jellyfin-dataعلى/config)، فانسخ الوحدة بعد التحقق من اسمها بـdocker volume ls:docker run --rm -v jellyfin-data:/source:ro -v /root/jellyfin-before:/copy alpine cp -a /source/. /copy/.النسخة المدمجة (لوحة التحكم > النسخ الاحتياطية) بديل، لكنها لا تغني عن نسخ المجلد حين يكون الترحيل نفسه هو الخطر.
تغيير الوسم والتشغيل
عدّل سطر
image:فيdocker-compose.ymlإلى الإصدار المستهدف، ثم:docker compose pulldocker compose up -dيشغّل الخادم عمليات الترحيل عند الإقلاع قبل قبول الاتصالات. وما دامت جارية يكرر فحص الصحة العبارة «Server is still starting up.»
المراقبة دون لمس أي شيء
يعرض
docker compose logs -fالترحيل الجاري مرقّمًا (مثل «1 of 21»). وفي طرفية ثانية يبيّنdocker statsالحمل. لا تعد تشغيل الحاوية ولا تكرر أمرupأثناء ترحيل جارٍ: هذه هي الحركة التي عطّلت قواعد بيانات في المشكلة #18066. لاحظ أنrestart: unless-stoppedيعيد أيضًا تشغيل حاوية أُنهيت (بسبب نفاد الذاكرة مثلًا) في منتصف الترحيل: فإن أظهر السجل إقلاعات متكررة فأوقفها بنفسك بـdocker compose stopوشخّص قبل المتابعة.القرار: الانتظار أم الاستعادة
الترحيل البطيء يستهلك المعالج أو القرص؛ أما الترحيل العالق فخامل. تعطي تقارير المشكلة #18066 أوامر قدر: نواة واحدة عند 100 % لأكثر من ساعتين على قاعدة تتجاوز 3 غيغابايت قبل وجود الإصلاح، وترقية كاملة استغرقت نحو ساعتين عند مستخدم آخر، ونجاح بعد انتظار ليلة كاملة عند ثالث؛ وفي المقابل 0 % من المعالج وبلا إدخال/إخراج على القرص وخيوط خاملة عند من كان ترحيلهم عالقًا فعلًا. انتظر ما دام المعالج أو القرص يعملان والعدّاد يتقدم. فإن كان كل شيء خاملًا منذ وقت طويل، أو لم يعد السجل يتحرك، فاستعد النسخة.
استعادة النسخة إذا كانت العملية خاملة
docker compose downmv /opt/jellyfin /opt/jellyfin.blockedcp -a /opt/jellyfin.before-upgrade /opt/jellyfinأعد الوسم الدقيق السابق في
docker-compose.ymlثم شغّلdocker compose up -d. لا تحاول إرجاع قاعدة البيانات إلى إصدار أقدم في مكانها: ليس لدى Jellyfin آلية للرجوع. عند نجاح الترقية أجرِ مسحًا كاملًا للمكتبات، وأعد تثبيت الإضافات التي أزلتها، ولا تحذف النسخ إلا بعد أيام من الاستخدام العادي.
ترحيل لا ينتهي أبدًا: الحالة الفعلية للمشكلة #18066
العَرَض. فُتحت المشكلة jellyfin/jellyfin #18066 بعنوان «Migration ChangeOwnerIdToGuid never completes and keeps one CPU core at 100%» في 15 سبتمبر 2026 عند ترقية من 10.11.11 إلى 12.1.0. يصف صاحبها خيط .NET عند نحو 100 % من نواة واحدة لأكثر من ساعتين، وقاعدة jellyfin.db بحجم يقارب 3.2 إلى 3.5 غيغابايت ونحو 311 ألف عنصر، مع شبه انعدام للكتابة على القرص ودون أي خطأ في السجل.
الحالة الثانية: إعادة التشغيل بواسطة apt upgrade. يروي مستخدم آخر أن apt upgrade أعاد تشغيل الخدمة في منتصف الترحيل؛ وبقيت كل عمليات الإقلاع اللاحقة عالقة عند الترحيل AddForeignKeyToOwnerId بنسبة 0 % من المعالج ودون إدخال/إخراج أو كتابة. ويذكر أيضًا أن ملف systemd محليًا يحدّ مهلة الإقلاع (TimeoutSec = 15) كان يقتل عمليات الترحيل. وقد استعاد النسخة التي ينشئها Jellyfin قبل الترحيل (المجلد data/SQLiteBackups/): فأعاد الإصدار 12.2 تشغيل عمليات الترحيل في نحو خمس دقائق.
ما نجح وما لم ينجح. نجح بعض المستخدمين بعد ترك الترحيل يعمل طوال الليل، وآخرون بعد استعادة نسخة سابقة للترحيل أو إعادة تثبيت Jellyfin؛ وعاد بعضهم إلى 10.11.11 في الأثناء. وما زال التعطل قائمًا على 12.2 عند اثنين منهم على الأقل، في حين أبلغ خمسة على الأقل عن ترقية ناجحة عليه.
إصلاح المشروع الأصلي. دُمج طلب السحب #18073 «Fix ChangeOwnerIdToGuid migration performance» في 26 سبتمبر 2026 في الفرع 12.z (المرحلة v12.2) ثم نُقل إلى الفرع المستقر في 27 سبتمبر. ويعالج بطأين: فحص تصادمات كان يمسح جدول UserData كاملًا لكل صف مؤقت، وسبعة فهارس بُنيت على جدول بحجم عدة غيغابايت ثم أُهملت فورًا حين يعيد SQLite بناء الجدول لإضافة المفتاح الخارجي.
الحالة في 7 نوفمبر 2026. ما زالت المشكلة مفتوحة (وسم bug)، دون تحليل للسبب الجذري من أحد المشرفين في الخيط الظاهر؛ وآخر تعليق في 17 أكتوبر. توجد الإصدارات 12.0 و12.1 و12.2 و12.3 و12.4 (والإصدار 12.4 الصادر في 26 أكتوبر هو الأحدث): استهدف آخر إصدار 12.x لا 12.0 أو 12.1 اللذين نُشرا قبل دمج إصلاح الأداء هذا.
قراءة حذرة: يقصّر الإصلاح زمن الترحيل لكنه لا يضمن انتهاءه لكل قاعدة، ولا شيء يغني عن النسخة المسبقة. وحالة منفصلة في الخيط، عمليات عند 100 % بعد تسجيل دخول مستخدم، ربطها صاحبها بإحصاءات SQLite قديمة (sqlite_stat1) وحلّها بالأمر ANALYZE؛ ولم تُؤكَّد صلتها بالترحيل.
استكشاف الأخطاء — المشكلات الشائعة
مكتبة فارغة بعد المسح: تحقق من صحة الـ bind mount في Docker ومن تطابق الصلاحيات. تعمل الحاوية بالمعرّف UID 1000؛ فإذا كانت ملفاتك مملوكة لـ root فلا يستطيع Jellyfin قراءتها: chown -R 1000:1000 /mnt/media.
HTTPS معطّل خلف nginx: إذا تحمّلت الواجهة عبر HTTP رغم ضبط HTTPS، فتأكد من تمرير الترويستين X-Forwarded-Proto وX-Real-IP في إعداد nginx. بدونهما يولّد Jellyfin عناوين HTTP في ردوده.
ترميز بطيء أو خطأ VAAPI: تأكد من وصول الحاوية إلى الجهاز بالأمر docker exec jellyfin ls /dev/dri. إن كان المجلد غائبًا فالجهاز غير ممرَّر في docker-compose.yml أو أن الـ VPS لا يتيحه.
تطبيقات الجوال ترفض الاتصال: تحقق من أن شهادة TLS صالحة وغير موقَّعة ذاتيًا. ترفض عملاء Jellyfin على iOS وAndroid الشهادات الموقَّعة ذاتيًا دون إعداد إضافي. وإن كنت تستخدم Let's Encrypt فتأكد من أن التجديد التلقائي (certbot renew) فعّال: systemctl status certbot.timer.
إضافات مثبَّتة لكنها غير فعّالة بعد إعادة التشغيل: تتطلب بعض الإضافات إعادة تشغيل كاملة لـ Jellyfin (لا إعادة تحميل للإعدادات) كي تُفعَّل. استخدم docker compose restart بدل خيار إعادة التشغيل من الواجهة إن استمرت المشكلة.
«Server is still starting up.» في حلقة بعد ترقية الإصدار: ثمة ترحيل لقاعدة البيانات جارٍ أو عالق. لا تعد التشغيل. انظر إلى عدّاد الترحيل في docker compose logs وإلى الحمل بـ docker stats ثم طبّق قرار الانتظار أو الاستعادة المشروح أعلاه.
عميل قديم لم يعد يتصل بعد 12.0: أُزيلت المسارات /emby/* و/mediabrowser/*. حدّث العميل أو استبدله بآخر.
النشر من Marketplace ServOrbit
إذا كنت تفضّل تثبيتًا مُعدًّا مسبقًا على إدارة Docker يدويًا، فإن Jellyfin متوفر في Marketplace ServOrbit. ينشئ التثبيت الحاوية تلقائيًا، وما إن تربط نطاقًا بالتطبيق من فضاء العميل حتى يثبّت مضيف nginx الافتراضي وشهادة TLS. تحصل على Jellyfin جاهز للاستخدام، مع معالج الإعداد عند أول دخول؛ أما تخزين الوسائط (وحدة إضافية، Storage Box) فيبقى عليك تركيبه بنفسك كما سبق شرحه.
يبقى الـ VPS تحت سيطرتك الكاملة: يمكنك الاتصال عبر SSH وتعديل docker-compose.yml وإضافة وحدات تخزين أو الانتقال إلى بنية أخرى في أي وقت.
انتبه إلى خصوصية في القالب: في 7 نوفمبر 2026 يشير إلى الصورة jellyfin/jellyfin:latest ويركّب وحدة التخزين jellyfin-data على /config. بعد النشر ثبّت بنفسك وسم الصورة على الإصدار الذي اخترته، ثم اتبع إجراء ترقية الإصدار أعلاه قبل أي تغيير. يُقدَّم هذا الدليل دون دعم لتثبيتك.