SSD Nodes Learn Hosting plans →
गाइड Matt Connorलेखक: Matt Connor

Immich self-hosting: 6 GB RAM और सुरक्षित अपग्रेड गाइड

Immich के लिए 6 GB RAM की आवश्यकता, port 2283 और HTTPS सेटअप, exit 137 मेमोरी एरर का समाधान और pgvecto.rs डेटाबेस के साथ v3 वर्जन की समस्याओं को ठीक करने के स्टेप्स जानें।

आप क्या बना रहे हैं

Immich एक self-hosted फोटो और वीडियो बैकअप सर्विस है, जो Google Photos का एक वास्तविक विकल्प है। इसमें एक फोन ऐप है जो बैकग्राउंड में आपके कैमरा रोल को अपलोड करता है, साथ ही टाइमलाइन, एल्बम, फेस रिकग्निशन और मशीन-लर्निंग सर्च की सुविधा है जो बिना किसी टैगिंग के "beach" या किसी व्यक्ति को खोज लेती है। आप इसे अपने VPS पर चलाते हैं, ओरिजिनल फाइलें आपकी डिस्क पर रहती हैं, और कोई भी उन्हें विज्ञापन दिखाने के लिए स्कैन नहीं करता है। यदि आप अभी भी इसे दूसरे संभावित विकल्प के साथ तौल रहे हैं, तो हमारा PhotoPrism और Immich तुलनात्मक लेख उनके RAM उपयोग, फोन ऐप्स और बैकअप कमांड्स को एक साथ रखता है।

इसका इंस्टॉलेशन प्रोजेक्ट की अपनी Docker Compose फाइल से चार कंटेनर्स के माध्यम से होता है। उस हिस्से में दस मिनट लगते हैं। इस गाइड का बाकी हिस्सा वह है जहाँ चुनौतियाँ आती हैं: मशीन-लर्निंग कंटेनर छोटे सर्वर पर अधिक मेमोरी लेता है, ओरिजिनल फाइलें डिस्क को तेजी से भरती हैं, मोबाइल ऐप को सटीक सर्वर URL की आवश्यकता होती है और आप चाहते हैं कि आपके नेटवर्क से बाहर जाने से पहले इसके सामने HTTPS हो। Immich में अक्सर ऐसे बदलाव आते हैं जो पुराने वर्शन को तोड़ सकते हैं, इसलिए एक लापरवाह docker compose pull आपके सर्वर को स्टार्ट होने से रोक सकता है। इन चार बातों को गंभीरता से लें, तो Immich पूरी तरह से स्थिर है। इन्हें नजरअंदाज करने पर आपका पूरा वीकेंड खराब हो सकता है।

आवश्यक शर्तें और कुछ महत्वपूर्ण सावधानियां

  • RAM: आधिकारिक दस्तावेज़ों में न्यूनतम 6 GB और अनुशंसित 8 GB RAM बताई गई है, लेकिन 4 GB के साथ swap का उपयोग करना ही न्यूनतम सीमा है। immich-server और Postgres containers बहुत कम संसाधन लेते हैं। immich-machine-learning container सबसे अधिक RAM का उपयोग करता है, क्योंकि यह search indexes बनाने के लिए CLIP और face-recognition models को RAM में लोड करता है। 2 GB वाले सर्वर पर kernel इसे बंद (kill) कर देता है। यदि आपके पास 4 GB RAM भी है, तब भी swap अवश्य जोड़ें।
  • Disk: अपनी पूरी लाइब्रेरी के आकार के अनुसार डिस्क चुनें, और थोड़ा अतिरिक्त स्थान रखें। आपकी मूल फ़ाइलें पूरी तरह कॉपी की जाती हैं, और इसके अलावा Immich thumbnails और preview images भी बनाता है (जो मूल आकार का लगभग 10–20% अतिरिक्त होता है)। 200 GB के फोटो कलेक्शन के लिए 300 GB का volume रखें। इसकी तुलना में Postgres बहुत कम जगह लेता है।
  • CPU: कोई भी आधुनिक KVM VPS पर्याप्त है, लेकिन CPU पर ML (Machine Learning) धीमा चलता है। बड़े import के दौरान smart-search indexing बैकग्राउंड में घंटों तक चल सकती है। यह सामान्य है; इसके लिए GPU की आवश्यकता नहीं है।
  • एक domain name जो VPS पर पॉइंट करता हो। मोबाइल ऐप HTTPS endpoint को प्राथमिकता देता है, और आपको इसके सामने एक reverse proxy की आवश्यकता होगी। यह सेटअप Docker, TLS और backups के साथ self-hosted Nextcloud instance के समान है; Immich उस फ़ाइल सर्वर का फोटो-आधारित विकल्प है।
  • Docker और Compose plugin इंस्टॉल होना चाहिए। Docker Engine और Compose v2 plugin को Docker की आधिकारिक apt repository से इंस्टॉल करें, जैसा कि हमारी Docker Compose बेसिक्स गाइड में बताया गया है।

