ورود به پنل ثبت‌ نام

نصب Immich روی سرور ابری؛ گالری شخصی جایگزین گوگل فوتوز

نصب Immich روی سرور ابری با داکر؛ گالری خودمیزبان عکس و ویدیو با آپلود خودکار از موبایل، پراکسی معکوس Nginx، گواهی SSL رایگان و بک‌آپ اصولی.

تیم ابر سپهر 11 دقیقه مطالعه
نصب Immich روی سرور ابری؛ گالری شخصی جایگزین گوگل فوتوز
در این مقاله

آرشیو عکس، یکی از معدود داده‌هایی است که واقعاً جایگزین ندارد. با این حال بیشتر ما آن را روی سرویسی می‌گذاریم که هر لحظه ممکن است شرایط قیمت‌گذاری‌اش عوض شود، حساب کاربری را ببندد یا دسترسی را محدود کند. نصب Immich روی سرور ابری پاسخی است به همین وابستگی: یک گالری خودمیزبان با تجربه‌ی کاربری نزدیک به سرویس‌های تجاری، که عکس‌ها روی سرور خودتان می‌مانند.

Immich یک برنامه‌ی متن‌باز برای مدیریت عکس و ویدیو است: آپلود خودکار از موبایل، نمایش بر اساس زمان و مکان، جست‌وجوی معنایی در محتوای تصویر، تشخیص چهره، آلبوم‌های اشتراکی و اپلیکیشن اندروید و iOS. تفاوت مهمش با یک پوشه‌ی ساده‌ی فایل این است که همان قابلیت‌هایی را می‌دهد که کاربر از یک گالری امروزی انتظار دارد.

در این راهنما Immich را با داکر روی Ubuntu 24.04/26.04 یا Debian 13 نصب می‌کنیم، پشت پراکسی معکوس Nginx با گواهی رایگان قرار می‌دهیم و در پایان یک برنامه‌ی بک‌آپ درست برایش تعریف می‌کنیم؛ چون گالری خودمیزبانِ بدون بک‌آپ، فقط شکل تازه‌ای از ریسک است.

پیش‌نیازها

  • یک سرور ابری با دسترسی root و داکر نصب‌شده؛ در غیر این صورت راهنمای نصب داکر روی اوبونتو را ببینید.
  • دست‌کم ۴ گیگابایت حافظه. سرویس یادگیری ماشین Immich (جست‌وجوی معنایی و تشخیص چهره) بخش عمده‌ی این حافظه را می‌خواهد؛ با ۲ گیگابایت هم بالا می‌آید اما پردازش کتابخانه‌های بزرگ دردسر خواهد داشت.
  • فضای دیسک متناسب با آرشیو شما به‌علاوه‌ی حدود ۳۰ درصد اضافه برای پیش‌نمایش‌ها و ویدیوهای بازکدگذاری‌شده.
  • یک سابدامین مثل photos.domain.com با رکورد A به آی‌پی سرور.

تمام دستورها با کاربر root اجرا می‌شوند.

گام ۱: دریافت فایل‌های رسمی

Immich با docker compose نصب می‌شود و تیم توسعه فایل‌های آماده منتشر می‌کند:

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

فایل compose چهار سرویس تعریف می‌کند: سرور اصلی، سرویس یادگیری ماشین، پایگاه داده‌ی PostgreSQL با افزونه‌های برداری و یک نمونه‌ی Redis برای صف کارها. استفاده از فایل رسمی به‌جای نوشتن دستی، مهم‌ترین کاری است که می‌توانید برای پایداری این نصب انجام دهید؛ نسخه‌ی پایگاه داده و افزونه‌های آن با نسخه‌ی برنامه هماهنگ شده‌اند.

گام ۲: تنظیم متغیرهای محیطی

nano .env

چهار متغیر مهم را تنظیم کنید:

