SSD Nodes Learn
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-07-24

Immich self-hosting: RAM ও upgrade গাইড

Immich চালানোর জন্য কমপক্ষে 6 GB RAM প্রয়োজন। pgvecto.rs ডাটাবেস ও v3 আপডেট সংক্রান্ত সমস্যা এবং port 2283 এর HTTPS সেটিংস সম্পর্কে বিস্তারিত জানুন।

আপনি যা তৈরি করছেন

Immich হলো একটি self-hosted ফটো এবং ভিডিও ব্যাকআপ সার্ভিস — যা Google Photos-এর একটি প্রকৃত বিকল্প। এতে একটি ফোন অ্যাপ রয়েছে যা ব্যাকগ্রাউন্ডে আপনার camera roll আপলোড করতে পারে। এতে আছে একটি timeline, albums, face recognition এবং machine-learning search, যা কোনো ট্যাগ ছাড়াই "beach" বা কোনো ব্যক্তিকে খুঁজে বের করতে পারে। আপনি এটি আপনার নিজস্ব VPS-এ চালাতে পারেন; মূল ফাইলগুলো আপনার ডিস্কেই থাকে এবং বিজ্ঞাপন দেখানোর জন্য কেউ সেগুলো স্ক্যান করে না।

ইনস্টলেশন প্রক্রিয়াটি প্রজেক্টের নিজস্ব Docker Compose ফাইল থেকে আসা চারটি container-এর সমন্বয়ে গঠিত। এই অংশটি সম্পন্ন করতে দশ মিনিট সময় লাগে। এই গাইডের বাকি অংশে কিছু জটিলতা রয়েছে: ছোট সার্ভারে machine-learning container প্রচুর memory ব্যবহার করে, মূল ফাইলগুলো দ্রুত disk দখল করে ফেলে, মোবাইল অ্যাপ সাধারণ HTTP সার্ভার গ্রহণ করে না, এবং Immich প্রায়ই breaking changes রিলিজ করে যা অসাবধানতাবশত docker compose pull থাকলে আপনার database স্টার্ট হতে বাধা দিতে পারে। এই চারটি বিষয় গুরুত্ব সহকারে বিবেচনা করলে Immich অত্যন্ত স্থিতিশীল থাকবে। এগুলো অবহেলা করলে আপনার একটি সপ্তাহান্ত নষ্ট হতে পারে।

Prerequisites, এবং সম্ভাব্য সমস্যাসমূহ

  • RAM: অফিসিয়াল ডকুমেন্টেশনে সর্বনিম্ন 6 GB এবং রিকমেন্ডেড 8 GB বলা হয়েছে — ৪ GB RAM এবং swap থাকলে তা সর্বনিম্ন হিসেবে গণ্য করুন। immich-server এবং Postgres কন্টেইনারগুলো খুব বেশি রিসোর্স নেয় না। immich-machine-learning কন্টেইনারটি সবচেয়ে বেশি মেমরি ব্যবহার করে — এটি সার্চ ইনডেক্স তৈরির জন্য RAM-এ CLIP এবং face-recognition মডেল লোড করে, ফলে ২ GB RAM বিশিষ্ট মেশিনে kernel এটি বন্ধ করে দেয়। আপনার ৪ GB RAM থাকলেও swap যোগ করুন।
  • Disk: আপনার সম্পূর্ণ লাইব্রেরির আকারের চেয়ে কিছুটা বেশি জায়গা রাখুন। আপনার অরিজিনাল ফাইলগুলো সম্পূর্ণ কপি করা হয়, এছাড়া Immich থাম্বনেইল এবং প্রিভিউ ইমেজ তৈরি করে (যা প্রায় ১০–২০% অতিরিক্ত জায়গা নেয়)। ২০০ GB ফটো সংগ্রহের জন্য ৩০০ GB ভলিউম প্রয়োজন। এর তুলনায় Postgres খুব ছোট।
  • CPU: যেকোনো আধুনিক KVM VPS ব্যবহার করা যাবে, তবে CPU-তে ML প্রসেসিং ধীরগতির হয়। বড় কোনো ইমপোর্ট করার পর Smart-search ইনডেক্সিং ব্যাকগ্রাউন্ডে কয়েক ঘণ্টা চলতে পারে। এটি স্বাভাবিক; এর জন্য GPU প্রয়োজন নেই।
  • একটি ডোমেইন নাম যা VPS-এর সাথে পয়েন্ট করা আছে। মোবাইল অ্যাপের জন্য HTTPS endpoint থাকা জরুরি, এবং আপনার একটি reverse proxy ব্যবহার করা উচিত। এটি Docker, TLS এবং ব্যাকআপ সহ self-hosted Nextcloud instance এর মতোই সেটআপ — Immich হলো সেই ফাইল সার্ভারের ফটো সংস্করণ।
  • Docker এবং Compose plugin ইনস্টল করা থাকতে হবে — Docker Engine এবং Docker-এর নিজস্ব apt রিপোজিটরি থেকে Compose v2 plugin, যা আমাদের Docker Compose basics guide-এ বিস্তারিত আলোচনা করা হয়েছে।

