SSD Nodes Learn Hosting plans →
الأدلة Matt Connorبقلم Matt Connor

ما هي متطلبات تشغيل Immich من الرام والمساحة؟

تعرف على الحد الأدنى الفعلي لتشغيل Immich. يتطلب النظام 6 جيجابايت من الرام، ولكن يمكنك تشغيله بـ 4 جيجابايت عبر تعطيل التعلم الآلي. اكتشف توزيع الموارد لكل حاوية.

ما مقدار ذاكرة الوصول العشوائي (RAM) التي يحتاجها Immich؟

يطلب Immich مقدار 6 GB من ذاكرة الوصول العشوائي (RAM) كحد أدنى موثق، و8 GB كحد موصى به، مع 2 أنوية للمعالج في الحد الأدنى، و4 نواة لتثبيت مريح. يغطي هذا الرقم حزمة البرمجيات بالكامل، لأن Immich يتكون من أربع حاويات وليس تطبيقاً واحداً. تصفح مكتبة تم استيرادها بالفعل لا يستهلك الكثير من الموارد. يذهب استهلاك الذاكرة إلى عملية الاستيراد، ويذهب معظمه إلى حاوية واحدة يمكنك إيقاف تشغيلها.

رسم بيانيImmich documented hardware requirements, October 2026
البيانات وراء هذا الرسم البياني
[
  {
    "label": "Documented minimum",
    "ram_gb": 6,
    "cpu_cores": 2
  },
  {
    "label": "Documented recommended",
    "ram_gb": 8,
    "cpu_cores": 4
  }
]

هذه هي الأرقام المنشورة في صفحة متطلبات Immich اعتباراً من أكتوبر 2026. إنها توصية لتحديد الحجم، وليست فحصاً يجريه البرنامج عند بدء التشغيل. توثق الصفحة نفسها إعداداً أصغر، وهو 4 GB مع تعطيل ميزات التعلم الآلي، ولا يوجد شيء أقل من ذلك. ما يتغير في الخادم الأصغر هو المهام الخلفية التي تكتمل، وما يحدث أثناء الاستيراد عندما تنفد الذاكرة.

يوجد حد تقني حقيقي واحد. منذ الإصدار 3، تحتاج حاوية التعلم الآلي على مضيفات amd64 إلى معالج يدعم x86-64-v2، وهو ما يغطي معظم المعالجات التي بيعت منذ عام 2012 تقريباً. ينطبق هذا المتطلب على تلك الحاوية، وليس على الخادم، لذا يمكنك على الأجهزة القديمة إيقاف تشغيل التعلم الآلي، أو تشغيله على جهاز آخر كما هو موضح أدناه، أو البقاء على الإصدار v2.7.5، الذي تذكره وثائق Immich كآخر إصدار متوافق.

إذا كنت لا تزال في مرحلة ما قبل التثبيت، ابدأ بـ تثبيت Immich الكامل على خادم افتراضي خاص (VPS) باستخدام Docker Compose ثم عُد إلى هنا لتحديد حجم الخادم المناسب.

أين تذهب الذاكرة: أربع حاويات

يبدأ ملف Compose الرسمي أربع خدمات. لكل منها متطلبات ذاكرة مختلفة، لذا فإن الرقم الإجمالي يخفي التفاصيل المفيدة.

تخدم immich-server واجهة الويب وAPI، كما تشغّل عمال المهام الخلفية. يعيش عاملان داخل تلك الحاوية الواحدة. تستجيب api للطلبات القادمة من المتصفح وتطبيق الهاتف. تدير microservices طوابير الانتظار، بما في ذلك إنشاء الصور المصغرة وترميز الفيديو. تقسم المتغيرات IMMICH_WORKERS_INCLUDE وIMMICH_WORKERS_EXCLUDE هاتين الخدمتين إلى حاويتين منفصلتين، وهي الطريقة التي تمنح بها النصف المزعج حد ذاكرة خاصاً به دون تقييد النصف الذي يخدم صورك.

