مقایسه PhotoPrism و Immich: کدام سرور عکس بهتر است؟
تفاوت اصلی PhotoPrism و Immich در نحوه مدیریت فایلهاست. این راهنما با بررسی مصرف رم، قابلیتهای اپلیکیشن موبایل و دستورات بکآپ Docker، به شما کمک میکند انتخاب درستی داشته باشید.
مقایسه PhotoPrism و Immich: پاسخ کوتاه
انتخاب بین PhotoPrism و Immich، انتخاب بین دو ابزار با وظایف متفاوت است، نه دو نسخه از یک محصول واحد. Immich جایگزینی برای Google Photos است: یک اپلیکیشن موبایل بهطور خودکار از تصاویر دوربین شما نسخه پشتیبان تهیه میکند و تایملاینی که ارائه میدهد برای هر کسی که از گالری گوشی استفاده کرده، آشناست. در مقابل، PhotoPrism کتابخانهای از عکسها را که از قبل دارید سازماندهی میکند: این برنامه پوشههای فایل روی دیسک را ایندکس کرده، متادیتای آنها را میخواند، آنها را روی نقشه قرار میدهد و فایلها را دقیقاً در همان جایی که هستند باقی میگذارد.
اگر مشکل شما این است که «حافظه گوشی پر شده و میخواهم از Google Photos خارج شوم»، Immich را انتخاب کنید. اگر مشکل شما این است که «400 GB عکس روی یک درایو دارم و نمیتوانم چیزی در میان آنها پیدا کنم»، PhotoPrism را انتخاب کنید. هر دو پروژه متنباز هستند، هر دو به عنوان Docker container روی یک VPS معمولی اجرا میشوند و هر دو کتابخانه شما را بدون ارسال هیچ دادهای به شخص ثالث، ایندکس و جستجو میکنند.
تفاوت در فلسفه و چرایی تعیینکننده بودن آن
Immich مالک فایلهاست. شما آن را به یک مسیر آپلود اشاره میدهید، اپلیکیشن موبایل یا آپلودر وب، فایلهای اصلی را ارسال میکنند و Immich آنها را در مسیر اختصاصی خود و با نامگذاری خودش ذخیره میکند. پایگاه داده، حقیقت مربوط به آلبومها، چهرهها و جستجو را در اختیار دارد. این طراحی همان چیزی است که تجربه کار با موبایل را بهبود میبخشد، زیرا سرور همیشه از وضعیت کامل تمام داراییها آگاه است.
PhotoPrism فایلها را میخواند. شما یک پوشه originals را که از قبل کنترل آن را در دست دارید mount میکنید و PhotoPrism روی آن یک ایندکس میسازد. ساختار درختی دایرکتوریهای شما دستنخورده باقی میماند. اگر فردا PhotoPrism را حذف کنید، عکسها در همان پوشهها با همان نامها باقی میمانند و فایلهای جانبی YAML که PhotoPrism برای توصیف آموختههایش نوشته است، در پوشه ذخیرهسازی خودش باقی میمانند؛ جایی که بهصورت پیشفرض آنها را نگه میدارد.
همین یک تفاوت، اکثر موارد دیگر را توضیح میدهد. Immich پشتیبانی قوی از موبایل دارد زیرا فرآیند دریافت فایلها را کنترل میکند. PhotoPrism قابلیت مدیریت کتابخانه (curation) قدرتمندی دارد زیرا هرگز با ساختار موجود شما تداخلی ایجاد نمیکند. Immich پاسخ بهتری برای خانوادهای است که عکسهایشان روی گوشیها قرار دارد. PhotoPrism پاسخ بهتری برای آرشیوی است که روی دیسک نگهداری میشود.
اشتهای سختافزاری: Immich منابع بیشتری میطلبد
کفهای حافظهٔ مستندشده فاصلهٔ زیادی با هم دارند و در یک VPS کوچک، این معمولاً عامل تعیینکننده است.
دادههای پشت این نمودار
[
{
"label": "Immich",
"min_ram_gb": 6
},
{
"label": "PhotoPrism",
"min_ram_gb": 3
}
]Immich مقدار 6 گیگابایت رم را به عنوان حداقل و 8 گیگابایت را به عنوان مقدار پیشنهادی مستند کرده است، با این نکته که یک ماشین 4 گیگابایتی تنها در صورتی میتواند آن را اجرا کند که یادگیری ماشین (machine learning) غیرفعال باشد. PhotoPrism مقدار 3 گیگابایت حافظهٔ فیزیکی و دو هسته CPU را مستند کرده و میگوید فراتر از این حداقل، مقدار رم باید با تعداد هستهها متناسب باشد.
این شکاف واقعی است و از کانتینر یادگیری ماشین ناشی میشود. Immich مدلهای خود را در یک سرویس immich-machine-learning جداگانه اجرا میکند که مدلهای CLIP (آموزش تقابلی زبان و تصویر) و تشخیص چهره را در حافظه بارگذاری میکند. روی یک ماشین 2 گیگابایتی، هسته (kernel) آن کانتینر را میکشد و شما خروج آن را با کد 137 میبینید؛ وضعیتی برای فرآیندی که با سیگنال 9 کشته شده است، که این همان روش نمایش OOM (کمبود حافظه) در Docker است. مدلهای داخلی PhotoPrism روی ONNX اجرا میشوند که طبق مستنداتش، عموماً روی انواع سختافزار عملکرد خوبی دارند و برای حافظهٔ محدود یک جایگزین مستند دارد: در ماشینهایی با 1 گیگابایت رم یا کمتر، تبدیل RAW و تشخیص چهره را غیرفعال میکند. البته این تضمینکنندهٔ پایداری نیست. زیر حداقل 3 گیگابایتی، پروژه نسبت به ناپایداری و مشکلات عملکرد هشدار میدهد، بنابراین این کف را به عنوان یک حد نهایی در نظر بگیرید.
مستندات PhotoPrism صراحتاً خواستار حداقل 4 گیگابایت swap روی سرور هستند. صفحهٔ نیازمندیهای Immich به swap اشارهای نمیکند، اما 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: را چاپ کند که 4.0Gi را نشان میدهد. اگر 0B را چاپ کرد، یعنی swapon شکست خورده است؛ معمولاً به این دلیل که فایلسیستم از fallocate پشتیبانی نمیکند و sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 جایگزین آن است. سقف حافظهٔ کانتینرها نیز در اینجا اهمیت دارد و تنظیم محدودیت حافظه در Docker Compose روشی است که از پایین آوردن کل سرور توسط یک سرویس پرمصرف جلوگیری میکنید. استثنا خود PhotoPrism است: مستنداتش توصیه میکنند محدودیت حافظهٔ سخت (hard memory limit) روی کانتینرش اعمال نکنید، زیرا ایندکس کردن فایلهای بزرگ بهطور لحظهای به حافظهٔ بیشتری نیاز دارد و محدودیت میتواند باعث ریاستارتهای غیرمنتظره شود.
یک نیازمندی دیگر کاربران را غافلگیر میکند. دیتابیس Postgres مربوط به Immich باید روی یک فایلسیستم معمولی Unix با مالکیت و مجوزهای واقعی، روی حافظهٔ محلی (local storage) قرار گیرد و هرگز نباید روی network share باشد. PhotoPrism هشدار میدهد که فایلهای دیتابیس آن را هرگز روی یک پوشهٔ شبکهٔ اشتراکی ذخیره نکنید و حافظهٔ SSD محلی را بهترین مکان برای آنها میداند. اجرای هیچکدام از این دو برنامه با دیتابیس روی یک object store متصلشده (mounted) ایمن نیست.
نحوه نصب هر کدام
هر دو نصب شامل یک فایل compose از سمت فروشنده و یک دستور هستند. ابتدا Docker Engine و افزونه Compose را طبق راهنمای ما در راهنمای ما برای Docker Compose روی VPS راهاندازی کنید.
Immich فایل compose و یک نمونه فایل environment را با هر release منتشر میکند.
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 با یک مقدار پیشفرض کارآمد ارائه میشود و Immich توصیه میکند آن را به یک رمز عبور تصادفی تغییر دهید، هرچند الزامی نیست. Postgres بهصورت عمومی در دسترس نیست، بنابراین رمز عبور فقط برای احراز هویت محلی استفاده میشود، اما انتخاب یک رمز تصادفی هزینهای ندارد. فقط از کاراکترهای A-Za-z0-9 استفاده کنید، زیرا مستندات Immich میگویند سایر کاراکترها هنگام تجزیه مقدار توسط Docker ممکن است باعث بروز مشکل شوند. سپس آن را اجرا کنید.
docker compose up -d
docker compose psرابط وب روی پورت 2283 پاسخ میدهد. اولین حسابی که از طریق آن صفحه ثبتنام شود، مدیر (administrator) خواهد بود؛ بنابراین بلافاصله به آن دسترسی پیدا کرده و ثبتنام کنید تا یک نمونه باز روی اینترنت باقی نماند.
PhotoPrism یک فایل compose ارائه میدهد که از قبل شامل MariaDB است.
sudo mkdir -p /opt/photoprism && cd /opt/photoprism
wget https://dl.photoprism.app/docker/compose.yamlفایل compose.yaml را باز کنید و پیش از اولین اجرا، PHOTOPRISM_ADMIN_PASSWORD را تغییر دهید. مستندات در این مورد صریح هستند: برنامه با هر رمز عبور اولیهای که در آن فایل باشد شروع به کار میکند، حداقل طول آن 8 کاراکتر است و مقدار پیشفرض هرگز نباید روی یک سرور عمومی استفاده شود. همزمان، volume مربوط به originals را روی پوشهای که عکسهای شما را نگه میدارد تنظیم کنید.
docker compose up -d
docker compose logs -f photoprismPhotoPrism روی پورت 2342 با کاربر admin پاسخ میدهد. هیچکدام از این برنامهها نباید مستقیماً در معرض اینترنت قرار بگیرند. یک reverse proxy با TLS (امنیت لایه انتقال) در مقابل آن قرار دهید؛ همان ساختاری که برای یک Nextcloud خودمیزبان با Docker، TLS و پشتیبانگیری استفاده میشود، یا سرور را خصوصی نگه دارید و از طریق VPN به آن متصل شوید. اگر این VPS قرار است چیزی فراتر از عکسها را میزبانی کند، همین محدودیت را برای هر سرویسی که اضافه میکنید اعمال کنید، زیرا یک رله RustDesk خودمیزبان تنها به دو پورت اختصاصی خود برای دسترسی نیاز دارد و نه هیچ چیز دیگر.
کدامیک اپلیکیشن موبایل بهتری دارد
این بخشی است که دو پروژه بیشترین فاصله را با هم دارند و دلیل اصلی انتخاب Immich توسط اکثر کاربران همین است.
Immich اپلیکیشنهای رسمی برای Android و iOS ارائه میدهد. این اپلیکیشنها از Camera Roll در پسزمینه نسخه پشتیبان تهیه میکنند؛ به این معنی که عکسهای جدید بدون نیاز به باز کردن برنامه، از گوشی خارج میشوند. برای استفاده از آن خارج از خانه، Immich سه روش را مستند کرده است: استفاده از VPN مانند WireGuard یا OpenVPN، استفاده از Tailscale، یا استفاده از یک reverse proxy که HTTPS ارائه میدهد. Reverse proxy همان روشی است که به اپلیکیشنهای موبایل اجازه میدهد بدون نیاز به یک اپلیکیشن VPN روی هر گوشی متصل شوند. Immich هشدار میدهد که هرگز پورت 2283 را بدون پیکربندی اضافی مستقیماً روی اینترنت باز (Forward) نکنید.
PhotoPrism هیچ اپلیکیشن بومی (Native) رسمی ندارد. این پروژه یک Progressive Web App ارائه میدهد که میتوانید آن را از طریق مرورگر به صفحه اصلی گوشی اضافه کنید. برای همگامسازی از گوشی، مستندات آن استفاده از WebDAV (مخفف Web Distributed Authoring and Versioning) را پیشنهاد میدهند. این پروژه برای این کار استفاده از یک اپلیکیشن شخص ثالث به نام PhotoSync را توصیه میکند که روی دایرکتوری /import/ یا /originals/ از طریق WebDAV تنظیم شده باشد. این روش کار میکند، اما یک اپلیکیشن پولی شخص ثالث است که کاری را انجام میدهد که Immich در داخل کلاینت اختصاصی خود ارائه میدهد.
اگر نیاز اصلی شما تهیه نسخه پشتیبان خودکار از گوشی برای چندین عضو خانواده است، پاسخ مشخص است: Immich.
یادگیری ماشین واقعاً چه چیزی به شما ارائه میدهد
برنامه Immich با استفاده از CLIP، جستجوی معنایی را روی کتابخانه شما انجام میدهد؛ بنابراین پرسوجویی مانند "دوچرخه قرمز در برف" عکسهایی را پیدا میکند که هیچکس هرگز برچسبگذاری نکرده است. این برنامه همچنین تشخیص و دستهبندی چهره و شناسایی تصاویر تکراری را انجام میدهد. نمایهسازی (indexing) یک واردات بزرگ روی CPU ممکن است ساعتها در پسزمینه طول بکشد که امری عادی است و نیازی به GPU (واحد پردازش گرافیکی) ندارد.
برنامه PhotoPrism تصاویر را با استفاده از یک مدل ONNX داخلی در دستهبندیهای مختلف قرار میدهد، چهرهها را شناسایی و آنها را با مدلهای چهره ONNX گروهبندی میکند و متادیتای موقعیت مکانی را برای ساخت نقشه مکانها میخواند. یک فایل vision.yml در پوشه پیکربندی آن میتواند در صورت تمایل شما، مدلهای Ollama یا OpenAI را برای برچسبگذاری و کپشننویسی جایگزین کند. نقشه، قابلیتی است که کاربران به خاطر آن میمانند: کتابخانهای که بر اساس محل وقوع رویدادها نمایهسازی شده، روشی کاملاً متفاوت برای مرور بیست سال عکس است. همین ایده روی سایر مجموعههای رسانهای نیز کار میکند و رابط کاربری فروشگاه ویدیوی دهه 90 Halcyon برای Jellyfin نسخه سینمایی آن است که به جای لیست، بر اساس قفسه مرور میکند. تشخیص چهره در نسخه رایگان Community گنجانده شده است. اشتراکهای پولی Essentials و Plus امکانات اضافی مانند لایههای نقشه غنیتر، نقشهای کاربری بیشتر و رابط مدیریت کاربر را اضافه میکنند که قیمت آنها از چند یورو در ماه شروع شده و از اکتبر 2026 به صورت سالانه صورتحساب میشود.
برنامه Immich هیچ قابلیت پولی ندارد و تیم پروژه اعلام کرده که هرگز نخواهد داشت. این پروژه کلیدهای محصول مادامالعمر اختیاری را به فروش میرساند که طبق قیمتهای اعلامشده در ژوئیه 2024، برای یک کاربر 25 دلار و برای کل سرور 100 دلار است، اما خرید آن هیچ قابلیتی را باز نمیکند و Immich بدون پرداخت هزینه نیز بدون محدودیت کار میکند. هسته اصلی PhotoPrism رایگان است و امکانات اضافی پولی به صورت اختیاری ارائه میشود.
پشتیبانگیری؛ تعیینکننده ماندگاری دادهها
یک سرور عکس بدون پشتیبان، تنها به اندازه یک خرابی دیسک با از دست رفتن تمام خاطرات یک خانواده فاصله دارد. هر دو برنامه به دو نوع پشتیبان نیاز دارند: پایگاه داده و فایلها.
برای Immich، پایگاه داده را از کانتینر Postgres تخلیه (dump) کرده و محل آپلودها را کپی کنید.
docker exec -t immich_postgres pg_dump --clean --if-exists --dbname=immich --username=postgres | gzip > /backup/immich-db.sql.gzسپس از UPLOAD_LOCATION پشتیبان بگیرید. پوشههایی که دادههای غیرقابل جایگزین را نگه میدارند عبارتند از upload، library و profile. پوشههای thumbs و encoded-video قابل بازسازی هستند، هرچند این کار ساعتها زمان CPU میگیرد. یک فایل dump از پایگاه داده به تنهایی چیزی را بازیابی نمیکند، زیرا فقط حاوی متادیتا است.
برای PhotoPrism، ایندکس دستور مخصوص به خود را دارد.
docker compose exec photoprism photoprism backup -i -fاین دستور یک فایل dump از نوع SQL در مسیر storage/backup/ مینویسد. سپس پوشه originals و پوشه storage را کپی کنید. از آنجا که PhotoPrism فایلهای جانبی YAML را نیز برای توصیف هر عکس مینویسد، ایندکس از دست رفته را میتوان تنها از روی فایلها بازسازی کرد؛ این یک مزیت واقعی برای آرشیوی است که قصد دارید دههها آن را حفظ کنید.
هر گزینهای را که انتخاب میکنید، طبق یک برنامهٔ زمانبندیشده، نسخههای پشتیبان را با نسخههای پشتیبان رمزگذاریشده و deduplicated با restic در فضای ذخیرهسازی راه دور از سرور خارج کنید. نسخهٔ پشتیبانی که روی همان دیسک کتابخانه قرار دارد، نسخهٔ پشتیبان محسوب نمیشود. کاری کنید که در صورت شکست، job اعلان ارسال کند؛ زیرا نسخهٔ پشتیبانی که در ماه March بیسروصدا متوقف شده است، تا روزی که به آن نیاز پیدا کنید دقیقاً مانند نسخهای به نظر میرسد که شب گذشته اجرا شده است، و یک سرور ntfy خودمیزبان همان شب این خطا را به تلفن شما ارسال میکند.
کدامیک را باید اجرا کنید
اگر عکسهای شما روی گوشی هستند، اگر بیش از یک نفر نیاز به پشتیبانگیری از camera roll دارد، و اگر میتوانید 6 GB رم یا بیشتر به سرور اختصاص دهید، Immich را اجرا کنید. این برنامه نزدیکترین جایگزین برای Google Photos است که میتوانید خودتان میزبانی کنید و تجربه کاربری موبایل، نقطه قوت اصلی آن است. راهنمای گامبهگام نصب Immich ما، جزئیات مربوط به اتمام حافظه (memory kills) و تلههای ارتقا را بهطور کامل پوشش میدهد.
اگر از قبل آرشیو عکس روی دیسک دارید، اگر به نقشهها، متادیتا و حفظ ساختار پوشهبندی خود اهمیت میدهید، یا اگر VPS شما 4 GB رم دارد و ترجیح میدهید یک کتابخانه فعال داشته باشید تا سیستمی که درگیر swap است، PhotoPrism را اجرا کنید. این ابزار برای مدیریت و دستهبندی عکسها بهتر است و با سختافزارهای ضعیفتر سازگاری بیشتری دارد.
اجرای همزمان هر دو نیز منطقی است. Immich دریافت روزانه عکس از گوشی را مدیریت میکند و شما میتوانید سالی یکبار عکسهای منتخب را به آرشیو خود منتقل کنید تا PhotoPrism آنها را ایندکس کند. این دو با هم تداخلی ندارند، زیرا PhotoPrism پوشهها را میخواند در حالی که Immich مالکیت فایلهای خودش را دارد.
FAQ
آیا PhotoPrism و Immich میتوانند از یک پوشه عکس مشترک استفاده کنند؟
بهصورت دوطرفه و ایمن، خیر. PhotoPrism پوشه originals را ایندکس میکند و اگر در حالت read-only اجرا نشود، قابلیتهایی دارد که در آن پوشه مینویسند؛ در حالی که Immich انتظار دارد مالک محتوای محل آپلود خود باشد. شما میتوانید PhotoPrism را به یک کپی read-only از پوشه library در Immich متصل کنید تا آن را مرور کنید، اما اجازه ندهید هر دو برنامه همزمان فایلهای یکسانی را مدیریت کنند، زیرا قالب ذخیرهسازی Immich ممکن است در حین ایندکسشدن توسط PhotoPrism، داراییها را جابهجا یا تغییر نام دهد.
آیا Immich بهاندازه کافی پایدار است که تنها نسخه عکسهای من را نگهداری کند؟
هیچ برنامه self-hosted نباید تنها نسخه از دادههای شما باشد. Immich اکنون از semantic versioning پیروی میکند و اعلام کرده که تغییرات ساختارشکن (breaking changes) محدود به نسخههای اصلی (major releases) است؛ بنابراین IMMICH_VERSION را روی یک تگ نسخه اصلی مانند v3 ثابت (pin) کنید، یادداشتهای انتشار را بخوانید و سپس با docker compose pull && docker compose up -d ارتقا دهید. دانگرید (Downgrade) پشتیبانی نمیشود، حتی در یک نسخه فرعی (minor version)؛ بنابراین پیش از هر ارتقا، از دیتابیس dump بگیرید. فایلهای اصلی را خارج از سرور پشتیبانگیری کنید تا ریسک به حداقل برسد.
چرا کانتینر یادگیری ماشین (machine learning) در Immich مدام ریاستارت میشود؟
معمولاً به دلیل مصرف بیش از حد حافظه توسط سیستم کشته (kill) میشود. دستور docker compose ps --all را اجرا کنید، زیرا کانتینر متوقفشده بدون این فلگ نمایش داده نمیشود، و بررسی کنید که آیا سرویس یادگیری ماشین با کد 137 خارج میشود یا خیر. این کد به این معنی است که پردازش با signal 9 کشته شده است؛ قاتل حافظه (OOM killer) هسته معمولاً علت این اتفاق است اما تنها دلیل نیست، پس آن را با sudo dmesg | grep -i 'out of memory' تأیید کنید. در یک ماشین با 4 GB رم، swap اضافه کنید یا یادگیری ماشین را کلاً غیرفعال کنید. محدودیت حافظه روی کانتینر باعث کند شدن آن نمیشود: در صورت رسیدن به حد مجاز، کانتینر همچنان کشته میشود، اما از تحت فشار قرار دادن بقیه سرور جلوگیری میکند. بدون یادگیری ماشین، جستجوی هوشمند و تشخیص چهره از کار میافتند، اما بقیه بخشهای Immich بهخوبی کار میکنند.
آیا PhotoPrism به MariaDB نیاز دارد یا SQLite کافی است؟
SQLite کار میکند و برای یک کتابخانه شخصی مناسب است، اما PhotoPrism هنگام استفاده از آن، تعداد workerها را به چهار محدود میکند. مستندات توصیه میکنند به MariaDB مهاجرت کنید زیرا همزمانی (concurrency) بالا را بهتر مدیریت میکند. فایل compose که پروژه ارائه میدهد از قبل شامل MariaDB است، بنابراین مسیر توصیهشده همان مسیر پیشفرض است.
چقدر فضای دیسک علاوه بر حجم کتابخانه باید در نظر بگیرم؟
برای هر دو برنامه، 10 تا 20 درصد به حجم فایلهای اصلی خود اضافه کنید. این فضا برای بندانگشتیها (thumbnails) و پیشنمایشهای ویدیویی تبدیلشده (transcoded) است. یک مجموعه 200 GB برای خودِ کتابخانه به حدود 220 تا 240 GB فضا نیاز دارد، بهعلاوه فضایی برای دیتابیس و رشد آتی. اگر یک نسخه پشتیبان کامل محلی نیز روی همان volume نگهداری میکنید، فایلهای اصلی و آن کپی حداقل به 400 GB فضا نیاز دارند، بنابراین حدود 450 GB بودجه در نظر بگیرید یا کپی را روی یک volume جداگانه قرار دهید.