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

هل تكفي 6 جيجابايت RAM لاستضافة Immich بأمان؟

اكتشف مقدار RAM الفعلي، واضبط المنفذ 2283 خلف HTTPS، وعالج الخطأ exit 137، وتعرّف لماذا لا يبدأ Immich v3 مع قاعدة pgvecto.rs، مع خطوات الاستعادة.

ما الذي ستبنيه

Immich هي خدمة مستضافة ذاتياً لنسخ الصور ومقاطع الفيديو احتياطياً، وتُعد بديلاً فعلياً عن Google Photos. تتضمن تطبيقاً للهاتف يرفع صور الكاميرا في الخلفية، وخطاً زمنياً، وألبومات، والتعرّف إلى الوجوه، وبحثاً يعتمد على تعلّم الآلة للعثور على «الشاطئ» أو على شخص، من دون أن تضطر إلى إضافة أي وسوم. تشغّلها على VPS تملكه، وتبقى الملفات الأصلية على قرصك، ولا يفحصها أحد لبيعك المنتجات. إذا كنت لا تزال تقارنها بالمرشح الآخر الواضح، فإن مقارنتنا بين PhotoPrism وImmich تعرض حدود RAM الدنيا لكل منهما، وتطبيقات الهاتف، وأوامر النسخ الاحتياطي جنباً إلى جنب.

يتكوّن التثبيت من أربع حاويات يحددها ملف Docker Compose الخاص بالمشروع. يستغرق ذلك الجزء عشر دقائق. أما بقية هذا الدليل فتتعلق بمصادر المشكلات: حاوية تعلّم الآلة تستهلك ذاكرة كبيرة على جهاز صغير، والملفات الأصلية تستهلك مساحة القرص بسرعة، ويحتاج تطبيق الهاتف إلى عنوان URL للخادم بدقة، كما تريد وضع HTTPS أمامه قبل إخراجه من شبكتك، وتصدر Immich تغييرات قد تكسر التوافق بوتيرة تكفي لأن تؤدي docker compose pull غير الحذرة إلى عجز خادمك عن بدء التشغيل. تعامل مع هذه الأمور الأربعة بجدية، وستكون Immich مستقرة جداً. تجاهلها، وستفقد عطلة نهاية أسبوع.

المتطلبات الأساسية والتنبيهات المهمة

  • الذاكرة RAM: تذكر الوثائق الرسمية أن الحد الأدنى هو 6 GB وأن السعة الموصى بها هي 8 GB، فاعتبر 4 GB مع swap الحد الأدنى المطلق. حاويتا immich-server وPostgres متواضعتان في استهلاك الموارد. أما حاوية immich-machine-learning فهي الأكثر استهلاكاً للذاكرة، إذ تحمّل نماذج CLIP والتعرّف على الوجوه إلى RAM لإنشاء فهارس البحث، وتُنهي النواة عملها على خادم بسعة 2 GB. أضف swap حتى إذا كانت لديك سعة 4 GB.
  • القرص: احسب سعته لتشمل مكتبتك كاملة، مع مساحة إضافية. تُنسخ الملفات الأصلية بالكامل، وينشئ Immich أيضاً صوراً مصغرة وصور معاينة، وتستهلك هذه الملفات نحو 10–20% إضافية. تحتاج مجموعة صور بحجم 200 GB إلى volume بسعة 300 GB. أما Postgres فاستهلاكه صغير بالمقارنة.
  • المعالج CPU: يكفي أي KVM VPS حديث، لكن تشغيل ML على CPU بطيء. قد تستغرق فهرسة البحث الذكي لاستيراد كبير ساعات في الخلفية. هذا طبيعي، ولا تحتاج العملية إلى GPU.
  • اسم نطاق موجّه إلى VPS. يفضّل تطبيق الهاتف بشدة نقطة نهاية HTTPS، وستحتاج إلى Reverse Proxy أمام الخدمة. هذا الإعداد مماثل لإعداد مثيل Nextcloud مستضاف ذاتياً مع Docker وTLS والنسخ الاحتياطية؛ إذ إن Immich هو النظير المخصص للصور لخادم الملفات ذلك.
  • تثبيت Docker وCompose plugin، أي Docker Engine مع Compose v2 plugin من مستودع apt الخاص بـDocker، كما هو موضح بالكامل في دليل أساسيات Docker Compose.