database هي صورة PostgreSQL 14 مع إضافة VectorChord مدمجة. تحتفظ بكل جزء من البيانات الوصفية ومتجه بحث واحد لكل أصل. تضع وثائق Immich لهذه الخدمة الحد الأدنى الصريح الوحيد في الحزمة: إذا طبقت حدود موارد Docker، تحتاج قاعدة البيانات إلى 2 GB على الأقل. تنص الصفحة نفسها على أن قاعدة البيانات يجب أن توضع بشكل مثالي على وحدة تخزين SSD محلية وليس أبداً على مشاركة شبكة من أي نوع، لأن عمليات البحث عن المتجهات والفهارس هي عمليات قراءة عشوائية صغيرة، لذا فإن وحدة تخزين الشبكة تحوّل كل عملية منها إلى رحلة ذهاب وإياب. إذا كان اختيار الخطة يعتمد على ذلك، فإن الفرق بين وحدات تخزين NVMe وSATA SSD على خادم VPS يهم هنا أكثر من أي مكان آخر في هذه الحزمة.

تشغّل redis صورة Valkey وتحتفظ بطوابير المهام. هي الأصغر بين الأربع بفارق كبير، لأنها تخزن سجلات المهام بدلاً من بيانات الصور.

immich-machine-learning هي الخدمة التي تحدد حجم خطتك. تقوم بتحميل نماذج للبحث الذكي، واكتشاف الوجوه، والتعرف على النصوص، ويبقى النموذج المحمّل مقيماً في الذاكرة. القيمة الافتراضية لـ MACHINE_LEARNING_MODEL_TTL هي 300، لذا يتم إسقاط النموذج بعد خمس دقائق من عدم وجود طلبات، ويُعاد قراءته من وحدة التخزين /cache عند الطلب التالي. أثناء الاستيراد الجماعي، لا توجد فجوة مدتها خمس دقائق، لذا تظل النماذج محمّلة من الأصل الأول إلى الأخير.

ما الذي يتغير أثناء الاستيراد

يكون Immich هادئاً في حالة الخمول. الاستيراد هو المرحلة التي تتعثر فيها الخوادم الصغيرة، لأن رفع أصل واحد يضع سلسلة من المهام في قائمة الانتظار، وتعمل عدة قوائم في وقت واحد.

استخراج البيانات الوصفية يقرأ ترويسة الملف وهو إجراء خفيف. أما توليد الصور المصغرة فهو أثقل. ينتج Immich ثلاثة مخرجات للصور المصغرة لكل أصل: عنصر نائب مشوش (thumbhash)، ومعاينة بصيغة WebP، وصورة مصغرة بصيغة JPEG، بالإضافة إلى صورة مصغرة إضافية لكل وجه يتم اكتشافه. كل مهمة من هذه المهام تقوم بفك ترميز صورة، وتحدد "تزامن المهام" (job concurrency) عدد المهام التي يتم فك ترميزها في وقت واحد. التزامن هو المضاعف الذي يحوّل التكلفة الصغيرة لكل مهمة إلى تكلفة على مستوى الخادم بالكامل، ولهذا السبب يذكر FAQ الخاص بـ Immich هذا الإعداد كأول شيء يجب خفضه على الأجهزة ذات الموارد المحدودة. اضبط التزامن للقوائم الثقيلة على 1 من خلال Administration، ثم Settings، ثم Job Settings.

تضيف أصول الفيديو عملية تحويل الترميز (transcoding). كل مهمة تحويل ترميز هي عملية FFmpeg منفصلة لها ذاكرتها الخاصة، وستستخدم كل خيط معالجة (CPU thread) تسمح لها به.

يرسل البحث الذكي (Smart search) كل أصل جديد إلى حاوية تعلم الآلة لحساب متجه تضمين واحد. يعمل اكتشاف الوجوه (Face detection) بنموذج ثانٍ على نفس الصورة. عند الاستيراد الأول لمكتبة صور موجودة، تعمل كلتا القائمتين على كل أصل تمتلكه، وذلك لساعات. تلك هي اللحظة الأسوأ بالنسبة للذاكرة في التثبيت بالكامل، وهي تحدث مرة واحدة فقط.

لماذا تتطلب ميزتا التعرف على الوجوه والأجسام أكبر قدر من ذاكرة الوصول العشوائي (RAM)

تتكون معالجة الوجوه من مهمتين. تقوم ميزة اكتشاف الوجوه بتشغيل نموذج داخل حاوية تعلم الآلة لتحديد مربعات الوجوه. بعد ذلك، تقوم ميزة التعرف على الوجوه بتجميع هذه الاكتشافات وتصنيفها كأشخاص، وتستعلم هذه الخطوة عن فهرس المتجهات (vector index) في Postgres. لذا، فإن المكتبة الكبيرة تضغط على الخدمتين بالتناوب: حاوية النموذج أثناء تشغيل الاكتشاف، ثم قاعدة البيانات أثناء تشغيل التجميع.

