Архитектура
Immich использует традиционную клиент-серверную архитектуру с выделенной базой данных для хранения данных. Клиенты на фронтенде общаются с бекенд-услугами через HTTP, используя REST API. Ниже представлена диаграмма архитектуры высокого уровня.
Диаграмма высокого уровня

На диаграмме показано, как клиенты взаимодействуют с API сервера через REST. Сервер общается с downstream системами (например, Redis, Postgres, Machine Learning, файловая система) через интерфейсы репозиториев. На диаграмме не отображено, что сервер разделен на два отдельных контейнера immich-server
и immich-microservices
. Контейнер микросервисов не обрабатывает запросы API и не выполняет задания cron, но преимущественно занимается обработкой запросов задач из Redis.
Клиенты
Immich имеет три основных клиента:
- Мобильное приложение - Android, iOS
- Веб-приложение - адаптивный сайт
- CLI - утилита командной строки для массовой загрузки
Мобильное приложение
Мобильное приложение написано на Dart с использованием Flutter. Ниже представлена обзорная архитектура:
На диаграмме показана целевая архитектура, текущая кодовая база не всегда следует этой архитектуре. Новый код и вклады должны следовать данной архитектуре. В настоящее время используется Isar Database для локальной базы данных и Riverpod для управления состоянием (провайдеры). Сущности и модели являются двумя типами классов данных, которые используются. В то время как сущности хранятся в локальной базе данных устройства, модели являются эфемерными и хранятся только в памяти. Репо зитории должны быть единственным местом, где другие классы данных используются внутренне (например, DTO OpenAPI). Однако их интерфейсы не должны использовать чужие классы данных!
Веб-клиент
Веб-приложение — это проект на TypeScript, который использует SvelteKit и Tailwindcss.
CLI
Immich CLI — это пакет npm, который позволяет пользователям управлять своим экземпляром Immich из командной строки. Он использует API для выполнения различных задач, особенно загрузки активов. Ознакомьтесь с документацией CLI для получения дополнительной информации.
Сервер
Бекенд Immich разделен на несколько служб, которые запускаются как отдельные контейнеры Docker.
immich-server
- обработка и ответ на запросы REST API, выполнение фоновых задач (генерация миниатюр, извлечение метаданных, транскодирование видео и т. д.)immich-machine-learning
- выполнение моделей машинного обученияpostgres
- постоянное хранилище данныхredis
- управление очередями для фоновых задач
Сервер Immich
Сервер Immich — это проект на базе TypeScript, написанный для Node.js. Он использует фреймворк Nest.js, сервер Express и инструмент для работы с запросами Kysely. Кодовая база сервера также по возможности следует гексагональной архитектуре. В частности, мы стремимся отделить реализации, специфичные для технологий (src/repositories
), от бизнес-логики (src/services
).
Конечные точки API
Входящий HTTP-запрос сопоставляется с контроллером (src/controllers
). Контроллеры представляют собой коллекции конечных точек HTTP. Каждый контроллер обычно реализует следующие операции CRUD для своего соответствующего типа ресурса:
POST
/<type>
- СоздатьGET
/<type>
- Прочитать (все)GET
/<type>/:id
- Прочитать (по id)PUT
/<type>/:id
- Обновить (по id)DELETE
/<type>/:id
- Удалить (по id)
Объекты передачи данных (DTO)
Сервер использует объекты передачи данных как открытые интерфейсы для входных данных (запрос, параметры и тело) и выходных данных (ответ) для каждой конечной точки. DTO преобразуются в схемы OpenAPI и управляют сгенерированным кодом, используемым каждым клиентом.
Фоновые задачи
Immich использует worker для выполнения фоновых задач. Эти задачи включают:
- Генерация миниатюр
- Извлечение метаданных
- Транскодирование видео
- Умный поиск
- Распознавание лиц
- Миграция шаблона хранения
- Побочные файлы (см. XMP Sidecars)
- Фоновые задачи (удаление файлов, удаление пользователей)
Этот список практически соответствует доступным задачам на странице Администрирование > Задачи, где предоставляются возможности удаленного управления очередями.
Машинное обучение
Служба машинного обучения написана на Python и использует FastAPI для HTTP-коммуникации.
Все операции, связанные с машинным обучением, вынесены в эту службу - immich-machine-learning
. Python является естественным выбором для ИИ и машинного обучения. Также у него есть довольно специфические требования к оборудованию. Запуск его как отдельного контейнера позволяет запускать контейнер на отдельной машине или полностью отключать его.
Каждый запрос к службе машинного обучения содержит соответствующие метаданные для задачи модели, название модели и т. д. Эти настройки хранятся в Postgres вместе с другими конфигурациями системы. Для каждого запроса контейнер микро сервисов извлекает эти настройки, чтобы прикрепить их к запросу.
Во внутренней логике службы машинного обучения загружается, конфигурируется и обрабатывается указанный запрос, текстовый или графический материал. Загруженные модели кэшируются и повторно используются для последующих запросов. Потоковый пул используется для обработки каждого запроса в отдельном потоке, чтобы не блокировать асинхронный цикл событий.
Все модели используют формат ONNX. Этот формат имеет широкую поддержку в индустрии, что позволяет экспортировать из большинства других форматов моделей, а также поддерживается многими аппаратными API. Он также довольно быстрый.
Модели машинного обучения также являются довольно большими, требуя значительных объёмов памяти. Мы всегда ищем способы улучшения и оптимизации данного аспекта этого контейнера.
Postgres
Immich сохраняет данные в Postgres, что включает информацию о доступе и авторизации, пользователях, альбомах, активах, настройках совместного использования и т. д.
Смотрите Миграции базы данных для получения информации о том, как изменить базу данных для создания индекса, модификации таблицы, добавления нового столбца и т. д.
Redis
Immich использует Redis через BullMQ для управления очередями задач. Некоторые задачи инициируют последующие задачи. Например, умный поиск и распознавание лиц зависят от генерации миниатюр и автоматически запускаются после их генерации.