الخطوة 1: أضف swap قبل أي شيء آخر

أكثر حالات فشل Immich شيوعاً على VPS صغير هي إنهاء حاوية ML بسبب نفاد الذاكرة. وفّر للنواة مساحة إضافية أولاً.

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. لن يجعل ذلك ML سريعاً، وهو يعمل كحاجز مؤقت لا كضمان، لكنه يقلل كثيراً احتمال توقف الحاوية أثناء الفهرسة على جهاز بسعة 4 GB.

الخطوة 2: نزّل ملفي compose وenv الرسميين، واستخدمهما لا نسخة منهما

يثبّت Immich إصدارات خدماته، والأهم صورة قاعدة بياناته، داخل الملفات التي يوفّرها مع الإصدار. لا تلصق ملف compose من مدونة، بما في ذلك هذه المدونة، باعتباره مصدر الحقيقة. نزّل ملفات الإصدار:

sudo mkdir -p /opt/immich && cd /opt/immich
sudo wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
sudo wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

هذه الملفات مأخوذة من الإصدار المعلَّم، لذلك تتطابق مراجع الصور. يعرّف ملف compose أربع خدمات. من المفيد معرفة وظيفة كل خدمة قبل تعديل أي شيء:

  • immich-server (ghcr.io/immich-app/immich-server، الحاوية immich_server)، وهي واجهة API وواجهة الويب، وتستمع على المنفذ 2283. تربط ملفات الرفع لديك في /data.
  • immich-machine-learning (ghcr.io/immich-app/immich-machine-learning، الحاوية immich_machine_learning)، للبحث باستخدام CLIP والتعرّف على الوجوه. تخزّن النماذج التي تم تنزيلها مؤقتاً في volume باسم model-cache. هذه هي الخدمة الأكثر استهلاكاً للذاكرة.
  • database (الحاوية immich_postgres)، وهي Postgres مع إضافة المتجهات VectorChord التي توفّر البحث بالتشابه. يكون وسم الصورة مثبتاً بواسطة digest داخل ملف compose مباشرة، مثل ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:.... كانت الإعدادات الأقدم تستخدم pgvecto.rs؛ أزيل دعمها في Immich v3.0، لذلك تستخدم كل عملية تثبيت جديدة اليوم VectorChord. لا تعدّل هذا الوسم يدوياً مطلقاً.
  • redis (الحاوية immich_redis)، وهي مثيل Valkey/Redis لقوائم انتظار المهام.

الخطوة 3: إعداد .env، حيث تُخزَّن صورك وقاعدة بياناتك

افتح .env واضبط أربعة أشياء. اترك كل ما يلي السطر المحدد كما هو.

# Where original uploads are stored on the host
UPLOAD_LOCATION=/opt/immich/library

# Where the Postgres data lives. NEVER put this on an NFS/network share.
DB_DATA_LOCATION=/opt/immich/postgres

# "v3" is a floating tag that tracks the latest v3.x. Pin a full tag like
# v3.0.2 instead; then you upgrade on purpose, not by surprise.
IMMICH_VERSION=v3.0.2

# Change this to a long random string. Letters and digits only.
DB_PASSWORD=REPLACE_WITH_A_LONG_RANDOM_STRING

# Set your timezone so timestamps and "on this day" line up
TZ=Europe/London

###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

هناك قاعدتان توفران عليك المشكلات. يجب أن يشير UPLOAD_LOCATION إلى قرصك الكبير. وإذا أضفت وحدة تخزين للبيانات لاحقاً، فعيّن هذا الإعداد منذ البداية إلى مسار mount الخاص بها، لأن نقله لاحقاً يعني نقل الصور المصغرة وتحديث مسارات الأصول. يجب أن يكون DB_DATA_LOCATION على قرص محلي، لأن Postgres يتلف عند استخدام مشاركة NFS أو SMB، وتذكر الوثائق ذلك بوضوح. إذا استخدمت الأحرف والأرقام فقط في DB_PASSWORD، فتتجنب فئة من أخطاء escaping في سلاسل الاتصال.