تغير الإعدادات الأربعة التالية ما تحتفظ به حاوية تعلم الآلة:

  • نموذج الوجه. يشحن Immich الإعداد buffalo_l افتراضياً، ويوصي قسم FAQ باستخدام buffalo_s على الخوادم الصغيرة. إنه نموذج أصغر، لذا فهو يشغل ذاكرة أقل ويعمل بشكل أسرع، على حساب الدقة في الوجوه الصغيرة أو الجانبية.
  • عدد العاملين (worker count). القيمة الافتراضية لـ MACHINE_LEARNING_WORKERS هي 1. كل عامل هو عملية منفصلة تقوم بتحميل نسختها الخاصة من النماذج، لذا فإن رفع هذا العدد إلى 2 يضاعف تقريباً ذاكرة النموذج المقيمة. أبقِ القيمة عند 1 ما لم تكن لديك ذاكرة RAM فائضة.
  • حجم الدفعة (batch size). يحدد MACHINE_LEARNING_MAX_BATCH_SIZE__FACIAL_RECOGNITION الحد الأقصى لعدد الوجوه التي تتم معالجتها في وقت واحد. يتم الاحتفاظ بالدفعة في الذاكرة معاً، لذا فإن صورة جماعية تحتوي على أربعين وجهاً تستهلك ذاكرة أكبر من صورة شخصية واحدة.
  • أنواع النماذج التي تعمل فعلياً. تقوم ميزات البحث الذكي، واكتشاف الوجوه، والتعرف على النصوص بتحميل نماذجها الخاصة. إيقاف الميزات التي لا تستخدمها، من خلال Administration، ثم Settings، ثم Machine Learning Settings، يزيل استهلاكها للذاكرة بشكل دائم وليس فقط بين عمليات الاستيراد.

يوجد أيضاً الإعداد MACHINE_LEARNING_MODEL_ARENA، وهو موثق على أنه يقوم بالحجز المسبق لذاكرة المعالج (CPU memory) لتجنب التجزئة، وهو مفعل افتراضياً. قم بتغيير هذا الإعداد كخيار أخير. يعتمد تأثيره على مخصص الذاكرة الأساسي، لذا فإن الطريقة الوحيدة الصادقة لتقييمه هي مراقبة docker stats قبل وبعد التغيير.

ثلاثة ملفات تعريف عملية: 2 GB و4 GB و8 GB

رسم بيانيCompose memory limits that fit each server size, in MB
البيانات وراء هذا الرسم البياني
[
  {
    "label": "2 GB VPS",
    "server_limit_mb": 768,
    "db_limit_mb": 768,
    "ml_limit_mb": 0,
    "redis_limit_mb": 128,
    "notes": "below every documented configuration, machine learning container removed"
  },
  {
    "label": "4 GB VPS",
    "server_limit_mb": 1024,
    "db_limit_mb": 2048,
    "ml_limit_mb": 0,
    "redis_limit_mb": 192,
    "notes": "documented 4 GB setup: machine learning disabled or moved to another host, job concurrency 1"
  },
  {
    "label": "8 GB VPS",
    "server_limit_mb": 2048,
    "db_limit_mb": 2048,
    "ml_limit_mb": 2560,
    "redis_limit_mb": 256,
    "notes": "everything on at default settings"
  }
]

اقرأ هذه القيم كحدود يجب إدخالها في Compose، وليس كمقاييس لما يستهلكه Immich. الحد هو سقف أقصى. هو لا يحجز أي شيء، ولا يجعل الخدمة أصغر حجماً. هو يحدد الخدمة التي سيقوم النواة (kernel) بإنهاؤها عند نفاد ذاكرة الخادم، وهذا قرار من الأفضل أن تتخذه أنت بدلاً من تركه لتقدير النواة الخاص.

الخادم بسعة 2 GB: أزل حاوية التعلم الآلي

سعة 2 GB تقع تحت الحد الأدنى الموثق البالغ 6 GB، وتحت الإعداد الوحيد المخفّض الذي يوثقه Immich، وهو 4 GB مع تعطيل التعلم الآلي. لا ينشر Immich أي إعداد لـ 2 GB، لذا فإن ملف التعريف هذا هو حل وسط غير مدعوم، وليس وصفة قياسية. إذا حاولت استخدامه على أي حال، فقم بإلغاء تفعيل خدمة immich-machine-learning بالكامل في docker-compose.yml، أو اتركها تعمل وعطّل كل نموذج ضمن Administration، Settings، Machine Learning Settings. إزالة الحاوية هي الخيار الأفضل، لأن النموذج المعطّل يترك عملية Python قيد التشغيل في الذاكرة.