चरण 1: सबसे पहले swap जोड़ें

छोटे VPS पर Immich के विफल होने का सबसे सामान्य कारण ML container का OOM-killed होना है। सबसे पहले kernel को काम करने के लिए पर्याप्त जगह दें।

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 RAM वाली मशीन पर indexing के दौरान container के बंद होने की संभावना काफी कम हो जाती है।

चरण 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 और वेब UI, जो पोर्ट 2283 पर लिसन करता है। यह आपके अपलोड्स को /data पर माउंट करता है।
  • immich-machine-learning (ghcr.io/immich-app/immich-machine-learning, कंटेनर immich_machine_learning), CLIP सर्च और फेस रिकग्निशन। यह डाउनलोड किए गए मॉडल्स को model-cache वॉल्यूम में कैश करता है। यह सबसे अधिक मेमोरी का उपयोग करने वाली सर्विस है।
  • database (कंटेनर immich_postgres), VectorChord वेक्टर एक्सटेंशन के साथ Postgres, जो सिमिलरिटी सर्च को पावर देता है। इमेज टैग को सीधे 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 को लोकल डिस्क पर होना चाहिए: NFS या SMB शेयर पर Postgres करप्ट हो जाता है, और दस्तावेज़ों में यह स्पष्ट शब्दों में लिखा है। यदि आप DB_PASSWORD में केवल अक्षरों और अंकों का उपयोग करते हैं, तो आप कनेक्शन-स्ट्रिंग एस्केपिंग बग्स की एक श्रेणी से बच जाते हैं।

चरण 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 कई गीगाबाइट की इमेजेज पुल (pull) करता है, इसलिए इसे समय दें। sudo docker compose logs -f immich-server के साथ प्रगति पर नजर रखें; तैयार होने पर सर्वर लॉग में यह दिखाई देगा कि यह पोर्ट 2283 पर लिसन (listen) कर रहा है। अब ब्राउज़र में http://YOUR_SERVER_IP:2283 खोलें। पहली बार विजिट करने पर एक Getting Started विज़ार्ड दिखाई देगा, आपके द्वारा बनाया गया पहला अकाउंट एडमिन होगा। एक मजबूत पासवर्ड सेट करें; यह अकाउंट सर्वर सेटिंग्स, यूजर मैनेजमेंट और उस ML कॉन्फ़िगरेशन का मालिक होता है जिसकी आपको बाद में आवश्यकता होगी।

Step 5: मोबाइल ऐप और बैकग्राउंड बैकअप

App Store या Play Store से "Immich" इंस्टॉल करें। लॉगिन स्क्रीन पर आपसे Server Endpoint URL मांगा जाएगा। पूरा URL दर्ज करें, जिसमें स्कीम भी शामिल हो, उदाहरण के लिए https://photos.example.com (ऐप खुद /api जोड़ देता है)। अभी बनाए गए अकाउंट से लॉगिन करें, फिर ऐप की Backup स्क्रीन खोलें, सुरक्षित रखने के लिए एल्बम चुनें (आमतौर पर Camera और Screenshots), और Background backup को इनेबल करें। iOS पर बैकग्राउंड बैकअप OS द्वारा सीमित (throttled) होता है; foreground अपलोड हमेशा चलते हैं, जबकि बैकग्राउंड अपलोड तब होते हैं जब OS इसकी अनुमति देता है।

