استضف Immich ذاتيًا: بديلك عن Google Photos
استضف Immich ذاتيًا على خادم VPS بملف Docker Compose الرسمي: الخادم، بحث التعلم الآلي، Postgres وRedis، نسخ احتياطي من الهاتف، HTTPS، ترقيات ونسخ احتياطية آمنة.
ما الذي تبنيه
Immich خدمة مستضافة ذاتيًا للنسخ الاحتياطي للصور والفيديوهات — بديل حقيقي عن Google Photos. له تطبيق هاتف يرفع صور كاميرتك في الخلفية، وخط زمني، وألبومات، وتعرّف على الوجوه، وبحث بالتعلم الآلي (machine learning) يجد لك «شاطئ» أو شخصًا معينًا دون أن تضع وسمًا واحدًا على أي شيء. تشغّله على خادم VPS تملكه أنت، فتبقى الملفات الأصلية على قرصك، ولا أحد يفحصها ليبيعك شيئًا.
يتكوّن التثبيت من أربع حاويات (containers) من ملف Docker Compose الخاص بالمشروع نفسه. هذا الجزء يستغرق عشر دقائق. أما بقية هذا الدليل فهي حيث يكمن العناء الحقيقي: حاوية التعلم الآلي شرهة للذاكرة على جهاز صغير، والملفات الأصلية تلتهم مساحة القرص بسرعة، وتطبيق الهاتف يرفض خادمًا يعمل بـ HTTP عادي فقط، ويصدر Immich تغييرات غير متوافقة (breaking changes) بوتيرة كافية لجعل تنفيذ أمر docker compose pull بلا حذر يترك قاعدة بياناتك عاجزة عن البدء. تعامل مع هذه الأمور الأربعة بجدية وستجد Immich صلبًا لا يتزعزع. تجاهلها وستخسر عطلة نهاية أسبوع كاملة.
المتطلبات المسبقة، والعقبات الحقيقية
- ذاكرة RAM: التوثيق الرسمي يذكر 6 غيغابايت كحد أدنى و8 غيغابايت كقيمة موصى بها — اعتبر 4 غيغابايت مع swap الحد الأدنى المطلق. حاويتا
immich-serverوPostgres متواضعتان في استهلاكهما. أما حاويةimmich-machine-learningفهي الشرهة: تحمّل نماذج CLIP والتعرف على الوجوه في الذاكرة لبناء فهارس البحث، وعلى جهاز بذاكرة 2 غيغابايت تقتلها النواة (kernel). أضف swap حتى لو كان لديك 4 غيغابايت. - مساحة القرص: قدّرها بحجم مكتبتك كاملة، ثم زد عليها قليلًا. تُنسخ ملفاتك الأصلية كاملة، ويولّد Immich فوق ذلك صورًا مصغّرة (thumbnails) وصور معاينة (بزيادة تقارب 10-20%). مجموعة صور بحجم 200 غيغابايت تحتاج إلى وحدة تخزين بحجم 300 غيغابايت. أما Postgres فحجمها صغير بالمقارنة.
- المعالج (CPU): أي خادم VPS حديث يعمل بتقنية KVM كافٍ، لكن التعلم الآلي على المعالج وحده بطيء. فهرسة البحث الذكي (smart search) لاستيراد كبير قد تعمل لساعات في الخلفية. هذا أمر طبيعي؛ ولا يحتاج إلى GPU.
- اسم نطاق (domain) يشير إلى الخادم. تطبيق الهاتف يفضّل بشدة نقطة اتصال HTTPS، وستحتاج إلى وكيل عكسي (reverse proxy) أمامها. هذا الإعداد له الشكل نفسه الذي تجده في نسخة Nextcloud مستضافة ذاتيًا بـ Docker وTLS ونسخ احتياطي — فـImmich هو لصورك ما ذلك الخادم لملفاتك.
- تثبيت Docker وإضافة Compose — أي Docker Engine مع إضافة Compose v2 من مستودع apt الرسمي الخاص بـ Docker، تمامًا كما هو مشروح في دليلنا لأساسيات Docker Compose.
الخطوة 1: أضف swap قبل أي شيء آخر
أكثر أعطال Immich شيوعًا على خادم VPS صغير هو أن تُقتل حاوية التعلم الآلي بفعل نفاد الذاكرة (OOM). أعطِ النواة أولًا مساحة تتنفس فيها.
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. هذا لن يجعل التعلم الآلي أسرع، لكنه يمنع موت الحاوية في منتصف الفهرسة على جهاز بذاكرة 4 غيغابايت.
الخطوة 2: احصل على ملفي compose وenv الرسميين — استخدم ملفاتهما لا نسخة منهما
يثبّت Immich إصدارات خدماته، والأهم من ذلك، صورة قاعدة بياناته، داخل الملفات التي يوزّعها. لا تلصق ملف compose من مدونة (بما فيها هذه المدونة) وتعتبره مرجعك المعتمد. حمّل ملفات الإصدار (release assets):
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هذه الملفات تأتي من الإصدار المُوسوم (tagged release)، لذا فإن مراجع الصور تتطابق معه. يعرّف ملف 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، التي تشغّل البحث بالتشابه. الوسم (tag) الخاص بالصورة مثبّت عبر بصمة (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 إلى قرصك الكبير — فإن أضفت وحدة تخزين بيانات لاحقًا، اضبط هذا المسار على نقطة ربطها منذ البداية، لأن نقله لاحقًا يعني نقل الصور المصغّرة وتحديث مسارات الملفات. أما DB_DATA_LOCATION فيجب أن يكون على قرص محلي: فـPostgres على مشاركة NFS أو SMB تتلف، والتوثيق يقول ذلك بوضوح تام. وإن استخدمت أحرفًا وأرقامًا فقط في DB_PASSWORD تتجنب فئة كاملة من أخطاء الهروب (escaping) في سلسلة الاتصال.
الخطوة 4: التشغيل الأول وإنشاء حساب المسؤول
cd /opt/immich
sudo docker compose up -d
sudo docker compose psالنتيجة الصحيحة هي أربع حاويات، جميعها running وتصبح لاحقًا healthy:
NAME STATUS
immich_machine_learning Up (healthy)
immich_postgres Up (healthy)
immich_redis Up (healthy)
immich_server Up (healthy)أول أمر up يسحب عدة غيغابايتات من الصور، فأعطه وقته. تابع التقدّم بالأمر sudo docker compose logs -f immich-server؛ يسجّل الخادم في سجلّاته أنه يستمع على المنفذ 2283 بمجرد أن يصبح جاهزًا. افتح الآن http://YOUR_SERVER_IP:2283 في متصفح. تعرض الزيارة الأولى معالج Getting Started — أول حساب تنشئه هو حساب المسؤول. اختر كلمة مرور قوية؛ فهذا الحساب يتحكم في إعدادات الخادم وإدارة المستخدمين وإعدادات التعلم الآلي التي ستحتاجها لاحقًا.
الخطوة 5: تطبيق الهاتف والنسخ الاحتياطي في الخلفية
ثبّت تطبيق «Immich» من App Store أو Play Store. تطلب شاشة تسجيل الدخول Server Endpoint URL (عنوان نقطة اتصال الخادم). أدخل الرابط الكامل بما فيه البروتوكول، مثل https://photos.example.com (يضيف التطبيق /api من تلقاء نفسه). سجّل الدخول بالحساب الذي أنشأته للتو، ثم افتح شاشة Backup في التطبيق، واختر الألبومات التي تريد حمايتها (عادة Camera وScreenshots)، وفعّل Background backup (النسخ الاحتياطي في الخلفية). النسخ الاحتياطي في الخلفية على iOS يخضع لتقييد من النظام: عمليات الرفع في المقدمة تعمل دائمًا، أما في الخلفية فتحدث حين يسمح النظام بذلك.
هذا بالضبط الموضع الذي يعلق فيه الناس، فاقرأ الخطوة 6 قبل أن تصارع التطبيق.
الخطوة 6: HTTPS عبر وكيل عكسي — وقاعدة الرابط الكامل
يريد تطبيق الهاتف HTTPS فعلًا. ضع وكيلًا عكسيًا أمام المنفذ 2283 وأنهِ TLS عنده. إن كنت تشغّل عدة حاويات بالفعل، فإن Traefik مع TLS تلقائي لعدة تطبيقات Docker هو الخيار الأنظف: كتلة وسوم (labels) واحدة تُوجّه photos.example.com إلى الحاوية immich-server وتجلب الشهادة نيابة عنك. إن كنت تفضّل nginx، فإن دليل Let's Encrypt مع Certbot وnginx يمنحك شهادة وكتلة proxy_pass http://127.0.0.1:2283;. هناك إعداد واحد في الوكيل مهم لـImmich: ارفع حد حجم الرفع، لأن فيديوهات الهاتف كبيرة. في nginx هذا يعني client_max_body_size 50000M; داخل كتلة server — فالقيمة الافتراضية 1 ميغابايت ترفض رفع الفيديوهات برسالة 413 Request Entity Too Large.
القاعدة التي يفرضها التطبيق: يجب أن تكون نقطة الاتصال قابلة للوصول، وفي الواقع العملي يجب أن تكون HTTPS. نقاط الاتصال بصيغة http://، أو عنوان IP مباشر مع إغفال المنفذ، هما مصدر رسالة «لا يمكن للتطبيق الوصول إلى الخادم» — وهي مذكورة كعطل مسمّى أدناه.
الخطوة 7: المكتبات الخارجية مقابل الملفات المرفوعة — استيراد شجرة صور موجودة مسبقًا
هناك طريقتان تدخل بهما الصور إلى Immich، وهما ليستا الشيء نفسه.
- الملفات المرفوعة (uploads) هي عناصر يملكها Immich. ينسخ التطبيق أو أداة الرفع عبر الويب الملف إلى
UPLOAD_LOCATION. يستطيع Immich إعادة تسميتها ونقلها وحذفها. - المكتبات الخارجية (external libraries) هي استيراد للقراءة فقط لملفات موجودة أصلًا في مجلد على خادمك — شجرة
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، لا مسار المضيف (host) /srv/photos. انقر Scan. استخدام مسار المضيف بدلًا من مسار الحاوية هو الخطأ الأول والأكثر شيوعًا في المكتبات الخارجية؛ فلا يجد الفحص شيئًا ويبلّغ عن صفر عناصر.
الخطوة 8: انضباط الترقية الذي يفرضه Immich
هذا هو الجزء الذي يفصل بين Immich مستقر وImmich معطوب. يصدر Immich تحديثاته بسرعة، ولا يُرجع الإصلاحات إلى الإصدارات القديمة، ولا يدعم التراجع إلى إصدار أقدم. اتباع الوسم العائم v3 بلا تفكير سيكسر قاعدة بياناتك عاجلًا أم آجلًا. الانضباط المطلوب:
- ثبّت إصدارًا محددًا. أبقِ
IMMICH_VERSIONمضبوطًا على وسم ثابت مثلv3.0.2، لا الوسم العائمv3الذي يسحب دومًا أحدث إصدار من سلسلة v3.x. - اقرأ ملاحظات الإصدار في كل مرة قبل الترقية. التغييرات غير المتوافقة — خصوصًا تغييرات قاعدة البيانات أو إضافة المتجهات — تُذكر هناك. إصدار v3.0 مثال واضح على ذلك: فقد أزال
pgvecto.rsكليًا، فاضطر كل من كان لا يزال على الإضافة القديمة إلى إتمام الانتقال إلى VectorChord (الذي أُدخل منذ v1.133) قبل أن يستطيع الترقية. - انسخ قاعدة البيانات احتياطيًا أولًا (الخطوة 9). دومًا، لكن بشكل مضاعف حين تذكر الملاحظات قاعدة البيانات.
- خذ ملف compose الجديد أيضًا. لا يثبّت
IMMICH_VERSIONسوى صورتي الخادم والتعلم الآلي. أما صورة Postgres فمثبّتة عبر بصمة داخلdocker-compose.ymlنفسه، فالإصدار الذي يحتاج إضافة قاعدة بيانات أحدث يوزَّع بملف compose جديد. أعد تحميل ملفي الإصدار كليهما، وأعد تطبيق قيم.envالخاصة بك، ثم رقِّ. - حدّث تطبيقات هاتفك في الوقت نفسه تقريبًا. لا يتحدث الخادم إلا بإصداره الرئيسي المطابق، ويدعم التطبيق الإصدار الرئيسي الحالي والسابق له. الخادم الذي يسبق التطبيق يعرض على الهاتف الرسالة
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 شيئان، وأحدهما بلا الآخر عديم الفائدة. قاعدة البيانات تحمل بنية الألبومات، والوجوه، وفهارس البحث، وخريطة الربط بين العنصر والملف. أما مجلد الملفات الأصلية فيحمل الصور الفعلية. استعد أحدهما بلا الآخر وستحصل إما على صور بلا تنظيم أو على قشرة فارغة تشير إلى ملفات مفقودة.
خذ تفريغًا (dump) لقاعدة البيانات بالأمر pg_dump من داخل حاوية Postgres — قاعدة بيانات immich تحديدًا، لا العنقود (cluster) كاملًا:
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 إلى جهاز آخر أو تخزين كائنات (object storage). نفّذ نسخ قاعدة البيانات أولًا ثم الملفات ثانيًا، حتى لا يشير التفريغ أبدًا إلى صورة لم تُنسخ بعد في نسخة الملفات. أما المكتبات الخارجية فتنسخها احتياطيًا بشكل منفصل من مصدرها الحقيقي؛ ف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 — أغفلها وستتوقف الاستعادة في منتصف الطريق. حين تعود الحزمة للعمل وملفاتك الأصلية في مكانها، افتح واجهة الويب: فإن كانت صورك وألبوماتك موجودة، فنسختك الاحتياطية تعمل. وإن لم تكن قد نفّذت هذا من قبل، فأنت لا تملك نسخة احتياطية — بل تملك أملًا فقط.
أنماط الفشل، مع النصوص التي ستراها حرفيًا
تُقتل حاوية التعلم الآلي بواسطة OOM. يتوقف الأمر sudo docker compose logs immich-machine-learning فجأة، ويُظهر docker compose ps حالتها Restarting، ورمز الخروج هو 137. يؤكد ذلك الأمر sudo dmesg | grep -i oom: Out of memory: Killed process ... (python3). تتجمد بعدها مهام البحث والوجوه. السبب هو ذاكرة غير كافية للنماذج. الإصلاحات، بالترتيب: أضف swap (الخطوة 1)؛ أو أعطِ الخادم ذاكرة أكبر؛ أو إن كنت عاجزًا فعلًا عن ذلك، عطّل التعلم الآلي من 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.. السبب هو صورة قاعدة بيانات إصدار إضافتها أقدم مما رُقّيت إليه بياناتك، وغالبًا ما يحدث ذلك بسبب تعديل وسم الصورة يدويًا أو استعادة تفريغ أحدث على صورة أقدم. الإصلاح هو استخدام صورة Postgres المطابقة: خذ ملف compose من الإصدار الذي يطابق قاعدة بياناتك، ولا تتراجع إلى إصدار أقدم، ولا تستعد إلا على صورة متوافقة.
لا يستطيع تطبيق الهاتف الوصول إلى الخادم. تظهر شاشة تسجيل الدخول خطأ اتصال / Server is not reachable بعد أن تُدخل الرابط. ثلاثة أسباب: كتبت http:// بينما لا يخدم الوكيل سوى https://؛ أو اتصلت مباشرة بالخلفية لكنك أغفلت المنفذ، فحاول الاتصال بـexample.com (المنفذ 443) بدلًا من example.com:2283؛ أو أن الوكيل العكسي لا يمرّر /api. أصلح ذلك بإدخال الرابط الكامل https://photos.example.com والتأكد أولًا من أنه يعمل في متصفح الهاتف. إن كان المتصفح يعمل والتطبيق لا يعمل، فإما أن الوكيل يحذف المسار أو أن الشهادة موقّعة ذاتيًا — والتطبيق يرفض الشهادات غير الموثوقة.
نفاد مساحة القرص أثناء الاستيراد. تبدأ عمليات الرفع بالفشل، وتصبح الصور المصغّرة فارغة، وتُظهر السجلّات 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
كم تحتاج Immich من ذاكرة RAM ومساحة قرص؟
المتطلبات الرسمية لـImmich هي 6 غيغابايت من الذاكرة كحد أدنى و8 غيغابايت موصى بها — و4 غيغابايت مع swap هي الحد العملي الأدنى لمكتبة صغيرة، واضبط swap في كل الأحوال لأن حاوية التعلم الآلي هي الجزء الذي يسبب الارتفاعات المفاجئة. أما القرص فقدّر حجم مكتبتك كاملة زائد نحو 10-20% للصور المصغّرة والمعاينات المولَّدة، على تخزين محلي — ولا تضع أبدًا مجلد بيانات Postgres على مشاركة شبكية. وإن كنت لا تزال تقرر ما ستستضيفه أيضًا، فإن دليل ما يجدر استضافته ذاتيًا في 2026 يضع بصمة Immich إلى جانب خدمات أخرى.
هل يمكنني تشغيل Immich بلا GPU؟
نعم. تعمل حاوية التعلم الآلي بارتياح على المعالج وحده — فالـGPU لا يفعل سوى تسريع فهرسة البحث الذكي، وتحويل ترميز الفيديو (transcoding) مع نسخة الصورة المناسبة. على المعالج وحده، قد تستغرق الفهرسة الأولى لمكتبة كبيرة ساعات في الخلفية، لكنها لا تعطّل النسخ الاحتياطي ولا التصفح. وإن كان جهازك صغيرًا جدًا على التعلم الآلي كليًا، يمكنك تعطيل Smart Search وFacial Recognition من إعدادات الإدارة والاحتفاظ بكل ما عداهما.
كيف أرقّي Immich بأمان؟
ثبّت IMMICH_VERSION على وسم محدد مثل v3.0.2، واقرأ ملاحظات الإصدار قبل كل ترقية، وانسخ قاعدة البيانات احتياطيًا أولًا. ولأن صورة Postgres مثبّتة داخل docker-compose.yml لا عبر IMMICH_VERSION، أعد تحميل ملف compose وملف example.env كليهما من الإصدار الذي تستهدفه وأعد تطبيق قيمك، ثم نفّذ docker compose pull && docker compose up -d. لا تترك الإصدار يطفو بلا مراقبة أبدًا — فImmich يصدر تغييرات غير متوافقة ولا يدعم التراجع إلى إصدار أقدم.
ما الذي أنسخه احتياطيًا بالضبط؟
شيئان معًا: تفريغ pg_dump لقاعدة بيانات immich ومجلد UPLOAD_LOCATION بالكامل. تحمل قاعدة البيانات الألبومات والوجوه وخريطة الربط بين العنصر والملف؛ ويحمل المجلد الصور الفعلية، وتحتاج الاستعادة إلى الاثنين معًا زائد صورة قاعدة بيانات بإضافة متجهات متوافقة. نفّذ تفريغ قاعدة البيانات أولًا ثم نسخ الملفات ثانيًا، واختبر الاستعادة على جهاز اختبار نظيف مرة واحدة على الأقل — فالنسخة الاحتياطية غير المُختبَرة ليست نسخة احتياطية.
كيف أستورد مجلد صوري الموجود مسبقًا؟
اربط المجلد للقراءة فقط داخل حاوية immich-server كوحدة تخزين إضافية (مثل - /srv/photos:/mnt/media/photos:ro)، أعد إنشاء الحاوية، ثم من Administration → External Libraries أنشئ مكتبة وأضف مسار الحاوية /mnt/media/photos. يفهرس Immich الملفات في مكانها ولا يعدّلها ولا يحذفها أبدًا. أشيع خطأ هو إدخال مسار المضيف بدلًا من مسار الحاوية، ما يجعل الفحص لا يجد شيئًا.