الخطوة 4: التشغيل الأول وإنشاء مستخدم admin

cd /opt/immich
sudo docker compose up -d
sudo docker compose ps

النتيجة الصحيحة هي أربعة containers، وكلها running ثم تصبح في النهاية healthy:

NAME                      STATUS
immich_machine_learning   Up (healthy)
immich_postgres           Up (healthy)
immich_redis              Up (healthy)
immich_server             Up (healthy)

ينزّل up الأول عدة غيغابايت من images، لذا امنحه وقتاً كافياً. راقب التقدم باستخدام sudo docker compose logs -f immich-server؛ ويسجّل الخادم أنه يستمع على المنفذ 2283 بعد أن يصبح جاهزاً. افتح الآن http://YOUR_SERVER_IP:2283 في متصفح. تعرض الزيارة الأولى معالج البدء، ويكون الحساب الأول الذي تنشئه هو حساب admin. عيّن كلمة مرور قوية؛ فهذا الحساب يملك إعدادات الخادم وإدارة المستخدمين وإعدادات ML التي ستحتاج إليها لاحقاً.

الخطوة 5: تطبيق الهاتف والنسخ الاحتياطي في الخلفية

ثبّت "Immich" من App Store أو Play Store. في شاشة تسجيل الدخول، يطلب التطبيق Server Endpoint URL. أدخل عنوان URL الكامل متضمناً المخطط، مثل https://photos.example.com (يضيف التطبيق /api بنفسه). سجّل الدخول باستخدام الحساب الذي أنشأته للتو، ثم افتح شاشة Backup في التطبيق، وحدد الألبومات التي تريد حمايتها، وعادةً ما تكون Camera وScreenshots، ثم فعّل Background backup. يفرض نظام iOS قيوداً على سرعة النسخ الاحتياطي في الخلفية. تعمل عمليات الرفع في الواجهة الأمامية دائماً، بينما تحدث عمليات الرفع في الخلفية عندما يسمح النظام بذلك.

هذه هي النقطة التي يتعثر فيها المستخدمون غالباً، لذلك اقرأ الخطوة 6 قبل محاولة إصلاح المشكلة في التطبيق.

الخطوة 6: HTTPS عبر Reverse Proxy وقاعدة عنوان URL الكامل

يحتاج تطبيق الهاتف إلى HTTPS فعلياً بمجرد خروجه من شبكتك المنزلية. ضع Reverse Proxy أمام المنفذ 2283 وأنهِ TLS هناك. إذا كنت تشغّل عدة حاويات بالفعل، فإن Traefik مع TLS تلقائي لعدة تطبيقات Docker هو الخيار الأنسب. يوجّه block واحد من labels photos.example.com إلى حاوية immich-server ويجلب الشهادة نيابةً عنك. إذا كنت تفضّل nginx، فسيمنحك دليل Let's Encrypt مع Certbot وnginx شهادة وblock بقيمة proxy_pass http://127.0.0.1:2283;. بعد إنشاء هذا الـproxy، تصبح إضافة الخدمة التالية في الغالب مسألة إنشاء نطاق فرعي جديد. بهذه الطريقة يمكن لواجهة وسائط مثل Halcyon، واجهة متجر الفيديو من التسعينيات لـJellyfin أن تعمل بجوار Immich على الخادم نفسه. وينطبق الأمر نفسه على HarnessRouter مستضاف ذاتياً يضع Codex وClaude Code خلف API واحد، إذ يرتبط بواجهة loopback عمداً ولا يصبح قابلاً للوصول إلا بعد أن ينهي الـproxy TLS أمامه. لذلك غيّر تسجيل الدخول الافتراضي قبل توجيه نطاق فرعي إليه. لكن لا تحتاج كل حاوية إلى اسم مضيف عام. من الأفضل إبقاء أداة إدارية فقط مثل ماسح الأمان open-kritt المستضاف ذاتياً خارج الـproxy تماماً، والوصول إلى واجهتها عبر نفق SSH في المناسبات النادرة التي تفتحها فيها. وتتجاوز خدمات أخرى الـproxy لأن HTTP ليس البروتوكول الذي تستخدمه أصلاً. وخادم relay مثل RustDesk المستضاف ذاتياً هو أوضح مثال على ذلك، إذ يستمع إلى عدد محدود من منافذ TCP وUDP الخام ويحتاج إلى قواعد جدار ناري بدلاً من نطاق فرعي. هناك إعداد واحد في الـproxy مهم لـImmich: ارفع حد حجم الرفع، لأن فيديوهات الهاتف كبيرة. في nginx يكون ذلك client_max_body_size 50000M; داخل server block. يرفض الإعداد الافتراضي البالغ 1 MB عمليات رفع الفيديو مع 413 Request Entity Too Large. إذا كان الـproxy يجيب أيضاً عن تحديات Let's Encrypt من نوع HTTP-01، فتأكد من أن /.well-known/immich ما زال موجهاً إلى Immich، وليس إلى معالج التحدي.