ستحتفظ بميزات الرفع، والألبومات، والمشاركة، والنسخ الاحتياطي للهاتف، والصور المصغرة، والبحث حسب التاريخ والمكان واسم الملف. ستفقد ميزات البحث حسب الوصف، والتجميع التلقائي للوجوه في أشخاص، والتعرف على النصوص داخل الصور.

تصل الحدود الأربعة مجتمعة إلى حوالي 1.7 GB، مما يترك للخادم حوالي 300 MB. تقول وثائق Immich إن قاعدة البيانات وحدها تحتاج إلى 2 GB على الأقل بمجرد استخدام حدود موارد Docker، وهو ما يمثل سعة الخادم بالكامل. لذا فإن 768 MB لقاعدة البيانات هي أقل بكثير من ذلك الحد الأدنى، وهذا هو السبب في أن Postgres هي الخدمة الأكثر عرضة للإنهاء هنا.

أول ما يتعطل هو عملية الاستيراد. تقديم صفحة هو استعلام بيانات وصفية متبوع بقراءة ملف، لذا فإن تصفح مكتبة موجودة بالفعل يستهلك أقل قدر من موارد الخادم، لكن الاستيراد المكثف للفيديوهات سيؤدي إلى استخدام الـ swap، لأن عملية تحويل الترميز (transcode) وطابور الصور المصغرة يطلبان الذاكرة في نفس اللحظة. إذا كان 2 GB هو كل ما تملك، فاضبط كل طابور ثقيل على مستوى توازي 1 وأضف ملف swap. إذا كنت تختار خطة استضافة، فاعتبر 4 GB هو الحد الأدنى الفعلي.

الخادم بسعة 4 GB: التعلم الآلي مفعّل، ومهمة واحدة في كل مرة

يوثق Immich سعة 4 GB كخيار قابل للعمل مع تعطيل ميزات التعلم الآلي، وهذا هو الإعداد المخفّض الوحيد في صفحة المتطلبات الخاصة به. مع وجود قاعدة البيانات عند حدها الأدنى الموثق البالغ 2 GB، تصل الحدود الثلاثة في الجدول إلى حوالي 3.2 GB، مما يترك للخادم حوالي 800 MB. اضبط توازي المهام على 1 لإنشاء الصور المصغرة وأبقِ خيوط تحويل الترميز منخفضة.

للحفاظ على التعرف على الوجوه والأشياء، المسار الموثق هو تشغيل حاوية التعلم الآلي على جهاز آخر، كما هو موضح أدناه، وتوجيه هذا الخادم إليها. تشغيلها على نفس الخادم بسعة 4 GB يتجاوز ما يوثقه Immich، لأن الحد الأدنى لقاعدة البيانات يترك حوالي 2 GB للخادم وRedis والنماذج والنظام معاً. إذا حاولت ذلك على أي حال، فقم بوضع سقف لحاوية التعلم الآلي باستخدام حد Compose، وحوّل التعرف على الوجوه إلى buffalo_s، واضبط توازي المهام على 1 للصور المصغرة واكتشاف الوجوه والبحث الذكي.

ستستمر الجولة الأولى على مكتبة موجودة لساعات طويلة، وفي حالة المكتبات الكبيرة لأكثر من يوم. هذا حد متعلق بالمعالج (CPU) وليس بالذاكرة، لذا فإن زيادة الـ RAM لن تقصر المدة.

إذا تم تشغيل التعلم الآلي على هذا الخادم، فإن أول ما يتعطل هو تلك الحاوية أثناء الجولة الأولى الشاملة. بدون سقف، تنمو الحاوية بينما تنمو أيضاً مهمة تحويل الترميز، ويقوم النواة بإنهاء الأكبر بينهما. ولأنها تعيد التشغيل في غضون ثوانٍ، يظهر docker ps -a أنها Up مع وقت تشغيل أقصر بكثير من جيرانها بدلاً من Exited (137)، ويكون الطابور متأخراً بهدوء أكثر مما كان عليه عند آخر فحص.

الخادم بسعة 8 GB: التوصية الموثقة

سعة 8 GB مع 4 أنوية تطابق ما يوصي به Immich، ويعمل كل شيء بالإعدادات الافتراضية: البحث الذكي، واكتشاف الوجوه، والتعرف على النصوص، وتحويل الترميز، بالتوازي الافتراضي. المكتبات التي تتجاوز مائة ألف أصل تعمل براحة هنا، وينتقل الضغط من الذاكرة إلى سرعة القرص، لأن فهرس المتجهات واستعلامات البيانات الوصفية هي ما تقوم به قاعدة البيانات طوال اليوم.

