لماذا تستضيف PhotoPrism ذاتيًا على خادم VPS
بينما يستهدف Immich تجربة السحابة الكاملة مع نسخ احتياطي فوري من الجوال، يركّز PhotoPrism على فهرسة وتنظيم مكتبة صور موجودة مسبقًا، غالبًا ما تكون كبيرة، موضوعة على نظام ملفات. يحلّل مجلداتك، ويصنّف الصور بوسوم (جبل، شاطئ، سيارة)، ويكتشف الوجوه، ويقرأ بيانات EXIF، ويحدّد المواقع الجغرافية للصور. يُنفَّذ كل ذلك محليًا عبر TensorFlow المدمج. استضافته على خادم VPS لها فائدة مزدوجة: تجميع أرشيف الصور المبعثر على قرص يمكن الوصول إليه من أي مكان، والاستفادة من الوسم التلقائي دون إرسال الصور أبدًا إلى خدمة طرف ثالث.
مزايا PhotoPrism المُستضاف ذاتيًا
- وسم تلقائي بذكاء اصطناعي محلي: بحث بالكلمات المفتاحية والأماكن والألوان دون سحابة.
- فهرسة الأرشيف الموجود مسبقًا على القرص، عبر WebDAV أو rsync أو تحميل شبكي.
- اكتشاف المكرّرات والصور المتشابهة لتنظيف مجموعة مكتظّة.
- خرائط تفاعلية مبنية على إحداثيات GPS المستخرجة من بيانات EXIF الوصفية.
- وضع القراءة فقط متاح: يفهرس PhotoPrism دون تعديل ملفاتك الأصلية أبدًا.
- واجهة PWA قابلة للتثبيت، يمكن الوصول إليها من أي متصفّح على شبكتك.
المتطلبات الدقيقة: RAM وCPU والتخزين والشبكة
PhotoPrism يستهلك الذاكرة بمجرد دخول TensorFlow على الخط. إليك العتبات الواجب احترامها. بدون GPU مع تفعيل محرك ML، خطّط لـ 2 غيغابايت RAM كحدٍّ أدنى: تحتها تُطلق عملية الفهرسة خطأ OOM ويُعيد الحاوية تشغيل نفسها في حلقة. مع ML مُفعَّل بالكامل (كشف الوجوه، تصنيف المشاهد)، 4 غيغابايت RAM هي المُوصى بها — العتبة المريحة لمكتبة من 10,000 إلى 50,000 صورة. نواة افتراضية واحدة تكفي للتصفّح، لكن الفهرسة الأولية لأرشيف كبير تستفيد من 2 إلى 4 أنوية. المنفذ الافتراضي هو 2342؛ تذكّر فتحه مؤقتًا للاختبار الأول قبل وضع الوكيل العكسي. للتخزين: خطّط لحجم originals زائد 30 إلى 40% للصور المصغّرة والذاكرة المؤقتة وفهرس MariaDB. أضف مساحة swap لا تقل عن 2 غيغابايت إذا كان VPS لديك أقل من 4 غيغابايت RAM.
نشر PhotoPrism خطوة بخطوة
تجهيز الخادم VPS والأحجام
ثبّت Docker، ثم أنشئ مجلدين دائمين:
/opt/photoprism/originalsلصورك و/opt/photoprism/storageللذاكرة المؤقتة وقاعدة بيانات الفهرس.الإعلان عن PhotoPrism وMariaDB
في
docker-compose.yml، أضف خدمةmariadbبحجم مخصّص وخدمةphotoprism. اربطهما عبرPHOTOPRISM_DATABASE_DRIVER=mysql.تحديد المسؤول ووضع الفهرسة
عيّن
PHOTOPRISM_ADMIN_PASSWORD، وفعّلPHOTOPRISM_READONLY=trueإذا أردته أن يفهرس دون المساس بالملفات الأصلية. ثم شغّل المكدّس بـdocker compose up -d.الاستيراد وتشغيل الفهرسة الأولى
انسخ صورك إلى مجلد
originalsعبرrsyncأو WebDAV، ثم شغّل التحليل بـdocker compose exec photoprism photoprism index.إعداد nginx كوكيل عكسي مع SSL Certbot
ثبّت nginx وcertbot على المضيف. أنشئ كتلة server في
/etc/nginx/sites-available/photoprism.confتستمع على المنفذ 80، وتعيد التوجيه إلى 443، وتوكّل إلىhttp://127.0.0.1:2342. أضف توجيهاتproxy_set_headerالضرورية لكي يكتشف PhotoPrism مخطّط HTTPS بشكل صحيح. احصل على الشهادة بـcertbot --nginx -d gallery.yourdomain.com.
الوصول من الجوال: تطبيق iOS وAndroid
لا يقدّم PhotoPrism تطبيقًا أصليًا للنسخ الاحتياطي التلقائي كـImmich، لكن واجهته PWA محسّنة للجوال: أضفها إلى الشاشة الرئيسية من Safari (iOS) أو Chrome (Android) للحصول على تجربة شبه أصلية. لتفعيل PWA يُشترط HTTPS. للنسخ الاحتياطي من الهاتف، الحل التكميلي المعتاد هو Syncthing أو rclone لإرسال مجلد DCIM إلى originals على الخادم.
تحسين ML على VPS بدون GPU: المتغيرات الأساسية
على VPS قياسي بدون GPU، يعمل TensorFlow بوضع المعالج CPU. ثلاثة متغيرات بيئية تتيح ضبط التوازن بين الجودة والموارد. PHOTOPRISM_WORKERS يتحكّم في عدد خيوط الفهرسة المتوازية — اضبطه على عدد الأنوية المتاحة (2 أو 4). PHOTOPRISM_DISABLE_TENSORFLOW (القيمة true) يُعطّل محرك ML بالكامل: لا تصنيف تلقائي ولا كشف وجوه، لكن الفهرسة أسرع 3 إلى 5 مرات واستهلاك RAM يهبط إلى أقل من 1 غيغابايت. PHOTOPRISM_DETECT_NSFW (القيمة true) يُفعّل فلتر المحتوى غير اللائق بتكلفة إضافية على كل صورة: لا تُفعّله إلا عند الحاجة الفعلية. للخوادم بين 2 و4 غيغابايت RAM: PHOTOPRISM_WORKERS=2 مع PHOTOPRISM_DETECT_NSFW=false وTensorFlow مُفعَّل.
تشخيص الأخطاء الأكثر شيوعاً
OOM عند التشغيل أو أثناء الفهرسة. علامته في سجلات Docker: Killed أو signal: killed. الحل الفوري: إضافة swap (fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile). الحل الدائم: الانتقال إلى VPS بـ 2 غيغابايت على الأقل. فهرسة لا تنتهي. على مكتبة 50,000 صورة بنواتَين افتراضيتَين، الفهرسة الأولى الكاملة قد تستغرق 6 إلى 24 ساعة — هذا طبيعي. مشاكل الصلاحيات على الأحجام. يعمل PhotoPrism بـ UID 1000 افتراضيًا؛ إذا كان originals مملوكًا لـ root يفشل الوصول بصمت. الحل: chown -R 1000:1000 /opt/photoprism. الواجهة تحمّل لكن لا تظهر صور. تأكّد من تشغيل photoprism index فعلًا؛ بدء الخدمة لا يُشغّل الاستيراد تلقائيًا.
استراتيجية النسخ الاحتياطي: originals وstorage وقاعدة البيانات
نسخ احتياطي PhotoPrism الفعّال يُميّز بين ثلاثة مكوّنات. مجلد originals يحتوي ملفاتك الرئيسية: هو الجوهر الذي لا يُعوَّض. انسخه احتياطيًا خارج الموقع يوميًا بـ rclone sync. مجلد storage يحتوي الصور المصغّرة والذاكرة المؤقتة: يمكن إعادة بنائه بالكامل بفهرسة جديدة، فنسخة أسبوعية تكفي. قاعدة MariaDB تحتوي الفهرس والألبومات والوسوم اليدوية وبيانات الوجوه — عمل التنظيم الذي أنجزته. احتفظ بـ dump منتظم: docker compose exec mariadb mysqldump -u photoprism -p photoprism > /opt/backup/photoprism-db-$(date +%Y%m%d).sql مجدوَل في cron ومشفَّر قبل الإرسال الخارجي.
PhotoPrism أم Immich: أيهما تختار
مرّر الجدول أفقيًا
| المعيار | PhotoPrism | Immich |
|---|---|---|
| الهدف الرئيسي | فهرسة وتنظيم مكتبة صور موجودة مسبقًا | سحابة صور كاملة مع نسخ احتياطي من الجوال |
| تطبيق الجوال | PWA، دون نسخ احتياطي تلقائي أصلي | تطبيقات iOS/Android مع نسخ احتياطي تلقائي |
| قاعدة البيانات | MariaDB أو SQLite | PostgreSQL مع امتداد شعاعي |
| بحث الذكاء الاصطناعي | وسوم TensorFlow حسب المحتوى واللون | بحث دلالي وتعرّف متقدم على الوجوه |
| RAM الموصى بها | 4 غيغابايت (2 غيغابايت كحدٍّ أدنى بدون GPU) | 6 إلى 8 غيغابايت |
| نموذج الملفات | يقرأ مجلد originals، مع وضع قراءة فقط متاح | يدير شجرة الرفع الخاصة به |
| متعدد المستخدمين | محدود، موجَّه لمجموعة واحدة | مكتبات معزولة لكل مستخدم |
| حالة الاستخدام المثلى | أرشفة وتصفّح مجلدات صور كبيرة | استبدال Google Photos في الاستخدام اليومي |
حمّل مجلد originals بوضع القراءة فقط (:ro في حجم Docker) وفعّل PHOTOPRISM_READONLY=true. سيفهرس PhotoPrism ويولّد الوسوم والصور المصغّرة في حجم storage المنفصل، دون أي مخاطرة بتعديل أو حذف ملف أصلي.