Перейти к основному содержимому

Архитектура

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

Диаграмма высокого уровня

Immich Architecture

На диаграмме показано, как клиенты взаимодействуют с API сервера через REST. Сервер общается с downstream системами (например, Redis, Postgres, Machine Learning, файловая система) через интерфейсы репозиториев. На диаграмме не отображено, что сервер разделен на два отдельных контейнера immich-server и immich-microservices. Контейнер микросервисов не обрабатывает запросы API и не выполняет задания cron, но преимущественно занимается обработкой запросов задач из Redis.

Клиенты

Immich имеет три основных клиента:

  1. Мобильное приложение - Android, iOS
  2. Веб-приложение - адаптивный сайт
  3. CLI - утилита командной строки для массовой загрузки
информация

Все три клиента используют OpenAPI для автоматической генерации REST-клиентов для упрощения интеграции. Для получения дополнительной информации о процессе, смотрите OpenAPI.

Мобильное приложение

Мобильное приложение написано на Dart с использованием Flutter. Ниже представлена обзорная архитектура:

Mobile App
Mobile App
Services
Services
Repositories
Repositories
Providers
Providers
Pages
Pages
Widgets
Widgets
User
User
platform
system
platform...
on-device
database
on-device...
server
server
OpenAPI
OpenAPI
UI part
UI part
non-UI part
non-UI part
Models
Models
Entities
Entities

На диаграмме показана целевая архитектура, текущая кодовая база не всегда следует этой архитектуре. Новый код и вклады должны следовать данной архитектуре. В настоящее время используется Isar Database для локальной базы данных и Riverpod для управления состоянием (провайдеры). Сущности и модели являются двумя типами классов данных, которые используются. В то время как сущности хранятся в локальной базе данных устройства, модели являются эфемерными и хранятся только в памяти. Репозитории должны быть единственным местом, где другие классы данных используются внутренне (например, DTO OpenAPI). Однако их интерфейсы не должны использовать чужие классы данных!

Веб-клиент

Веб-приложение — это проект на TypeScript, который использует SvelteKit и Tailwindcss.

CLI

Immich CLI — это пакет npm, который позволяет пользователям управлять своим экземпляром Immich из командной строки. Он использует API для выполнения различных задач, особенно загрузки активов. Ознакомьтесь с документацией CLI для получения дополнительной информации.

Сервер

Бекенд Immich разделен на несколько служб, которые запускаются как отдельные контейнеры Docker.

  1. immich-server - обработка и ответ на запросы REST API, выполнение фоновых задач (генерация миниатюр, извлечение метаданных, транскодирование видео и т. д.)
  2. immich-machine-learning - выполнение моделей машинного обучения
  3. postgres - постоянное хранилище данных
  4. 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 для управления очередями задач. Некоторые задачи инициируют последующие задачи. Например, умный поиск и распознавание лиц зависят от генерации миниатюр и автоматически запускаются после их генерации.