यहीं पर अक्सर लोग अटक जाते हैं, इसलिए ऐप के साथ संघर्ष करने से पहले Step 6 पढ़ें।

चरण 6: रिवर्स प्रॉक्सी के माध्यम से HTTPS, और पूर्ण-URL नियम

जब मोबाइल ऐप आपके होम नेटवर्क से बाहर जाता है, तो उसे वास्तव में HTTPS की आवश्यकता होती है। पोर्ट 2283 के सामने एक रिवर्स प्रॉक्सी रखें और वहां TLS termination करें। यदि आप पहले से ही कई कंटेनर चला रहे हैं, तो Traefik with automatic TLS for multiple Docker apps सबसे व्यवस्थित विकल्प है; एक लेबल ब्लॉक photos.example.com को immich-server कंटेनर तक रूट करता है और आपके लिए सर्टिफिकेट प्राप्त करता है। यदि आप nginx पसंद करते हैं, तो Let's Encrypt with Certbot and nginx गाइड आपको एक सर्टिफिकेट और एक proxy_pass http://127.0.0.1:2283; ब्लॉक प्रदान करती है। एक बार जब वह प्रॉक्सी मौजूद हो, तो अगली सर्विस जोड़ना मुख्य रूप से एक नया सबडोमेन जोड़ने जैसा है। इसी तरह Halcyon, the 90s video store skin for Jellyfin जैसा मीडिया फ्रंट-एंड उसी बॉक्स पर Immich के साथ स्थित हो जाता है। यही बात a self-hosted HarnessRouter putting Codex and Claude Code behind one API पर भी लागू होती है, जो जानबूझकर लूपबैक पर बाइंड होता है और केवल तभी पहुंच योग्य होता है जब प्रॉक्सी उसके सामने TLS को समाप्त कर दे, इसलिए सबडोमेन को उस पर पॉइंट करने से पहले उसका डिफ़ॉल्ट लॉगिन बदल दें। हालाँकि, हर कंटेनर को पब्लिक होस्टनेम की आवश्यकता नहीं होती है: a self-hosted open-kritt security scanner जैसे केवल-एडमिन टूल को प्रॉक्सी से पूरी तरह दूर रखना और दुर्लभ अवसरों पर जब आप इसका UI खोलते हैं, तो इसे SSH टनल के माध्यम से एक्सेस करना बेहतर होता है। अन्य सर्विस प्रॉक्सी को छोड़ देती हैं क्योंकि HTTP उनकी भाषा नहीं है, और a self-hosted RustDesk relay server इसका सबसे स्पष्ट उदाहरण है; यह कुछ रॉ TCP और UDP पोर्ट्स पर लिसन करता है और इसे सबडोमेन के बजाय फायरवॉल नियमों की आवश्यकता होती है। Immich के लिए एक प्रॉक्सी सेटिंग महत्वपूर्ण है: अपलोड आकार सीमा बढ़ाएं, क्योंकि फोन के वीडियो बड़े होते हैं। Nginx में यह सर्वर ब्लॉक के अंदर client_max_body_size 50000M; है, डिफ़ॉल्ट 1 MB वीडियो अपलोड को 413 Request Entity Too Large के साथ अस्वीकार कर देता है। यदि आपकी प्रॉक्सी Let's Encrypt HTTP-01 चुनौतियों का भी उत्तर देती है, तो सुनिश्चित करें कि /.well-known/immich अभी भी Immich पर रूट किया गया है, न कि चैलेंज हैंडलर पर।

ऐप द्वारा लागू किया जाने वाला नियम: एंडपॉइंट ठीक उसी URL पर पहुंच योग्य होना चाहिए जिसे आप टाइप करते हैं। ऐप एक साधारण http://YOUR_SERVER_IP:2283 (इसका अपना लॉगिन संकेत http://your-server-ip:port है) स्वीकार करेगा, लेकिन इंटरनेट से गुजरने वाली किसी भी चीज़ को HTTPS होना चाहिए। गलत स्कीम, या पोर्ट हटाकर सीधे IP का उपयोग करना ही वह कारण है जिससे "the app cannot reach the server" जैसी त्रुटि आती है, जिसे नीचे एक नामित विफलता के रूप में कवर किया गया है।