اضبط الحدود على أي حال. على خادم يمتلك مساحة كافية، تمنع الحدود أي طابور جامح من إسقاط قاعدة البيانات معه. إذا كنت تقارن هذا بالخيارات الأصغر، فإن تكلفة الـ VPS الفعلية حسب فئة الذاكرة تجعل خطة 8 GB عادةً هي الطريقة الأرخص للتوقف عن ضبط الإعدادات.

كيفية تحديد سقف الذاكرة لكل خدمة باستخدام حدود Compose

لا تُعدّل docker-compose.yml لهذا الغرض. يتم استبدال هذا الملف في كل مرة تقوم فيها بالترقية باستخدام wget. ضع الحدود في docker-compose.override.yml بجانبه، حيث يقوم docker compose بدمجهما تلقائياً.

services:
  immich-server:
    deploy:
      resources:
        limits:
          memory: 1024M
  immich-machine-learning:
    deploy:
      resources:
        limits:
          memory: 1024M
          cpus: '1.5'
  database:
    deploy:
      resources:
        limits:
          memory: 2048M
  redis:
    deploy:
      resources:
        limits:
          memory: 192M
docker compose up -d
docker stats --no-stream

يجب أن يظهر docker stats الآن السقف الخاص بك في عمود MEM USAGE / LIMIT بدلاً من إجمالي ذاكرة المضيف. إذا كان عمود الحد لا يزال يعرض حجم المضيف الكامل، فهذا يعني أن ملف التجاوز لم يتم التقاطه: تحقق من اسم الملف وقم بتشغيل docker compose config لرؤية النتيجة المدمجة.

حافظ على قاعدة البيانات عند 2048M أو أكثر. توثّق Immich سعة 2 GB كحد أدنى لقاعدة البيانات عند استخدام حدود موارد Docker. الحد المنخفض جداً يحوّل الخدمة البطيئة إلى خدمة متوقفة، لذا ارفعه إذا بدأ الحاوية في التكرار (cycling). هناك المزيد حول الآليات في ضبط حدود الذاكرة لكل خدمة في Docker Compose، بما في ذلك سبب عمل deploy خارج Swarm مع Compose v2.

كيفية إيقاف حاوية التعلم الآلي أو نقلها

على خادم صغير، يُعد نقل هذه الحاوية إلى مكان آخر أكبر تغيير يمكنك القيام به. يدعم Immich تشغيلها على جهاز آخر. أنشئ هذا الملف على المضيف الثاني، والذي يمكن أن يكون جهاز كمبيوتر مكتبي يعمل في المساء فقط:

name: immich_remote_ml
services:
  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
    restart: always
    ports:
      - 3003:3003
volumes:
  model-cache:
docker compose up -d
curl -s http://localhost:3003/ping

ثم انتقل إلى Administration، ثم Settings، ثم Machine Learning Settings في واجهة الويب، وانقر على Add URL، وأدخل http://<host>:3003. حافظ على تطابق الإصدار على كلا المضيفين، لأن وثائق Immich تحذر من أن عدم تطابق الإصدار بينهما قد يسبب أخطاءً وعدم استقرار.

ينقل ذلك المنفذ معاينات صورك إلى الجهاز الآخر دون تشفير، وتحذر وثائق Immich من أن حاوية التعلم الآلي لا تملك تدابير أمنية خاصة بها، لذا احتفظ بها ضمن شبكة خاصة أو شغّلها عبر نفق WireGuard بين المضيفين. لا تعرض المنفذ 3003 للإنترنت أبداً.

إذا كانت فكرة وجود حاوية نموذج مقيم هي المشكلة، فهذا سبب وجيه أيضاً للمقارنة بين كيفية اختلاف PhotoPrism وImmich فيما يشغلانه في حالة السكون قبل الالتزام بحجم خطة معينة.

ما هي مساحة القرص التي تحتاجها مكتبة Immich؟

لا يوجد معامل ضرب واحد، لأن أربعة عناصر مختلفة تنمو بمعدلات مختلفة. إليك الحسابات لمكتبة تحتوي على 50,000 صورة و500 مقطع فيديو قصير.