القاعدة التي يفرضها التطبيق هي أن تكون نقطة النهاية قابلة للوصول عبر عنوان URL الذي تكتبه بالضبط. يقبل التطبيق http://YOUR_SERVER_IP:2283 عاديّاً، وتلميح تسجيل الدخول الخاص به هو http://your-server-ip:port، لكن كل ما يعبر الإنترنت يجب أن يستخدم HTTPS. يؤدي استخدام المخطط الخاطئ أو استخدام عنوان IP مباشر من دون كتابة المنفذ إلى ظهور رسالة «لا يستطيع التطبيق الوصول إلى الخادم». ويرد هذا السبب كحالة فشل مسماة أدناه.

الخطوة 7: المكتبات الخارجية مقابل التحميلات، واستيراد شجرة صور موجودة

تصل الصور إلى Immich بطريقتين، وهما ليستا الشيء نفسه.

  • التحميلات هي أصول يملكها Immich. ينسخ التطبيق أو أداة التحميل عبر الويب الملف إلى UPLOAD_LOCATION. ويمكن لـImmich إعادة تسميتها ونقلها وحذفها.
  • المكتبات الخارجية هي عمليات استيراد للملفات الموجودة مسبقاً في مجلد على خادمك، أو في شجرة Pictures قديمة، أو في تصدير من NAS. يفهرسها Immich في مكانها ويعرضها في المخطط الزمني، لكنه لا يعدّل الملفات الأصلية أو يحذفها مطلقاً.

لاستيراد شجرة موجودة، اربطها للقراءة فقط داخل حاوية الخادم. حرّر docker-compose.yml ضمن immich-server: وأضف وحدة تخزين:

  immich-server:
    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
      - /srv/photos:/mnt/media/photos:ro

يضمن :ro عدم تمكّن Immich من الوصول إلى الملفات الأصلية مطلقاً. أعد إنشاء الحاوية باستخدام sudo docker compose up -d، ثم انتقل في واجهة الويب إلى صورتك الرمزية → Administration → External Libraries → Create Library، واختر المستخدم المالك، وانقر على Add ضمن Folders، وأدخل مسار الحاوية، /mnt/media/photos، وليس مسار المضيف /srv/photos. انقر على Scan. استخدام مسار المضيف بدلاً من مسار الحاوية هو الخطأ الأكثر شيوعاً في المكتبات الخارجية؛ إذ لا يعثر الفحص على شيء ويبلغ عن صفر من الأصول.

