SSD Nodes Learn
गाइड Matt Connorलेखक: Matt Connor · अपडेट किया गया: 2026-07-24

Immich self-hosting guide aur RAM requirements

Immich v3 mein pgvecto.rs database ki samasya aur 6 GB RAM ki zaroorat ko samjhein. Port 2283 aur exit 137 memory kill se bachne ke liye ye guide padhein.

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

Immich एक self-hosted photo और video backup service है — यह Google Photos का एक वास्तविक विकल्प है। इसमें एक phone app है जो background में आपके camera roll को upload करता है। इसमें timeline, albums, face recognition और machine-learning search की सुविधा है, जिससे आप बिना किसी tag के "beach" या किसी व्यक्ति को खोज सकते हैं। आप इसे अपने स्वयं के VPS पर चलाते हैं, original files आपके disk पर रहती हैं, और कोई भी उन्हें scan करके आपको सामान नहीं बेचता।

इसका installation project की Docker Compose file से चार containers का उपयोग करके होता है। इस प्रक्रिया में दस मिनट लगते हैं। इस guide का बाकी हिस्सा सबसे कठिन है: machine-learning container छोटे server पर बहुत अधिक memory लेता है, original files disk को जल्दी भर देती हैं, mobile app plain-HTTP server को स्वीकार नहीं करता है, और Immich में अक्सर breaking changes आते हैं जिससे एक लापरवाह docker compose pull आपके database को start होने से रोक सकता है। यदि आप इन चार बातों का ध्यान रखते हैं, तो Immich पूरी तरह से stable है। यदि आप इन्हें अनदेखा करते हैं, तो आपका पूरा weekend बर्बाद हो सकता है।

Prerequisites, aur sambhavit samasyaein

  • RAM: official docs ke anusar kam se kam 6 GB aur 8 GB recommended hai — 4 GB plus swap ko minimum limit maanein. immich-server aur Postgres containers kam memory lete hain. immich-machine-learning container sabse zyada memory leta hai — search indexes banane ke liye yeh CLIP aur face-recognition models ko RAM mein load karta hai, aur 2 GB wale system par kernel ise kill kar deta hai. Agar aapke paas 4 GB RAM hai, tab bhi swap zaroor add karein.
  • Disk: apni poori library ke size se thoda zyada space rakhein. Aapki original files poori tarah copy hoti hain, aur Immich thumbnails aur preview images bhi generate karta hai (lagbhag 10–20% extra space). 200 GB photo collection ke liye 300 GB volume ki zaroorat hogi. Iske muqable Postgres ka size bahut chota hai.
  • CPU: koi bhi modern KVM VPS kaafi hai, lekin CPU par ML slow hota hai. Bade import ka smart-search indexing background mein kai ghanton tak chal sakta hai. Yeh normal hai; iske liye GPU ki zaroorat nahi hai.
  • Ek domain name jo VPS par point kiya gaya ho. Mobile app ke liye HTTPS endpoint behtar hai, isliye aapko ek reverse proxy ki zaroorat hogi. Yeh setup Docker, TLS aur backups ke saath self-hosted Nextcloud instance jaisa hi hai — Immich, us files server ka photos wala hissa hai.
  • Docker aur Compose plugin installed hona chahiye — Docker Engine ke saath Docker ke apne apt repository se Compose v2 plugin, jaisa ki hamare Docker Compose basics guide mein bataya gaya hai.

Step 1: Sabse pehle swap add karein

Chhote VPS par Immich fail hone ka sabse bada karan ML container ka OOM-killed hona hai. Kernel ko thodi extra memory space dein.

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 ab Swap: line 4.0Gi dikhana chahiye. Isse ML ki speed nahi badhegi, lekin 4 GB machine par indexing ke dauran container crash hone se bach jayega.

Step 2: Official compose और env प्राप्त करें — अपनी प्रतिलिपि के बजाय उनके द्वारा प्रदान किए गए फ़ाइलों का उपयोग करें