UPLOAD_LOCATION=/srv/immich/library
DB_DATA_LOCATION=/srv/immich/postgres
DB_PASSWORD=ChangeThisToSomethingLong123
TZ=Asia/Tehran
  • UPLOAD_LOCATION جایی است که همه‌ی عکس‌ها و ویدیوها ذخیره می‌شوند. اگر دیسک جداگانه‌ای برای داده دارید، مسیر را روی همان بگذارید؛ این پوشه با رشد آرشیو، بزرگ می‌شود.
  • DB_DATA_LOCATION داده‌ی PostgreSQL است و باید روی فایل‌سیستم محلی باشد. گذاشتن آن روی فضای شبکه (NFS، SMB یا فضای ابری mount‌شده) به خرابی پایگاه داده منجر می‌شود.
  • DB_PASSWORD رمز پایگاه داده است.

در DB_PASSWORD فقط از حروف انگلیسی و عدد استفاده کنید. کاراکترهای ویژه در رشته‌ی اتصال پایگاه داده تفسیر می‌شوند و باعث خطای اتصالی می‌شوند که پیدا کردن علتش وقت زیادی می‌گیرد.

گام ۳: بستن پورت روی اینترنت

فایل compose به‌صورت پیش‌فرض پورت 2283 را روی همه‌ی رابط‌ها منتشر می‌کند. چون می‌خواهیم دسترسی فقط از مسیر HTTPS باشد، آن را به لوکال‌هاست محدود می‌کنیم:

nano docker-compose.yml

در سرویس immich-server بخش ports را این‌طور تغییر دهید:

    ports:
      - '127.0.0.1:2283:2283'

این یک خط، تفاوت میان «گالری خصوصی» و «گالری در دسترس هر اسکنری روی اینترنت» است. یادتان باشد داکر پورت‌های منتشرشده را مستقیم در iptables ثبت می‌کند و فایروال UFW جلوی آن‌ها را نمی‌گیرد؛ محدود کردن آدرس انتشار، مطمئن‌ترین راه است.

گام ۴: اجرای Immich

docker compose up -d
docker compose logs -f

اجرای اول چند دقیقه طول می‌کشد؛ حجم ایمیج‌ها قابل‌توجه است و پایگاه داده باید ساختار اولیه‌اش را بسازد. وقتی در لاگ پیام آماده‌بودن سرور را دیدید، از روی خود سرور آزمایش کنید:

curl -I http://127.0.0.1:2283

پاسخ باید یک کد HTTP معتبر باشد. اگر سرویس بالا نیامد، معمولاً مقصر کمبود حافظه است؛ با docker compose ps وضعیت هر سرویس و با free -h حافظه‌ی آزاد را ببینید.

گام ۵: پیکربندی Nginx به‌عنوان پراکسی معکوس

apt install -y nginx
nano /etc/nginx/sites-available/photos.domain.com

با این محتوا:

server {
    listen 80;
    server_name photos.domain.com;

    # آپلود ویدیوهای بزرگ از موبایل
    client_max_body_size 50000M;

    location / {
        proxy_pass http://127.0.0.1:2283;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # آپلود بدون بافر شدن کل فایل در Nginx
        proxy_request_buffering off;

        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
        send_timeout 600s;
    }
}

سه تنظیم اینجا مستقیماً از مستندات رسمی Immich می‌آید و هرکدام یک خرابی مشخص را جلوگیری می‌کند:

  • client_max_body_size مقدار پیش‌فرض Nginx یک مگابایت است؛ با آن، آپلود هر ویدیوی موبایل با خطای ۴۱۳ شکست می‌خورد.
  • proxy_request_buffering off باعث می‌شود Nginx فایل را حین دریافت به Immich بفرستد، نه اینکه اول کل آن را روی دیسک یا حافظه‌ی خودش نگه دارد.
  • تایم‌اوت‌های ۶۰۰ ثانیه برای آپلود دسته‌ای صدها عکس از موبایل لازم‌اند.

سایت را فعال و بررسی کنید:

ln -s /etc/nginx/sites-available/photos.domain.com /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