ধাপ 1: অন্য সবকিছুর আগে swap যোগ করুন

একটি ছোট VPS-এ Immich-এর সবচেয়ে সাধারণ সমস্যা হলো ML container-টি OOM-killed হয়ে যাওয়া। কার্নেলকে কাজ করার জন্য পর্যাপ্ত জায়গা দিন।

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-এর গতি বাড়াবে না, কিন্তু 4 GB মেমরি সম্পন্ন মেশিনে ইনডেক্সিং চলাকালীন container বন্ধ হওয়া রোধ করবে।

Step 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, container immich_server) — এটি API এবং web UI, যা port 2283-এ লিসেন করে। এটি আপনার আপলোড করা ফাইলগুলো /data-এ মাউন্ট করে।
  • immich-machine-learning (ghcr.io/immich-app/immich-machine-learning, container immich_machine_learning) — CLIP সার্চ এবং face recognition। এটি ডাউনলোড করা মডেলগুলো model-cache ভলিউমে ক্যাশ করে রাখে। এটি প্রচুর মেমরি ব্যবহার করে।
  • database (container immich_postgres) — VectorChord ভেক্টর এক্সটেনশনসহ Postgres, যা similarity search পরিচালনা করে। ইমেজ ট্যাগটি সরাসরি compose ফাইলের ভেতর digest দ্বারা নির্দিষ্ট করা থাকে, উদাহরণস্বরূপ ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:...। পুরনো সেটআপে pgvecto.rs ব্যবহার করা হতো; Immich v3.0 থেকে এর সাপোর্ট সরিয়ে নেওয়া হয়েছে, তাই বর্তমানে আপনি যা ইনস্টল করবেন তা VectorChord। এই ট্যাগটি কখনোই ম্যানুয়ালি এডিট করবেন না।
  • redis (container immich_redis) — জব কিউ (job queues) এর জন্য একটি Valkey/Redis ইনস্ট্যান্স।

Step 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 আপনার বড় ডিস্কের দিকে পয়েন্ট করা থাকতে হবে — যদি আপনি পরে একটি data volume যুক্ত করেন, তবে শুরু থেকেই এটিকে এর mount path হিসেবে সেট করুন; কারণ পরে এটি মুভ করা মানে হলো thumbnails মুভ করা এবং asset paths আপডেট করা। এবং DB_DATA_LOCATION অবশ্যই local disk-এ থাকতে হবে: NFS বা SMB share-এ Postgres ব্যবহার করলে ডেটা corrupt হয়ে যায়, এবং docs-এ এটি স্পষ্টভাবে বলা আছে। আপনি যদি DB_PASSWORD-এ শুধুমাত্র letters এবং digits ব্যবহার করেন, তবে আপনি connection-string escaping সংক্রান্ত বাগ থেকে বাঁচতে পারবেন।