चरण 7: External libraries बनाम uploads, मौजूदा फोटो ट्री को इम्पोर्ट करना

Immich में फोटो लाने के दो तरीके हैं, और दोनों एक समान नहीं हैं।

  • Uploads वे assets हैं जिनका स्वामित्व Immich के पास होता है। ऐप या वेब uploader फाइल को UPLOAD_LOCATION में कॉपी कर देता है। Immich इन्हें rename, move और delete कर सकता है।
  • External libraries उन फाइलों का read-only इम्पोर्ट हैं जो पहले से ही आपके सर्वर पर किसी फोल्डर में, पुराने Pictures ट्री में, या NAS एक्सपोर्ट में मौजूद हैं। Immich उन्हें वहीं index करता है और timeline में दिखाता है, लेकिन मूल फाइलों को कभी modify या delete नहीं करता है।

मौजूदा ट्री को इम्पोर्ट करने के लिए, इसे सर्वर कंटेनर में read-only मोड में mount करें। immich-server: के अंतर्गत docker-compose.yml को edit करें और एक 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 के साथ कंटेनर को recreate करें, फिर वेब UI में अपने avatar → Administration → External Libraries → Create Library पर जाएं, मालिक user को चुनें, Folders के अंतर्गत Add पर क्लिक करें, और host path /srv/photos के बजाय container path, /mnt/media/photos दर्ज करें। Scan पर क्लिक करें। कंटेनर path के बजाय host path का उपयोग करना external-library से जुड़ी सबसे आम गलती है; ऐसा करने पर scan को कुछ नहीं मिलता और वह शून्य assets की रिपोर्ट करता है।

चरण 8: Immich द्वारा अपेक्षित अपग्रेड अनुशासन

यह वह हिस्सा है जो एक सुचारू रूप से चलने वाले Immich और एक खराब हो चुके Immich के बीच अंतर करता है। Immich तेजी से नए संस्करण (releases) जारी करता है, और यह पुराने संस्करणों के लिए fixes backport नहीं करता और न ही downgrades का समर्थन करता है। फ्लोटिंग v3 टैग आधिकारिक तौर पर समर्थित तरीका है, और Immich का लक्ष्य breaking changes को केवल major versions तक सीमित रखना है। हालाँकि, जब भी आप pull करते हैं, यह आपको अपग्रेड कर देता है, चाहे आपने नोट्स पढ़े हों या नहीं। बिना योजना के किए गए अपग्रेड को रोल बैक नहीं किया जा सकता है। यही 'पिन करें, फिर नोट्स पढ़ें' वाली आदत सर्वर पर मौजूद हर लंबे समय तक चलने वाले कंटेनर के लिए अपनानी चाहिए। यही कारण है कि एक self-hosted KiroCrew agent को एक ज्ञात-अच्छे (known-good) टैग पर पिन किया जाता है, ताकि अगले रीस्टार्ट पर वह अपने आप न बदले। अनुशासन इस प्रकार है:

  1. एक संस्करण पिन करें। IMMICH_VERSION को v3.0.2 जैसे किसी ठोस टैग पर सेट रखें, न कि फ्लोटिंग v3 पर, जो हमेशा नवीनतम v3.x को खींचता है।
  2. अपग्रेड करने से पहले हर बार रिलीज नोट्स पढ़ें। इसमें breaking changes, विशेष रूप से डेटाबेस या vector-extension में बदलावों का उल्लेख होता है। v3.0 रिलीज इसका स्पष्ट उदाहरण है: इसने pgvecto.rs को पूरी तरह से हटा दिया था, इसलिए जो लोग पुरानी extension पर थे, उन्हें अपग्रेड करने से पहले VectorChord माइग्रेशन (v1.133 में पेश किया गया) पूरा करना पड़ा।
  3. पहले डेटाबेस का बैकअप लें (चरण 9)। यह हमेशा करें, लेकिन जब नोट्स में डेटाबेस का उल्लेख हो तो इसे दोगुना सुनिश्चित करें।
  4. नया compose file भी लें। IMMICH_VERSION केवल server और ML images को पिन करता है। Postgres image docker-compose.yml के अंदर digest द्वारा पिन की जाती है, इसलिए जिस संस्करण को नए डेटाबेस extension की आवश्यकता होती है, वह एक नई compose file के साथ आता है। दोनों रिलीज एसेट को फिर से डाउनलोड करें, अपने .env मानों को फिर से लागू करें, और फिर अपग्रेड करें।
  5. अपने मोबाइल क्लाइंट्स को पहले अपडेट करें। सर्वर केवल अपने मेल खाते major version के साथ संचार करता है, और ऐप आमतौर पर वर्तमान और पिछले major version के साथ संगत होता है। जब सर्वर ऐप से नया होता है, तो वर्तमान रिलीज (v3.3.1, 2026-10-10 को जाँचा गया) फोन पर App update is available की सूचना और Update बटन दिखाता है। Immich सर्वर से पहले सभी मोबाइल क्लाइंट्स को अपग्रेड करने की सलाह देता है।

