Привет, Хабр!
Меня зовут Алексей Свиридов, в InfoWatch я уже 12 лет, начинал как инженер, теперь отвечаю за проекты внедрения на территории СЗФО. В этой статье расскажу о том, как Immich помогает мне в работе с корпоративным фото/видеоархивом.
Мануалов по установке не будет, но расскажу про пару технических приёмов, которые лично мне показались интересными. Возможно, пригодятся и вам.
При чём тут вообще фотоархив?
Как и в любой другой компании, отдел внутрикома у нас отвечает за проведение всевозможных мероприятий — от больших корпоративов и празднований дня рождения компании до профильных праздников а-ля «День тестировщика» и прочего. Я — региональный сотрудник, так что стараюсь ходить на каждое такое мероприятие: и себя показать, и коллег вживую увидеть.
Так вот, про фото. После любого такого события появляется пара сотен фотографий. А иногда и тысяч, если фотограф попался выносливый, а мероприятие было масштабным. Немного спойлерну — сейчас в архиве компании насчитывается более 50 000 фотографий и 1000+ видеороликов.
Само собой, когда мероприятие проходит, фотограф присылает внутрикомам все фотографии, которые они затем и размещают на внутренних ресурсах. А потом присылают ссылку в рабочий чат — мол, спасибо всем, кто пришёл, вот тут ваши фото.
И всё бы ничего, если бы не один нюанс. Фотографии лежат на сетевой шаре в виде файлов, для их просмотра есть простенькая галерея. Что хочется сотруднику после получения ссылки? Правильно, быстренько забрать все свои фоточки и сохранить куда-то в домашний архив, либо поделиться ими в соцсетях. И вот с «быстренько» возникают проблемы — хранилище файлов не самое быстрое, плюс корпоративный VPN не то чтобы сильно ускоряет процесс, да ещё и сами фото тяжёлые, по 3–5 мегабайта.
Так что «по-быстрому промотать все фото», которых там более тысячи — это половина рабочего дня. В случае если вас никто не будет отвлекать в процессе задачами, например. Да, всегда можно создать на рабочем столе временную папку вида «Новая папка» или «111» и покидать фото туда локально, чтобы потом уже быстро просмотреть. Но, во-первых, нет ничего более постоянного, чем временное, а во-вторых, таких папок к концу года можно создать изрядное количество.
Что же делать
Решить рабочую проблему помогла проблема личная — у меня есть свой домашний фотоархив, который знатно разросся, и пришло время найти современное решение для его структурирования. Сначала я остановил свой выбор на Synology Photo и уже начал перетаскивать в него свой архив. Я был приятно удивлён тому, как далеко шагнули технологии: оказывается, можно закинуть в Synology Photo папку с фотографиями, и через пару мгновений он найдёт на них все лица, сгруппирует фото по тематике (праздник, мебель, животные и прочее) и многое другое.
А потом добрые люди подсказали о существовании бесплатного аналога, киллера Google Photo: Immich.
Закинув в него пару папок с фотографиями, я был удивлён ещё больше. Сам процесс установки расписывать не буду (про него можете почитать подробнее в этой статье на Хабре), скажу просто — закончилось тем, что весь домашний фотоархив я перенёс на Immich.
После чего вдохновился и решил с помощью Immich структурировать и корпоративный фотоархив.
В процессе, само собой, обнаружилось несколько сложностей. Если вы решите пройти моим путём — вот несколько рекомендаций, который могут заметно упростить вам дело.
Параметры виртуальной машины
ОС: РедОС 8.0
CPU: 8
RAM: 6 Гб
HDD: 150 Гб (много места нам не надо, т.к. будем использовать существующее сетевое хранилище)
Рекомендации по первоначальной настройке
По умолчанию в Immich для «Интеллектуального поиска» используется модель машинного обучения: ViT-B-32__openai. Она заточена на поиск с использованием английского языка, так что рекомендую сразу после установки переключить на модель, которая допускает использование русского языка, например: ViT-SO400M-16-SigLIP2-384__webli. Выбрать можно здесь и здесь.
Также следует обратить внимание на «Модель для распознавания текста».
Если в вашей медиатеке есть много видеофайлов и возможность временно использовать видеокарту, то рекомендую настроить Аппаратное ускорение. После первоначального сканирования библиотеки можно будет отключить аппаратное ускорение и использовать CPU.
Подключение медиатеки
Все фотографии лежат на общей сетевой папке и доступны на чтение всем пользователям домена.
Монтируем сетевую папку на хост через fstab:
//file-server.yourcompanyname.ru/PhotoGallery /mnt/PhotoGallery cifs credentials=/root/.smb_auth,iocharset=utf8,ro,uid=1000,gid=1000 0 0
Параметры доступа к сетевой папке указываем в файле /root/.smb_auth:
username=user
password=p@$$w0rD
domain=yourcompanyname.ru
Далее прокидываем папку в контейнер immich_server:
volumes: - /mnt/PhotoGallery:/mnt/media/PhotoGallery
Затем её можно добавить в Immich как «Внешнюю библиотеку»:

