Cloud Boxi

Семейный фотоархив на Immich: что работает спустя полгода

Immich выглядит как привычная галерея в телефоне, только фотографии лежат на своём сервере. Перенёс в него 780 ГБ снимков и записал, что оказалось важным.

Семье не нужны папки на сервере. Им нужна лента с фотографиями, поиск и автозагрузка с телефона. Immich всё это даёт: мобильные приложения, общие альбомы, поиск по лицам и по описанию вроде «собака на пляже». Для меня главное, что файлы остаются обычными файлами на диске.

Установка

Immich запускается через Docker Compose. Файлы конфигурации берутся из официальных релизов:

mkdir -p /srv/apps/immich && cd /srv/apps/immich
curl -LO https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
curl -L -o .env https://github.com/immich-app/immich/releases/latest/download/example.env

В .env важны две строки:

UPLOAD_LOCATION=/srv/data/photos/immich
DB_DATA_LOCATION=/srv/apps/immich/postgres

Фотографии лежат на зеркале, а базу данных я держу на NVMe: на жёстких дисках она заметно медленнее. Там же стоит закрепить версию в IMMICH_VERSION, чтобы обновляться осознанно, после чтения заметок к релизу.

docker compose up -d

Импорт старых фотографий

Загружать весь архив через телефон бессмысленно. Два рабочих способа:

  • Внешняя библиотека: Immich читает существующую папку и не трогает файлы. Папка подключается в контейнер как том только для чтения.
  • Консольная утилита immich: загружает файлы на сервер, как будто их отправил телефон.

Я начал с внешней библиотеки, потому что так проще откатиться. Новые снимки приходят с телефонов автозагрузкой, и Immich сам раскладывает их по папкам с датами.

Нагрузка на N100

Первичная обработка 780 ГБ заняла около пяти суток. Больше всего времени ушло на распознавание лиц и построение поиска. Память в этот момент занята почти полностью: без 16 ГБ я бы не обошёлся. Зато дальше сервер спокойно обрабатывает новые снимки за минуты.

На время импорта я снизил число параллельных задач машинного обучения до одной в настройках задач. Сервер стал отзывчивее, а общее время выросло ненамного. Перекодирование видео идёт через аппаратный блок Quick Sync, для этого в Compose подключается файл hwaccel.transcoding.yml.

Что надо копировать

Папка с фотографиями без базы данных теряет альбомы, лица и описания. Immich сам регулярно делает дамп базы в UPLOAD_LOCATION/backups, поэтому она попадает в общий бэкап вместе с фотографиями. Миниатюры и перекодированное видео можно не копировать, они создаются заново:

/srv/data/photos/immich/thumbs
/srv/data/photos/immich/encoded-video

Итог

Семья пользуется приложением и не думает о сервере, а это лучшая оценка. Минус один: проект быстро развивается, и обновления иногда требуют внимания. Поэтому перед каждым обновлением делаю снимок и читаю заметки к релизу.