架构
Immich 采用传统的客户端-服务器设计,并配备专用数据库用于数据持久化。前端客户端通过 HTTP 使用 REST API 与后端服务进行通信。以下是架构的高层次图。
高层次图

图示显示了客户端通过 REST 与服务器的 API 进行通信。服务器通过存储库接口与下游系统(如 Redis、Postgres、机器学习、文件系统)通信。图中未显示的是服务器被拆分为两个独立的容器 immich-server
和 immich-microservices
。微服务容器不处 理 API 请求或安排定时任务,主要处理来自 Redis 的作业请求。
客户端
Immich 有三个主要客户端:
- 移动应用 - Android,iOS
- 网页应用 - 响应式网站
- CLI - 命令行工具用于批量上传
移动应用
移动应用是使用 Flutter 基于 Dart 编写的。以下是架构概览:
图示展示了目标架构,但当前代码库未完全遵循此架构。新代码和贡献应遵循此架构。 目前,它使用 Isar 数据库 作为本地数据库,并使用 Riverpod 进行状态管理(provider)。 数据类分为两种:实体类和模型类。实体类存储在设备上的数据库中,而模型类是临时的,仅保存在内存中。 存储库内部应是唯一采用其他数据类(例如 OpenAPI DTO)的地方。然而,其接口不应使用外部数据类!
网页客户端
网页应用是一个 TypeScript 项目,使用 SvelteKit 和 Tailwindcss。
命令行工具 (CLI)
Immich CLI 是一个 npm 包,用户可以通过命令行控制他们的 Immich 实例。它使用 API 执行各种任务,特别是上传资源。有关更多信息,请参阅 CLI 文档。
服务器
Immich 后端分为若干服务,作为单个 Docker 容器运行。
immich-server
- 处理并响应 REST API 请求,执行后台作业(生成缩略图,提取元数据,转码等)immich-machine-learning
- 执行机器学习模型postgres
- 持久化数据存储redis
- 背景作业队列管理
Immich 服务器
Immich 服务器是基于 Node.js 的 TypeScript 项目。它使用 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 架构,控制每个客户端使用的生成代码。