Step 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 চালানোর সময় কয়েক gigabyte ইমেজ pull করা হবে, তাই কিছুটা সময় দিন। sudo docker compose logs -f immich-server দিয়ে প্রগ্রেস পর্যবেক্ষণ করুন; সার্ভার প্রস্তুত হয়ে গেলে এটি জানায় যে এটি port 2283 এ listen করছে। এখন ব্রাউজারে http://YOUR_SERVER_IP:2283 ওপেন করুন। প্রথমবার ভিজিট করলে একটি Getting Started wizard দেখতে পাবেন — আপনি প্রথম যে account টি তৈরি করবেন সেটিই হবে admin। একটি শক্তিশালী password সেট করুন; এই account দিয়ে সার্ভার settings, user management এবং পরবর্তীতে প্রয়োজনীয় ML configuration নিয়ন্ত্রণ করা হবে।

Step 5: মোবাইল অ্যাপ এবং ব্যাকগ্রাউন্ড ব্যাকআপ

App Store বা Play Store থেকে "Immich" ইনস্টল করুন। লগইন স্ক্রিনে একটি Server Endpoint URL চাইবে। স্কিম সহ সম্পূর্ণ URL প্রদান করুন, উদাহরণস্বরূপ https://photos.example.com (অ্যাপটি নিজে থেকেই /api যোগ করে নেয়)। আপনার তৈরি করা অ্যাকাউন্ট দিয়ে লগইন করুন, তারপর অ্যাপের Backup স্ক্রিনটি খুলুন। যে অ্যালবামগুলো সুরক্ষিত করতে চান সেগুলো নির্বাচন করুন (সাধারণত Camera এবং Screenshots), এবং Background backup চালু করুন। iOS অপারেটিং সিস্টেম ব্যাকগ্রাউন্ড ব্যাকআপের গতি সীমিত করে দেয় — ফোরগ্রাউন্ড আপলোড সবসময় চলে, কিন্তু ব্যাকগ্রাউন্ড আপলোড অপারেটিং সিস্টেম অনুমতি দিলে সম্পন্ন হয়।

বেশিরভাগ ব্যবহারকারী এখানেই সমস্যার সম্মুখীন হন, তাই অ্যাপটি নিয়ে কাজ করার আগে Step 6 পড়ে নিন।

Step 6: reverse proxy-এর মাধ্যমে HTTPS — এবং full-URL নিয়ম

mobile app-এর জন্য HTTPS প্রয়োজন। port 2283-এর সামনে একটি reverse proxy ব্যবহার করুন এবং সেখানে TLS terminate করুন। আপনি যদি ইতিমধ্যে একাধিক container চালান, তবে Traefik with automatic TLS for multiple Docker apps হলো সবচেয়ে সহজ উপায় — একটি label block ব্যবহার করে photos.example.com-কে immich-server container-এর সাথে রুট করা যায় এবং এটি আপনার জন্য certificate সংগ্রহ করে নেয়। আপনি যদি nginx পছন্দ করেন, তবে Let's Encrypt with Certbot and nginx গাইডটি অনুসরণ করলে আপনি একটি certificate এবং proxy_pass http://127.0.0.1:2283; block পাবেন। Immich-এর জন্য একটি proxy setting অত্যন্ত গুরুত্বপূর্ণ: upload size limit বাড়িয়ে দিন, কারণ ফোনের ভিডিওর সাইজ অনেক বড় হয়। nginx-এ এটি হলো server block-এর ভেতরে থাকা client_max_body_size 50000M; — ডিফল্ট 1 MB সাইজ ভিডিও আপলোড করার সময় 413 Request Entity Too Large error দেখাবে।

app-টি এই নিয়মটি মেনে চলে: endpoint-টি অবশ্যই reachable হতে হবে এবং বাস্তবে এটি HTTPS হতে হবে। http:// endpoint, অথবা port ছাড়া সরাসরি IP ব্যবহার করলে "the app cannot reach the server" errorটি আসে — যা নিচে একটি নির্দিষ্ট failure হিসেবে আলোচনা করা হয়েছে।

Step 7: External libraries বনাম uploads — বিদ্যমান photo tree ইমপোর্ট করা

