PhotoPrism বনাম Immich: কোন photo server আপনার জন্য?
PhotoPrism ও Immich-এর তুলনায় জানুন বাস্তব RAM floor, phone app, map সুবিধা এবং VPS-এ backup-এর সঠিক commands। ফোন backup নাকি পুরোনো library index, সিদ্ধান্ত নিন।
PhotoPrism বনাম Immich: সংক্ষিপ্ত উত্তর
PhotoPrism বনাম Immich বেছে নেওয়া একই পণ্যের দুটি সংস্করণের মধ্যে সিদ্ধান্ত নয়; এটি দুটি ভিন্ন কাজের মধ্যে সিদ্ধান্ত। Immich Google Photos-এর বিকল্প: একটি ফোন অ্যাপ স্বয়ংক্রিয়ভাবে আপনার camera roll-এর backup রাখে, এবং এর timeline ফোনের gallery ছেড়ে আসা ব্যবহারকারীদের কাছে পরিচিত মনে হয়। PhotoPrism আপনার আগে থেকেই থাকা photo library সংগঠিত করে: এটি disk-এ থাকা file-এর folder index করে, metadata পড়ে, সেগুলো map-এ দেখায় এবং file-গুলো যেখানে ছিল ঠিক সেখানেই রাখে।
সমস্যা যদি হয়, "আমার ফোনে জায়গা শেষ হয়ে যাচ্ছে এবং আমি Google Photos ব্যবহার বন্ধ করতে চাই", তাহলে Immich বেছে নিন। সমস্যা যদি হয়, "একটি drive-এ আমার 400 GB photo আছে, কিন্তু সেগুলোর মধ্যে কিছুই খুঁজে পাই না", তাহলে PhotoPrism বেছে নিন। দুটিই open source, দুটিই সাধারণ VPS-এ Docker container হিসেবে চালানো যায়, এবং দুটিই কোনো third party-এর কাছে কিছু না পাঠিয়ে আপনার library index ও search করে।
দর্শনগত পার্থক্য, এবং কেন এটিই সবকিছু নির্ধারণ করে
Immich ফাইলগুলোর মালিকানা ও ব্যবস্থাপনা ধরে রাখে। আপনি এটিকে একটি upload location নির্দেশ করেন, phone app বা web uploader সেখানে original ফাইল পাঠায়, এবং Immich নিজস্ব path ও naming ব্যবহার করে সেগুলো সংরক্ষণ করে। Database-এ album, face এবং search সম্পর্কিত প্রকৃত তথ্য থাকে। এই নকশার কারণেই phone experience ভালো হয়, কারণ server প্রতিটি asset-এর সম্পূর্ণ অবস্থা সবসময় জানে।
PhotoPrism ফাইলগুলো পড়ে। আপনি এমন একটি originals folder mount করেন, যেটি ইতিমধ্যে আপনার নিয়ন্ত্রণে আছে, এবং PhotoPrism সেটির ওপর একটি index তৈরি করে। আপনার directory tree আপনারই থাকে। আগামীকাল PhotoPrism সরিয়ে ফেললেও photos একই folder-এ একই name-এ থেকে যায়। PhotoPrism যা শিখেছে তা বর্ণনা করে যে sidecar YAML file-গুলো লিখেছে, সেগুলো তার নিজস্ব storage folder-এ থাকে; default হিসেবে PhotoPrism সেখানেই এগুলো সংরক্ষণ করে।
এই একটি পার্থক্যই পরের অধিকাংশ বিষয় ব্যাখ্যা করে। Immich ingestion নিয়ন্ত্রণ করে বলে mobile support শক্তিশালী। PhotoPrism আপনার বিদ্যমান structure-এর সঙ্গে সংঘাতে যায় না বলে library curation শক্তিশালী। যেসব পরিবারের photos phone-এ থাকে, তাদের জন্য Immich ভালো সমাধান। যে archive একটি disk-এ থাকে, তার জন্য PhotoPrism ভালো সমাধান।
Hardware-এর চাহিদা: Immich বেশি সম্পদ চায়
নথিভুক্ত memory floor-এর মধ্যে পার্থক্য অনেক, এবং ছোট VPS-এ সাধারণত এটিই সিদ্ধান্ত নির্ধারণ করে।
এই চার্টের পেছনের ডেটা
[
{
"label": "Immich",
"min_ram_gb": 6
},
{
"label": "PhotoPrism",
"min_ram_gb": 3
}
]Immich ন্যূনতম হিসেবে 6 GB RAM এবং সুপারিশকৃত হিসেবে 8 GB উল্লেখ করে। সেখানে বলা আছে, machine learning বন্ধ করলেই কেবল 4 GB মেশিনে এটি চালানো যায়। PhotoPrism 3 GB physical memory এবং দুইটি CPU core উল্লেখ করে। আরও বলা আছে, এই ন্যূনতম সীমার বেশি হলে RAM-এর পরিমাণ core count-এর সঙ্গে সামঞ্জস্যপূর্ণ হওয়া উচিত।
এই পার্থক্য বাস্তব, এবং এর কারণ machine learning container। Immich তার model-গুলো একটি পৃথক immich-machine-learning service-এ চালায়। এই service CLIP (contrastive language image pretraining) এবং face detection model memory-তে load করে। 2 GB মেশিনে kernel ওই container-টি kill করে। তখন এটি code 137 দিয়ে exit করেছে দেখা যায়। এটি signal 9 দিয়ে kill হওয়া process-এর status, এবং Docker-এ out of memory kill এভাবেই দেখা যায়। PhotoPrism-এর built-in model-গুলো ONNX-এ চলে। তাদের documentation অনুযায়ী, এগুলো সাধারণত সব ধরনের hardware-এ ভালো কাজ করে। কম memory-এর জন্য PhotoPrism-এ একটি documented fallback-ও আছে: 1 GB বা তার কম memory-র মেশিনে এটি RAW conversion এবং face recognition বন্ধ করে দেয়। তবে এটি stability-এর নিশ্চয়তা নয়। 3 GB minimum-এর নিচে project instability এবং performance সমস্যা সম্পর্কে সতর্ক করে। তাই এই সীমাকে প্রকৃত minimum হিসেবেই ধরুন।
PhotoPrism-এর documentation server-এ অন্তত 4 GB swap রাখার বিষয়ে স্পষ্ট। Immich-এর requirements page-এ swap-এর উল্লেখ নেই, কিন্তু ছোট মেশিনে swap তার machine learning container-কে অতিরিক্ত memory headroom দেয়। যেকোনো একটি install করার আগেই 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 -hfree -h এখন Swap: line দেখানো উচিত, যেখানে 4.0Gi থাকবে। এটি 0B দেখালে বুঝবেন swapon ব্যর্থ হয়েছে। সাধারণত filesystem fallocate সমর্থন করে না বলেই এমন হয়, এবং sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 হলো fallback। এখানেও container-এর memory ceiling গুরুত্বপূর্ণ। Docker Compose-এ memory limit নির্ধারণ করলে একটি অতিরিক্ত memory ব্যবহারকারী service পুরো মেশিন অচল করে দিতে পারে না। ব্যতিক্রম PhotoPrism নিজেই: তার documentation container-এ hard memory limit না দিতে পরামর্শ দেয়, কারণ বড় file index করার সময় অল্প সময়ের জন্য অতিরিক্ত memory প্রয়োজন হয় এবং limit দিলে অপ্রত্যাশিত restart হতে পারে।
আরেকটি requirement অনেকেই খেয়াল করেন না। Immich-এর Postgres database-কে প্রকৃত ownership ও permission-সহ একটি সাধারণ Unix filesystem-এ, local storage-এ রাখতে হবে। এটি কখনোই network share-এ রাখা যাবে না। PhotoPrism তার database file shared network folder-এ না রাখতে সতর্ক করে এবং local SSD storage-কে এগুলোর জন্য সবচেয়ে ভালো স্থান বলে। কোনো app-এর database mounted object store-এ রেখে নিরাপদে চালানো যায় না।
প্রতিটি ইনস্টল কীভাবে করবেন
দুটি ইনস্টলই একটি vendor compose file এবং একটি command নিয়ে গঠিত। প্রথমে Docker Engine এবং Compose plugin সেট আপ করুন, যেমন VPS-এ Docker Compose নিয়ে আমাদের গাইডে দেখানো হয়েছে।
Immich প্রতিটি release-এর সঙ্গে তার compose file এবং একটি example environment file প্রকাশ করে।
sudo mkdir -p /opt/immich && cd /opt/immich
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.envকিছু শুরু করার আগে .env সম্পাদনা করুন। UPLOAD_LOCATION-এ আপনার মূল ফাইলগুলো সংরক্ষিত হবে। DB_PASSWORD-এ কার্যকর default দেওয়া থাকে। Immich এটিকে একটি random password-এ পরিবর্তন করার পরামর্শ দেয়, যদিও এটি বাধ্যতামূলক নয়। Postgres publicভাবে exposed নয়, তাই passwordটি শুধু local authentication-এর জন্য ব্যবহৃত হয়। তবু random password সেট করতে কোনো অতিরিক্ত খরচ নেই। শুধু A-Za-z0-9-এ থাকা character ব্যবহার করুন, কারণ Docker value parse করার সময় অন্য character সমস্যা তৈরি করতে পারে বলে Immich-এর documentation-এ বলা হয়েছে। এরপর এটি চালু করুন।
docker compose up -d
docker compose psWeb interface port 2283-এ সাড়া দেয়। ওই page-এর মাধ্যমে নিবন্ধিত প্রথম account administrator হয়। তাই এটি দ্রুত খুলে account register করুন। Internet-এ কোনো open instance ফেলে রাখবেন না।
PhotoPrism একটি compose file প্রকাশ করে, যাতে MariaDB আগে থেকেই অন্তর্ভুক্ত থাকে।
sudo mkdir -p /opt/photoprism && cd /opt/photoprism
wget https://dl.photoprism.app/docker/compose.yamlপ্রথমবার শুরু করার আগে compose.yaml খুলে PHOTOPRISM_ADMIN_PASSWORD পরিবর্তন করুন। Documentation-এ বিষয়টি স্পষ্টভাবে বলা হয়েছে: file-এ থাকা initial password দিয়েই app শুরু হয়, minimum length 8 characters, এবং public server-এ default value কখনো ব্যবহার করা যাবে না। একই সময়ে originals volume-কে আপনার photos থাকা folder-এ সেট করুন।
docker compose up -d
docker compose logs -f photoprismPhotoPrism user admin ব্যবহার করে port 2342-এ সাড়া দেয়। কোনো app-ই সরাসরি exposed করা উচিত নয়। সামনে TLS (transport layer security) সহ একটি reverse proxy বসান। Docker, TLS এবং backup সহ self-hosted Nextcloud-এর জন্য ব্যবহৃত একই ধরনের setup ব্যবহার করতে পারেন। বিকল্পভাবে server private রাখুন এবং VPN-এর মাধ্যমে এতে সংযোগ করুন। ওই VPS-এ photos ছাড়াও অন্য কিছু host করা হলে, যোগ করা প্রতিটি service-এর ক্ষেত্রেও একই সীমাবদ্ধতা বজায় রাখুন। কারণ একটি self-hosted RustDesk relay-এর জন্য শুধু তার নিজস্ব দুটি port reachable থাকাই যথেষ্ট; অন্য কোনো port reachable রাখার প্রয়োজন নেই।
কোনটির ফোন অ্যাপ ভালো
এই দিকটিতে দুটি প্রকল্পের পার্থক্য সবচেয়ে বেশি। অধিকাংশ মানুষ শেষ পর্যন্ত Immich বেছে নেওয়ার এটিই প্রধান কারণ।
Immich Android এবং iOS-এর জন্য অফিসিয়াল অ্যাপ প্রকাশ করে। এগুলো ব্যাকগ্রাউন্ডে camera roll backup করে। অর্থাৎ কাউকে কোনো কিছু খুলতে না হলেও নতুন ছবি ফোন থেকে চলে যায়। বাড়ির বাইরে এটি ব্যবহার করতে Immich তিনটি পদ্ধতি উল্লেখ করে: WireGuard বা OpenVPN-এর মতো VPN, Tailscale, অথবা HTTPS পরিবেশনকারী reverse proxy। reverse proxy ব্যবহার করলে প্রতিটি ফোনে VPN অ্যাপ ইনস্টল না করেই ফোনের অ্যাপগুলো সংযোগ করতে পারে। Immich সতর্ক করে যে অতিরিক্ত configuration ছাড়া port 2283 সরাসরি Internet-এ forward করা যাবে না।
PhotoPrism-এর কোনো অফিসিয়াল native app নেই। এটি একটি progressive web app প্রকাশ করে, যা browser থেকে home screen-এ যোগ করা যায়। ফোন থেকে sync করার পদ্ধতি হিসেবে এটি WebDAV (web distributed authoring and versioning) নথিভুক্ত করে। এ জন্য প্রকল্পটি PhotoSync নামের একটি third party app ব্যবহারের পরামর্শ দেয়। এই app-টিকে WebDAV-এর মাধ্যমে /import/ বা /originals/ directory-তে নির্দেশ করতে হয়। এটি কাজ করে। তবে এখানে Immich নিজের client-এর ভেতরে যে কাজটি করে, সেটিই একটি paid third party app করছে।
যদি একাধিক family member-এর জন্য automatic phone backup প্রয়োজন হয়, তাহলে সিদ্ধান্ত স্পষ্ট। Immich।
মেশিন লার্নিং আসলে কী সুবিধা দেয়
Immich CLIP ব্যবহার করে আপনার লাইব্রেরিতে semantic search চালায়। তাই "red bicycle in snow"-এর মতো query এমন ছবিও খুঁজে পায়, যেগুলো কেউ কখনও tag করেনি। এটি face detection, clustering এবং duplicate detection-ও করে। CPU-তে বড় import index করতে background-এ কয়েক ঘণ্টা লাগতে পারে। এটি স্বাভাবিক এবং এর জন্য GPU (graphics processing unit) প্রয়োজন হয় না।
PhotoPrism একটি built-in ONNX model দিয়ে ছবিকে বিভিন্ন label-এ শ্রেণিবদ্ধ করে। ONNX face model ব্যবহার করে মুখ শনাক্ত করে এবং সেগুলোকে people হিসেবে group করে। এছাড়া location metadata পড়ে places map তৈরি করে। Label ও caption-এর জন্য চাইলে এর config folder-এ থাকা একটি vision.yml file-এর মাধ্যমে Ollama বা OpenAI ব্যবহার করা যায়। Map-ই অনেক ব্যবহারকারীকে ধরে রাখে। কোথায় ছবি তোলা হয়েছে সেই তথ্য অনুযায়ী index করা লাইব্রেরি বিশ বছর ধরে জমা হওয়া ছবি দেখার সম্পূর্ণ ভিন্ন উপায় দেয়। একই ধারণা অন্য media collection-এও প্রযোজ্য। Jellyfin-এর জন্য Halcyon-এর 90s video store front end চলচ্চিত্রের ক্ষেত্রে সেই একই পদ্ধতি ব্যবহার করে; list-এর বদলে shelf অনুযায়ী browse করা যায়। Face recognition বিনামূল্যের Community edition-এ অন্তর্ভুক্ত। Paid Essentials এবং Plus membership-এ আরও কিছু সুবিধা যোগ হয়, যেমন সমৃদ্ধ map layer, আরও বেশি user role এবং user management interface। October 2026 অনুযায়ী, বার্ষিক billing-এ এর দাম মাসে কয়েক euro থেকে শুরু।
Immich-এ paywalled feature নেই এবং project-এর বক্তব্য অনুযায়ী ভবিষ্যতেও থাকবে না। Immich optional lifetime product key বিক্রি করে। July 2024-এ Immich ঘোষিত দামে একটি key-এর মূল্য একজন user-এর জন্য $25, অথবা পুরো server-এর জন্য $100। তবে key কিনলে কোনো feature unlock হয় না। আপনি কখনও অর্থ প্রদান না করলেও Immich কোনো সীমাবদ্ধতা ছাড়াই কাজ করে। PhotoPrism-এর core বিনামূল্যে, তবে optional paid extra রয়েছে।
ব্যাকআপই নির্ধারণ করে আপনি ডেটা ধরে রাখতে পারবেন কি না
ব্যাকআপ ছাড়া একটি photo server-এ একটি disk failure হলেই পরিবারের বছরের পর বছর জমা করা সব ছবি হারিয়ে যেতে পারে। উভয় অ্যাপের জন্য দুটি ধরনের ব্যাকআপ প্রয়োজন: database এবং files।
Immich-এর ক্ষেত্রে Postgres container থেকে database dump নিন এবং upload location কপি করুন।
docker exec -t immich_postgres pg_dump --clean --if-exists --dbname=immich --username=postgres | gzip > /backup/immich-db.sql.gzএরপর UPLOAD_LOCATION-এর ব্যাকআপ নিন। অপরিবর্তনীয় ডেটা থাকা folder-গুলো হল upload, library এবং profile। thumbs এবং encoded-video folder পুনরায় তৈরি করা যায়, তবে এতে কয়েক ঘণ্টা CPU time লাগতে পারে। শুধু database dump থেকে কোনো কিছু restore করা যায় না, কারণ এতে কেবল metadata থাকে।
PhotoPrism-এর index-এর জন্য নিজস্ব command রয়েছে।
docker compose exec photoprism photoprism backup -i -fএটি storage/backup/-এর অধীনে একটি SQL dump লেখে। এরপর originals folder এবং storage folder কপি করুন। PhotoPrism প্রতিটি photo-এর বিবরণসহ sidecar YAML file-ও লেখে। তাই index হারিয়ে গেলেও শুধু file ব্যবহার করে এটি পুনর্নির্মাণ করা যায়। কয়েক দশক ধরে সংরক্ষণ করার পরিকল্পনা থাকা archive-এর জন্য এটি একটি গুরুত্বপূর্ণ সুবিধা।
আপনি যেটিই বেছে নিন, নির্ধারিত সময়সূচি অনুযায়ী সেই backup-গুলো encrypted, deduplicated restic backup হিসেবে remote storage-এ সার্ভারের বাইরে পাঠান। Library-র একই disk-এ থাকা backup প্রকৃত backup নয়। Job ব্যর্থ হলে যেন স্পষ্টভাবে notification পাঠায়, কারণ মার্চে নীরবে বন্ধ হয়ে যাওয়া backup এবং গত রাতে সফলভাবে চলা backup—যেদিন backup প্রয়োজন হবে, তার আগ পর্যন্ত—একই রকম দেখায়। আর self-hosted ntfy server সেই ব্যর্থতার notification একই সন্ধ্যায় আপনার ফোনে পাঠাবে।
কোনটি চালাবেন
আপনার ছবি যদি ফোনে থাকে, একাধিক ব্যক্তির camera roll backup করার প্রয়োজন হলে এবং আপনি সার্ভারকে 6 GB বা তার বেশি RAM দিতে পারলে Immich চালান। এটি নিজে host করা যায় এমন Google Photos-এর সবচেয়ে কাছের বিকল্প, এবং এর মূল সুবিধা হলো mobile experience। আমাদের ধাপে ধাপে Immich install guide-এ memory kill এবং upgrade-এর ঝুঁকিগুলো বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে।
আপনার disk-এ আগে থেকেই photo archive থাকলে, maps ও metadata এবং নিজের folder structure বজায় রাখা গুরুত্বপূর্ণ হলে, অথবা আপনার VPS-এ 4 GB RAM থাকলে এবং swapping করা library-এর বদলে কার্যকর library চাইলে PhotoPrism চালান। এটি photo curation-এর জন্য ভালো এবং ছোট hardware-এর ওপর কম চাপ ফেলে।
দুটিই চালানো যুক্তিসঙ্গত হতে পারে। Immich প্রতিদিনের phone ingestion সামলাবে। বছরে একবার আপনি রাখতে চান এমন ছবিগুলো archive-এ সাজিয়ে PhotoPrism-কে সেগুলো index করতে দিতে পারেন। দুটির মধ্যে conflict হয় না, কারণ PhotoPrism folder পড়ে, আর Immich নিজের data নিজে পরিচালনা করে।
FAQ
PhotoPrism এবং Immich কি একই photo folder ব্যবহার করতে পারে?
দুই দিকেই নিরাপদে নয়। PhotoPrism একটি originals folder index করে এবং read-only mode-এ না চললে সেখানে লেখার মতো feature রয়েছে। অন্যদিকে Immich তার upload location-এর contents-এর মালিকানা ধরে নিয়ে কাজ করে। Immich-এর library folder-এর একটি read-only copy PhotoPrism-কে browse করার জন্য দেখাতে পারেন। তবে দুইটি app-কে একই file manage করতে দেবেন না। PhotoPrism index করার সময় Immich-এর storage template asset সরাতে বা rename করতে পারে।
আমার photo-গুলোর একমাত্র copy রাখার জন্য Immich কি যথেষ্ট stable?
কোনো self-hosted app-এর কাছেই কোনো কিছুর একমাত্র copy রাখা উচিত নয়। Immich এখন semantic versioning অনুসরণ করে এবং জানায় যে breaking change major release-এই সীমিত থাকে। তাই IMMICH_VERSION-কে v3-এর মতো একটি major version tag-এ pin করুন, release note পড়ুন, তারপর docker compose pull && docker compose up -d দিয়ে upgrade করুন। Downgrade supported নয়, একই minor version-এর মধ্যেও নয়। তাই প্রতিটি upgrade-এর আগে database dump নিন। Original file-গুলোর server-এর বাইরে backup রাখুন। এতে ঝুঁকি কম থাকে।
Immich-এর machine learning container বারবার restart হয় কেন?
সাধারণত অতিরিক্ত memory ব্যবহার করার কারণে এটি kill হয়। docker compose ps --all চালান, কারণ ওই flag ছাড়া stopped container দেখা যায় না। এরপর machine learning service code 137 দিয়ে exit করছে কি না দেখুন। এই code-এর অর্থ process-টি signal 9 দিয়ে kill হয়েছে। সাধারণত এর কারণ kernel-এর out of memory killer, তবে এটিই একমাত্র কারণ নয়। তাই sudo dmesg | grep -i 'out of memory' দিয়ে বিষয়টি নিশ্চিত করুন। Swap যোগ করুন, অথবা 4 GB machine-এ machine learning সম্পূর্ণ disable করুন। Container-এর memory limit সেট করলে process throttle হয় না। Limit-এ পৌঁছালে process এখনও kill হয়, তবে server-এর বাকি অংশের memory শেষ করে ফেলে না। Machine learning ছাড়া smart search এবং face recognition কাজ করবে না। Immich-এর বাকি অংশ ঠিকমতো চলবে।
PhotoPrism-এর কি MariaDB দরকার, নাকি SQLite ব্যবহার করা যাবে?
SQLite কাজ করে এবং personal library-এর জন্য যথেষ্ট। তবে SQLite ব্যবহার করলে PhotoPrism সর্বোচ্চ four worker-এ সীমাবদ্ধ থাকে। Documentation-এ high concurrency ভালোভাবে সামলানোর জন্য MariaDB-তে switching করার পরামর্শ দেওয়া হয়েছে। Project-এর প্রকাশিত compose file-এ MariaDB আগে থেকেই অন্তর্ভুক্ত আছে। তাই recommended path-টিই default।
আমার library-এর আকারের অতিরিক্ত কতটা disk space রাখা উচিত?
দুইটি app-এর ক্ষেত্রেই original-এর আকারের উপর 10 থেকে 20 percent অতিরিক্ত রাখুন। এতে generated thumbnail এবং transcoded video preview-এর জায়গা হবে। 200 GB collection-এর জন্য শুধু library-তেই প্রায় 220 থেকে 240 GB দরকার হবে। এর সঙ্গে database এবং ভবিষ্যৎ বৃদ্ধির জন্য অতিরিক্ত জায়গা রাখুন। একই volume-এ সম্পূর্ণ local backup copy রাখলে original এবং সেই copy-এর জন্য অন্য কিছু গণনা করার আগেই অন্তত 400 GB দরকার হবে। তাই প্রায় 450 GB budget করুন, অথবা copy-টি আলাদা volume-এ রাখুন।