एक बार जब आपके पास नई फाइलें आ जाएं, तो वास्तविक कमांड्स ये हैं:

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

चरण 9: बैकअप, डेटाबेस डंप और ओरिजिनल फाइल्स, और इनका परीक्षण

Immich का बैकअप दो चीजों से मिलकर बनता है, और एक के बिना दूसरा बेकार है। डेटाबेस में एल्बम संरचना, चेहरे, सर्च इंडेक्स और एसेट से फाइल का मैप होता है। ओरिजिनल डायरेक्टरी में वास्तविक फोटो होती हैं। एक को बिना दूसरे के रिस्टोर करने पर या तो आपको बिना किसी ऑर्गनाइजेशन के फोटो मिलेंगी या फिर एक खाली शेल जो गायब फाइलों की ओर इशारा करेगा। यह दो-भाग वाला ढांचा केवल Immich की विशेषता नहीं है: एक self-hosted Chatwoot सपोर्ट डेस्क को भी Postgres डंप और उसकी अपलोड डायरेक्टरी की इसी तरह की जोड़ी की आवश्यकता होती है, अन्यथा रिस्टोर किया गया इनबॉक्स बिना किसी अटैचमेंट के वापस आएगा। Postgres डेटा डायरेक्टरी को फाइल ट्री के रूप में कॉपी करना डंप स्टेप का शॉर्टकट लग सकता है, लेकिन यह एक उपयोगी बैकअप नहीं है। यह एक ऐसी गलती है जिसे पूर्ण Immich बैकअप और रिस्टोर वॉकथ्रू में समझाया गया है, जो आपको रिस्टोर के बाद खाली टाइमलाइन जैसी समस्या से बचाता है।

Postgres कंटेनर के अंदर से pg_dump का उपयोग करके डेटाबेस का डंप लें, विशेष रूप से 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 टाइमर, उसे विफल होने पर अलर्ट भेजने की आवश्यकता होती है। अपने स्वयं के ntfy पुश सर्वर की ओर इशारा करने वाली एक systemd OnFailure= यूनिट आपको उस रात फोन पर संदेश भेज देगी जिस रात डंप विफल होता है, बजाय इसके कि आप रिस्टोर के दौरान इसे खोजें। पहले डेटाबेस का बैकअप लें और फिर फाइलों का, ताकि डंप कभी भी ऐसी फोटो का संदर्भ न दे जिसे फाइल बैकअप ने अभी तक कॉपी नहीं किया है। एक्सटर्नल लाइब्रेरी का बैकअप उनके वास्तविक स्रोत पर अलग से लें; Immich उनका मालिक नहीं है।

अब वह हिस्सा जिसे हर कोई छोड़ देता है: रिस्टोर का परीक्षण करें। रिस्टोर को एक ऐसे फ्रेश स्टैक पर चलना चाहिए जिसका सर्वर कभी शुरू न हुआ हो, और एक ऐसे Postgres इमेज पर जिसका वेक्टर एक्सटेंशन डंप के साथ संगत हो, यही कारण है कि आप कभी भी DB इमेज टैग के साथ प्रयोग न करें। उसी 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