Смотрим первые результаты
Первое сканирование будет долгим. Immich запускает следующие задачи:
Создание миниатюр
Извлечение метаданных
Интеллектуальный поиск
Поиск дубликатов
Обнаружение лиц
Распознавание лиц
Распознавание текста
Спустя несколько часов мы получаем 50 000 фотографий, отсортированных по датам, различным местам (если на фотографиях присутствует геометки), и 7 тысяч лиц, которые нам ещё предстоит разметить.
Проблемы, с которыми я столкнулся
Проблема №1
У части фотографий дата съёмки не соответствует действительности
Оказывается, что цифровой фотоаппарат между мероприятиями успевает разрядиться, все настройки обнуляются, в том числе и дата. На сетевом хранилище все фотографии с одного мероприятия находятся в одной папке, поэтому некорректная дата не играет никакой роли. А вот в Immich медиафайлы из всех папок отображаются в едином пространстве, они отсортированы по дате.
Поэтому, если дата указана неверно, то все фотографии перемешиваются в хаотичном порядке.
Скрытый текст
Immich может использовать одну из следующих дат:
github
/** look for a date from these tags (in order) */ const EXIF_DATE_TAGS: Array<keyof Tags> = [ 'SubSecDateTimeOriginal', 'DateTimeOriginal', 'SubSecCreateDate', 'CreationDate', 'CreateDate', 'SubSecMediaCreateDate', 'MediaCreateDate', 'DateTimeCreated', ];
В Immich можно массово поменять дату. При этом с оригинальным файлом ничего не случится, а рядом с каждой фотографией создастся файл с расширением .xmp (Extensible Metadata Platform), также новая дата фиксируется в базе Postgres. Так как сетевое хранилище доступно только для чтения, то файл создать не получится, соответственно, и дату тоже не поменять.
Своё решение я спрятал под спойлер ниже.
Перед тем как его раскрыть, напишите в комментариях — как бы вы решили эту проблему?
Моё решение
Для решения этой проблемы я использую OverlayFS. Она позволяет накладывать одно дерево каталогов (верхний слой) поверх другого дерева каталогов (нижний слой). Причём нижний слой доступен только для чтения, а верхний — для записи. В нашем случае это выглядит так:
Создаём каталог /mnt/PhotoGallery/lower/ — сюда будет смонтирована сетевая папка с фотографиями (доступ только на чтение).
Создаём каталог /mnt/PhotoGallery/upper/ — здесь Immich будет создавать свои .xmp-файлы. Данные в этом каталоге физически хранятся на виртуальной машине.
Создаём каталог /mnt/PhotoGallery/merged/ — результирующий каталог, который следует монтировать в docker-контейнер. Это «виртуальный» каталог, он хранит в себе слой lower + слой upper. При записи в этот каталог файлы физически записываются в каталог upper.
Также следует создать каталог /mnt/PhotoGallery/work/ — для рабочих нужд OverlayFS.