Immich अपनी फ़ाइलों के भीतर service versions और महत्वपूर्ण रूप से, database image को निश्चित (pin) करता है। किसी ब्लॉग (इस ब्लॉग सहित) से compose file को अपने source of truth के रूप में उपयोग न करें। 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 से आते हैं, इसलिए image references मेल खाते हैं। compose file चार services को परिभाषित करती है। किसी भी चीज़ को बदलने से पहले प्रत्येक के बारे में जानना सहायक होगा:

  • immich-server (ghcr.io/immich-app/immich-server, container immich_server) — API और web UI, जो port 2283 पर listen करता है। यह आपके uploads को /data पर mount करता है।
  • immich-machine-learning (ghcr.io/immich-app/immich-machine-learning, container immich_machine_learning) — CLIP search और face recognition। यह डाउनलोड किए गए models को model-cache volume में cache करता है। यह सबसे अधिक memory का उपयोग करता है।
  • database (container immich_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 को कभी भी मैन्युअल रूप से edit न करें।
  • redis (container immich_redis) — job queues के लिए एक Valkey/Redis instance।

Step 3: .env को कॉन्फ़िगर करें — जहाँ आपकी photos और 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 जोड़ते हैं, तो इसे शुरुआत से ही उसके mount path पर सेट कर दें, क्योंकि बाद में इसे बदलने का मतलब है thumbnails को मूव करना और asset paths को अपडेट करना। और DB_DATA_LOCATION local disk पर होना चाहिए: Postgres, NFS या SMB share पर corrupt हो जाता है, और docs में इसे स्पष्ट रूप से बताया गया है। यदि आप DB_PASSWORD में केवल letters और digits का उपयोग करते हैं, तो आप connection-string escaping bugs की एक श्रेणी से बच सकते हैं।

Step 4: First run and creating the admin user

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 pull करेगा, इसलिए इसे समय दें। sudo docker compose logs -f immich-server के साथ progress देखें; तैयार होने पर server logs में दिखेगा कि यह port 2283 पर listening है। अब browser में http://YOUR_SERVER_IP:2283 खोलें। पहली बार visit करने पर Getting Started wizard दिखाई देगा — आपके द्वारा बनाया गया पहला account admin होगा। एक strong password सेट करें; इस account के पास server settings, user management और वह ML configuration होगा जिसकी आपको बाद में आवश्यकता होगी।

Step 5: Mobile app aur background backup

App Store ya Play Store se "Immich" install karein. Login screen par aapko Server Endpoint URL enter karna hoga. Scheme ke saath pura URL enter karein, jaise ki https://photos.example.com (app apne aap /api add kar dega). Apne naye account se login karein, phir app ki Backup screen kholein, jin albums ko protect karna hai unhe select karein (aam taur par Camera aur Screenshots), aur Background backup enable karein. iOS mein background backup OS dwara throttle kiya jata hai — foreground uploads hamesha chalte hain, lekin background uploads tabhi hote hain jab OS ijazat deta hai.

Log aksar isi step par atak jaate hain, isliye app ke saath struggle karne se pehle Step 6 zaroor padhein.

Step 6: Reverse proxy के माध्यम से HTTPS — और full-URL नियम

Mobile app के लिए HTTPS अनिवार्य है। Port 2283 के आगे एक reverse proxy लगाएँ और TLS वहीं terminate करें। यदि आप पहले से ही कई containers चला रहे हैं, तो Traefik with automatic TLS for multiple Docker apps सबसे व्यवस्थित विकल्प है — एक label block photos.example.com को immich-server container तक route करता है और आपके लिए certificate प्राप्त कर लेता है। यदि आप nginx पसंद करते हैं, तो Let's Encrypt with Certbot and nginx guide आपको certificate और proxy_pass http://127.0.0.1:2283; block प्रदान करता है। Immich के लिए एक proxy setting महत्वपूर्ण है: upload size limit बढ़ाएँ, क्योंकि phone videos बड़े होते हैं। nginx में यह server block के अंदर client_max_body_size 50000M; है — default 1 MB होने पर 413 Request Entity Too Large के साथ video uploads reject हो जाते हैं।

App द्वारा लागू किया गया नियम: endpoint तक पहुँचा जा सकना चाहिए और व्यावहारिक रूप से, वह HTTPS होना चाहिए। http:// endpoints, या बिना port के direct IP, "the app cannot reach the server" त्रुटि का कारण बनते हैं — जिसे नीचे एक named failure के रूप में समझाया गया है।

Step 7: External libraries vs uploads — importing an existing photo tree

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

  • Uploads वे assets हैं जिनका मालिकाना हक Immich के पास है। App या web uploader file को UPLOAD_LOCATION में copy कर देता है। Immich इन्हें rename, move या delete कर सकता है।
  • External libraries आपके server के किसी folder में पहले से मौजूद files का read-only import है — जैसे कि कोई पुराना Pictures tree या NAS export। Immich इन्हें उसी स्थान पर index करता है और timeline में दिखाता है, लेकिन यह originals को कभी modify या delete नहीं करता।

मौजूदा tree को import करने के लिए, उसे server container में 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 originals को कभी touch नहीं कर पाएगा। sudo docker compose up -d के साथ container को recreate करें, फिर web UI में अपने avatar → Administration → External Libraries → Create Library पर जाएँ, owning user चुनें, Folders के नीचे Add पर click करें, और container path दर्ज करें — /mnt/media/photos, host path /srv/photos नहीं। Scan पर click करें। Container path के बजाय host path का उपयोग करना external-library से जुड़ी सबसे बड़ी गलती है; इससे scan को कुछ नहीं मिलता और zero assets report होते हैं।

Step 8: Immich के लिए आवश्यक upgrade discipline

यही वह हिस्सा है जो एक सही Immich setup को खराब होने से बचाता है। Immich बहुत तेज़ी से अपडेट जारी करता है और यह पुराने versions के लिए fixes या downgrades का समर्थन नहीं करता है। यदि आप बिना सोचे-समझे floating v3 tag का उपयोग करते रहेंगे, तो आपका database खराब हो जाएगा। इसके लिए यह discipline अपनाएं:

  1. एक version pin करें। IMMICH_VERSION को हमेशा v3.0.2 जैसे किसी निश्चित tag पर सेट रखें, न कि floating v3 पर जो हमेशा नवीनतम v3.x को pull करता है।
  2. हर बार upgrade करने से पहले release notes ज़रूर पढ़ें। Breaking changes — विशेष रूप से database या vector-extension से जुड़े बदलाव — वहीं बताए जाते हैं। v3.0 release इसका एक उदाहरण है: इसने pgvecto.rs को पूरी तरह से हटा दिया था, इसलिए पुराने extension वाले users को upgrade करने से पहले VectorChord migration (जो v1.133 में आया था) पूरा करना आवश्यक था।
  3. सबसे पहले database का backup लें (Step 9)। यह हमेशा करें, और विशेष रूप से तब जब release notes में database का ज़िक्र हो।
  4. नया compose file भी डाउनलोड करें। IMMICH_VERSION केवल server और ML images को pin करता है। Postgres image को docker-compose.yml के अंदर digest द्वारा pin किया जाता है, इसलिए यदि किसी version को नए database extension की आवश्यकता है, तो वह एक नया compose file भी प्रदान करता है। दोनों release assets को फिर से download करें, अपने .env values को फिर से apply करें, और फिर upgrade करें।
  5. अपने mobile clients को भी उसी समय update करें। Server केवल अपने matching major version के साथ ही communicate करता है, और app केवल current और पिछले major version का समर्थन करती है। यदि server app से आगे निकल जाता है, तो phone पर Your app major version is not compatible with the server! दिखाई देगा, इसलिए app को पहले update करना सबसे सुरक्षित है।

जब आपके पास नई files आ जाएं, तो ये commands चलाएं:

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

Step 9: Backups — एक database dump PLUS originals, और इसे test करें

Immich का backup दो चीजों से मिलकर बनता है, और एक के बिना दूसरा बेकार है। database में album structure, faces, search indexes और asset से file का map होता है। originals directory में वास्तविक photos होते हैं। यदि आप एक को दूसरे के बिना restore करते हैं, तो आपको या तो बिना organisation वाली photos मिलेंगी या missing files की ओर इशारा करने वाला एक खाली shell मिलेगा।

Postgres container के अंदर से pg_dump का उपयोग करके database dump करें — विशेष रूप से immich database का, न कि पूरे 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 का backup लें — पूरा /opt/immich/library tree, और विशेष रूप से इसके library/, upload/ और profile/ subfolders — restic, rsync या borg का उपयोग करके किसी अन्य machine या object storage में। पहले database का backup लें और उसके बाद files का, ताकि dump कभी भी ऐसी photo को reference न करे जिसे file backup ने अभी तक copy नहीं किया है। External libraries का backup उनके वास्तविक source पर अलग से लें; Immich उनका owner नहीं है।

अब वह हिस्सा जिसे हर कोई skip कर देता है: restore को test करें। Restore को एक fresh stack पर चलाना चाहिए जिसका server पहले कभी start न हुआ हो, और एक ऐसे Postgres image पर जिसका vector extension dump के साथ compatible हो — यही कारण है कि आपको DB image tag के साथ कभी improvisation नहीं करना चाहिए। एक scratch box पर जिसमें समान compose और .env हो, पुराने 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 -d

VectorChord database पर search_path का sed rewrite अनिवार्य है — यदि आप इसे छोड़ देते हैं, तो restore बीच में ही abort हो जाएगा। जब stack आपकी originals के साथ वापस आ जाए, तो web UI खोलें: यदि आपकी photos और albums वहां मौजूद हैं, तो आपका backup काम कर रहा है। यदि आपने इसे कभी run नहीं किया है, तो आपके पास backup नहीं है — आपके पास केवल एक hope है।

Failure modes, with the strings you will see

The ML container is 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 में जाकर Smart Search और Facial Recognition को बंद करके ML को disable करें — आपके backups और albums सुरक्षित रहेंगे, लेकिन search-by-content काम नहीं करेगा। compose file से immich-machine-learning service को हटाने का भी यही परिणाम होता है।

Postgres refuses to start after an upgrade. server 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 आपके upgraded data से पुराना है। ऐसा अक्सर image tag को मैन्युअल रूप से edit करने या पुराने image पर नया dump restore करने से होता है। समाधान यह है कि मेल खाने वाला Postgres image उपयोग करें — अपने database से मेल खाने वाली release की compose file लें, downgrade न करें, और केवल एक compatible image पर ही restore करें।

The mobile app cannot reach the server. URL डालने के बाद login screen पर connection error / Server is not reachable दिखाई देता है। इसके तीन कारण हैं: आपने http:// टाइप किया है जबकि proxy केवल https:// serve करता है; आपने सीधे backend से connect किया लेकिन port नहीं लिखा, जिससे इसने example.com:2283 के बजाय example.com (port 443) try किया; या reverse proxy, /api को forward नहीं कर रहा है। समाधान के लिए पूरा https://photos.example.com URL दर्ज करें और पहले फोन के browser में इसे चलाकर देखें। यदि browser काम करता है लेकिन app नहीं, तो proxy path को strip कर रहा है या certificate self-signed है — app untrusted certs को reject कर देता है।

Out of disk mid-import. 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 को उसमें move करें, .env को update करें, और फिर से शुरू करें — या यदि आपका provider अनुमति देता है तो existing disk को expand करें। यदि disk भर जाता है तो Postgres अटक सकता है, इसलिए corruption मानने से पहले space clear करें और database container को restart करें।

FAQ

Immich के लिए कितनी RAM और disk की आवश्यकता है?

Immich की आधिकारिक आवश्यकताएँ न्यूनतम 6 GB RAM और अनुशंसित 8 GB हैं — एक छोटे library के लिए swap के साथ 4 GB एक व्यावहारिक सीमा है। swap को configure करना आवश्यक है क्योंकि machine-learning container में resource usage बढ़ जाता है। Disk के लिए, अपने full library size के साथ लगभग 10–20% अतिरिक्त space local storage पर रखें — Postgres data directory को कभी भी network share पर न रखें। यदि आप अन्य services के बारे में निर्णय ले रहे हैं, तो 2026 में क्या self-host करें उसका guide में Immich के footprint की तुलना अन्य services से की गई है।

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

हाँ। Machine-learning container CPU पर सुचारू रूप से चलता है — GPU केवल smart-search indexing और सही image variant के साथ video transcoding की गति बढ़ाता है। CPU पर, एक बड़ी library का initial index background में घंटों ले सकता है, लेकिन यह backups या browsing को नहीं रोकता है। यदि आपका system ML के लिए बहुत छोटा है, तो आप admin settings में Smart Search और Facial Recognition को disable कर सकते हैं और बाकी सब चालू रख सकते हैं।

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

IMMICH_VERSION को v3.0.2 जैसे किसी निश्चित tag पर pin करें, प्रत्येक upgrade से पहले release notes पढ़ें, और सबसे पहले database का backup लें। क्योंकि docker-compose.yml के अंदर Postgres image को IMMICH_VERSION के बजाय pin किया गया है, इसलिए अपने target release से compose file और example.env दोनों को फिर से download करें और अपने values को फिर से apply करें, फिर docker compose pull && docker compose up -d चलाएँ। version को बिना किसी नियंत्रण के न छोड़ें — Immich में breaking changes आते हैं और यह downgrades को support नहीं करता है।

मुझे वास्तव में क्या 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 करें और उसके बाद file copy करें, और कम से कम एक बार किसी scratch box पर restore को test करें — बिना test किया गया backup, backup नहीं है।

मैं अपने existing photo folder को import कैसे करूँ?

Folder को immich-server container में एक extra volume (उदाहरण के लिए - /srv/photos:/mnt/media/photos:ro) के रूप में read-only mount करें, container को recreate करें, फिर Administration → External Libraries में एक library बनाएँ और container path /mnt/media/photos जोड़ें। Immich files को उसी स्थान पर index करता है और उन्हें कभी modify या delete नहीं करता है। सबसे सामान्य गलती container path के बजाय host path दर्ज करना है, जिससे scan को कुछ भी नहीं मिलता है।