Immich-এ ছবি দুটি উপায়ে যুক্ত করা যায় এবং এই দুটি পদ্ধতি এক নয়।

  • Uploads হলো সেই সব asset যা Immich-এর মালিকানাধীন। অ্যাপ বা ওয়েব আপলোডার ফাইলটি UPLOAD_LOCATION-এ কপি করে। Immich এগুলো rename, move বা delete করতে পারে।
  • External libraries হলো আপনার সার্ভারের কোনো ফোল্ডারে থাকা ফাইলের read-only ইমপোর্ট — যেমন কোনো পুরাতন Pictures tree বা NAS export। Immich এগুলোকে নিজ স্থানে index করে এবং timeline-এ দেখায়, কিন্তু মূল ফাইলগুলো কখনো পরিবর্তন বা delete করে না।

বিদ্যমান কোনো tree ইমপোর্ট করতে, সেটি সার্ভার 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 টি পুনরায় তৈরি (recreate) করুন। এরপর web UI-তে আপনার avatar → Administration → External Libraries → Create Library-তে যান, মালিকানা বা owning user নির্বাচন করুন, Folders-এর নিচে Add ক্লিক করুন এবং container পাথটি লিখুন — /mnt/media/photos, হোস্ট পাথ /srv/photos নয়। Scan-এ ক্লিক করুন। হোস্ট পাথ ব্যবহার করা হলো external-library ব্যবহারের ক্ষেত্রে সবচেয়ে সাধারণ ভুল; এতে scan কোনো ফাইল খুঁজে পায় না এবং zero assets রিপোর্ট করে।

Step 8: Immich-এর জন্য প্রয়োজনীয় আপগ্রেড নিয়মাবলী

এই ধাপটি একটি সফল Immich এবং একটি ত্রুটিযুক্ত Immich-এর মধ্যে পার্থক্য তৈরি করে। Immich খুব দ্রুত আপডেট রিলিজ করে এবং এটি পুরনো ভার্সনে কোনো ফিক্স বা ডাউনগ্রেড সাপোর্ট করে না। অন্ধভাবে floating v3 tag অনুসরণ করলে আপনার database নষ্ট হয়ে যেতে পারে। নিয়মগুলো হলো:

  1. একটি নির্দিষ্ট version pin করুন। IMMICH_VERSION-কে সবসময় একটি নির্দিষ্ট tag যেমন v3.0.2 হিসেবে সেট করে রাখুন। সবসময় নতুনest v3.x নিয়ে আসে এমন floating v3 ব্যবহার করবেন না।
  2. প্রতিবার আপগ্রেড করার আগে release notes পড়ুন। Breaking changes — বিশেষ করে database বা vector-extension সংক্রান্ত পরিবর্তনগুলো সেখানে উল্লেখ করা থাকে। v3.0 রিলিজ হলো এর একটি বড় উদাহরণ: এটি সরাসরি pgvecto.rs রিমুভ করে দিয়েছে। তাই যারা পুরনো extension ব্যবহার করছিলেন, তাদের আপগ্রেড করার আগে অবশ্যই VectorChord migration (যা v1.133-এ আনা হয়েছিল) সম্পন্ন করতে হয়েছে।
  3. প্রথমে database backup নিন (Step 9)। সবসময় backup নিন, তবে release notes-এ database সংক্রান্ত কোনো কথা থাকলে অবশ্যই তা নিশ্চিত করুন।
  4. নতুন compose file-টিও সংগ্রহ করুন। IMMICH_VERSION শুধুমাত্র server এবং ML image pin করে। Postgres image-টি docker-compose.yml এর ভেতরে digest দিয়ে pin করা থাকে। তাই কোনো ভার্সনে যদি নতুন database extension প্রয়োজন হয়, তবে তারা একটি নতুন compose file প্রদান করে। উভয় release asset পুনরায় ডাউনলোড করুন, আপনার .env value গুলো পুনরায় প্রয়োগ করুন এবং তারপর upgrade করুন।
  5. একই সময়ে আপনার mobile client-গুলো আপডেট করুন। Server শুধুমাত্র তার নিজস্ব matching major version-এর সাথে যোগাযোগ করতে পারে। অ্যাপটি শুধুমাত্র বর্তমান এবং পূর্ববর্তী major version সাপোর্ট করে। যদি server অ্যাপের চেয়ে অনেক বেশি উন্নত ভার্সনে চলে যায়, তবে অ্যাপে 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