رسم بيانيWorked disk estimate: 50,000 photos and 500 videos
البيانات وراء هذا الرسم البياني
[
  {
    "label": "Originals: 50,000 photos at 4 MB",
    "gb": 200
  },
  {
    "label": "Originals: 500 videos at 120 MB",
    "gb": 60
  },
  {
    "label": "Thumbnails and encoded video at 15%",
    "gb": 39
  },
  {
    "label": "Postgres database",
    "gb": 3
  },
  {
    "label": "Machine learning model cache",
    "gb": 2
  }
]

تُعد 200 جيجابايت للصور و60 جيجابايت للفيديو مجرد افتراضات. استبدلها بمتوسطاتك الخاصة قبل شراء أي شيء، لأن الفيديو هو العامل الحاسم في هذا الرقم: دقيقة واحدة من فيديو الهاتف أكبر من مئة صورة.

find /srv/immich/upload -type f -printf '%s\n' \
  | awk '{n++; s+=$1} END {printf "%d files, %.1f MB average\n", n, s/n/1048576}'

الصف 39 جيجابايت هو النسبة الوحيدة المنشورة التي توفرها Immich: تضيف الصور المصغرة المُنشأة والفيديو المُعاد ترميزه ما بين 10 إلى 20 بالمئة إلى حجم المكتبة في المتوسط. هذا النطاق يعتمد على كمية الأصول التي لديك والتي تتطلب إعادة ترميز لتتوافق مع المتصفح. المكتبة التي تحتوي على ملفات JPEG تقع بالقرب من الحد الأدنى لهذا النطاق.

حجم قاعدة البيانات هو 3 جيجابايت، وهذا الرقم قريب من التكلفة الثابتة. توثق Immich ملفات قاعدة البيانات عادةً بأنها تتراوح بين 1 إلى 3 جيجابايت، لأنها تخزن البيانات الوصفية ومتجهات البحث بدلاً من البكسلات. ذاكرة التخزين المؤقت للنماذج هي 2 جيجابايت وتنمو إذا قمت بتفعيل عدة نماذج أو اختبرت نماذج مختلفة. يشير قسم FAQ إلى هذا الحجم كمستهلك للمساحة لهذا السبب تحديداً.

تصل الصفوف الخمسة في مجموعها إلى ما يزيد قليلاً عن 300 جيجابايت، لذا فإن وحدة تخزين بسعة 500 جيجابايت تترك مساحة للنمو، بينما وحدة بسعة 250 جيجابايت لا تكفي. راقب التوزيع باستخدام:

