Immich کے لیے 6 GB RAM اور محفوظ upgrades
Immich کے لیے اصل RAM ضرورت، HTTPS کے پیچھے port 2283، exit 137 memory kill، اور pgvecto.rs database پر Immich v3 کے نہ چلنے کی وجہ جانیں۔ Restore steps شامل ہیں۔
آپ کیا بنا رہے ہیں
Immich ایک self-hosted photo اور video backup service ہے، اور Google Photos کا حقیقی متبادل ہے۔ اس کی phone app آپ کی camera roll کو پس منظر میں upload کرتی ہے، جبکہ اس میں timeline، albums، face recognition اور machine-learning search شامل ہیں۔ یہ search آپ کے کچھ tag کیے بغیر "beach" یا کسی شخص کی تصاویر تلاش کر سکتی ہے۔ آپ اسے اپنے زیرِ ملکیت VPS پر چلاتے ہیں، اصل files آپ کی disk پر رہتی ہیں، اور کوئی انہیں آپ کو چیزیں فروخت کرنے کے لیے scan نہیں کرتا۔ اگر آپ اب بھی دوسرے واضح امیدوار کا جائزہ لے رہے ہیں تو ہماری PhotoPrism اور Immich comparison میں ان کی RAM requirements، phone apps اور backup commands کا ساتھ ساتھ تقابل موجود ہے۔
Install کے لیے project کی اپنی Docker Compose file سے چار containers درکار ہیں۔ یہ مرحلہ دس منٹ لیتا ہے۔ اس guide کا باقی حصہ اصل مشکلات سے متعلق ہے: machine-learning container ایک چھوٹی machine پر بہت زیادہ memory استعمال کرتا ہے، original files تیزی سے disk بھر دیتی ہیں، mobile app کو بالکل درست server URL درکار ہوتا ہے، اور آپ اسے اپنے network سے باہر دستیاب کرنے سے پہلے اس کے سامنے HTTPS چاہتے ہیں۔ مزید یہ کہ Immich اتنی کثرت سے breaking changes جاری کرتا ہے کہ ایک معمولی docker compose pull آپ کے server کو start ہونے سے روک سکتا ہے۔ ان چار امور کو سنجیدگی سے سنبھالیں تو Immich نہایت مستحکم رہتا ہے۔ انہیں نظرانداز کریں تو ایک پورا weekend ضائع ہو سکتا ہے۔
شرائطِ پیشگی اور اہم عملی نکات
- RAM: official docs میں کم از کم 6 GB اور تجویز کردہ مقدار 8 GB ہے؛ 4 GB RAM اور swap کو مطلق کم از کم حد سمجھیں۔
immich-serverاور Postgres containers زیادہ وسائل استعمال نہیں کرتے۔immich-machine-learningcontainer زیادہ RAM استعمال کرتا ہے، کیونکہ یہ search indexes بنانے کے لیے CLIP اور face-recognition models کو RAM میں load کرتا ہے۔ 2 GB والے server پر kernel اسے ختم کر دیتا ہے۔ اگر آپ کے پاس 4 GB RAM بھی ہو تو swap شامل کریں۔ - Disk: اپنی پوری library کے لیے گنجائش مقرر کریں، پھر کچھ اضافی جگہ رکھیں۔ آپ کی اصل files مکمل طور پر copy ہوتی ہیں۔ اس کے علاوہ Immich thumbnails اور preview images بھی بناتا ہے، جو عموماً مزید 10–20% جگہ لیتی ہیں۔ 200 GB کی photo collection کے لیے 300 GB volume درکار ہوگا۔ اس کے مقابلے میں Postgres کم جگہ لیتا ہے۔
- CPU: کوئی بھی جدید KVM VPS کافی ہے، لیکن CPU پر ML سست ہوتا ہے۔ بڑی import کے لیے smart-search indexing پس منظر میں کئی گھنٹے چل سکتی ہے۔ یہ معمول کی بات ہے؛ اس کے لیے GPU ضروری نہیں۔
- ایک domain name جو VPS کی طرف point کیا گیا ہو۔ Mobile app HTTPS endpoint کو ترجیح دیتی ہے، اور آپ کو سامنے reverse proxy درکار ہوگا۔ یہ setup اسی طرز کا ہے جیسے Docker، TLS اور backups کے ساتھ self-hosted Nextcloud instance؛ Immich اس files server کا photos counterpart ہے۔
- Docker اور Compose plugin پہلے سے installed ہوں۔ Docker Engine کے ساتھ Docker کے اپنے apt repository سے Compose v2 plugin استعمال کریں، جیسا کہ ہماری Docker Compose basics guide میں مکمل طور پر بیان کیا گیا ہے۔
مرحلہ 1: کسی بھی دوسرے کام سے پہلے swap شامل کریں
چھوٹے VPS پر Immich کی سب سے عام خرابی یہ ہے کہ ML container کو OOM کی وجہ سے بند کر دیا جاتا ہے۔ پہلے kernel کو اضافی memory فراہم کریں۔
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 میں 4.0Gi کی Swap: لائن نظر آنی چاہیے۔ اس سے ML تیز نہیں ہوگا، اور یہ ضمانت کے بجائے ایک buffer ہے، لیکن 4 GB مشین پر indexing کے دوران container کے بند ہونے کا امکان نمایاں طور پر کم ہو جاتا ہے۔
مرحلہ 2: آفیشل compose اور env فائلیں حاصل کریں، نقل استعمال نہ کریں
Immich اپنی فراہم کردہ فائلوں میں سروس کے versions اور، خاص طور پر، database image کو pin کرتا ہے۔ کسی blog، بشمول اس guide، سے compose file کو اپنی بنیادی source of truth کے طور پر paste نہ کریں۔ release assets download کریں:
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 سے حاصل ہوتی ہیں، اس لیے image references ایک دوسرے سے مطابقت رکھتے ہیں۔ compose file میں چار services کی تعریف ہے۔ کسی بھی تبدیلی سے پہلے یہ سمجھنا مفید ہے کہ ہر service کیا کرتی ہے:
immich-server(ghcr.io/immich-app/immich-server، containerimmich_server)، API اور web UI ہے اور port2283پر listening کرتی ہے۔ یہ آپ کے uploads کو/dataپر mount کرتی ہے۔immich-machine-learning(ghcr.io/immich-app/immich-machine-learning، containerimmich_machine_learning)، CLIP search اور face recognition فراہم کرتی ہے۔ یہ download کیے گئے models کوmodel-cachevolume میں cache کرتی ہے۔ اسے سب سے زیادہ memory درکار ہوتی ہے۔database(containerimmich_postgres)، VectorChord vector extension کے ساتھ Postgres ہے، جو similarity search چلاتا ہے۔ image tag کو compose file میں براہِ راست digest کے ذریعے pin کیا گیا ہے، مثلاًghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:...۔ پرانے setups میںpgvecto.rsاستعمال ہوتا تھا؛ Immich v3.0 میں اس کی support ختم کر دی گئی، اس لیے آج install کی جانے والی ہر چیز VectorChord استعمال کرتی ہے۔ اس tag میں کبھی دستی ترمیم نہ کریں۔redis(containerimmich_redis)، job queues کے لیے Valkey/Redis instance ہے۔
مرحلہ 3: .env کو ترتیب دیں، جہاں آپ کی تصاویر اور database موجود ہوں گے
.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 کو آپ کی بڑی disk کی طرف اشارہ کرنا چاہیے۔ اگر بعد میں data volume attach کرنا ہو تو شروع ہی سے اس کی mount path یہاں مقرر کریں، کیونکہ بعد میں اسے منتقل کرنے کا مطلب thumbnails منتقل کرنا اور asset paths کو اپ ڈیٹ کرنا ہے۔ DB_DATA_LOCATION لازماً local disk پر ہونا چاہیے: NFS یا SMB share پر Postgres خراب ہو جاتا ہے، اور دستاویزات میں یہ بات واضح طور پر لکھی ہے۔ DB_PASSWORD میں صرف حروف اور digits استعمال کرنے سے connection-string escaping کی ایک قسم کی خرابیوں سے بچا جا سکتا ہے۔
مرحلہ 4: پہلی بار چلانا اور منتظم صارف بنانا
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 کئی gigabytes کی images download کرتا ہے، اس لیے اسے وقت دیں۔ sudo docker compose logs -f immich-server کے ذریعے پیش رفت دیکھیں؛ تیار ہونے کے بعد server logs میں یہ درج ہوتا ہے کہ وہ port 2283 پر listening کر رہا ہے۔ اب browser میں http://YOUR_SERVER_IP:2283 کھولیں۔ پہلی بار کھولنے پر Getting Started wizard ظاہر ہوتا ہے۔ آپ جو پہلا account بناتے ہیں، وہی admin ہوتا ہے۔ مضبوط password مقرر کریں؛ اس account کے پاس server settings، user management اور وہ ML configuration ہوتی ہے جس کی آپ کو بعد میں ضرورت ہوگی۔
مرحلہ 5: موبائل ایپ اور پس منظر میں بیک اپ
App Store یا Play Store سے "Immich" انسٹال کریں۔ لاگ اِن اسکرین پر Server Endpoint URL درج کرنے کو کہا جائے گا۔ scheme سمیت مکمل URL درج کریں، مثلاً https://photos.example.com (ایپ خود /api شامل کر دیتی ہے)۔ ابھی بنائے گئے اکاؤنٹ سے لاگ اِن کریں۔ پھر ایپ کی Backup اسکرین کھولیں، ان albums کا انتخاب کریں جنہیں محفوظ رکھنا ہے، عموماً Camera اور Screenshots، اور Background backup فعال کریں۔ iOS میں پس منظر کے بیک اپ کی رفتار OS محدود کرتا ہے۔ foreground uploads ہمیشہ چلتی ہیں، جبکہ background uploads اسی وقت ہوتی ہیں جب OS اجازت دے۔
لوگ عموماً اسی مرحلے پر رک جاتے ہیں، اس لیے ایپ کے ساتھ مسئلہ حل کرنے سے پہلے Step 6 پڑھیں۔
مرحلہ 6: reverse proxy کے ذریعے HTTPS، اور مکمل URL کا اصول
گھریلو نیٹ ورک سے باہر آنے کے بعد mobile app کو HTTPS درکار ہوتا ہے۔ port 2283 کے سامنے reverse proxy رکھیں اور وہیں TLS terminate کریں۔ اگر آپ پہلے ہی متعدد containers چلا رہے ہیں تو متعدد Docker apps کے لیے automatic TLS والا Traefik سب سے صاف حل ہے۔ ایک label block photos.example.com کو immich-server container تک route کرتا ہے اور آپ کے لیے certificate حاصل کرتا ہے۔ اگر آپ nginx کو ترجیح دیتے ہیں تو Certbot اور nginx کے ساتھ Let's Encrypt گائیڈ آپ کے لیے certificate اور proxy_pass http://127.0.0.1:2283; block تیار کرتی ہے۔ جب یہ proxy موجود ہو جائے تو اگلی service شامل کرنے کے لیے عموماً صرف نیا subdomain بنانا پڑتا ہے۔ اسی طرح media front end، مثلاً Jellyfin کے لیے 90s video store skin Halcyon، اسی سرور پر Immich کے ساتھ چل سکتا ہے۔ یہی بات ایک self-hosted HarnessRouter جو Codex اور Claude Code کو ایک API کے پیچھے رکھتا ہے پر بھی لاگو ہوتی ہے۔ یہ جان بوجھ کر loopback پر bind ہوتا ہے اور صرف اس وقت قابل رسائی بنتا ہے جب proxy اس کے سامنے TLS terminate کرے۔ اس لیے subdomain کو اس کی طرف point کرنے سے پہلے default login تبدیل کریں۔ تاہم ہر container کے لیے public hostname ضروری نہیں ہوتا۔ ایک self-hosted open-kritt security scanner جیسا صرف administrators کے لیے مخصوص tool بہتر ہے کہ proxy سے بالکل باہر رکھا جائے، اور کبھی کبھار اس کا UI کھولنے کے لیے SSH tunnel استعمال کیا جائے۔ کچھ services proxy استعمال نہیں کرتیں کیونکہ وہ HTTP کو بالکل استعمال نہیں کرتیں۔ ایک self-hosted RustDesk relay server اس کی واضح مثال ہے۔ یہ چند raw TCP اور UDP ports پر listen کرتا ہے اور subdomain کے بجائے firewall rules چاہتا ہے۔ Immich کے لیے proxy کی ایک setting اہم ہے: upload size limit بڑھائیں، کیونکہ phone videos بڑی ہوتی ہیں۔ nginx میں یہ server block کے اندر client_max_body_size 50000M; ہوتا ہے۔ default 1 MB video uploads کو 413 Request Entity Too Large کے ساتھ مسترد کرتا ہے۔ اگر آپ کا proxy Let's Encrypt HTTP-01 challenges کا جواب بھی دیتا ہے تو یقینی بنائیں کہ /.well-known/immich اب بھی Immich کی طرف route ہو، challenge handler کی طرف نہیں۔
App جس اصول کو نافذ کرتی ہے وہ یہ ہے: endpoint بالکل اسی URL پر قابل رسائی ہونا چاہیے جو آپ درج کرتے ہیں۔ App سادہ http://YOUR_SERVER_IP:2283 قبول کرے گی، اور اس کا اپنا login hint http://your-server-ip:port ہے، لیکن internet سے گزرنے والی ہر چیز HTTPS ہونی چاہیے۔ غلط scheme، یا port کے بغیر direct IP، اس مسئلے کا سبب بنتا ہے کہ "app server تک نہیں پہنچ سکتی"۔ اس کی وضاحت ذیل میں ایک نامزد failure کے طور پر کی گئی ہے۔
مرحلہ 7: External libraries بمقابلہ uploads، موجودہ photo tree درآمد کرنا
Immich میں photos شامل کرنے کے دو طریقے ہیں، اور یہ ایک جیسے نہیں ہیں۔
- Uploads وہ assets ہیں جن کی ملکیت Immich کے پاس ہوتی ہے۔ ایپ یا web uploader فائل کو
UPLOAD_LOCATIONمیں copy کرتا ہے۔ Immich ان کے نام بدل سکتا ہے، انہیں منتقل کر سکتا ہے اور حذف کر سکتا ہے۔ - External libraries ان فائلوں کا read-only import ہیں جو پہلے ہی آپ کے server کے کسی folder، پرانے
Picturestree یا NAS export میں موجود ہوتی ہیں۔ Immich انہیں اسی جگہ index کرتا ہے اور timeline میں دکھاتا ہے، لیکن اصل فائلوں میں کبھی ترمیم نہیں کرتا اور نہ انہیں حذف کرتا ہے۔
موجودہ tree درآمد کرنے کے لیے اسے server container میں read-only طور پر mount کریں۔ immich-server: کے تحت docker-compose.yml میں ترمیم کریں اور ایک volume شامل کریں:
immich-server:
volumes:
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
- /srv/photos:/mnt/media/photos:ro:ro اس بات کی ضمانت دیتا ہے کہ Immich اصل فائلوں کو کبھی نہیں چھو سکتا۔ sudo docker compose up -d سے container دوبارہ بنائیں۔ اس کے بعد web UI میں اپنے avatar → Administration → External Libraries → Create Library پر جائیں، مالک user منتخب کریں، Folders کے تحت Add پر click کریں، اور container path /mnt/media/photos درج کریں، host path /srv/photos نہیں۔ Scan پر click کریں۔ container path کے بجائے host path استعمال کرنا external library کی سب سے عام غلطی ہے؛ scan کو کوئی فائل نہیں ملتی اور یہ zero assets رپورٹ کرتا ہے۔
مرحلہ 8: Immich کا تقاضا کردہ upgrade discipline
یہ وہ حصہ ہے جو مستحکم Immich اور خراب Immich کے درمیان فرق پیدا کرتا ہے۔ Immich تیزی سے نئے releases جاری کرتا ہے اور fixes کو پرانے versions میں backport نہیں کرتا، نہ ہی downgrades کو support کرتا ہے۔ floating v3 tag releases کو follow کرنے کا officially supported طریقہ ہے، اور Immich breaking changes کو major versions تک محدود رکھنے کی کوشش کرتا ہے، لیکن آپ جب بھی pull کرتے ہیں تو یہ upgrade ہو جاتا ہے، چاہے آپ نے release notes پڑھے ہوں یا نہیں۔ جس upgrade کی آپ نے منصوبہ بندی نہ کی ہو اسے rollback نہیں کیا جا سکتا۔ یہی pin-then-read-the-notes عادت box پر موجود ہر طویل مدت تک چلنے والے container کے لیے بھی مفید ہے۔ اسی لیے self-hosted KiroCrew agent کو ایک معلوم اور قابل اعتماد tag پر pin کیا جاتا ہے، بجائے اس کے کہ اگلے restart پر وہ خود بخود تبدیل ہو جائے۔ اس کے لیے یہ discipline اپنائیں:
- Version pin کریں۔
IMMICH_VERSIONکوv3.0.2جیسے واضح tag پر رکھیں، نہ کہ floatingv3پر، جو ہمیشہ تازہ ترین v3.x حاصل کرتا ہے۔ - Upgrade سے پہلے ہر بار release notes پڑھیں۔ Breaking changes، خصوصاً database یا vector-extension سے متعلق تبدیلیاں، وہاں درج ہوتی ہیں۔ v3.0 release اس کی واضح مثال ہے: اس نے pgvecto.rs کو مکمل طور پر ہٹا دیا۔ اس لیے جو صارف اب بھی پرانا extension استعمال کر رہے تھے، انہیں آگے بڑھنے سے پہلے VectorChord migration مکمل کرنا پڑا، جو v1.133 میں متعارف ہوئی تھی۔
- سب سے پہلے database کا backup لیں (مرحلہ 9)۔ یہ ہمیشہ کریں، لیکن جب notes میں database کا ذکر ہو تو خاص طور پر ضروری ہے۔
- نئی compose file بھی حاصل کریں۔
IMMICH_VERSIONصرف server اور ML images کو pin کرتا ہے۔ Postgres image کوdocker-compose.ymlکے اندر digest کے ذریعے pin کیا جاتا ہے، اس لیے نئے database extension کی ضرورت رکھنے والا version نئی compose file کے ساتھ جاری ہوتا ہے۔ دونوں release assets دوبارہ download کریں، اپنی.envvalues دوبارہ apply کریں، پھر upgrade کریں۔ - اپنے mobile clients پہلے update کریں۔ Server صرف اپنے matching major version کے ساتھ کام کرتا ہے، جبکہ app عموماً موجودہ اور پچھلے major version کے ساتھ compatible ہوتی ہے۔ جب server app سے نیا ہو، تو موجودہ releases (v3.3.1، 2026-10-10 کو جانچا گیا) فون پر App update is available notice اور Update button دکھاتے ہیں۔ Immich سرور کو upgrade کرنے سے پہلے تمام mobile clients کو upgrade کرنے کی سفارش کرتا ہے۔
نئی files رکھنے کے بعد اصل commands یہ ہیں:
cd /opt/immich
sudo docker compose pull
sudo docker compose up -d
sudo docker image pruneمرحلہ 9: بیک اپ، database dump اور اصل فائلیں، پھر اس کی جانچ
Immich کا بیک اپ دو چیزوں پر مشتمل ہوتا ہے، اور ایک کے بغیر دوسری بے کار ہے۔ database میں album structure، faces، search indexes اور asset سے file تک کا نقشہ محفوظ ہوتا ہے۔ originals directory میں اصل photos محفوظ ہوتی ہیں۔ ایک کو دوسرے کے بغیر restore کریں تو یا تو organisation کے بغیر photos ملیں گی یا missing files کی طرف اشارہ کرنے والا خالی shell۔ یہ دو حصوں والی ساخت Immich کی خاص بات نہیں ہے: self-hosted Chatwoot support desk کو بھی Postgres dump اور اس کی uploads directory کی یہی جوڑی درکار ہوتی ہے، ورنہ restored inbox واپس آتا ہے لیکن اس کی ہر attachment missing ہوتی ہے۔ Postgres data directory کو file tree کے طور پر copy کرنا dump کے مرحلے سے بچنے کا مختصر راستہ معلوم ہوتا ہے، مگر یہ قابلِ استعمال بیک اپ نہیں ہے۔ یہ ایک ایسا trap ہے جسے مکمل Immich backup اور restore walkthrough restore کے دوران پیش آنے والے اس مسئلے کے ساتھ واضح کرتا ہے جس میں timeline خالی رہ جاتی ہے۔
pg_dump کے ذریعے database کو Postgres container کے اندر سے dump کریں۔ صرف immich database dump کریں، پورے 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 tree، اور خاص طور پر اس کے library/، upload/ اور profile/ subfolders کا بیک اپ restic، rsync یا borg کے ذریعے کسی دوسرے machine یا object storage پر بنائیں۔ یہ job چاہے cron entry schedule کرے یا systemd timer، ناکامی کی صورت میں اطلاع بھیجنے کا انتظام ہونا چاہیے۔ کسی systemd OnFailure= unit کو اپنے ntfy push server کی طرف متوجہ کرنے سے dump ناکام ہونے کی رات آپ کے phone پر message پہنچ جاتا ہے، بجائے اس کے کہ آپ کو restore کے وقت اس کا پتا چلے۔ پہلے database کا بیک اپ لیں اور پھر files کا، تاکہ dump کبھی ایسی photo کا حوالہ نہ دے جسے file backup نے ابھی copy نہ کیا ہو۔ External libraries کا بیک اپ ان کے اصل source پر الگ سے لیں؛ Immich ان کا مالک نہیں ہوتا۔
اب وہ حصہ جسے سب چھوڑ دیتے ہیں: restore کی جانچ کریں۔ Restore ایک fresh stack پر ہونا چاہیے، جس کا server پہلے کبھی start نہ ہوا ہو، اور ایسے Postgres image پر ہونا چاہیے جس کی vector extension dump کے ساتھ compatible ہو۔ اسی لیے DB image tag کا کبھی اندازے سے انتخاب نہ کریں۔ اسی compose اور .env کے ساتھ ایک scratch box پر پرانی state wipe کریں، صرف database start کریں، پھر dump load کریں:
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 -dVectorChord database پر search_path کی sed rewrite optional نہیں ہے۔ اسے چھوڑنے سے restore درمیان میں abort ہو جاتا ہے۔ جب آپ کی originals موجود ہوں اور stack دوبارہ start ہو جائے تو web UI کھولیں۔ اگر آپ کی photos اور albums موجود ہیں تو بیک اپ کام کر رہا ہے۔ اگر آپ نے یہ عمل کبھی نہیں چلایا تو آپ کے پاس بیک اپ نہیں، صرف امید ہے۔
ناکامی کی صورتیں، اور وہ strings جو آپ کو نظر آئیں گی
ML container OOM-killed ہو جاتا ہے۔ sudo docker compose logs immich-machine-learning اچانک رک جاتا ہے، docker compose ps اسے Restarting دکھاتا ہے، اور exit code 137 ہوتا ہے۔ sudo dmesg | grep -i oom اس کی تصدیق کرتا ہے: Out of memory: Killed process ... (python3)۔ اس کے بعد search اور face jobs رک جاتی ہیں۔ وجہ یہ ہے کہ models کے لیے RAM ناکافی ہے۔ حل، اسی ترتیب سے: swap شامل کریں (Step 1)؛ VPS کی RAM بڑھائیں؛ یا، اگر واقعی یہ ممکن نہ ہو، Administration → Settings → Machine Learning Settings کھولیں اور اعلیٰ سطح کا machine learning toggle بند کر دیں۔ اس سے تمام ML features ایک ساتھ غیر فعال ہو جاتے ہیں۔ صرف Smart Search اور Facial Recognition بند کرنا کافی نہیں، کیونکہ OCR اور دیگر model types بطور default enabled رہتے ہیں۔ آپ backups اور albums برقرار رکھتے ہیں، لیکن content کے مطابق search کی سہولت ختم ہو جاتی ہے۔ compose file سے immich-machine-learning service ہٹانے کا بھی یہی اثر ہوتا ہے۔
Upgrade کے بعد Immich server start نہیں ہوتا۔ Postgres container ممکن ہے درست طور پر چل رہا ہو؛ startup کے وقت vector extension version کی جانچ immich_server کرتا ہے اور start ہونے سے انکار کر دیتا ہے۔ اس کے log میں 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. جیسی line بار بار آتی ہے، یا پرانے stacks میں The pgvecto.rs extension is not available in this Postgres instance.۔ وجہ ایسی database image ہے جس کا extension version اس version سے پرانا ہے جس پر آپ کا data upgrade کیا گیا تھا۔ یہ تقریباً ہمیشہ image tag کو دستی طور پر تبدیل کرنے یا newer dump کو older image پر restore کرنے کی وجہ سے ہوتا ہے۔ حل یہ ہے کہ مطابقت رکھنے والی Postgres image استعمال کریں، اپنے database کے مطابق release سے compose file لیں، downgrade نہ کریں، اور restore صرف compatible image پر کریں۔
Mobile app server تک نہیں پہنچ سکتی۔ URL درج کرنے کے بعد login screen پر Could not connect to server جیسی connection error دکھائی دیتی ہے۔ عام وجوہات یہ ہیں: آپ نے http:// درج کیا، جبکہ proxy صرف https:// serve کرتا ہے؛ آپ backend سے براہِ راست connect ہوئے لیکن port نہیں دیا، اس لیے اس نے example.com:2283 کے بجائے example.com (port 443) آزمایا؛ reverse proxy /api forward نہیں کر رہا؛ یا Let's Encrypt HTTP-01 challenges سنبھالنے والا proxy /.well-known/immich کو Immich کے بجائے کسی اور جگہ route کر رہا ہے۔ حل کے لیے مکمل https://photos.example.com URL درج کریں اور پہلے phone browser میں تصدیق کریں کہ وہ load ہوتا ہے۔ اگر browser میں کام کرتا ہے لیکن app میں نہیں، تو proxy path strip کر رہا ہے یا /.well-known/immich کو غلط route کر رہا ہے۔ دوسری وجہ self-signed certificate بھی ہو سکتی ہے، جسے app handshake error کے ساتھ reject کرتی ہے، جب تک اس کی settings میں self-signed certificate support enabled نہ کیا جائے۔
Import کے دوران disk بھر جاتی ہے۔ Uploads ناکام ہونا شروع ہو جاتی ہیں، thumbnails خالی دکھائی دیتی ہیں، اور logs میں ENOSPC: no space left on device یا Postgres کی طرف سے could not extend file ... No space left on device دکھائی دیتا ہے۔ df -h میں UPLOAD_LOCATION volume کا استعمال 100% دکھائی دیتا ہے۔ اسی لیے بڑی library import کرنے سے پہلے disk size مقرر کریں۔ بحالی کے لیے بڑا volume attach کریں، stack روکیں، UPLOAD_LOCATION کو اس volume پر منتقل کریں، .env update کریں، اور دوبارہ start کریں۔ اگر provider اجازت دے تو موجودہ disk کو بھی expand کیا جا سکتا ہے۔ اگر Postgres کی disk بھر جائے تو database معطل ہو سکتا ہے۔ اس لیے جگہ خالی کریں اور corruption فرض کرنے سے پہلے database container restart کریں۔
FAQ
Immich کو کتنی RAM اور disk درکار ہوتی ہے؟
Immich کی سرکاری ضروریات کے مطابق کم از کم 6 GB RAM اور تجویز کردہ مقدار 8 GB ہے۔ چھوٹی library کے لیے swap کے ساتھ 4 GB عملی کم از کم مقدار ہے۔ بہرحال swap configure کریں، کیونکہ machine-learning container ہی عموماً سب سے زیادہ memory استعمال کرتا ہے۔ Disk کے لیے پوری library کے حجم کے علاوہ generated thumbnails اور previews کے لیے تقریباً 10–20% اضافی جگہ رکھیں۔ یہ data local storage پر رکھیں؛ Postgres data directory کو کبھی network share پر نہ رکھیں۔ اگر آپ ابھی یہ طے کر رہے ہیں کہ مزید کیا چلانا ہے تو 2026 میں self-host کرنے والی چیزوں کی guide میں Immich کا footprint دیگر services کے ساتھ دیا گیا ہے۔
کیا میں Immich کو GPU کے بغیر چلا سکتا ہوں؟
ہاں۔ machine-learning container CPU پر بھی درست طور پر چلتا ہے۔ GPU صرف smart-search indexing کو تیز کرتا ہے اور مناسب image variant کے ساتھ video transcoding بھی تیز کر سکتا ہے۔ CPU پر بڑی library کا ابتدائی index پس منظر میں مکمل ہونے میں کئی گھنٹے لے سکتا ہے، لیکن اس سے backups یا browsing نہیں رکتی۔ اگر آپ کا server ML کے لیے بھی بہت کم وسائل رکھتا ہے تو admin settings میں موجود top-level toggle سے machine learning مکمل طور پر بند کر سکتے ہیں اور باقی تمام features استعمال کر سکتے ہیں۔
میں Immich کو محفوظ طریقے سے upgrade کیسے کروں؟
IMMICH_VERSION کو v3.0.2 جیسے واضح tag پر pin کریں، ہر upgrade سے پہلے release notes پڑھیں، اور پہلے database کا backup لیں۔ Postgres image کو docker-compose.yml کے اندر pin کیا جاتا ہے، IMMICH_VERSION کے ذریعے نہیں۔ اس لیے اپنی مطلوبہ release سے compose file اور example.env دونوں دوبارہ download کریں، اپنی values دوبارہ apply کریں، پھر docker compose pull && docker compose up -d چلائیں۔ Version کو unattended طور پر کبھی float نہ ہونے دیں۔ Immich downgrades کو support نہیں کرتا، اس لیے جس upgrade کے بارے میں آپ نے پہلے نہ پڑھا ہو اسے واپس نہیں کیا جا سکتا۔
مجھے درست طور پر کس چیز کا backup لینا چاہیے؟
دونوں چیزوں کا ایک ساتھ backup لیں: immich database کا pg_dump اور پوری UPLOAD_LOCATION originals directory۔ Database میں albums، faces اور asset-to-file mapping محفوظ ہوتی ہے۔ Directory میں اصل photos ہوتی ہیں۔ Restore کے لیے دونوں کے علاوہ compatible vector extension والی database image بھی درکار ہوتی ہے۔ پہلے database dump لیں اور اس کے بعد files copy کریں۔ کم از کم ایک بار restore کو scratch server پر test کریں، کیونکہ جس backup کا test نہ کیا گیا ہو وہ backup نہیں ہوتا۔
میں اپنی موجودہ photo folder کیسے import کروں؟
Folder کو read-only حالت میں اضافی volume کے طور پر immich-server container میں mount کریں، مثلاً - /srv/photos:/mnt/media/photos:ro، پھر container دوبارہ بنائیں۔ اس کے بعد Administration → External Libraries میں library بنائیں اور container path /mnt/media/photos شامل کریں۔ Immich files کو ان کی موجودہ جگہ پر index کرتا ہے اور انہیں کبھی modify یا delete نہیں کرتا۔ سب سے عام غلطی host path درج کرنا ہے، container path نہیں۔ اس صورت میں scan کو کوئی file نہیں ملتی۔