Step 9: Backups — একটি database dump PLUS আসল ফাইলসমূহ, এবং এটি পরীক্ষা করুন

Immich-এর backup দুটি জিনিসের সমন্বয়ে গঠিত, এবং একটি ছাড়া অন্যটি অকেজো। database-এ অ্যালবাম স্ট্রাকচার, ফেস, সার্চ ইনডেক্স এবং asset থেকে ফাইল মেলানোর ম্যাপ থাকে। originals directory-তে আসল ছবিগুলো থাকে। একটি ছাড়া অন্যটি restore করলে হয় কোনো বিন্যাস ছাড়া ছবি পাবেন, অথবা ফাইলবিহীন একটি খালি শেল পাবেন।

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/ subfolder-গুলো — restic, rsync অথবা borg ব্যবহার করে অন্য কোনো machine বা object storage-এ। প্রথমে database এবং পরে ফাইল backup করুন, যাতে dump-এ এমন কোনো ছবির রেফারেন্স না থাকে যা ফাইল backup এখনও কপি করেনি। External libraries গুলো তাদের আসল source থেকে আলাদাভাবে backup করতে হয়; Immich সেগুলোর মালিক নয়।

এখন সেই অংশ যা সবাই বাদ দেয়: restore পরীক্ষা করুন। একটি restore অবশ্যই একটি নতুন stack-এ চালাতে হবে যা আগে কখনও চালু করা হয়নি, এবং এমন একটি Postgres image-এ যার vector extension dump-এর সাথে সামঞ্জস্যপূর্ণ — এই কারণেই DB image tag কখনো নিজে থেকে পরিবর্তন করা উচিত নয়। একই compose এবং .env সহ একটি নতুন machine-এ, যেকোনো পুরাতন state মুছে ফেলুন, শুধুমাত্র database চালু করুন, তারপর dump লোড করুন:

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 মাঝপথে থেমে যাবে। যখন stack আপনার originals সহ পুনরায় চালু হবে, তখন web UI খুলুন: যদি আপনার ছবি এবং অ্যালবাম সেখানে থাকে, তবে আপনার backup কাজ করছে। আপনি যদি এটি কখনও না করে থাকেন, তবে আপনার কাছে backup নেই — আপনার কাছে কেবল একটি আশা আছে।

ব্যর্থতার ধরন এবং সংশ্লিষ্ট স্ট্রিংসমূহ

ML container-টি OOM-killed হচ্ছে। sudo docker compose logs immich-machine-learning হঠাৎ বন্ধ হয়ে যায়, docker compose ps এটি Restarting হিসেবে দেখায়, এবং exit code হলো 137sudo dmesg | grep -i oom এটি নিশ্চিত করে: Out of memory: Killed process ... (python3)। এর ফলে search এবং face jobs আটকে যায়। এর কারণ হলো মডেলগুলোর জন্য পর্যাপ্ত RAM না থাকা। সমাধানের ধাপগুলো হলো: swap যোগ করা (Step 1); VPS-এর RAM বাড়ানো; অথবা, যদি সম্ভব না হয়, তবে Administration → Settings → Machine Learning Settings থেকে Smart Search এবং Facial Recognition বন্ধ করে ML নিষ্ক্রিয় করা — এতে আপনার ব্যাকআপ এবং অ্যালবাম থাকবে, কিন্তু content-এর ভিত্তিতে সার্চ করার সুবিধা থাকবে না। compose file থেকে immich-machine-learning service সরিয়ে ফেললেও একই ফলাফল পাওয়া যায়।