На всякий случай привожу результирующий пример fstab:
//file-server.infowatch.ru/PhotoGallery /mnt/PhotoGallery/lower cifs credentials=/root/.smb_auth,iocharset=utf8,ro,uid=1000,gid=1000 0 0 overlay /mnt/PhotoGallery/merged overlay lowerdir=/mnt/PhotoGallery/lower,upperdir=/mnt/PhotoGallery/upper,workdir=/mnt/PhotoGallery/work,x-systemd.requires=/mnt/PhotoGallery/lower,_netdev 0 0 В docker монтируем следующим образом: volumes: - /mnt/PhotoGallery/merged:/mnt/media/PhotoGallery
Проблема №2
У части фотографий отсутствует геометка
Тут решение точно такое же, как в пункте выше: используем OverlayFS и массово меняем геометку.
Проблема №3
Иногда элементы карты не загружаются или загружаются очень долго
Полагаю, это связано с тем, что функция отображения объектов на карте использует внешний сервис плиток (tiles.immich.cloud). Этот домен периодически недоступен из России. Пока я эту проблему не решал, но потенциально это можно сделать с помощью изменения JSON-стиля или поднять локальный docker-контейнер с тайлами.
Проблема №4
Отсутствует удобный совместный просмотр фотографий
В Immich можно настроить авторизацию через домен и предоставить доступ всем пользователям, но функции у этих пользователей будут ограничены.
Мне не хватило следующего:
нельзя посмотреть людей на чужих фотографиях, их видит только владелец;
нельзя отмечать людей;
нельзя выполнить поиск фотографий по определённому человеку;
нельзя кликнуть на нужную фотографию и использовать функцию «Показать на временной шкале».
Решения этой проблемы я пока не нашёл. Пока есть только такая идея: использовать доступ из-под одной учётной записи и детектировать деструктивные действия. Например, если кто-то случайно удалит фотографии или разметку людей, то можно будет откатиться на бэкап.
Ели у вас есть более элегантное решение, напишите в комментариях.
Забавные случаи, которые удалось обнаружить
-
При разметке лиц я заметил, что некоторые сотрудники присутствуют на фотографиях задолго до своего трудоустройства в InfoWatch. Вот почему такое бывает:
в офисе есть коллеги из ГК, попадающие в кадр на совместных мероприятиях. Со временем некоторые из них устраиваются к нам в InfoWatch;
иногда коллеги берут на мероприятия родственников, которые потом тоже устраиваются к нам работать;
студенты последних курсов попадают в кадр, будучи на наших выставках, а потом приходят стажироваться.
-
На одном из корпоративов у нас была фотобудка с нейросетью. Она делала фотографию, обрабатывала её с помощью ИИ (искажала лицо, заменяла фон) и выдавала результат.
Так вот — Immich успешно нашёл на таких фотографиях настоящих сотрудников:
Зачем вообще на работе нужен Immich?
Фотографии — это всегда воспоминания и эмоции. Приятный подарок на день рождения: если сотрудник проработал несколько лет, то можно в пару кликов сделать выборку фотографий с его участием, создать новый альбом и отправить ссылкой.
После очередного мероприятия подождал, пока фотографии появятся в общей сетевой папке, сделал фильтр по себе и скачал все новые фотографии для домашнего фотоархива.
Immich умеет искать лица не только на фотографиях, но и на видео.
Надо найти фото с костюмированного корпоратива? Дата не нужна, достаточно в поисковую строку ввести «пираты» — и результат у вас.
Создать про коллегу стикеры или мемы.
Мем

6. Подарить сотруднику на юбилей фотокнигу. Immich легко сделает выборку по коллегам.
В общем, вот таким полезным инструментом можно довольно быстро организовать даже самый большой корпоративный фотоархив. Буду рад, если вам пригодится мой опыт.
А если вы используете для подобных целей какой-то другой сервис — напишите в комментариях, пожалуйста.
Yavanosta
Проблему 4 вроде бы решают вот в этом форке, который постоянно ребейзится на актуальный Immich. Переход в одну сторону вроде бы простой, обратно не знаю. Сам не пробовал её.
https://habr.com/ru/news/1056546/
https://github.com/open-noodle/gallery