الخطوة 8: انضباط الترقية الذي يتطلبه Immich

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

  1. ثبّت إصداراً. اترك IMMICH_VERSION مضبوطاً على علامة محددة مثل v3.0.2، وليس على v3 العائمة التي تسحب دائماً أحدث إصدار v3.x.
  2. اقرأ ملاحظات الإصدار في كل مرة قبل الترقية. تُذكر هناك التغييرات غير المتوافقة، ولا سيما تغييرات قاعدة البيانات أو امتدادات المتجهات. إصدار v3.0 هو المثال الواضح: فقد أزال pgvecto.rs نهائياً، لذلك كان على كل من لا يزال يستخدم الامتداد القديم إكمال ترحيل VectorChord، الذي قُدّم في v1.133، قبل الترقية.
  3. أنشئ نسخة احتياطية من قاعدة البيانات أولاً (الخطوة 9). افعل ذلك دائماً، وبدرجة أكبر عندما تذكر الملاحظات قاعدة البيانات.
  4. نزّل ملف compose الجديد أيضاً. يثبّت IMMICH_VERSION صور الخادم وML فقط. أما صورة Postgres فتُثبّت بواسطة digest داخل docker-compose.yml، لذلك يأتي الإصدار الذي يحتاج إلى امتداد أحدث لقاعدة البيانات مع ملف compose جديد. أعد تنزيل ملفي الإصدار، وأعد تطبيق قيم .env، ثم نفّذ الترقية.
  5. حدّث عملاء الهاتف أولاً. لا يتحدث الخادم إلا مع الإصدار الرئيسي المطابق له، ويكون التطبيق متوافقاً عادةً مع الإصدار الرئيسي الحالي والسابق. عندما يكون الخادم أحدث من التطبيق، تعرض الإصدارات الحالية (v3.3.1، وفق التحقق في 2026-10-10) إشعار يتوفر تحديث للتطبيق مع زر تحديث على الهاتف. وتوصي Immich بترقية جميع عملاء الهاتف قبل الخادم.

الأوامر الفعلية بعد وضع الملفات الجديدة:

cd /opt/immich
sudo docker compose pull
sudo docker compose up -d
sudo docker image prune

الخطوة 9: النسخ الاحتياطية، وتفريغ قاعدة البيانات مع الملفات الأصلية، واختبارها

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

فرّغ قاعدة البيانات باستخدام pg_dump من داخل حاوية Postgres، وتحديداً قاعدة البيانات immich، وليس العنقود بأكمله:

sudo docker exec -t immich_postgres pg_dump --clean --if-exists \
  --dbname=immich --username=postgres | gzip > /opt/immich/immich-db-$(date +%F).sql.gz

ثم انسخ UPLOAD_LOCATION، أي شجرة /opt/immich/library بأكملها، وخصوصاً مجلداتها الفرعية library/ وupload/ وprofile/، باستخدام restic أو rsync أو borg إلى جهاز آخر أو إلى تخزين كائني. أياً كانت الآلية التي تجدول هذه المهمة، سواء كانت إدخالاً في cron أو مؤقتاً في systemd، فهي تحتاج إلى مكان لإرسال تنبيه عند فشلها. وتضع وحدة systemd من نوع OnFailure= موجّهة إلى خادم ntfy الخاص بك رسالة على هاتفك في الليلة التي يفشل فيها التفريغ، بدلاً من أن تكتشف المشكلة أثناء الاستعادة. نفّذ نسخ قاعدة البيانات أولاً، ثم نسخ الملفات، حتى لا يشير التفريغ إلى صورة لم تنسخها نسخة الملفات الاحتياطية بعد. انسخ المكتبات الخارجية احتياطياً بشكل منفصل من مصدرها الفعلي؛ إذ إن Immich لا يملكها.

والآن الجزء الذي يتجاهله الجميع: اختبر الاستعادة. يجب أن تعمل الاستعادة على مكدس جديد لم يبدأ خادمه من قبل، وعلى صورة Postgres يكون امتداد المتجهات فيها متوافقاً مع التفريغ. ولهذا السبب تحديداً لا تختَر وسم صورة قاعدة البيانات ارتجالاً. على جهاز مؤقت يستخدم compose نفسه و.env، احذف أي حالة قديمة، وشغّل قاعدة البيانات وحدها، ثم حمّل التفريغ:

cd /opt/immich
sudo docker compose down -v
sudo docker compose pull
sudo docker compose create
sudo docker start immich_postgres
sleep 10
gunzip --stdout immich-db-2026-07-15.sql.gz |
  sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" |
  sudo docker exec -i immich_postgres psql --dbname=immich --username=postgres --single-transaction --set ON_ERROR_STOP=on
sudo docker compose up -d

إعادة كتابة search_path باستخدام sed ليست اختيارية في قاعدة بيانات VectorChord. إذا حذفتها، تفشل الاستعادة في منتصف العملية. عندما يعود المكدس إلى العمل مع وجود ملفاتك الأصلية في أماكنها، افتح واجهة الويب. إذا ظهرت صورك وألبوماتك، فنسختك الاحتياطية تعمل. وإذا لم تنفّذ هذه العملية من قبل، فلا تملك نسخة احتياطية؛ بل تملك أملاً فقط.