Upgrade করার পর 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. এর মতো লাইন বারবার আসতে থাকে — অথবা পুরনো stack-এর ক্ষেত্রে, The pgvecto.rs extension is not available in this Postgres instance.। এর কারণ হলো ডাটাবেস ইমেজের extension version আপনার আপগ্রেড করা ডাটার চেয়ে পুরনো। এটি সাধারণত ইমেজ tag ম্যানুয়ালি এডিট করলে বা পুরনো ইমেজে নতুন dump রিস্টোর করলে ঘটে। সমাধান হলো সামঞ্জস্যপূর্ণ Postgres image ব্যবহার করা — আপনার ডাটাবেসের সাথে মিলে যায় এমন release-এর compose file ব্যবহার করুন, downgrade করবেন না, এবং শুধুমাত্র একটি compatible image-এ রিস্টোর করুন।

Mobile app সার্ভারের সাথে সংযোগ করতে পারছে না। URL এন্টার করার পর login screen-এ connection error / Server is not reachable দেখায়। এর তিনটি কারণ হতে পারে: আপনি http:// টাইপ করেছেন যেখানে proxy শুধুমাত্র https:// সার্ভ করে; আপনি সরাসরি backend-এ কানেক্ট করেছেন কিন্তু port উল্লেখ করেননি, ফলে এটি example.com:2283 এর পরিবর্তে example.com (port 443) ট্রাই করেছে; অথবা reverse proxy, /api ফরওয়ার্ড করছে না। সমাধান হিসেবে সম্পূর্ণ https://photos.example.com URL ব্যবহার করুন এবং প্রথমে ফোনের ব্রাউজারে এটি লোড হচ্ছে কিনা তা নিশ্চিত করুন। যদি ব্রাউজারে কাজ করে কিন্তু app-এ না করে, তবে বুঝতে হবে proxy পাথ (path) রিমুভ করছে অথবা certificateটি self-signed — app অনির্ভরযোগ্য cert reject করে।

Import চলাকালীন ডিস্ক ফুল হয়ে যাওয়া। আপলোড ফেইল হতে শুরু করে, thumbnails খালি দেখায়, এবং লগ-এ ENOSPC: no space left on device অথবা Postgres থেকে could not extend file ... No space left on device দেখায়। df -h দিয়ে দেখা যায় যে UPLOAD_LOCATION volume ১০০% পূর্ণ হয়ে গেছে। এই কারণেই বড় লাইব্রেরি ইমপোর্ট করার আগে ডিস্ক সাইজ নির্ধারণ করে নিতে হয়। সমাধান হিসেবে একটি বড় volume যুক্ত করুন, stack স্টপ করুন, UPLOAD_LOCATION সেখানে মুভ করুন, .env আপডেট করুন এবং পুনরায় শুরু করুন — অথবা আপনার প্রোভাইডার অনুমতি দিলে বিদ্যমান ডিস্কটি বড় (expand) করুন। ডিস্ক ফুল হয়ে গেলে Postgres আটকে যেতে পারে, তাই ডাটা corruption হওয়ার কথা ভাবার আগে ডিস্কের জায়গা খালি করে ডাটাবেস container রিস্টার্ট করুন।

FAQ

Immich-এর জন্য কতটুকু RAM এবং disk প্রয়োজন?

Immich-এর অফিসিয়াল রিকয়ারমেন্ট হলো সর্বনিম্ন 6 GB RAM এবং রিকমেন্ডেড 8 GB — ছোট লাইব্রেরির জন্য swap সহ 4 GB হলো ব্যবহারিক সর্বনিম্ন সীমা। যেকোনোভাবেই swap কনফিগার করে রাখুন, কারণ machine-learning container-টি অনেক বেশি রিসোর্স ব্যবহার করে। Disk-এর জন্য আপনার সম্পূর্ণ লাইব্রেরি সাইজের সাথে থাম্বনেইল এবং প্রিভিউ তৈরির জন্য আরও প্রায় 10–20% জায়গা বরাদ্দ রাখুন, যা লোকাল স্টোরেজে থাকতে হবে — কখনোই Postgres data directory কোনো network share-এ রাখবেন না। আপনি যদি আরও কী কী সার্ভিস চালাতে চান তা নিয়ে সিদ্ধান্ত নিতে না পারেন, তবে 2026 সালে কী কী self-host করবেন তার গাইড-এ অন্যান্য সার্ভিসের তুলনায় Immich-এর রিসোর্স ব্যবহারের পরিমাণ দেওয়া আছে।

