Immich: скільки RAM потрібно та як безпечно оновлювати
Дізнайтеся чесну потребу в RAM, налаштуйте порт 2283 за HTTPS, виправте завершення з кодом 137 і запустіть Immich v3 без несумісного pgvecto.rs.
Що ви створюєте
Immich — self-hosted сервіс для резервного копіювання фото й відео, повноцінна заміна Google Photos. Він має мобільний застосунок, який у фоновому режимі завантажує фотографії з камери, часову шкалу, альбоми, розпізнавання облич і пошук на основі машинного навчання. Пошук знаходить, наприклад, «пляж» або потрібну людину, навіть якщо ви нічого не позначали вручну. Ви запускаєте сервіс на власному VPS, оригінали файлів залишаються на вашому диску, і ніхто не сканує їх для показу вам реклами. Якщо ви все ще порівнюєте Immich з іншим очевидним кандидатом, у нашому порівнянні PhotoPrism та Immich наведено поруч мінімальні вимоги до RAM, мобільні застосунки й команди резервного копіювання.
Встановлення складається з чотирьох контейнерів із власного Docker Compose file проєкту. Це займає десять хвилин. Основні труднощі описано далі в цьому посібнику: контейнер машинного навчання потребує багато пам’яті на невеликому сервері, оригінали швидко заповнюють диск, мобільному застосунку потрібна точна URL-адреса сервера, а перед виходом сервісу в інтернет потрібно налаштувати HTTPS. Крім того, Immich досить часто випускає зміни, що порушують сумісність, тому необережний docker compose pull може залишити сервер непрацездатним. Ставтеся до цих чотирьох аспектів серйозно — і Immich працюватиме стабільно. Ігнорування їх може коштувати вам цілого вихідного тижня.
Попередні вимоги та важливі нюанси
- ОЗП: в офіційній документації вказано мінімум 6 GB і рекомендовано 8 GB; вважайте 4 GB разом зі swap абсолютним мінімумом. Контейнери
immich-serverі Postgres споживають небагато ресурсів. Контейнерimmich-machine-learningє основним споживачем пам’яті: він завантажує моделі CLIP і розпізнавання облич в ОЗП для побудови пошукових індексів, а на сервері з 2 GB ядро його завершує. Додайте swap, навіть якщо маєте 4 GB. - Диск: розрахуйте обсяг для всієї бібліотеки та передбачте запас. Оригінали копіюються повністю. Крім того, Immich створює мініатюри й зображення попереднього перегляду — це приблизно ще 10–20%. Для фотоколекції обсягом 200 GB потрібен том на 300 GB. Порівняно з цим Postgres займає мало місця.
- CPU: будь-який сучасний KVM VPS підходить, але ML на CPU працює повільно. Індексація smart search для великого імпорту може тривати кілька годин у фоновому режимі. Це нормально; GPU не потрібен.
- Доменне ім’я, спрямоване на VPS. Мобільний застосунок наполегливо рекомендує HTTPS endpoint, а перед ним потрібен reverse proxy. Це така сама схема, як у self-hosted інстансу Nextcloud із Docker, TLS і резервними копіями; Immich є аналогом цього файлового сервера для фотографій.
- Docker і Compose plugin, встановлені з Docker Engine та Compose v2 plugin із власного apt-репозиторію Docker, як описано в нашому посібнику з основ Docker Compose.
Крок 1: Спочатку додайте swap
Найпоширеніша причина збою Immich на невеликому VPS — примусове завершення ML-контейнера через OOM. Спочатку надайте kernel додатковий простір для роботи.
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 і не є гарантією, але створює буфер і значно зменшує ймовірність завершення контейнера під час індексації на машині з 4 GB RAM.
Крок 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, контейнерimmich_server) — API та вебінтерфейс, який прослуховує порт2283. Він монтує завантажені файли в/data.immich-machine-learning(ghcr.io/immich-app/immich-machine-learning, контейнерimmich_machine_learning) — пошук CLIP і розпізнавання облич. Завантажені моделі кешуються у томіmodel-cache. Цей сервіс споживає найбільше пам’яті.database(контейнерimmich_postgres) — Postgres із векторним розширенням VectorChord, яке забезпечує пошук за схожістю. Тег образу зафіксовано за digest безпосередньо в compose-файлі, наприкладghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:.... У старіших конфігураціях використовувавсяpgvecto.rs; підтримку цього варіанта вилучено в Immich v3.0, тому все, що ви встановлюєте сьогодні, використовує VectorChord. Ніколи не змінюйте цей тег вручну.redis(контейнерimmich_redis) — екземпляр Valkey/Redis для черг завдань.
Крок 3: Налаштуйте .env, де зберігаються фотографії та база даних
Відкрийте .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 має вказувати на великий диск. Якщо пізніше підключите том даних, одразу вкажіть тут шлях до його точки монтування, оскільки перенесення після налаштування означає переміщення мініатюр і оновлення шляхів до ресурсів. DB_DATA_LOCATION має розташовуватися на локальному диску: використання Postgres через NFS або SMB призводить до пошкодження даних, і в документації про це сказано прямо. Якщо в DB_PASSWORD використовувати лише літери та цифри, можна уникнути певного класу помилок екранування в рядку підключення.
Крок 4: Перший запуск і створення облікового запису адміністратора
cd /opt/immich
sudo docker compose up -d
sudo docker compose psПравильний результат — чотири контейнери, усі running і зрештою healthy:
NAME STATUS
immich_machine_learning Up (healthy)
immich_postgres Up (healthy)
immich_redis Up (healthy)
immich_server Up (healthy)Перший up завантажує кілька гігабайтів образів, тому зачекайте. Переглядайте перебіг виконання за допомогою sudo docker compose logs -f immich-server; коли сервер буде готовий, у журналі з’явиться повідомлення, що він прослуховує порт 2283. Тепер відкрийте http://YOUR_SERVER_IP:2283 у браузері. Під час першого відвідування відкриється майстер Getting Started. Перший створений обліковий запис буде обліковим записом адміністратора. Задайте надійний пароль. Цей обліковий запис керує налаштуваннями сервера, користувачами та конфігурацією ML, яка знадобиться пізніше.
Крок 5: Мобільний застосунок і резервне копіювання у фоновому режимі
Установіть Immich з App Store або Play Store. На екрані входу застосунок запитує Server Endpoint URL. Укажіть повну URL-адресу зі схемою, наприклад https://photos.example.com (застосунок сам додає /api). Увійдіть за допомогою щойно створеного облікового запису, відкрийте екран Backup, виберіть альбоми для резервного копіювання (зазвичай Camera і Screenshots) і ввімкніть Background backup. В iOS фонове резервне копіювання обмежується операційною системою. Завантаження у foreground виконується завжди, а у фоновому режимі — лише коли це дозволяє операційна система.
Саме на цьому етапі найчастіше виникають проблеми, тому прочитайте Крок 6, перш ніж намагатися виправити роботу застосунку.
Крок 6: HTTPS через reverse proxy та правило повної URL-адреси
Мобільний застосунок наполегливо потребує HTTPS після виходу за межі домашньої мережі. Розмістіть reverse proxy перед портом 2283 і завершуйте TLS на ньому. Якщо ви вже запускаєте кілька контейнерів, найзручнішим варіантом буде Traefik з автоматичним TLS для кількох Docker-застосунків: один блок labels маршрутизує photos.example.com до контейнера immich-server і сам отримує для нього сертифікат. Якщо ви надаєте перевагу nginx, посібник Let's Encrypt із Certbot і nginx допоможе отримати сертифікат і блок proxy_pass http://127.0.0.1:2283;. Після налаштування такого проксі додавання наступного сервісу здебільшого зводиться до створення нового субдомену. Так media front end на кшталт Halcyon, оболонка відеомагазину 90-х для Jellyfin може працювати поруч з Immich на тому самому сервері. Те саме стосується self-hosted HarnessRouter, який розміщує Codex і Claude Code за одним API: він навмисно прив’язаний до loopback і стає доступним лише після того, як проксі завершує TLS перед ним. Тому змініть його стандартні облікові дані до того, як прив’язувати до нього субдомен. Водночас не кожен контейнер потребує публічного hostname. Інструмент лише для адміністраторів, наприклад self-hosted сканер безпеки open-kritt, краще взагалі не підключати до проксі. У рідкісних випадках, коли потрібно відкрити його UI, доступайтеся до нього через SSH-тунель. Інші сервіси не використовують проксі, оскільки HTTP для них не є основним протоколом. Найкращий приклад — self-hosted relay server RustDesk: він прослуховує кілька необроблених TCP- і UDP-портів і потребує правил firewall, а не субдомену. Для Immich важливе одне налаштування проксі: збільште ліміт розміру завантаження, оскільки відео з телефона мають великий розмір. У nginx це client_max_body_size 50000M; усередині server block. Стандартне значення 1 MB відхиляє завантаження відео з помилкою 413 Request Entity Too Large. Якщо ваш проксі також обробляє HTTP-01 challenges від Let's Encrypt, переконайтеся, що /.well-known/immich і далі маршрутизується до Immich, а не до обробника challenge.
Правило, яке застосунок примусово застосовує: endpoint має бути доступним точно за URL-адресою, яку ви вводите. Застосунок прийме звичайний http://YOUR_SERVER_IP:2283 (у його підказці для входу вказано http://your-server-ip:port), але все, що проходить через інтернет, має використовувати HTTPS. Неправильна схема або пряма IP-адреса без указаного порту спричиняє помилку «застосунок не може підключитися до сервера». Нижче це описано як окремий тип несправності.
Крок 7: Зовнішні бібліотеки та завантажені файли, імпорт наявного дерева фотографій
Фотографії потрапляють до Immich двома способами. Це не одне й те саме.
- Завантажені файли — це об’єкти, якими керує Immich. Застосунок або вебзавантажувач копіює файл у
UPLOAD_LOCATION. Immich може перейменовувати, переміщувати та видаляти їх. - Зовнішні бібліотеки — це імпорт файлів у режимі лише для читання. Файли вже зберігаються в папці на сервері, у старому дереві
Picturesабо в експорті NAS. Immich індексує їх на місці та показує на часовій шкалі, але ніколи не змінює і не видаляє оригінали.
Щоб імпортувати наявне дерево, змонтуйте його в контейнер сервера в режимі лише для читання. Відредагуйте docker-compose.yml у immich-server: і додайте 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. Потім у вебінтерфейсі відкрийте меню свого аватара → Administration → External Libraries → Create Library, виберіть користувача-власника, натисніть Add у розділі Folders і введіть шлях у контейнері — /mnt/media/photos, а не шлях на хості /srv/photos. Натисніть Scan. Використання шляху на хості замість шляху в контейнері — найпоширеніша помилка під час налаштування зовнішньої бібліотеки: сканування не знаходить файлів і повідомляє про нуль об’єктів.
Крок 8: Дисципліна оновлення, якої вимагає Immich
Це частина, яка визначає, чи працюватиме Immich стабільно. Immich швидко випускає нові версії, не переносить виправлення до старих версій і не підтримує відкат. Плаваючий тег v3 є офіційно підтримуваним способом стежити за новими релізами. Immich намагається обмежувати несумісні зміни основними версіями, але оновлює систему під час кожного pull незалежно від того, чи прочитали ви примітки до релізу. Оновлення, яке не було заплановане, неможливо скасувати. Той самий підхід — зафіксувати версію та прочитати примітки до релізу — варто застосовувати до кожного контейнера, який довго працює на сервері. Саме тому self-hosted агент KiroCrew фіксують на одній перевіреній версії, а не дозволяють йому непомітно оновитися під час наступного перезапуску. Основні правила:
- Зафіксуйте версію. Встановіть у
IMMICH_VERSIONконкретний тег, наприкладv3.0.2, а не плаваючий тегv3, який щоразу завантажує найновішу версію v3.x. - Щоразу перед оновленням читайте примітки до релізу. Несумісні зміни, особливо зміни бази даних або vector extension, описують саме там. Реліз v3.0 є очевидним прикладом: у ньому повністю видалили pgvecto.rs. Тому користувачі старої extension мали спочатку завершити міграцію на VectorChord, яку запровадили ще у v1.133, і лише після цього перейти на новішу версію.
- Спочатку створіть резервну копію бази даних (Крок 9). Це потрібно робити завжди, але особливо коли в примітках згадано базу даних.
- Також завантажте новий compose-файл.
IMMICH_VERSIONфіксує лише образи сервера та ML. Образ Postgres зафіксований за digest усерединіdocker-compose.yml, тому версія, якій потрібна новіша database extension, постачається з новим compose-файлом. Повторно завантажте обидва файли релізу, повторно застосуйте значення.env, а потім виконайте оновлення. - Спочатку оновіть мобільні клієнти. Сервер працює лише з відповідною основною версією, а застосунок зазвичай сумісний із поточною та попередньою основними версіями. Якщо версія сервера новіша за версію застосунку, поточні релізи (v3.3.1, перевірено 2026-10-10) показують на телефоні повідомлення App update is available із кнопкою Update. Immich рекомендує оновити всі мобільні клієнти до оновлення сервера.
Фактичні команди після розміщення нових файлів:
cd /opt/immich
sudo docker compose pull
sudo docker compose up -d
sudo docker image pruneКрок 9: Резервні копії: дамп бази даних ПЛЮС оригінали та перевірка відновлення
Резервна копія Immich складається з двох частин, і без однієї з них інша марна. База даних зберігає структуру альбомів, обличчя, пошукові індекси та відповідність між asset і файлом. Каталог оригіналів містить самі фотографії. Якщо відновити лише одну частину, ви отримаєте або фотографії без організації, або порожню оболонку, що посилається на відсутні файли. Така двокомпонентна структура характерна не лише для Immich: self-hosted система підтримки Chatwoot також потребує пари з дампу Postgres і каталогу uploads. Інакше після відновлення inbox повернеться без усіх вкладень. Копіювання каталогу даних Postgres як дерева файлів може здаватися способом обійти створення дампу, але така копія непридатна для резервного копіювання. Цю помилку розглянуто в повному посібнику з резервного копіювання та відновлення Immich, де також описано відновлення, після якого timeline залишається порожнім.
Створіть дамп бази даних за допомогою pg_dump всередині контейнера Postgres. Дампуйте саме базу immich, а не весь кластер:
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, усього дерева /opt/immich/library і, зокрема, його підкаталогів library/, upload/ та profile/. Для цього використайте restic, rsync або borg і передайте дані на іншу машину чи до object storage. Незалежно від того, що запускає це завдання — запис cron чи таймер systemd, — має бути спосіб повідомити про помилку. Блок systemd OnFailure=, налаштований на ваш власний push-сервер ntfy, надішле повідомлення на телефон у ніч, коли створення дампу завершиться помилкою. Інакше ви можете дізнатися про проблему лише під час відновлення. Спочатку створюйте дамп бази даних, а потім копіюйте файли. Так дамп не міститиме посилання на фотографію, яку резервна копія файлів ще не встигла скопіювати. Зовнішні бібліотеки резервуйте окремо з їхнього фактичного джерела. Immich не керує ними.
Тепер частина, яку всі пропускають: перевірте відновлення. Відновлення потрібно виконувати у свіжому стеку, сервер якого ще жодного разу не запускався. Також використовуйте образ Postgres із сумісним із дампом vector extension. Саме тому не можна довільно змінювати tag образу DB. На тестовій машині з тим самим compose і .env видаліть старий стан, запустіть лише базу даних, а потім завантажте дамп:
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Перезапис sed у search_path є обов’язковим для бази даних VectorChord. Якщо пропустити цей параметр, відновлення перерветься. Після запуску стека з відновленими оригіналами відкрийте web UI. Якщо фотографії та альбоми доступні, резервна копія працює. Якщо ви ніколи не виконували цю перевірку, у вас немає резервної копії — у вас є лише надія.
Типові сценарії відмови та повідомлення, які ви побачите
Контейнер ML завершується через нестачу пам’яті (OOM-killed). sudo docker compose logs immich-machine-learning раптово завершується, docker compose ps показує Restarting, а код завершення має значення 137. sudo dmesg | grep -i oom підтверджує це повідомленням: Out of memory: Killed process ... (python3). Після цього завдання пошуку та розпізнавання облич зависають. Причина — недостатній обсяг RAM для моделей. Виконайте такі дії в зазначеному порядку: додайте swap (Крок 1); збільште обсяг RAM у VPS; або, якщо це справді неможливо, відкрийте Administration → Settings → Machine Learning Settings і вимкніть перемикач машинного навчання верхнього рівня. Це вимкне всі функції ML одночасно. Вимкнення лише Smart Search і Facial Recognition недостатньо, оскільки OCR та інші типи моделей за замовчуванням залишаються увімкненими. Резервні копії та альбоми збережуться, але пошук за вмістом буде недоступний. Видалення сервісу immich-machine-learning з compose-файлу має такий самий ефект.
Сервер Immich відмовляється запускатися після оновлення. Контейнер Postgres може працювати нормально. Перевірку версії vector extension під час запуску виконує саме immich_server, після чого він відмовляється запускатися. У його журналі повторюється рядок на кшталт 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. або, у старіших стеках, The pgvecto.rs extension is not available in this Postgres instance.. Причина — образ бази даних зі старішою версією extension, ніж та, до якої було оновлено ваші дані. Майже завжди це трапляється через ручне редагування image tag або відновлення новішого dump у старіший образ. Використовуйте сумісний образ Postgres, візьміть compose-файл із релізу, що відповідає вашій базі даних, не виконуйте downgrade і відновлюйте дані лише в сумісний образ.
Мобільний застосунок не може підключитися до сервера. Після введення URL на екрані входу з’являється помилка підключення, наприклад Could not connect to server. Типові причини: ви ввели http://, хоча proxy обслуговує лише https://; підключилися безпосередньо до backend, але не вказали порт, тому застосунок спробував використати example.com (порт 443) замість example.com:2283; reverse proxy не перенаправляє /api; або proxy, який обробляє виклики Let's Encrypt HTTP-01, спрямовує /.well-known/immich не до Immich. Введіть повний URL https://photos.example.com і спочатку перевірте його в браузері телефона. Якщо в браузері все працює, а в застосунку — ні, proxy видаляє шлях або неправильно маршрутизує /.well-known/immich. Інша можлива причина — самопідписаний сертифікат. Застосунок відхиляє його під час handshake, якщо в його налаштуваннях не ввімкнено підтримку self-signed сертифікатів.
На диску закінчується місце під час імпорту. Завантаження починають завершуватися помилками, мініатюри зникають, а в журналах з’являються ENOSPC: no space left on device або, у Postgres, could not extend file ... No space left on device. df -h показує, що том UPLOAD_LOCATION заповнений на 100%. Саме тому обсяг диска потрібно розрахувати до імпорту великої бібліотеки. Для відновлення під’єднайте більший том, зупиніть стек, перемістіть на нього UPLOAD_LOCATION, оновіть .env і знову запустіть стек. Якщо ваш провайдер це підтримує, можна також збільшити розмір наявного диска. Якщо місце вичерпується, Postgres може перейти в некоректний стан. Спочатку звільніть місце та перезапустіть контейнер бази даних, а вже потім робіть висновок про пошкодження.
FAQ
Скільки RAM і дискового простору потребує Immich?
Офіційна вимога Immich — щонайменше 6 GB RAM, рекомендовано 8 GB. Для невеликої бібліотеки практичний мінімум становить 4 GB зі swap. У будь-якому разі налаштуйте swap, оскільки найбільше навантаження виникає в контейнері machine learning. Для дискового простору передбачте весь обсяг бібліотеки та ще приблизно 10–20% для згенерованих ескізів і попередніх переглядів. Використовуйте локальне сховище. Ніколи не розміщуйте каталог даних Postgres у мережевому ресурсі. Якщо ви ще вирішуєте, які сервіси запускати, у посібнику про те, що варто self-hosted у 2026 році наведено обсяг Immich у порівнянні з іншими сервісами.
Чи можна запускати Immich без GPU?
Так. Контейнер machine learning працює на CPU. GPU лише пришвидшує індексацію для smart search і, у разі використання відповідного варіанта image, транскодування відео. На CPU початкова індексація великої бібліотеки може тривати кілька годин у фоновому режимі, але не блокує резервне копіювання та перегляд. Якщо ваш сервер недостатньо потужний для ML, повністю вимкніть machine learning за допомогою перемикача верхнього рівня в налаштуваннях адміністратора. Усі інші функції продовжать працювати.
Як безпечно оновити Immich?
Зафіксуйте IMMICH_VERSION на конкретному tag, наприклад v3.0.2, перед кожним оновленням прочитайте примітки до release і спочатку створіть резервну копію бази даних. Оскільки image Postgres зафіксовано всередині docker-compose.yml, а не через IMMICH_VERSION, повторно завантажте compose-файл і example.env для потрібного release, повторно застосуйте власні значення, а потім виконайте docker compose pull && docker compose up -d. Ніколи не залишайте версію нефіксованою для автоматичного оновлення. Immich не підтримує downgrade, тому оновлення, виконане без попереднього ознайомлення з документацією, неможливо скасувати.
Що саме потрібно резервувати?
Два компоненти разом: pg_dump бази даних immich і весь каталог оригіналів UPLOAD_LOCATION. У базі даних зберігаються альбоми, обличчя та відповідність asset файлам. У каталозі зберігаються самі фотографії. Для відновлення потрібні обидва компоненти, а також image бази даних із сумісним vector extension. Спочатку створіть database dump, а потім скопіюйте файли. Принаймні один раз перевірте відновлення на тестовому сервері. Неперевірена резервна копія не є резервною копією.
Як імпортувати наявну папку з фотографіями?
Підключіть папку в режимі лише для читання до контейнера immich-server як додатковий volume, наприклад - /srv/photos:/mnt/media/photos:ro, повторно створіть контейнер, а потім у Administration → External Libraries створіть library і додайте шлях container /mnt/media/photos. Immich індексує файли на місці та ніколи не змінює і не видаляє їх. Найпоширеніша помилка — вказати шлях на host замість шляху в container. Через це сканування не знаходить файлів.