grep UPLOAD_LOCATION .env
du -sh /srv/immich/*

توجد ستة مجلدات تحت UPLOAD_LOCATION. يحتوي upload وlibrary على الملفات الأصلية، ويحتوي thumbs على المعاينات والصور المصغرة للوجوه، ويحتوي encoded-video على النسخ المُعاد ترميزها، ويحتوي profile على الصور الرمزية، ويحتوي backups على نسخ احتياطية تلقائية لقاعدة البيانات. فقط upload وlibrary وprofile هي ملفات لا يمكن تعويضها، حيث يمكن إعادة إنشاء كل شيء آخر منها.

هناك أمران يفاجئان المستخدمين. تذهب الأصول المحذوفة إلى سلة المهملات أولاً وتحتفظ بمساحتها حتى يتم إفراغ السلة، لذا فإن عملية التنظيف الكبيرة لا توفر مساحة في اليوم الذي تقوم فيه بالحذف. كما أن نسخة قاعدة البيانات الاحتياطية تحتوي على بيانات وصفية فقط، لذا فهي عديمة القيمة بدون الملفات الأصلية:

docker exec -t immich_postgres pg_dump --clean --if-exists \
  --dbname=immich --username=postgres | gzip > /srv/backups/immich-dump.sql.gz

اقرن ذلك بنسخة على مستوى الملفات للأصول الأصلية في مكان خارج الخادم، وهو الغرض من نسخ restic الاحتياطية من VPS إلى وحدة تخزين خارجية.

تعتمد عملية الترميز (Transcoding) على المعالج، لا على الذاكرة العشوائية (RAM)

لن تؤدي إضافة المزيد من الذاكرة العشوائية إلى تسريع عملية الترميز. يستخدم Immich برنامج FFmpeg للترميز، وفي خوادم VPS العادية، يتم فك تشفير كل إطار وإعادة تشفيره بواسطة المعالج (CPU). تحتفظ كل عملية FFmpeg بمخازن مؤقتة للإطارات التي تم فك تشفيرها في الذاكرة، ولهذا السبب يحسب قسم الاستيراد عملية الترميز كتكلفة إضافية على الذاكرة، لكن سرعتها يحددها المعالج. حتى في الحالات التي يتوفر فيها تسريع عتادي، يوضح توثيق Immich أن التسريع يقتصر افتراضياً على التشفير فقط، لذا يظل المعالج مسؤولاً عن فك التشفير وتعيين النغمات (tone mapping) ما لم تقم بتفعيل فك التشفير العتادي أيضاً.

يتطلب التسريع العتادي ملف hwaccel.transcoding.yml Compose إضافي بالإضافة إلى جهاز لتمريره، باستخدام NVENC أو Quick Sync أو RKMPP أو VAAPI. لا توفر معظم خطط VPS أياً من هذه الميزات، لذا خطط اعتماداً على المعالج.

الإعداد العملي هو عدد الخيوط (thread count). ضمن الإدارة (Administration)، ثم الإعدادات (Settings)، ثم إعدادات ترميز الفيديو (Video Transcoding Settings)، تعني قيمة الخيوط 0 استخدام جميع الأنوية، مما قد يؤدي إلى تجميد واجهة الويب بسبب فيديو واحد على خطة ذات نواتين. اضبط القيمة على 1 أو 2 هناك، كما تقترح الأسئلة الشائعة لـ Immich، لتصبح عملية الترميز بطيئة بدلاً من أن تكون معطلة للنظام.

لماذا يبدو تبادل الذاكرة (swap thrashing) كأنه تعليق للنظام

هذا هو الفشل الذي يسيء المستخدمون فهمه في أغلب الأحيان. عندما تنفد ذاكرة Immich، هناك نتيجتان، وواحدة منهما فقط تبدو كفشل.

بدون وجود مساحة تبادل (swap)، يقوم النواة بإنهاء العملية. يعيد الحاوية التشغيل خلال ثوانٍ، لذا من المتصفح يتوقف طابور المهام ببساطة ثم يستأنف. الدليل موجود في docker ps -a:

docker ps -a --filter name=immich
docker inspect immich_machine_learning | grep -i oomkilled
sudo dmesg -T | grep -i -E 'out of memory|oom-kill'

تعني Exited (137) أن العملية أُنهيت بالإشارة 9. الرقم 137 هو 128 مضافاً إليه 9. أنت ترى هذه الحالة فقط بينما تكون الحاوية متوقفة. بمجرد أن تعيد سياسة إعادة التشغيل الحاوية، تظهر docker ps -a أنها Up مرة أخرى، وتكون فترة التشغيل أقصر بكثير من حاويات Immich الأخرى هي الدليل. الإشارة 9 بحد ذاتها لا تثبت وجود مشكلة في الذاكرة، لأن Docker يرسلها أيضاً عندما يتجاوز الإيقاف العادي مهلته الزمنية. تؤكد قيمة OOMKilled التي تساوي true أنها أُنهيت بسبب الذاكرة، وبمجرد إعادة تشغيل الحاوية، تكون أسطر oom-kill من dmesg هي السجل الذي يجب الوثوق به.

مع وجود مساحة تبادل (swap)، لا يتم إنهاء أي شيء ولا تظهر أي أخطاء. يبدأ النواة بنقل الصفحات إلى القرص، ويتباطأ الاستيراد بمقدار مرتبة عشرية، وتتوقف واجهة الويب عن الاستجابة ضمن المهلة الزمنية العادية. كل حاوية تعمل. قد تظل كل فحوصات السلامة ناجحة. يبدو الأمر كأنه تعليق للنظام، ويقوم المستخدمون بإعادة تشغيل الجهاز عند هذه النقطة، مما يؤدي إلى فقدان تقدم الطابور ولا يغير شيئاً.

free -m
vmstat 1 5

القيم المستمرة غير الصفرية في أعمدة si وso من vmstat تعني أن الجهاز يقرأ ويكتب في مساحة التبادل باستمرار، وهو تعريف الـ thrashing. سيرتفع صف free -m الخاص بـ Swap المستخدم في نفس الوقت.

أضف مساحة تبادل (swap) على أي حال في جهاز بذاكرة 2 GB أو 4 GB، لأن استيراداً بطيئاً يمكنك تشخيصه أفضل من حاوية مُنهاة لا يمكنك تشخيصها:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

ثم عالج السبب. قلل توازي المهام إلى 1، أو حدد موارد حاوية التعلم الآلي، أو انقلها خارج هذا الخادم. تمنحك مساحة التبادل الوقت للقيام بذلك. إنها ليست الحل بحد ذاتها.

FAQ

هل يمكنني تشغيل Immich على خادم VPS بذاكرة 2 GB؟

لا يمكن ذلك في أي إعداد توثقه Immich. تحدد صفحة المتطلبات 6 GB كحد أدنى، وتذكر أن 4 GB هي الإعداد الأصغر الوحيد المتاح عند تعطيل ميزات تعلم الآلة، وتذكر أن قاعدة البيانات وحدها تحتاج 2 GB على الأقل بمجرد استخدام حدود موارد Docker. قد يؤدي التعليق على خدمة immich-machine-learning وضبط توازي المهام (job concurrency) على 1 إلى تشغيله، لكن هذا حل وسط غير مدعوم، وPostgres هي الخدمة الأكثر عرضة للإنهاء أثناء عملية الاستيراد. إذا كان لديك 2 GB فقط، أضف ملف تبديل (swap file) بحجم 2 GB بحيث تؤدي ذروة الاستيراد إلى إبطاء الخادم بدلاً من إنهاء الحاوية. إذا كنت تختار خطة استضافة، فابدأ بـ 4 GB.

لماذا يتوقف استيراد Immich دون رسالة خطأ؟

هناك سببان مختلفان يبدوان متطابقين من المتصفح. إما أن حاوية قد أُنهيت بسبب الذاكرة وأعيد تشغيلها بالفعل، وفي هذه الحالة يظهر docker ps -a أنها Up مع وقت تشغيل قصير بشكل مريب (لا يظهر Exited (137) إلا إذا ضبطتها وهي متوقفة)، أو أن المضيف يستخدم الذاكرة الافتراضية (swapping)، وفي هذه الحالة تظل كل حاوية قيد التشغيل ويكون كل شيء بطيئاً جداً. يميّز vmstat 1 5 بينهما: الأرقام المستمرة غير الصفرية في عمودي si و so تعني حدوث swapping. قلل توازي المهام لإنشاء الصور المصغرة، واكتشاف الوجوه، والبحث الذكي في كلتا الحالتين.

ماذا يعني رمز الخروج 137 في سجلات Immich؟

الرمز 137 هو 128 مضافاً إليه الإشارة 9، مما يعني أن العملية أُنهيت باستخدام SIGKILL. في خادم Immich، عادة ما يكون هذا بسبب تجاوز سقف الذاكرة، سواء كان حد الحاوية الخاص أو نفاد ذاكرة المضيف، لكن الرمز وحده لا يثبت ذلك: يرسل Docker أيضاً SIGKILL عندما لا تتوقف الحاوية ضمن مهلتها الزمنية، وهي 10 ثوانٍ افتراضياً على Linux. تحقق باستخدام docker inspect immich_machine_learning | grep -i oomkilled. تؤكد القيمة true أن النواة أنهت العملية بسبب الذاكرة، ويخبرك free -m مضافاً إليه sudo dmesg -T | grep -i oom-kill ما إذا كان السبب هو حد الحاوية أو المضيف بالكامل. حاوية تعلم الآلة هي الضحية المعتادة لأنها غالباً ما تكون العملية الأكبر.

كم مساحة القرص التي يحتاجها Immich لكل صورة؟

خصص مساحة الملف الأصلي بالإضافة إلى 10 إلى 20 بالمئة. توثق Immich أن الصور المصغرة المُنشأة والفيديو المُحوّل ترميزه تزيد من حجم المكتبة بنسبة 10 إلى 20 بالمئة في المتوسط، وعادة ما تكون قاعدة البيانات نفسها بحجم 1 إلى 3 GB حتى للمكتبات الكبيرة. الفيديو هو ما يحدد إجمالي المساحة فعلياً، لذا قِس متوسط حجم ملفاتك قبل اختيار الخطة بدلاً من تطبيق مضاعف على عدد الصور.

هل أحتاج إلى GPU لـ Immich؟

لا. يعمل كل جزء من Immich على المعالج (CPU). تسرّع بطاقة الرسوميات استنتاج النماذج في حاوية تعلم الآلة وترميز الفيديو، وكلاهما ليس مطلوباً. معظم خطط VPS لا توفر GPU. على الأجهزة التي تعتمد على المعالج فقط، اضبط خيوط تحويل الترميز (transcoding threads) على 1 أو 2، واستخدم نموذج الوجه buffalo_s، واترك الاستيراد الجماعي الأول يعمل طوال الليل.

هل كان هذا المقال مفيدًا؟