أوضاع الفشل، مع السلاسل التي ستظهر لك

توقفت حاوية ML بسبب نفاد الذاكرة. تنتهي sudo docker compose logs immich-machine-learning فجأة، وتعرض docker compose ps الحالة Restarting، ويكون رمز الخروج 137. ويؤكد sudo dmesg | grep -i oom ذلك: Out of memory: Killed process ... (python3). عندئذٍ تتوقف مهام البحث والتعرّف على الوجوه. السبب هو عدم كفاية RAM لتشغيل النماذج. اتبع هذه الحلول بالترتيب: أضف swap (الخطوة 1)؛ أو امنح VPS مقداراً أكبر من RAM؛ أو، إذا تعذّر ذلك فعلاً، افتح Administration → Settings → Machine Learning Settings وعطّل مفتاح machine learning الرئيسي، الذي يعطّل جميع ميزات ML دفعة واحدة. لا يكفي تعطيل Smart Search وFacial Recognition فقط، لأن OCR وأنواع النماذج الأخرى تظل مفعّلة افتراضياً. ستحتفظ بالنسخ الاحتياطية والألبومات، لكنك ستفقد البحث حسب المحتوى. ولإزالة خدمة immich-machine-learning من ملف compose التأثير نفسه.

يرفض خادم Immich البدء بعد الترقية. قد تكون حاوية Postgres قيد التشغيل بصورة سليمة؛ لكن immich_server هو الذي يتحقق من إصدار vector extension عند بدء التشغيل ويرفض البدء، وقد يتكرر في سجله سطر مثل The database currently has VectorChord 0.5.3 activated, but the Postgres instance only has 0.4.2 available. This most likely means the extension was downgraded.، أو، في المكدسات الأقدم، The pgvecto.rs extension is not available in this Postgres instance.. السبب هو استخدام صورة قاعدة بيانات يكون إصدار extension فيها أقدم من الإصدار الذي رُقّيت بياناتك إليه. يحدث ذلك غالباً بسبب تعديل image tag يدوياً أو استعادة dump أحدث على صورة أقدم. الحل هو استخدام صورة Postgres المطابقة، وأخذ ملف compose من الإصدار المطابق لقاعدة بياناتك، وعدم إجراء downgrade، والاستعادة فقط على صورة متوافقة.

لا يستطيع تطبيق الهاتف الوصول إلى الخادم. تعرض شاشة تسجيل الدخول خطأ اتصال مثل Could not connect to server بعد إدخال URL. الأسباب المعتادة هي: أدخلت http:// بينما لا يوفّر الـproxy سوى https://؛ أو اتصلت مباشرة بالواجهة الخلفية وتركت المنفذ فارغاً، فحاول التطبيق استخدام example.com (المنفذ 443) بدلاً من example.com:2283؛ أو أن الـreverse proxy لا يمرّر /api؛ أو أن proxy الذي يتعامل مع تحديات Let's Encrypt HTTP-01 يوجّه /.well-known/immich إلى مكان غير Immich. أصلح ذلك بإدخال URL كاملاً من نوع https://photos.example.com، ثم تأكد أولاً من أنه يفتح في متصفح الهاتف. إذا عمل المتصفح ولم يعمل التطبيق، فقد يكون الـproxy يحذف المسار أو يوجّه /.well-known/immich بشكل خاطئ، أو قد تكون الشهادة موقّعة ذاتياً. يرفض التطبيق هذه الشهادة بخطأ في المصافحة ما لم تفعّل دعم الشهادات الموقّعة ذاتياً في إعداداته.

نفاد مساحة القرص أثناء الاستيراد. تبدأ عمليات الرفع بالفشل، وتصبح الصور المصغّرة فارغة، وتعرض السجلات ENOSPC: no space left on device أو، من Postgres، could not extend file ... No space left on device. ويعرض df -h أن وحدة التخزين UPLOAD_LOCATION ممتلئة بنسبة 100%. لهذا يجب تحديد حجم القرص قبل استيراد مكتبة كبيرة. للاسترداد، أرفق وحدة تخزين أكبر، وأوقف المكدس، وانقل UPLOAD_LOCATION إليها، وحدّث .env، ثم شغّل المكدس من جديد. ويمكنك أيضاً توسيع القرص الحالي إذا كان موفّر الخدمة يسمح بذلك. قد تتعطل Postgres إذا امتلأت مساحة التخزين، لذلك أفرغ مساحة وأعد تشغيل حاوية قاعدة البيانات قبل افتراض وجود تلف.

