PhotoPrism أم Immich: أي خادم صور تختار؟
قارن PhotoPrism وImmich بواقعية: الحد الأدنى الفعلي للذاكرة، تطبيقات الهاتف، الخرائط، وأوامر النسخ الاحتياطي الدقيقة المطلوبة لكل منهما على VPS.
PhotoPrism مقابل Immich: الإجابة المختصرة
المقارنة بين PhotoPrism وImmich هي اختيار بين مهمتين مختلفتين، وليست اختياراً بين إصدارين من المنتج نفسه. يحل Immich محل Google Photos: ينسخ تطبيق الهاتف صور الكاميرا احتياطياً تلقائياً، ويبدو المخطط الزمني الناتج مألوفاً لأي شخص ينتقل من معرض صور الهاتف. ينظّم PhotoPrism مكتبة صور موجودة لديك مسبقاً: يفهرس مجلدات الملفات على القرص، ويقرأ بياناتها الوصفية، ويضعها على خريطة، ويترك الملفات في أماكنها تماماً.
اختر Immich إذا كانت المشكلة هي: "هاتفي ممتلئ وأريد التوقف عن استخدام Google Photos". اختر PhotoPrism إذا كانت المشكلة هي: "لدي 400 GB من الصور على قرص، ولا أستطيع العثور على أي شيء بينها". كلاهما مفتوح المصدر، ويعمل كلاهما كحاويات Docker على VPS عادي، ويفهرسان مكتبتك ويتيحان البحث فيها من دون إرسال أي شيء إلى جهة خارجية.
الاختلاف في الفلسفة، ولماذا يحسم كل شيء
يتولى Immich إدارة الملفات. تحدد له موقع الرفع، ثم يرسل تطبيق الهاتف أو أداة الرفع عبر الويب الملفات الأصلية، ويخزنها Immich ضمن مساره وبأسماء يحددها هو. تحتفظ قاعدة البيانات بالمعلومات المعتمدة عن الألبومات والوجوه والبحث. هذا التصميم هو ما يجعل تجربة استخدام الهاتف جيدة، لأن الخادم يعرف دائماً الحالة الكاملة لكل عنصر.
يقرأ PhotoPrism الملفات. تربط مجلد originals تتحكم فيه مسبقاً، ثم ينشئ PhotoPrism فهرساً له. تبقى بنية مجلداتك ملكاً لك. إذا أزلت PhotoPrism غداً، فستبقى الصور في المجلدات نفسها وبالأسماء نفسها. أما ملفات YAML الجانبية التي أنشأها PhotoPrism لوصف ما تعلّمه، فتبقى في مجلد التخزين الخاص به، حيث يحتفظ بها افتراضياً.
يشرح هذا الاختلاف الواحد معظم الفروق الأخرى. يوفّر Immich دعماً قوياً للهواتف لأنه يتحكم في استيعاب الملفات. ويوفّر PhotoPrism إدارة قوية للمكتبة لأنه لا يغيّر بنيتك الحالية. يكون Immich الخيار الأفضل لعائلة توجد صورها على الهواتف. ويكون PhotoPrism الخيار الأفضل لأرشيف موجود على قرص.
متطلبات العتاد: Immich يحتاج إلى المزيد
الفارق بين الحد الأدنى الموثق للذاكرة كبير، وعلى VPS صغير يكون هذا العامل عادةً هو الحاسم.
البيانات وراء هذا الرسم البياني
[
{
"label": "Immich",
"min_ram_gb": 6
},
{
"label": "PhotoPrism",
"min_ram_gb": 3
}
]يوثّق Immich مقدار 6 GB من RAM كحد أدنى، و8 GB كقيمة موصى بها، مع ملاحظة أن جهازاً بذاكرة 4 GB لا يمكنه تشغيله إلا بعد إيقاف تعلّم الآلة. ويوثّق PhotoPrism مقدار 3 GB من الذاكرة الفعلية ونواتي CPU، ويذكر أن مقدار RAM بعد هذا الحد الأدنى يجب أن يتوافق مع عدد الأنوية.
الفارق حقيقي، وسببه حاوية تعلّم الآلة. يشغّل Immich نماذجه في خدمة immich-machine-learning منفصلة، وتحمّل هذه الخدمة نماذج CLIP (التدريب التبايني المسبق للغة والصور) واكتشاف الوجوه في الذاكرة. على جهاز بذاكرة 2 GB، تنهي النواة هذه الحاوية، وتراها تخرج بالرمز 137، وهو رمز الحالة لعملية أُنهيت بالإشارة 9، وهذه هي الطريقة التي يظهر بها إنهاء العملية بسبب نفاد الذاكرة في Docker. تعمل نماذج PhotoPrism المضمّنة على ONNX، وتذكر وثائقه أنها تؤدي عموماً أداءً جيداً على جميع أنواع العتاد. كما يوفّر PhotoPrism آلية رجوع موثقة عند ضيق الذاكرة: على الأجهزة التي تحتوي على 1 GB أو أقل، يعطّل تحويل RAW والتعرّف على الوجوه. لكن هذا لا يضمن الاستقرار. ويحذّر المشروع من عدم الاستقرار ومشكلات الأداء عند النزول عن الحد الأدنى البالغ 3 GB، لذلك تعامل مع هذا الحد باعتباره حداً أدنى فعلياً.
توضح وثائق PhotoPrism ضرورة توفير 4 GB على الأقل من swap على الخادم. لا تذكر صفحة متطلبات Immich swap، لكن swap يمنح حاوية تعلّم الآلة مساحة إضافية على الجهاز الصغير. أضفها قبل تثبيت أيٍّ منهما.
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -hيجب أن يطبع free -h الآن سطراً من نوع Swap: يبيّن 4.0Gi. وإذا طبع 0B، فهذا يعني أن swapon فشل، وعادةً يكون السبب أن نظام الملفات لا يدعم fallocate، وأن sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 هو آلية الرجوع. تهم حدود ذاكرة الحاويات هنا أيضاً، ويتيح لك ضبط حدود الذاكرة في Docker Compose منع خدمة واحدة كثيرة الاستهلاك من إسقاط الجهاز بأكمله. والاستثناء هو PhotoPrism نفسه: إذ تنصح وثائقه بعدم فرض حد صلب للذاكرة على حاويته، لأن فهرسة الملفات الكبيرة تحتاج مؤقتاً إلى ذاكرة إضافية، وقد يؤدي الحد إلى عمليات إعادة تشغيل غير متوقعة.
هناك متطلب آخر يغفل عنه بعض المستخدمين. يجب أن تكون قاعدة بيانات Postgres الخاصة بـImmich على نظام ملفات Unix عادي يوفّر الملكية والصلاحيات الفعلية، وعلى تخزين محلي، وليس على مشاركة شبكية بأي حال. ويحذّر PhotoPrism من تخزين ملفات قاعدة بياناته على مجلد شبكي مشترك، ويذكر أن تخزين SSD المحلي هو المكان الأفضل لها. لا يمكن تشغيل أي من التطبيقين بأمان إذا كانت قاعدة بياناته على مخزن كائنات موصول.
كيفية تثبيت كل تطبيق
يتكوّن كلا التثبيتين من ملف Compose يوفّره المورّد وأمر واحد. أعدّ Docker Engine وCompose plugin أولاً، كما هو موضّح في دليلنا إلى Docker Compose على VPS.
تنشر Immich ملف Compose وملف بيئة نموذجي مع كل إصدار.
sudo mkdir -p /opt/immich && cd /opt/immich
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.envعدّل .env قبل بدء أي شيء. سيُخزّن UPLOAD_LOCATION ملفاتك الأصلية. تأتي DB_PASSWORD بقيمة افتراضية صالحة للعمل، وتوصي Immich بتغييرها إلى كلمة مرور عشوائية، رغم أنها لا تفرض ذلك. لا يُعرَض Postgres للعامة، لذلك تُستخدم كلمة المرور للمصادقة المحلية فقط، لكن تعيين كلمة مرور عشوائية لا يكلّف شيئاً. استخدم الأحرف A-Za-z0-9 فقط، لأن وثائق Immich تذكر أن الأحرف الأخرى قد تسبب مشكلات عندما يحلّل Docker القيمة. ثم شغّل التطبيق.
docker compose up -d
docker compose psتستجيب واجهة الويب على المنفذ 2283. يصبح أول حساب يُسجَّل عبر تلك الصفحة حساب المسؤول، لذلك افتحها وسجّل الحساب فوراً بدلاً من ترك نسخة مفتوحة على الإنترنت.
توفّر PhotoPrism ملف Compose واحداً يتضمن MariaDB مسبقاً.
sudo mkdir -p /opt/photoprism && cd /opt/photoprism
wget https://dl.photoprism.app/docker/compose.yamlافتح compose.yaml وغيّر PHOTOPRISM_ADMIN_PASSWORD قبل التشغيل الأول. توضح الوثائق ذلك صراحة: يبدأ التطبيق باستخدام كلمة المرور الأولية الموجودة في ذلك الملف، والحد الأدنى للطول هو 8 أحرف، ويجب عدم استخدام القيمة الافتراضية مطلقاً على خادم عام. اضبط وحدة التخزين originals في الوقت نفسه على المجلد الذي يحتوي على صورك.
docker compose up -d
docker compose logs -f photoprismتستجيب PhotoPrism على المنفذ 2342 باستخدام المستخدم admin. لا ينبغي تعريض أي من التطبيقين مباشرة للإنترنت. ضع reverse proxy مع TLS (أمان طبقة النقل) أمامهما، باستخدام بنية الإعداد نفسها الموضحة في Nextcloud مستضاف ذاتياً مع Docker وTLS والنسخ الاحتياطية، أو أبقِ الخادم خاصاً ووصل إليه عبر VPN. إذا بدأ VPS هذا باستضافة ما يتجاوز الصور، فطبّق القيد نفسه على كل خدمة تضيفها إليه، لأن مرحل RustDesk مستضاف ذاتياً يحتاج إلى إتاحة منفذَيه فقط، ولا شيء غير ذلك.
أيّهما يوفّر تطبيقاً أفضل للهاتف
هنا يظهر أكبر اختلاف بين المشروعين، وهو السبب الذي يجعل معظم المستخدمين ينتهون إلى استخدام Immich.
يوفّر Immich تطبيقات رسمية لنظامي Android وiOS. وتنفّذ هذه التطبيقات نسخاً احتياطية في الخلفية لمجلد الصور في الهاتف، ما يعني أن الصور الجديدة تُنقل من الهاتف دون الحاجة إلى فتح أي تطبيق. لاستخدام الخدمة خارج المنزل، يوثّق Immich ثلاث طرق: شبكة VPN مثل WireGuard أو OpenVPN، أو Tailscale، أو Reverse Proxy يوفّر HTTPS. يتيح Reverse Proxy لتطبيقات الهاتف الاتصال دون تثبيت تطبيق VPN على كل هاتف. ويحذّر Immich من إعادة توجيه المنفذ 2283 مباشرةً إلى الإنترنت دون إعدادات إضافية.
لا يوفّر PhotoPrism تطبيقاً أصلياً رسمياً. بل يوفّر progressive web app تضيفه إلى الشاشة الرئيسية من المتصفح، كما يوثّق WebDAV (تأليف الويب وإدارة الإصدارات) باعتباره طريقة المزامنة من الهاتف. يوصي المشروع باستخدام تطبيق تابع لجهة خارجية يسمى PhotoSync لهذا الغرض، مع توجيهه إلى الدليل /import/ أو /originals/ عبر WebDAV. تعمل هذه الطريقة، لكنها تعتمد على تطبيق مدفوع تابع لجهة خارجية لتنفيذ مهمة ينفّذها Immich داخل تطبيقه نفسه.
إذا كان النسخ الاحتياطي التلقائي من هواتف عدة أفراد في العائلة هو المتطلب، فالإجابة محسومة: Immich.
ما الذي يوفّره تعلّم الآلة فعلياً
ينفّذ Immich بحثاً دلالياً في مكتبتك باستخدام CLIP، لذلك يمكن لطلب مثل "دراجة حمراء في الثلج" العثور على صور لم يضع أحد لها وسوماً من قبل. كما ينفّذ اكتشاف الوجوه وتجميعها، واكتشاف الصور المكررة. قد تستغرق فهرسة استيراد كبير ساعات عند تشغيلها على CPU في الخلفية، وهذا أمر طبيعي ولا يحتاج إلى GPU (وحدة معالجة الرسومات).
يصنّف PhotoPrism الصور ضمن تسميات باستخدام نموذج ONNX مضمّن، ويكتشف الوجوه ويجمعها ضمن أشخاص باستخدام نماذج وجوه ONNX، ويقرأ البيانات الوصفية للموقع لإنشاء خريطة للأماكن. ويمكن لملف vision.yml في مجلد الإعدادات استبدال النموذج بـ Ollama أو OpenAI للتسميات والوصف، إذا أردت ذلك. الخريطة هي الميزة التي تجعل المستخدمين يستمرون في استخدام التطبيق: فالمكتبة المفهرسة حسب مكان التقاط الصور توفر طريقة مختلفة فعلاً لتصفح عشرين عاماً من الصور. وتعمل الفكرة نفسها مع مجموعات الوسائط الأخرى، كما أن واجهة Halcyon الأمامية لمتجر فيديوهات التسعينيات في Jellyfin هي النسخة الخاصة بالأفلام منها، إذ تتيح التصفح حسب الرف بدلاً من القائمة. يتضمن إصدار Community المجاني التعرّف على الوجوه. وتضيف عضويتا Essentials وPlus المدفوعتان ميزات إضافية، مثل طبقات خرائط أكثر تفصيلاً، والمزيد من أدوار المستخدمين، وواجهة لإدارة المستخدمين، وتبدأ أسعارهما من بضعة يوروهات شهرياً مع الفوترة السنوية، وفقاً للأسعار في أكتوبر 2026.
لا يحتوي Immich على ميزات محجوبة خلف الدفع، ويذكر المشروع أنه لن يفعل ذلك أبداً. لكنه يبيع مفاتيح منتج اختيارية مدى الحياة، بسعر $25 لمستخدم واحد أو $100 لخادم كامل، وفق الأسعار التي أعلنها Immich في يوليو 2024. لكن شراء أحد هذه المفاتيح لا يفتح أي ميزة، ويعمل Immich دون قيود إذا لم تدفع شيئاً. أما المكوّن الأساسي في PhotoPrism فهو مجاني، مع إضافات مدفوعة اختيارية.
النسخ الاحتياطية هي ما يحدد إمكانية الاحتفاظ ببياناتك
خادم صور بلا نسخة احتياطية يبعده عطل قرص واحد عن فقدان كل ما تملكه العائلة. يحتاج كلا التطبيقين إلى نسختين احتياطيتين: نسخة من قاعدة البيانات، ونسخة من الملفات.
بالنسبة إلى Immich، أفرغ قاعدة البيانات من حاوية Postgres وانسخ موقع الرفع.
docker exec -t immich_postgres pg_dump --clean --if-exists --dbname=immich --username=postgres | gzip > /backup/immich-db.sql.gzثم أنشئ نسخة احتياطية من UPLOAD_LOCATION. المجلدات التي تحتوي على بيانات لا يمكن تعويضها هي upload وlibrary وprofile. يمكن إعادة إنشاء المجلدين thumbs وencoded-video، لكن ذلك يستهلك ساعات من وقت CPU. لا تستعيد نسخة قاعدة البيانات وحدها أي شيء، لأنها تحتوي على البيانات الوصفية فقط.
أما PhotoPrism، فلديه أمر خاص بالفهرس.
docker compose exec photoprism photoprism backup -i -fيكتب هذا الأمر تفريغ SQL ضمن storage/backup/. ثم انسخ المجلد originals والمجلد storage. يكتب PhotoPrism أيضاً ملفات YAML جانبية تصف كل صورة، لذلك يمكن إعادة بناء فهرس مفقود من الملفات وحدها. وهذه ميزة مهمة لأرشيف تخطط للاحتفاظ به لعقود.
أيّاً كان الخيار الذي تختاره، انقل هذه النسخ الاحتياطية خارج الخادم وفق جدول زمني باستخدام نسخ restic احتياطية مشفّرة ومزالة التكرار إلى تخزين بعيد. النسخة الاحتياطية الموجودة على القرص نفسه الذي توجد عليه المكتبة ليست نسخة احتياطية. اجعل المهمة ترسل تنبيهاً عند فشلها، لأن النسخة الاحتياطية التي توقّف تشغيلها بصمت في مارس تبدو تماماً كنسخة نُفِّذت الليلة الماضية إلى أن تحتاج إليها، وعندها سيرسل خادم ntfy مستضاف ذاتياً هذا الفشل إلى هاتفك في المساء نفسه.
أيّهما ينبغي أن تشغّل؟
شغّل Immich إذا كانت صورك موجودة على الهواتف، أو إذا كان أكثر من شخص يحتاج إلى نسخ احتياطي لمحتوى كاميرا الهاتف، أو إذا كان بإمكانك تخصيص 6 GB من ذاكرة RAM للخادم أو أكثر. وهو أقرب خيار إلى Google Photos يمكنك استضافته بنفسك، كما أن تجربة استخدام تطبيق الهاتف هي محور قوته. يشرح دليل تثبيت Immich خطوة بخطوة لدينا حالات توقف الخدمة بسبب نفاد الذاكرة ومشكلات الترقية بالتفصيل.
شغّل PhotoPrism إذا كان لديك أرشيف صور موجود مسبقاً على القرص، أو إذا كنت تهتم بالخرائط والبيانات الوصفية والحفاظ على بنية مجلداتك، أو إذا كان VPS لديك مزوداً بـ4 GB من ذاكرة RAM وتفضّل مكتبة تعمل بدلاً من مكتبة تعتمد على swapping. فهو أداة أفضل لتنظيم الصور، كما أنه أقل استهلاكاً للموارد على الأجهزة محدودة الإمكانات.
من المنطقي أيضاً تشغيل التطبيقين معاً. يتولى Immich استيراد صور الهاتف اليومية، ثم ترتب الصور التي تريد الاحتفاظ بها في أرشيفك مرة واحدة سنوياً، وتدع PhotoPrism يفهرس ذلك الأرشيف. لا يتعارضان، لأن PhotoPrism يقرأ المجلدات، بينما يدير Immich بياناته الخاصة.
FAQ
هل يمكن لـPhotoPrism وImmich مشاركة مجلد الصور نفسه؟
ليس بأمان في كلا الاتجاهين. يفهرس PhotoPrism مجلد originals، ويحتوي على ميزات تكتب فيه ما لم يعمل في وضع القراءة فقط، بينما يتوقع Immich أن يدير محتويات موقع التحميل الخاص به. يمكنك توجيه PhotoPrism إلى نسخة للقراءة فقط من مجلد library الخاص بـImmich لتصفحه، لكن لا تسمح للتطبيقين بإدارة الملفات نفسها، لأن قالب التخزين في Immich قد ينقل الأصول أو يعيد تسميتها أثناء فهرستها بواسطة PhotoPrism.
هل أصبح Immich مستقراً بما يكفي للاحتفاظ بالنسخة الوحيدة من صوري؟
لا ينبغي لأي تطبيق مستضاف ذاتياً أن يحتفظ بالنسخة الوحيدة من أي شيء. يتبع Immich الآن نظام الإصدارات الدلالية، ويذكر أن التغييرات غير المتوافقة تقتصر على الإصدارات الرئيسية. لذلك ثبّت IMMICH_VERSION على وسم إصدار رئيسي مثل v3، واقرأ ملاحظات الإصدار، ثم نفّذ الترقية باستخدام docker compose pull && docker compose up -d. لا يُدعم الرجوع إلى إصدار أقدم، حتى ضمن الإصدار الفرعي نفسه، لذلك أنشئ تفريغاً لقاعدة البيانات قبل كل ترقية. احتفظ بنسخة احتياطية من الملفات الأصلية خارج الخادم، وبذلك يظل الخطر محدوداً.
لماذا تستمر حاوية تعلّم الآلة في Immich في إعادة التشغيل؟
غالباً ما يُنهى تشغيلها لأنها تستخدم قدراً كبيراً من الذاكرة. شغّل docker compose ps --all، لأن الحاوية المتوقفة لا تظهر من دون هذا الخيار، وابحث عن خروج خدمة تعلّم الآلة برمز 137. يعني هذا الرمز أن العملية أُنهيت بالإشارة 9. ويكون قاتل العمليات عند نفاد الذاكرة في النواة هو السبب المعتاد، لكنه ليس السبب الوحيد، لذلك أكّد السبب باستخدام sudo dmesg | grep -i 'out of memory'. أضف مساحة swap، أو عطّل تعلّم الآلة بالكامل على جهاز بسعة 4 GB. لا تؤدي حدود الذاكرة على الحاوية إلى خنق استخدامها للذاكرة؛ فعند بلوغ الحد تُنهى الحاوية، لكنها تتوقف عن استنزاف بقية موارد الخادم. يتوقف البحث الذكي والتعرّف على الوجوه من دون تعلّم الآلة، بينما يعمل باقي Immich بصورة طبيعية.
هل يحتاج PhotoPrism إلى MariaDB، أم تكفي SQLite؟
تعمل SQLite جيداً وتناسب مكتبة شخصية، لكن PhotoPrism يحدّ نفسه إلى أربعة عمال عند استخدامها. وتوصي الوثائق بالانتقال إلى MariaDB لأنها تتعامل مع التزامن المرتفع بصورة أفضل. يتضمن ملف compose الذي يصدره المشروع MariaDB بالفعل، لذا فإن المسار الموصى به هو أيضاً المسار الافتراضي.
ما مقدار مساحة القرص التي ينبغي تخصيصها فوق حجم مكتبتي؟
أضف 10 إلى 20 بالمئة إلى حجم الملفات الأصلية، لأي من التطبيقين. يغطي ذلك الصور المصغرة المُنشأة ومعاينات الفيديو المحوّلة. تحتاج مجموعة بحجم 200 GB إلى نحو 220 إلى 240 GB للمكتبة وحدها، إضافة إلى مساحة لقاعدة البيانات والنمو المستقبلي. إذا احتفظت أيضاً بنسخة احتياطية محلية كاملة على وحدة التخزين نفسها، فستحتاج الملفات الأصلية والنسخة إلى 400 GB على الأقل قبل احتساب أي شيء آخر. لذلك خصص نحو 450 GB، أو ضع النسخة على وحدة تخزين منفصلة.