আমি কি GPU ছাড়া Immich চালাতে পারি?

হ্যাঁ। machine-learning containerটি CPU-তে অনায়াসেই চলে — GPU শুধুমাত্র smart-search indexing এবং সঠিক image variant থাকলে video transcoding-এর গতি বাড়ায়। CPU ব্যবহার করলে বড় লাইব্রেরির প্রাথমিক indexing ব্যাকগ্রাউন্ডে কয়েক ঘণ্টা সময় নিতে পারে, তবে এটি ব্যাকআপ বা ব্রাউজিংয়ে বাধা দেয় না। আপনার মেশিন যদি ML চালানোর জন্য যথেষ্ট শক্তিশালী না হয়, তবে আপনি admin settings থেকে Smart Search এবং Facial Recognition ডিজেবল করে বাকি সব ফিচার ব্যবহার করতে পারেন।

আমি কীভাবে নিরাপদে Immich upgrade করব?

IMMICH_VERSION-কে v3.0.2-এর মতো একটি নির্দিষ্ট tag-এ pin করে রাখুন, প্রতিটি upgrade-এর আগে release notes পড়ুন এবং প্রথমে database ব্যাকআপ নিন। যেহেতু Postgres image-টি IMMICH_VERSION-এর পরিবর্তে docker-compose.yml-এর ভেতরে pin করা থাকে, তাই আপনার টার্গেট রিলিজ থেকে compose file এবং example.env পুনরায় ডাউনলোড করুন এবং আপনার ভ্যালুগুলো পুনরায় প্রয়োগ করুন, তারপর docker compose pull && docker compose up -d চালান। ভার্সন কখনো অনিয়ন্ত্রিতভাবে পরিবর্তন হতে দেবেন না — Immich-এ breaking changes থাকে এবং এটি downgrade সাপোর্ট করে না।

আমাকে ঠিক কী ব্যাকআপ নিতে হবে?

দুটি জিনিস একত্রে: immich database-এর একটি pg_dump এবং সম্পূর্ণ UPLOAD_LOCATION originals ডিরেক্টরি। Database-এ অ্যালবাম, ফেস এবং asset-to-file ম্যাপিং থাকে; ডিরেক্টরিতে থাকে আসল ছবিগুলো। রিস্টোর করার জন্য এই দুটির পাশাপাশি একটি compatible vector extension সহ database image প্রয়োজন। প্রথমে database dump করুন এবং পরে ফাইল কপি করুন। অন্তত একবার একটি scratch box-এ রিস্টোরটি পরীক্ষা করে দেখুন — পরীক্ষা না করা ব্যাকআপ আসলে ব্যাকআপ নয়।

আমি কীভাবে আমার বিদ্যমান photo folder ইমপোর্ট করব?

ফোল্ডারটিকে একটি অতিরিক্ত volume হিসেবে (উদাহরণস্বরূপ - /srv/photos:/mnt/media/photos:ro) immich-server container-এ read-only মোডে মাউন্ট করুন, container-টি পুনরায় তৈরি করুন, তারপর Administration → External Libraries-এ গিয়ে একটি লাইব্রেরি তৈরি করুন এবং container path /mnt/media/photos যোগ করুন। Immich ফাইলগুলো সরাসরি ইন-প্লেস ইনডেক্স করে এবং ফাইলগুলো কখনো পরিবর্তন বা ডিলিট করে না। সবচেয়ে সাধারণ ভুল হলো container path-এর পরিবর্তে host path ব্যবহার করা, যার ফলে স্ক্যান কোনো ফাইল খুঁজে পায় না।