FAQ

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

الحد الأدنى الرسمي لمتطلبات Immich هو 6 GB من RAM، والموصى به 8 GB. ويُعد 4 GB مع swap حداً عملياً لمكتبة صغيرة. اضبط swap في كلتا الحالتين، لأن حاوية تعلّم الآلة هي التي يرتفع استهلاكها بشكل مفاجئ. بالنسبة إلى القرص، احسب كامل حجم مكتبتك، وأضف نحو 10–20% للصور المصغرة والمعاينات التي ينشئها النظام، مع استخدام تخزين محلي. لا تضع دليل بيانات Postgres على مشاركة شبكة. إذا كنت لا تزال تقرر الخدمات الأخرى التي ستشغّلها، فإن دليل ما الذي تستضيفه ذاتياً في 2026 يضع حجم Immich بجانب الخدمات الأخرى.

هل يمكنني تشغيل Immich من دون GPU؟

نعم. تعمل حاوية تعلّم الآلة بشكل جيد باستخدام CPU. ويؤدي GPU فقط إلى تسريع فهرسة البحث الذكي، وكذلك تحويل ترميز الفيديو عند استخدام متغير image المناسب. باستخدام CPU، قد تستغرق الفهرسة الأولية لمكتبة كبيرة ساعات في الخلفية، لكنها لا تمنع إجراء النسخ الاحتياطية أو تصفح المكتبة. إذا كان جهازك صغيراً جداً لتشغيل تعلّم الآلة، يمكنك تعطيله بالكامل باستخدام مفتاح التبديل العام في إعدادات الإدارة، مع إبقاء كل شيء آخر قيد التشغيل.

كيف أرقّي Immich بأمان؟

ثبّت IMMICH_VERSION على tag محدد مثل v3.0.2، واقرأ ملاحظات الإصدار قبل كل ترقية، وأنشئ نسخة احتياطية من قاعدة البيانات أولاً. لأن image الخاص بـPostgres مثبت داخل docker-compose.yml وليس بواسطة IMMICH_VERSION، أعد تنزيل ملف compose وexample.env من الإصدار المستهدف، وأعد تطبيق قيمك، ثم شغّل docker compose pull && docker compose up -d. لا تترك الإصدار يتغير تلقائياً من دون مراقبة. لا يدعم Immich الرجوع إلى إصدار أقدم، لذلك لا يمكن التراجع عن ترقية لم تقرأ عنها مسبقاً.

ما الذي يجب أن أنشئ له نسخة احتياطية تحديداً؟

شيئان معاً: pg_dump من قاعدة بيانات immich، ودليل UPLOAD_LOCATION originals بالكامل. تحتوي قاعدة البيانات على الألبومات والوجوه والربط بين الأصول والملفات. أما الدليل فيحتوي على الصور الفعلية. وتتطلب عملية الاستعادة كليهما، إضافة إلى image لقاعدة بيانات يتوافق مع vector extension. أنشئ تفريغ قاعدة البيانات أولاً، ثم انسخ الملفات ثانياً. اختبر الاستعادة على جهاز تجريبي مرة واحدة على الأقل، فالنسخة الاحتياطية غير المختبرة ليست نسخة احتياطية.

كيف أستورد مجلد الصور الموجود لدي؟

اربط المجلد للقراءة فقط داخل حاوية immich-server بوصفه volume إضافياً، مثل - /srv/photos:/mnt/media/photos:ro، ثم أعد إنشاء الحاوية. بعد ذلك، انتقل إلى Administration → External Libraries، وأنشئ مكتبة، وأضف مسار container /mnt/media/photos. يفهرس Immich الملفات في مكانها ولا يعدّلها أو يحذفها. الخطأ الأكثر شيوعاً هو إدخال مسار المضيف بدلاً من مسار الحاوية، ما يجعل الفحص لا يعثر على أي ملفات.