SSD Nodes Learn Hosting plans →
الأدلة Matt Connorبقلم Matt Connor · آخر تحديث في 2026-08-28

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

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

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

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

يتكوّن التثبيت من أربع حاويات وفق ملف Docker Compose الخاص بالمشروع. يستغرق هذا الجزء عشر دقائق. أما بقية هذا الدليل فتتناول مصادر المشكلات الفعلية: حاوية تعلّم الآلة تستهلك قدراً كبيراً من الذاكرة على الأجهزة الصغيرة، والملفات الأصلية تستهلك مساحة القرص بسرعة، وتطبيق الهاتف يرفض الخادم الذي يستخدم HTTP عادي، كما أن 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 في connection string.

الخطوة 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 عبر وكيل عكسي، وقاعدة عنوان 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 ليس البروتوكول الذي تستخدمه أصلاً. ويُعد خادم ترحيل RustDesk المستضاف ذاتياً أوضح مثال على ذلك؛ فهو يستمع على عدة منافذ TCP وUDP خام، ويحتاج إلى قواعد جدار ناري بدلاً من نطاق فرعي. هناك إعداد واحد في الـproxy مهم لـImmich: ارفع حد حجم الرفع، لأن فيديوهات الهاتف كبيرة. في nginx يكون ذلك client_max_body_size 50000M; داخل server block؛ إذ يرفض الإعداد الافتراضي البالغ 1 MB عمليات رفع الفيديو مع 413 Request Entity Too Large.

القاعدة التي يفرضها التطبيق هي أن تكون نقطة النهاية قابلة للوصول، وأن تستخدم HTTPS عملياً. نقاط النهاية http://، أو عنوان 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 دون تحقق إلى إتلاف قاعدة بياناتك في النهاية. وينبغي تطبيق عادة تثبيت الإصدار ثم قراءة ملاحظات الإصدار على كل حاوية طويلة التشغيل على الخادم. لذلك يُثبَّت وكيل 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. حدّث تطبيقات الأجهزة المحمولة في الوقت نفسه تقريباً. لا يتحدث الخادم إلا مع الإصدار الرئيسي المطابق له، ويدعم التطبيق الإصدار الرئيسي الحالي والإصدار الرئيسي السابق. إذا تقدم الخادم على التطبيق، فسيعرض التطبيق Your app major version is not compatible with the server! على الهاتف إلى أن تحدّثه. لذلك من الأسلم تحديث التطبيق أولاً.

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

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)؛ أو زِد RAM في VPS؛ أو، إذا تعذر ذلك فعلاً، عطّل ML من Administration → Settings → Machine Learning Settings بإيقاف Smart Search وFacial Recognition. ستحتفظ بالنسخ الاحتياطية والألبومات، لكنك ستفقد البحث حسب المحتوى. وتؤدي إزالة خدمة immich-machine-learning من ملف compose إلى النتيجة نفسها.

يرفض Postgres البدء بعد الترقية. يكرر سجل الخادم سطراً مثل 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 أقدم من الإصدار الذي رُقّيت إليه بياناتك. يحدث ذلك غالباً بسبب تعديل وسم الصورة يدوياً أو استعادة dump أحدث إلى صورة أقدم. الحل هو استخدام صورة Postgres المطابقة، وأخذ ملف compose من الإصدار المطابق لقاعدة بياناتك. لا تُجرِ downgrade، ولا تستعد البيانات إلا إلى صورة متوافقة.

يتعذر على تطبيق الهاتف الوصول إلى الخادم. تعرض شاشة تسجيل الدخول خطأ اتصال / الخادم غير قابل للوصول بعد إدخال URL. توجد 3 أسباب: أدخلت http:// بينما لا يقدّم proxy سوى https://؛ أو اتصلت مباشرة بالواجهة الخلفية، لكنك حذفت المنفذ، فحاول التطبيق استخدام example.com (المنفذ 443) بدلاً من example.com:2283؛ أو أن reverse proxy لا يمرر /api. أدخل كامل https://photos.example.com URL، وتأكد أولاً من أنه يفتح في متصفح الهاتف. إذا عمل المتصفح ولم يعمل التطبيق، فقد يكون proxy يحذف المسار، أو تكون الشهادة موقعة ذاتياً، إذ يرفض التطبيق الشهادات غير الموثوقة.

نفاد مساحة القرص أثناء الاستيراد. تفشل عمليات الرفع، وتصبح الصور المصغرة فارغة، وتعرض السجلات 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 ومجلد originals الكامل UPLOAD_LOCATION. تحتوي قاعدة البيانات على الألبومات والوجوه والربط بين الأصول والملفات. أما المجلد فيحتوي على الصور الفعلية. وتتطلب الاستعادة كليهما، إضافة إلى image لقاعدة بيانات متوافق مع vector extension. أنشئ تفريغ قاعدة البيانات أولاً، ثم انسخ الملفات ثانياً. واختبر الاستعادة على جهاز تجريبي مرة واحدة على الأقل. فالنسخة الاحتياطية غير المختبرة ليست نسخة احتياطية.

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

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