VectorChord डेटाबेस पर search_path का sed रीराइट वैकल्पिक नहीं है, इसे छोड़ने पर रिस्टोर बीच में ही रुक जाएगा। जब स्टैक आपके ओरिजिनल फाइल्स के साथ वापस आ जाए, तो वेब UI खोलें: यदि आपकी फोटो और एल्बम वहां मौजूद हैं, तो आपका बैकअप काम कर रहा है। यदि आपने इसे कभी नहीं चलाया है, तो आपके पास बैकअप नहीं है, केवल एक उम्मीद है।

विफलता के प्रकार और दिखाई देने वाले संदेश

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)। इसके बाद सर्च और फेस जॉब्स रुक जाते हैं। इसका कारण मॉडल्स के लिए RAM की कमी है। समाधान, क्रमवार: swap जोड़ें (Step 1); VPS को अधिक RAM दें; या, यदि आप ऐसा बिल्कुल नहीं कर सकते, तो Administration → Settings → Machine Learning Settings में जाएँ और टॉप-लेवल मशीन लर्निंग टॉगल को बंद कर दें, जो एक साथ सभी ML फीचर्स को डिसेबल कर देता है। केवल Smart Search और Facial Recognition को बंद करना पर्याप्त नहीं है, क्योंकि OCR और अन्य मॉडल प्रकार डिफ़ॉल्ट रूप से इनेबल रहते हैं। आप बैकअप और एल्बम सुरक्षित रखते हैं, लेकिन कंटेंट-आधारित सर्च खो देते हैं। compose फ़ाइल से immich-machine-learning सर्विस को हटाने का भी यही परिणाम होता है।

अपग्रेड के बाद Immich सर्वर का स्टार्ट न होना। Postgres container ठीक से चल रहा हो सकता है; यह immich_server है जो स्टार्टअप पर वेक्टर एक्सटेंशन वर्ज़न की जाँच करता है और स्टार्ट होने से मना कर देता है, और इसका लॉग 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 फ़ाइल लें जो आपके डेटाबेस से मेल खाती है, डाउनग्रेड न करें, और केवल एक संगत इमेज पर ही रिस्टोर करें।

मोबाइल ऐप का सर्वर तक न पहुँच पाना। URL डालने के बाद लॉगिन स्क्रीन पर Could not connect to server जैसा कनेक्शन एरर दिखाई देता है। सामान्य कारण: आपने http:// टाइप किया जहाँ प्रॉक्सी केवल https:// सर्व करता है; आपने सीधे बैकएंड से कनेक्ट किया लेकिन पोर्ट छोड़ दिया, इसलिए इसने example.com:2283 के बजाय example.com (port 443) का प्रयास किया; रिवर्स प्रॉक्सी /api को फॉरवर्ड नहीं कर रहा है; या कोई प्रॉक्सी जो Let's Encrypt HTTP-01 चुनौतियों को संभालता है, वह /.well-known/immich को Immich के अलावा कहीं और रूट कर रहा है। पूरा https://photos.example.com URL दर्ज करके और पहले फोन ब्राउज़र में इसके लोड होने की पुष्टि करके इसे ठीक करें। यदि ब्राउज़र काम करता है और ऐप नहीं, तो प्रॉक्सी पाथ को हटा रहा है या /.well-known/immich को गलत रूट कर रहा है, या सर्टिफिकेट self-signed है, जिसे ऐप हैंडशेक एरर के साथ रिजेक्ट कर देता है जब तक कि आप इसकी सेटिंग्स में self-signed सर्टिफिकेट सपोर्ट इनेबल न करें।

इंपोर्ट के दौरान डिस्क का भर जाना। अपलोड फेल होने लगते हैं, थंबनेल खाली हो जाते हैं, और लॉग 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 और disk की आवश्यकता होती है?