گام ۶: فایروال و گواهی SSL

apt install -y ufw
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable

پیش از ufw enable از وجود قاعده‌ی OpenSSH مطمئن شوید، وگرنه نشست SSH فعلی شما قطع می‌شود. در آن صورت از کنسول تحت وب کنترل پنل ابر سپهر وارد سرور شوید.

سپس گواهی رایگان را صادر کنید:

apt install -y certbot python3-certbot-nginx
certbot --nginx -d photos.domain.com
certbot renew --dry-run

اپلیکیشن موبایل Immich برای آپلود خودکار به یک اتصال HTTPS معتبر نیاز دارد؛ این گام اختیاری نیست.

گام ۷: حساب مدیر و اپلیکیشن موبایل

آدرس https://photos.domain.com را باز کنید. نخستین حسابی که ساخته می‌شود، مدیر سیستم است؛ همین حالا آن را بسازید. سپس در بخش مدیریت، ثبت‌نام آزاد را ببندید و کاربران خانواده یا تیم را دستی اضافه کنید.

پیش از دعوت دیگران، یک نکته‌ی مهم درباره‌ی فضای ذخیره‌سازی: در بخش مدیریت می‌توانید برای هر کاربر سهمیه (Quota) تعیین کنید. اگر قرار است چند نفر از یک سرور استفاده کنند، تعیین سهمیه از ابتدا جلوی پر شدن ناگهانی دیسک را می‌گیرد.

در اپلیکیشن موبایل، در بخش ورود، آدرس سرور را به‌صورت کامل وارد کنید:

https://photos.domain.com/api

پس از ورود، از بخش پشتیبان‌گیری (Backup) آلبوم‌هایی را که باید خودکار آپلود شوند انتخاب کنید. توصیه می‌شود آپلود پس‌زمینه را فعال کنید تا عکس‌های جدید بدون باز کردن برنامه ارسال شوند.

وارد کردن آرشیو قدیمی

اگر آرشیو بزرگی روی کامپیوتر دارید، آپلود از راه مرورگر بهترین گزینه نیست. Immich یک ابزار خط فرمان دارد که پوشه‌ها را دسته‌ای و با ادامه‌ی خودکار پس از قطعی آپلود می‌کند؛ برای آرشیوهای چندده‌گیگابایتی، این روش هم سریع‌تر است و هم قابل‌اعتمادتر.

کتابخانه‌ی خارجی برای آرشیوی که همین حالا روی سرور است

اگر عکس‌ها از قبل روی سرور هستند و نمی‌خواهید نسخه‌ی دومی از آن‌ها ساخته شود، Immich مفهومی به نام External Library دارد: پوشه‌ی موجود را به کانتینر mount می‌کنید و Immich آن را فقط می‌خواند و فهرست‌بندی می‌کند، بدون آن‌که فایلی را جابه‌جا یا کپی کند. برای آرشیوهای بزرگ که ساختار پوشه‌بندی مشخصی دارند، این روش هم فضا را نصف می‌کند و هم ساختار قبلی شما را دست‌نخورده نگه می‌دارد.

تنظیم مصرف منابع

سنگین‌ترین بخش Immich، سرویس یادگیری ماشین است که پس از هر آپلود، جست‌وجوی معنایی و تشخیص چهره را پردازش می‌کند. اگر سرور کوچکی دارید یا این قابلیت‌ها برایتان مهم نیستند، از بخش مدیریت می‌توانید کارهای مربوط به آن‌ها را متوقف کنید؛ گالری، آلبوم‌ها و آپلود خودکار بدون آن هم کار می‌کنند.

نکته‌ی دیگر، بازکدگذاری ویدیوهاست. Immich برای پخش روان در مرورگر، نسخه‌ای سازگار از ویدیوها می‌سازد که هم زمان CPU می‌برد و هم فضای دیسک. در همان بخش مدیریت می‌توانید سیاست بازکدگذاری را محدودتر کنید تا فقط ویدیوهایی که واقعاً نیاز دارند پردازش شوند. برای مشاهده‌ی بار لحظه‌ای:

docker stats --no-stream

اگر مصرف حافظه مدام نزدیک سقف است، پیش از آن‌که سرویس‌ها به‌صورت تصادفی kill شوند، حافظه‌ی سرور را ارتقا دهید.

نگهداری: به‌روزرسانی و بک‌آپ

به‌روزرسانی با دو دستور انجام می‌شود:

cd /opt/immich
docker compose pull
docker compose up -d

پیش از هر به‌روزرسانی، یادداشت انتشار نسخه را ببینید. Immich پروژه‌ی فعالی است و گاهی تغییرهای ناسازگار دارد؛ گرفتن یک اسنپ‌شات از کنترل پنل ابر سپهر پیش از به‌روزرسانی، سریع‌ترین راه بازگشت است.

بک‌آپ دو بخش دارد. اول پایگاه داده، که همه‌ی آلبوم‌ها، چهره‌ها و ابرداده‌ها در آن است:

docker exec -t immich_postgres pg_dump --clean --if-exists \
  --dbname=immich --username=postgres | gzip > /root/immich-db.sql.gz

دوم فایل‌ها. از پوشه‌ی UPLOAD_LOCATION این زیرپوشه‌ها ضروری‌اند: library، upload، profile و backups. دو پوشه‌ی thumbs و encoded-video را می‌توانید کنار بگذارید؛ آن‌ها قابل بازتولیدند و فقط حجم بک‌آپ را زیاد می‌کنند (پس از بازیابی باید کارهای تولید پیش‌نمایش را دوباره اجرا کنید).

برای خودکار کردن این کار و فرستادن نسخه‌ها به خارج از سرور، راهنمای بک‌آپ خودکار سرور با Restic همین الگو را پیاده می‌کند: dump پایگاه داده به‌صورت جریانی و بک‌آپ افزایشی پوشه‌ی عکس‌ها.

کار دستور چه زمانی
وضعیت سرویس‌ها docker compose ps هنگام عیب‌یابی
مشاهده لاگ docker compose logs -f immich-server هنگام خطای آپلود
بک‌آپ پایگاه داده docker exec -t immich_postgres pg_dump … روزانه
بک‌آپ فایل‌ها Restic روی UPLOAD_LOCATION روزانه
به‌روزرسانی docker compose pull && docker compose up -d ماهانه، پس از خواندن یادداشت انتشار
فضای باقی‌مانده دیسک df -h /srv/immich ماهانه

پایش فضای دیسک را جدی بگیرید. پر شدن دیسک روی سروری که پایگاه داده دارد، خطرناک‌ترین حالت ممکن است؛ در کنترل پنل ابر سپهر می‌توانید پیش از رسیدن به این نقطه فضای سرور را ارتقا دهید.

جمع‌بندی

با نصب Immich روی سرور ابری، یک گالری کامل با آپلود خودکار موبایل، جست‌وجو و آلبوم‌های اشتراکی دارید که هیچ عکسی از آن خارج نمی‌شود و هزینه‌اش هم ثابت و قابل پیش‌بینی است.

سه تصمیمی که بیشترین تفاوت را می‌سازند: انتشار پورت فقط روی 127.0.0.1 و عبور ترافیک از HTTPS، تنظیم درست client_max_body_size و بافر نکردن آپلود در Nginx، و داشتن بک‌آپ واقعی از پایگاه داده و پوشه‌ی عکس‌ها پیش از آن‌که آرشیو خانوادگی‌تان تنها نسخه‌ی موجود باشد.

اگر می‌خواهید آرشیو عکس خود را به زیرساخت خودتان منتقل کنید، از صفحه خرید سرور ابری با فضای متناسب شروع کنید و هر زمان آرشیو بزرگ‌تر شد، دیسک را ارتقا دهید.

مقالات مرتبط