Immich চালাতে কত RAM লাগে এবং নিরাপদে upgrade করবেন কীভাবে
Immich-এর বাস্তব RAM চাহিদা, HTTPS-এর পেছনে port 2283, exit 137 memory kill এবং pgvecto.rs database-এ Immich v3 কেন চালু হবে না, restore ধাপসহ।
আপনি যা তৈরি করছেন
Immich হলো self-hosted photo ও video backup service, যা Google Photos-এর প্রকৃত বিকল্প। এতে একটি phone app আছে, যা background-এ আপনার camera roll upload করে। এছাড়া timeline, album, face recognition এবং machine-learning search আছে। কোনো কিছু tag না করেও এটি "beach" বা কোনো ব্যক্তির ছবি খুঁজে দিতে পারে। আপনি এটি নিজের মালিকানাধীন VPS-এ চালান। Original file আপনার disk-এই থাকে। কেউ সেগুলো scan করে আপনাকে কিছু বিক্রি করার চেষ্টা করে না। আপনি যদি এখনও অন্য সুস্পষ্ট বিকল্পটির সঙ্গে এটি তুলনা করে দেখেন, আমাদের PhotoPrism ও Immich তুলনা-এ তাদের RAM-এর ন্যূনতম প্রয়োজনীয়তা, phone app এবং backup command পাশাপাশি দেখানো হয়েছে।
Install প্রক্রিয়ায় project-এর নিজস্ব Docker Compose file থেকে চারটি container চালু করা হয়। এই অংশে দশ মিনিট লাগে। এই guide-এর বাকি অংশেই মূল সমস্যা: ছোট machine-এ machine-learning container-এর অনেক memory লাগে, original file দ্রুত disk ভরে ফেলে, mobile app-এর জন্য সঠিক server URL প্রয়োজন, এবং এটি আপনার network-এর বাইরে ব্যবহারের আগে সামনে HTTPS রাখতে হবে। তাছাড়া Immich এত ঘন ঘন breaking change প্রকাশ করে যে অসতর্ক docker compose pull আপনার server start হওয়া বন্ধ করে দিতে পারে। এই চারটি বিষয় গুরুত্বসহকারে সামলালে Immich অত্যন্ত নির্ভরযোগ্য। এগুলো উপেক্ষা করলে আপনার পুরো weekend নষ্ট হতে পারে।
Prerequisites এবং গুরুত্বপূর্ণ সীমাবদ্ধতা
- RAM: অফিসিয়াল ডকুমেন্টেশনে minimum 6 GB এবং recommended 8 GB বলা হয়েছে; 4 GB RAM এবং swap-কে absolute floor হিসেবে ধরুন।
immich-serverএবং Postgres container-এর resource usage কম।immich-machine-learningcontainer-টি বেশি RAM ব্যবহার করে। এটি RAM-এ CLIP এবং face-recognition model load করে search index তৈরি করে। 2 GB-এর server-এ kernel এটিকে বন্ধ করে দেয়। আপনার 4 GB RAM থাকলেও swap যোগ করুন। - Disk: পুরো library এবং অতিরিক্ত ব্যবহারের জন্য পর্যাপ্ত capacity রাখুন। আপনার original file-গুলো সম্পূর্ণভাবে copy হয়। Immich thumbnail এবং preview image-ও তৈরি করে। এগুলোর জন্য সাধারণত অতিরিক্ত 10–20% storage লাগে। 200 GB-এর photo collection-এর জন্য 300 GB volume রাখুন। এর তুলনায় Postgres-এর storage usage কম।
- CPU: যেকোনো আধুনিক KVM VPS যথেষ্ট, তবে CPU-তে ML ধীরগতির। বড় import-এর smart-search indexing background-এ কয়েক ঘণ্টা চলতে পারে। এটি স্বাভাবিক। এর জন্য GPU প্রয়োজন হয় না।
- VPS-এর দিকে নির্দেশ করা একটি domain name। Mobile app HTTPS endpoint ব্যবহার করতে বেশি পছন্দ করে। এছাড়া সামনে একটি reverse proxy রাখা উচিত। এটি Docker, TLS এবং backup-সহ self-hosted Nextcloud instance-এর মতো একই ধরনের setup। Immich হলো সেই file server-এর photo counterpart।
- Docker এবং Compose plugin ইনস্টল করা থাকতে হবে। Docker-এর নিজস্ব apt repository থেকে Docker Engine এবং Compose v2 plugin ইনস্টল করুন। প্রক্রিয়াটি আমাদের Docker Compose basics guide-এ ঠিকভাবে দেখানো হয়েছে।
ধাপ 1: অন্য কিছু করার আগে swap যোগ করুন
ছোট VPS-এ Immich ব্যর্থ হওয়ার সবচেয়ে সাধারণ কারণ হলো ML container-টি OOM-killed হওয়া। প্রথমে kernel-কে অতিরিক্ত কাজের জন্য কিছু swap দিন।
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 দ্রুত হবে না। এটি নিশ্চয়তা নয়, বরং একটি buffer। তবে 4 GB মেশিনে index তৈরির মাঝপথে container বন্ধ হয়ে যাওয়ার সম্ভাবনা অনেক কমে।
ধাপ 2: অফিসিয়াল compose ও env সংগ্রহ করুন; কপি নয়, অফিসিয়াল ফাইল ব্যবহার করুন
Immich তার সরবরাহ করা ফাইলের মধ্যেই service version এবং বিশেষভাবে database image নির্দিষ্ট করে। কোনো blog থেকে, এমনকি এই blog থেকেও, compose file কপি করে সেটিকে নির্ভরযোগ্য উৎস হিসেবে ব্যবহার করবেন না। release asset 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 reference-গুলো সঠিকভাবে মিলে যায়। compose file-এ চারটি service নির্ধারিত আছে। কোনো পরিবর্তন করার আগে প্রতিটির ভূমিকা জানা সহায়ক:
immich-server(ghcr.io/immich-app/immich-server, containerimmich_server), API ও web UI; এটি port2283-এ listen করে। এটি আপনার upload-গুলো/data-এ mount করে।immich-machine-learning(ghcr.io/immich-app/immich-machine-learning, containerimmich_machine_learning), CLIP search ও face recognition-এর জন্য ব্যবহৃত হয়। এটি download করা model-গুলোmodel-cachevolume-এ cache করে। এই service-টির memory চাহিদা সবচেয়ে বেশি।database(containerimmich_postgres), VectorChord vector extension-সহ Postgres; এটিই similarity search চালায়। compose file-এ image tag সরাসরি digest দিয়ে নির্দিষ্ট করা আছে, যেমনghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:...। পুরোনো setup-এpgvecto.rsব্যবহার করা হতো; Immich v3.0-এ এর support সরিয়ে দেওয়া হয়েছে। তাই বর্তমানে install করা সব setup-এ VectorChord থাকবে। এই tag কখনো হাতে পরিবর্তন করবেন না।redis(containerimmich_redis), job queue-এর জন্য একটি 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-এর path দেওয়া উচিত। পরে data volume সংযুক্ত করলে শুরু থেকেই এখানে তার mount path সেট করুন, কারণ পরে এটি সরাতে হলে thumbnail সরাতে হবে এবং asset path আপডেট করতে হবে। DB_DATA_LOCATION অবশ্যই local disk-এ থাকতে হবে: NFS বা SMB share-এ Postgres রাখলে data corrupt হয়, এবং documentation-এ এটি স্পষ্টভাবে বলা আছে। DB_PASSWORD-এ শুধু অক্ষর ও সংখ্যা ব্যবহার করলে connection string escape-সংক্রান্ত একধরনের bug এড়ানো যায়।
ধাপ 4: প্রথমবার চালু করা এবং admin user তৈরি
cd /opt/immich
sudo docker compose up -d
sudo docker compose psসঠিক ফলাফলে চারটি container থাকবে। সবগুলো running এবং শেষ পর্যন্ত healthy অবস্থায় থাকবে:
NAME STATUS
immich_machine_learning Up (healthy)
immich_postgres Up (healthy)
immich_redis Up (healthy)
immich_server Up (healthy)প্রথম up-এ কয়েক GB image download হয়, তাই কিছু সময় দিন। sudo docker compose logs -f immich-server দিয়ে অগ্রগতি দেখুন। প্রস্তুত হলে server লগে এটি port 2283-এ listening করছে বলে দেখাবে। এখন browser-এ http://YOUR_SERVER_IP:2283 খুলুন। প্রথমবার গেলে Getting Started wizard দেখা যাবে। আপনি যে প্রথম account তৈরি করবেন, সেটিই admin হবে। শক্তিশালী password সেট করুন। এই account-এর মাধ্যমে server settings, user management এবং পরে প্রয়োজনীয় ML configuration পরিচালনা করা হয়।
ধাপ 5: মোবাইল অ্যাপ এবং background backup
App Store বা Play Store থেকে "Immich" ইনস্টল করুন। Login screen-এ Server Endpoint URL চাওয়া হবে। Scheme-সহ সম্পূর্ণ URL লিখুন, যেমন https://photos.example.com (অ্যাপ নিজেই /api যোগ করে)। আপনি যে account তৈরি করেছেন, সেটি দিয়ে login করুন। এরপর অ্যাপের Backup screen খুলে যে album-গুলো সুরক্ষিত রাখতে চান সেগুলো নির্বাচন করুন (সাধারণত Camera এবং Screenshots), তারপর Background backup চালু করুন। iOS background backup-এর গতি OS নিয়ন্ত্রণ করে কমিয়ে দিতে পারে। Foreground upload সবসময় চলে। Background upload OS অনুমতি দিলে চলে।
এই ধাপেই সাধারণত ব্যবহারকারীরা আটকে যান। তাই অ্যাপ নিয়ে সমস্যায় পড়ার আগে ধাপ 6 পড়ুন।
ধাপ 6: reverse proxy ব্যবহার করে HTTPS এবং সম্পূর্ণ URL-এর নিয়ম
আপনার home network-এর বাইরে গেলে mobile app-এর HTTPS প্রয়োজন। 2283 port-এর সামনে একটি reverse proxy বসান এবং সেখানেই TLS termination করুন। আপনি যদি ইতিমধ্যে একাধিক container চালান, তাহলে একাধিক Docker app-এর জন্য automatic TLS-সহ Traefik সবচেয়ে গোছানো বিকল্প। একটি label block-ই photos.example.com-কে immich-server container-এ route করে এবং আপনার জন্য certificate সংগ্রহ করে। nginx পছন্দ করলে Certbot এবং nginx দিয়ে Let's Encrypt guide অনুসরণ করে certificate এবং একটি proxy_pass http://127.0.0.1:2283; block তৈরি করতে পারবেন। এই proxy তৈরি হয়ে গেলে পরের service যোগ করার কাজ মূলত একটি নতুন subdomain তৈরিতে সীমাবদ্ধ থাকে। এভাবেই Jellyfin-এর জন্য 90s video store skin Halcyon একই server-এ Immich-এর পাশে চলতে পারে। একটি self-hosted HarnessRouter-এর মাধ্যমে Codex এবং Claude Code-কে একটি API-এর পেছনে রাখা-র ক্ষেত্রেও একই বিষয় প্রযোজ্য। এটি ইচ্ছাকৃতভাবে loopback-এ bind করে এবং সামনে proxy TLS termination করার পরেই কেবল reachable হয়। তাই এর দিকে subdomain নির্দেশ করার আগে default login পরিবর্তন করুন। তবে সব container-এর জন্য public hostname প্রয়োজন হয় না। একটি self-hosted open-kritt security scanner-এর মতো admin-only tool proxy-এর বাইরে রাখাই ভালো। খুব কম সময়ে UI খুলতে হলে SSH tunnel ব্যবহার করে এতে প্রবেশ করুন। কিছু service proxy এড়িয়ে চলে, কারণ HTTP তাদের protocol নয়। একটি self-hosted RustDesk relay server এর স্পষ্ট উদাহরণ। এটি কয়েকটি raw TCP এবং UDP port-এ listen করে এবং subdomain-এর বদলে firewall rule প্রয়োজন। Immich-এর জন্য একটি proxy setting গুরুত্বপূর্ণ: upload size limit বাড়ান, কারণ phone video বড় হয়। nginx-এ server block-এর ভিতরে এটি client_max_body_size 50000M;। default 1 MB হওয়ায় 413 Request Entity Too Large দিয়ে video upload প্রত্যাখ্যান হয়। আপনার proxy যদি Let's Encrypt HTTP-01 challenge-এর উত্তরও দেয়, তাহলে নিশ্চিত করুন /.well-known/immich এখনও Immich-এ route করা আছে, challenge handler-এ নয়।
App যে নিয়মটি প্রয়োগ করে তা হলো: আপনি যে URL লিখবেন, endpoint-টি ঠিক সেই URL-এই reachable হতে হবে। App একটি সাধারণ http://YOUR_SERVER_IP:2283 গ্রহণ করবে, যার নিজের login hint হলো http://your-server-ip:port। তবে Internet অতিক্রম করা যেকোনো সংযোগে HTTPS ব্যবহার করা উচিত। ভুল scheme অথবা port বাদ দেওয়া direct IP থেকেই “app cannot reach the server” সমস্যা হয়। নিচে এটিকে একটি নির্দিষ্ট failure হিসেবে ব্যাখ্যা করা হয়েছে।
ধাপ 7: External libraries বনাম uploads, বিদ্যমান photo tree import করা
Immich-এ photo যোগ করার দুটি উপায় আছে। এগুলো এক জিনিস নয়।
- Uploads হলো এমন asset, যার মালিক Immich। অ্যাপ বা web uploader ফাইলটি
UPLOAD_LOCATION-এ কপি করে। Immich এগুলোর নাম পরিবর্তন, স্থানান্তর এবং মুছে ফেলা করতে পারে। - External libraries হলো এমন ফাইলের read-only import, যেগুলো আপনার server-এর কোনো folder, পুরোনো
Picturestree বা NAS export-এ আগে থেকেই আছে। Immich ফাইলগুলো যেখানে আছে সেখানেই index করে এবং timeline-এ দেখায়, কিন্তু মূল ফাইল কখনো পরিবর্তন বা মুছে ফেলে না।
বিদ্যমান tree import করতে সেটিকে read-only অবস্থায় server container-এ 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 এ যান। owning user নির্বাচন করুন, Folders-এর অধীনে Add-এ click করুন এবং container path /mnt/media/photos লিখুন, host path /srv/photos নয়। Scan-এ click করুন। container path-এর বদলে host path ব্যবহার করা external library-এর সবচেয়ে সাধারণ ভুল। এতে scan কোনো ফাইল খুঁজে পায় না এবং zero asset দেখায়।
ধাপ 8: Immich যে upgrade discipline দাবি করে
এই অংশটিই একটি সচল Immich এবং একটি বিকল Immich-এর মধ্যে পার্থক্য তৈরি করে। Immich দ্রুত release দেয় এবং পুরোনো version-এ fix backport করে না বা downgrade সমর্থন করে না। ভাসমান v3 tag ব্যবহার করে release অনুসরণ করা আনুষ্ঠানিকভাবে সমর্থিত পদ্ধতি। Immich breaking change-গুলো major version-এ সীমাবদ্ধ রাখার চেষ্টা করে। তবে আপনি notes পড়েছেন কি না, তা বিবেচনা না করেই pull করার সময় এটি upgrade হয়ে যায়। পরিকল্পনা না করে করা upgrade rollback করা যায় না। একই pin-then-read-the-notes অভ্যাস সার্ভারে দীর্ঘদিন চলা প্রতিটি container-এর ক্ষেত্রেই প্রয়োগ করা ভালো। তাই একটি self-hosted KiroCrew agent-কে একটি নির্দিষ্ট, যাচাইকৃত tag-এ pin করা হয়, যাতে পরবর্তী restart-এ সেটি আপনার অজান্তে পরিবর্তিত না হয়। এই discipline অনুসরণ করুন:
- একটি version pin করুন।
IMMICH_VERSION-এv3.0.2-এর মতো নির্দিষ্ট tag রাখুন। সর্বশেষ v3.x সবসময় pull করে এমন ভাসমানv3ব্যবহার করবেন না। - প্রতিবার upgrade-এর আগে release notes পড়ুন। Breaking change, বিশেষ করে database বা vector-extension পরিবর্তন, সেখানে উল্লেখ করা থাকে। v3.0 release এর স্পষ্ট উদাহরণ। এতে pgvecto.rs সম্পূর্ণ সরিয়ে দেওয়া হয়েছিল। তাই পুরোনো extension ব্যবহারকারীদের upgrade করার আগে VectorChord migration সম্পন্ন করতে হয়েছিল। এই migration v1.133-এ চালু হয়েছিল।
- প্রথমে database-এর backup নিন (ধাপ 9)। সবসময়ই নিন। Notes-এ database-এর কথা থাকলে আরও সতর্ক থাকুন।
- নতুন compose file-টিও নিন।
IMMICH_VERSIONশুধু server এবং ML image pin করে। Postgres image-এর digestdocker-compose.yml-এর ভিতরে pin করা থাকে। তাই নতুন database extension প্রয়োজন এমন version-এর সঙ্গে নতুন compose file দেওয়া হয়। উভয় release asset আবার download করুন, আপনার.envvalue-গুলো পুনরায় প্রয়োগ করুন, তারপর upgrade করুন। - প্রথমে mobile client-গুলো update করুন। Server শুধু তার সামঞ্জস্যপূর্ণ major version-এর সঙ্গে কথা বলে। App সাধারণত বর্তমান এবং আগের major version-এর সঙ্গে compatible থাকে। App-এর চেয়ে server নতুন হলে, বর্তমান release-গুলোতে (v3.3.1, 2026-10-10 তারিখে যাচাই করা) ফোনে App update is available notice এবং Update button দেখা যায়। Immich server upgrade করার আগে সব mobile client upgrade করার পরামর্শ দেয়।
নতুন file-গুলো প্রস্তুত থাকার পরে প্রকৃত command:
cd /opt/immich
sudo docker compose pull
sudo docker compose up -d
sudo docker image pruneধাপ 9: Backup, database dump এবং মূল ফাইল—এবং এটি পরীক্ষা করুন
Immich-এর backup দুটি জিনিস নিয়ে গঠিত, এবং একটিকে বাদ দিলে অন্যটি অকেজো। Database-এ album structure, faces, search indexes এবং asset থেকে file-এর mapping থাকে। Originals directory-তে প্রকৃত photos থাকে। একটিকে অন্যটি ছাড়া restore করলে হয় organization ছাড়া 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 ধাপ এড়ানোর shortcut মনে হতে পারে, কিন্তু এটি ব্যবহারযোগ্য backup নয়—এটি এমন একটি ফাঁদ, পূর্ণ Immich backup ও restore walkthrough যেটি সেই restore slip-এর পাশাপাশি ব্যাখ্যা করে, যার ফলে আপনার timeline খালি থেকে যায়।
Postgres container-এর ভেতর থেকে pg_dump দিয়ে database 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এরপর restic, rsync অথবা borg ব্যবহার করে UPLOAD_LOCATION, অর্থাৎ সম্পূর্ণ /opt/immich/library tree, বিশেষ করে তার library/, upload/ এবং profile/ subfolder, অন্য machine বা object storage-এ backup করুন। cron entry বা systemd timer—যে পদ্ধতিই সেই job schedule করুক—ব্যর্থ হলে জানানোর জন্য একটি ব্যবস্থা প্রয়োজন। আপনার নিজস্ব ntfy push server-এ নির্দেশ করা একটি systemd OnFailure= unit dump ব্যর্থ হওয়ার রাতে আপনার phone-এ message পাঠায়। ফলে restore করার সময় ব্যর্থতাটি প্রথম জানতে হয় না। Database আগে এবং files পরে backup করুন, যাতে file backup এখনো copy করেনি—এমন কোনো photo dump-এ reference না থাকে। External libraries তাদের প্রকৃত source থেকে আলাদাভাবে backup করুন; Immich সেগুলোর মালিক নয়।
এখন সেই অংশ, যা সবাই এড়িয়ে যায়: restore পরীক্ষা করুন। Restore অবশ্যই এমন একটি fresh stack-এ চালাতে হবে, যার server কখনো start হয়নি। যে Postgres image ব্যবহার করবেন, তার vector extension-টি dump-এর সঙ্গে compatible হতে হবে। এ কারণেই DB image tag কখনো অনুমান করে ঠিক করবেন না। একই compose এবং .env-সহ একটি scratch box-এ পুরোনো state মুছে ফেলুন। শুধু database চালু করুন। তারপর 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 ঐচ্ছিক নয়। এটি বাদ দিলে restore মাঝপথে abort হবে। Originals যথাস্থানে রেখে stack আবার চালু হলে web UI খুলুন। আপনার photos এবং albums সেখানে থাকলে backup কাজ করছে। আপনি এটি কখনো চালিয়ে না থাকলে আপনার backup নেই; আছে শুধু আশা।
ব্যর্থতার ধরন এবং যে স্ট্রিংগুলো দেখতে পাবেন
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 job আটকে যায়। কারণ হলো model চালানোর জন্য RAM অপর্যাপ্ত। সমাধানের ক্রম: swap যোগ করুন (ধাপ 1); VPS-এ আরও RAM দিন; অথবা সত্যিই তা সম্ভব না হলে Administration → Settings → Machine Learning Settings খুলে শীর্ষ-স্তরের machine learning toggle বন্ধ করুন। এতে একসঙ্গে সব ML feature বন্ধ হয়ে যায়। শুধু Smart Search এবং Facial Recognition বন্ধ করা যথেষ্ট নয়, কারণ OCR এবং অন্যান্য model type ডিফল্টভাবে সক্রিয় থাকে। Backup ও album থাকবে, তবে content অনুযায়ী search করা যাবে না। compose file থেকে immich-machine-learning service সরালেও একই ফল হবে।
Upgrade-এর পরে Immich server start হতে অস্বীকার করে। Postgres container স্বাভাবিকভাবে চলতে পারে; startup-এর সময় vector extension version যাচাই করে এবং start হতে অস্বীকার করে immich_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 বারবার দেখা যেতে পারে, অথবা পুরোনো stack-এ The pgvecto.rs extension is not available in this Postgres instance.। কারণ হলো এমন একটি database image ব্যবহার করা, যার extension version আপনার data যে version-এ upgrade হয়েছে তার চেয়ে পুরোনো। সাধারণত image tag হাতে edit করা বা নতুন dump পুরোনো image-এ restore করার কারণে এটি ঘটে। সমাধান হলো সামঞ্জস্যপূর্ণ Postgres image ব্যবহার করা, আপনার database-এর version-এর সঙ্গে মেলে এমন release থেকে compose file নেওয়া, downgrade না করা এবং শুধু compatible image-এ restore করা।
Mobile app server-এ পৌঁছাতে পারে না। URL দেওয়ার পরে login screen-এ Could not connect to server-এর মতো connection error দেখা যায়। সাধারণ কারণগুলো হলো: proxy শুধু https:// serve করলেও আপনি http:// লিখেছেন; backend-এ সরাসরি সংযোগ করে port বাদ দিয়েছেন, তাই example.com:2283-এর বদলে example.com (port 443) ব্যবহারের চেষ্টা হয়েছে; reverse proxy /api forward করছে না; অথবা Let's Encrypt HTTP-01 challenge পরিচালনাকারী proxy /.well-known/immich-কে Immich ছাড়া অন্য কোথাও route করছে। সমাধান হিসেবে সম্পূর্ণ https://photos.example.com URL লিখুন এবং আগে phone browser-এ সেটি load হচ্ছে কি না নিশ্চিত করুন। Browser-এ কাজ করলেও app-এ কাজ না করলে proxy path বাদ দিচ্ছে বা /.well-known/immich ভুলভাবে route করছে। Certificate self-signed হলেও এমন হতে পারে। সে ক্ষেত্রে app handshake error দিয়ে সংযোগ প্রত্যাখ্যান করে, যদি না তার settings-এ self-signed certificate support চালু করেন।
Import চলাকালে disk space শেষ হয়ে যায়। Upload ব্যর্থ হতে শুরু করে, thumbnail ফাঁকা দেখায় এবং log-এ 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-এর আকার নির্ধারণ করার কারণ এটাই। বড় volume সংযুক্ত করে, stack বন্ধ করে, UPLOAD_LOCATION সেখানে সরিয়ে, .env update করে আবার start করে পুনরুদ্ধার করুন। Provider অনুমতি দিলে বিদ্যমান disk-ও expand করতে পারেন। Disk পূর্ণ হয়ে গেলে Postgres অচল অবস্থায় যেতে পারে। তাই corruption ধরে নেওয়ার আগে space খালি করে database container restart করুন।
FAQ
Immich-এর কত RAM এবং disk প্রয়োজন?
Immich-এর official requirement হলো ন্যূনতম 6 GB RAM এবং recommended 8 GB। ছোট library-এর জন্য swap-সহ 4 GB বাস্তবসম্মত ন্যূনতম সীমা। যেকোনো অবস্থায় swap configure করুন, কারণ machine-learning container-ই সাধারণত resource usage হঠাৎ বাড়ায়। Disk-এর ক্ষেত্রে পুরো library-এর আকারের সঙ্গে generated thumbnail ও preview-এর জন্য আনুমানিক 10–20% অতিরিক্ত জায়গা রাখুন। এগুলো local storage-এ রাখুন; Postgres data directory কখনো network share-এ রাখবেন না। আর কী চালাবেন তা এখনও ঠিক না করে থাকলে, 2026 সালে কী self-host করবেন সেই guide-এ Immich-এর footprint অন্যান্য service-এর পাশে তুলনা করা হয়েছে।
GPU ছাড়া কি Immich চালাতে পারি?
হ্যাঁ। Machine-learning container CPU-তেই স্বাভাবিকভাবে চলে। GPU শুধু smart-search indexing দ্রুত করে এবং সঠিক image variant ব্যবহার করলে video transcoding-ও দ্রুত করে। CPU-তে বড় library-এর initial index background-এ তৈরি হতে কয়েক ঘণ্টা লাগতে পারে, তবে এতে backup বা browsing বন্ধ থাকে না। আপনার box ML চালানোর জন্য একেবারেই ছোট হলে admin settings-এর top-level toggle দিয়ে machine learning সম্পূর্ণ বন্ধ করতে পারেন এবং বাকি সব বৈশিষ্ট্য চালু রাখতে পারেন।
Immich কীভাবে নিরাপদে upgrade করব?
IMMICH_VERSION-কে v3.0.2-এর মতো একটি নির্দিষ্ট tag-এ pin করুন, প্রতিটি upgrade-এর আগে release notes পড়ুন এবং প্রথমে database backup নিন। Postgres image-টি IMMICH_VERSION-এর মাধ্যমে নয়, docker-compose.yml-এর ভেতরে pin করা থাকে। তাই target release থেকে compose file এবং example.env দুটিই আবার download করুন, আপনার values পুনরায় প্রয়োগ করুন, তারপর docker compose pull && docker compose up -d চালান। Version কখনো unattended অবস্থায় float করতে দেবেন না। Immich downgrade সমর্থন করে না, তাই release সম্পর্কে না পড়ে করা upgrade ফিরিয়ে নেওয়া যায় না।
ঠিক কী কী backup করব?
দুটি জিনিস একসঙ্গে backup করুন: immich database-এর একটি pg_dump এবং সম্পূর্ণ UPLOAD_LOCATION originals directory। Database-এ album, face এবং asset-to-file mapping থাকে। Directory-তে প্রকৃত photo থাকে। Restore করতে দুটিই প্রয়োজন, পাশাপাশি compatible vector extension-সহ একটি database image-ও দরকার। প্রথমে database dump নিন এবং পরে file copy করুন। অন্তত একবার একটি scratch box-এ restore পরীক্ষা করুন। পরীক্ষা না করা backup আসলে backup নয়।
আমার বিদ্যমান photo folder কীভাবে import করব?
Folder-টি read-only অবস্থায় অতিরিক্ত volume হিসেবে immich-server container-এ mount করুন, যেমন - /srv/photos:/mnt/media/photos:ro। এরপর container recreate করুন। তারপর Administration → External Libraries-এ একটি library তৈরি করে container path /mnt/media/photos যোগ করুন। Immich file-গুলো যেখানে আছে সেখানেই index করে এবং কখনো সেগুলো পরিবর্তন বা delete করে না। সবচেয়ে সাধারণ ভুল হলো container path-এর বদলে host path দেওয়া। এতে scan কোনো file খুঁজে পায় না।