Immich की आधिकारिक आवश्यकता कम से कम 6 GB RAM है और 8 GB की अनुशंसा की जाती है। एक छोटी लाइब्रेरी के लिए 4 GB RAM और swap का उपयोग करना व्यावहारिक न्यूनतम स्तर है। किसी भी स्थिति में swap कॉन्फ़िगर करें, क्योंकि machine-learning container में अचानक लोड बढ़ सकता है। डिस्क के लिए, अपनी पूरी लाइब्रेरी के आकार का बजट रखें और उसमें थंबनेल और प्रीव्यू के लिए लगभग 10–20% अतिरिक्त स्थान जोड़ें। इसे हमेशा local storage पर रखें; Postgres डेटा डायरेक्टरी को कभी भी network share पर न रखें। यदि आप अभी भी यह तय कर रहे हैं कि और क्या रन करना है, तो 2026 में क्या self-host करें, इसकी गाइड में अन्य सेवाओं के साथ Immich के footprint की तुलना दी गई है।

क्या मैं बिना GPU के Immich चला सकता हूँ?

हाँ। Machine-learning container CPU पर आसानी से चलता है। GPU केवल smart-search इंडेक्सिंग की गति बढ़ाता है और सही image variant के साथ वीडियो ट्रांसकोडिंग में मदद करता है। CPU पर, एक बड़ी लाइब्रेरी की शुरुआती इंडेक्सिंग में बैकग्राउंड में घंटों लग सकते हैं, लेकिन यह बैकअप या ब्राउज़िंग को नहीं रोकता है। यदि आपका सिस्टम ML के लिए बहुत छोटा है, तो आप admin settings में टॉप-लेवल टॉगल के साथ machine learning को पूरी तरह से बंद कर सकते हैं और बाकी सब कुछ इस्तेमाल कर सकते हैं।

मैं Immich को सुरक्षित रूप से अपग्रेड कैसे करूँ?

IMMICH_VERSION को v3.0.2 जैसे किसी निश्चित tag पर पिन करें, हर अपग्रेड से पहले release notes पढ़ें, और सबसे पहले डेटाबेस का बैकअप लें। चूंकि Postgres इमेज IMMICH_VERSION के बजाय docker-compose.yml के अंदर पिन की गई है, इसलिए अपने टारगेट रिलीज़ से compose फाइल और example.env दोनों को फिर से डाउनलोड करें और अपने values को फिर से लागू करें, फिर docker compose pull && docker compose up -d चलाएँ। वर्जन को कभी भी बिना निगरानी के न छोड़ें। Immich डाउनग्रेड को सपोर्ट नहीं करता है, इसलिए बिना पढ़े किया गया अपग्रेड वापस नहीं लिया जा सकता।

मुझे वास्तव में किसका बैकअप लेना चाहिए?

दो चीजों का, एक साथ: immich डेटाबेस का एक pg_dump और पूरी UPLOAD_LOCATION ओरिजिनल डायरेक्टरी। डेटाबेस में एल्बम, चेहरे और एसेट-टू-फाइल मैपिंग होती है; डायरेक्टरी में वास्तविक फोटो होती हैं। रिस्टोर के लिए दोनों की आवश्यकता होती है, साथ ही एक compatible vector extension वाली डेटाबेस इमेज की भी। पहले डेटाबेस डंप करें और फिर फाइल कॉपी करें। रिस्टोर का परीक्षण कम से कम एक बार किसी अलग मशीन पर जरूर करें; बिना परीक्षण किया गया बैकअप, बैकअप नहीं माना जाता।

मैं अपने मौजूदा फोटो फोल्डर को कैसे इम्पोर्ट करूँ?

फोल्डर को read-only मोड में immich-server कंटेनर में एक अतिरिक्त वॉल्यूम (उदाहरण के लिए - /srv/photos:/mnt/media/photos:ro) के रूप में माउंट करें। कंटेनर को फिर से बनाएँ, फिर Administration → External Libraries में जाकर एक लाइब्रेरी बनाएँ और container पाथ /mnt/media/photos जोड़ें। Immich फाइलों को वहीं इंडेक्स करता है और उन्हें कभी भी मॉडिफाई या डिलीट नहीं करता है। सबसे आम गलती होस्ट पाथ को डालना है, जबकि कंटेनर पाथ डालना चाहिए, जिससे स्कैन में कुछ भी नहीं मिलता।