forked from Cutlery/immich
* Update added and re -arrangement of FAQ * Erasure of addition mistakes * Erasure of addition mistakes * Fix broken links * Correcting spelling errors + adding more questions * New required fixes * More FAQ * Adding questions + adding a note about a directory and an explanation about adding a path in a Windows environment * Update docs/docs/FAQ/Albums-FAQ.md Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com> * Update docs/docs/FAQ/Assets-FAQ.md Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com> * Update docs/docs/FAQ/Machine-Learning-FAQ.md Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com> * Update docs/docs/FAQ/Machine-Learning-FAQ.md Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com> * Update docs/docs/features/libraries.md Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com> * Corrections * chore: updates * import TOCinlines from all FAQ pages to one page + Corrections * Removing privacy information + adding required Flutter version information * Removing privacy information + adding required Flutter version information * Revert "Removing privacy information + adding required Flutter version information" This reverts commit da63439fd212b2ddd578fb6ca860f1a8bcd0bb45. * All in one page * Guide - Remove Offline Files * Guide - Remove Offline Files * doc: updates * chore: fix broken link * docs: clean up database gui guide --------- Co-authored-by: Alex <alex.tran1502@gmail.com> Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com> Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
111 lines
6.2 KiB
Plaintext
111 lines
6.2 KiB
Plaintext
---
|
|
sidebar_position: 1
|
|
---
|
|
|
|
import AppArchitecture from './img/app-architecture.png';
|
|
|
|
# Architecture
|
|
|
|
Immich uses a traditional client-server design, with a dedicated database for data persistence. The frontend clients communicate with backend services over HTTP using REST APIs. Below is a high level diagram of the architecture.
|
|
|
|
## High Level Diagram
|
|
|
|
<img alt="Immich Architecture" src={AppArchitecture} className="p-4 dark:bg-immich-dark-primary my-4" />
|
|
|
|
The diagram shows clients communicating with the server's API via REST. The server communicates with downstream systems (i.e. Redis, Postgres, Machine Learning, file system) through repository interfaces. Not shown in the diagram, is that the server is split into two separate containers `immich-server` and `immich-microservices`. The microservices container does not handle API requests or schedule cron jobs, but primarily handles incoming job requests from Redis.
|
|
|
|
## Clients
|
|
|
|
Immich has three main clients:
|
|
|
|
1. Mobile app - Android, iOS
|
|
2. Web app - Responsive website
|
|
3. CLI - Command-line utility for bulk upload
|
|
|
|
:::info
|
|
All three clients use [OpenAPI](./open-api.md) to auto-generate rest clients for easy integration. For more information about this process, see [OpenAPI](./open-api.md).
|
|
:::
|
|
|
|
### Mobile App
|
|
|
|
The mobile app is written in [Flutter](https://flutter.dev/). It uses [Isar Database](https://isar.dev/) for a local database and [Riverpod](https://riverpod.dev/) for state management.
|
|
|
|
### Web Client
|
|
|
|
The web app is a [TypeScript](https://www.typescriptlang.org/) project that uses [SvelteKit](https://kit.svelte.dev) and [Tailwindcss](https://tailwindcss.com/).
|
|
|
|
### CLI
|
|
|
|
The Immich CLI is an [npm](https://www.npmjs.com/) package that lets users control their Immich instance from the command line. It uses the API to perform various tasks, especially uploading assets. See the [CLI documentation](/docs/features/command-line-interface.md) for more information.
|
|
|
|
## Server
|
|
|
|
The Immich backend is divided into several services, which are run as individual docker containers.
|
|
|
|
1. `immich-server` - Handle and respond to REST API requests
|
|
1. `immich-microservices` - Execute background jobs (thumbnail generation, metadata extraction, transcoding, etc.)
|
|
1. `immich-machine-learning` - Execute machine learning models
|
|
1. `postgres` - Persistent data storage
|
|
1. `redis`- Queue management for `immich-microservices`
|
|
|
|
### Immich Server
|
|
|
|
The Immich Server is a [TypeScript](https://www.typescriptlang.org/) project written for [Node.js](https://nodejs.org/). It uses the [Nest.js](https://nestjs.com) framework, with [TypeORM](https://typeorm.io/) for database management. The server codebase also loosely follows the [Hexagonal Architecture](<https://en.wikipedia.org/wiki/Hexagonal_architecture_(software)>). Specifically, we aim to separate technology specific implementations (`infra/`) from core business logic (`domain/`).
|
|
|
|
#### REST Endpoints
|
|
|
|
The server is a list of HTTP endpoints and associated handlers (controllers). Each controller usually implements the following CRUD operations:
|
|
|
|
- `POST` `/<type>` - **Create**
|
|
- `GET` `/<type>` - **Read** (all)
|
|
- `GET` `/<type>/:id` - **Read** (by id)
|
|
- `PUT` `/<type>/:id` - **Updated** (by id)
|
|
- `DELETE` `/<type>/:id` - **Delete** (by id)
|
|
|
|
#### DTOs
|
|
|
|
The server uses [Domain Transfer Objects](https://en.wikipedia.org/wiki/Data_transfer_object) as public interfaces for the inputs (query, params, and body) and outputs (response) for each endpoint. DTOs translate to [OpenAPI](./open-api.md) schemas and control the generated code used by each client.
|
|
|
|
### Microservices
|
|
|
|
The Immich Microservices image uses the same `Dockerfile` as the Immich Server, but with a different entrypoint. The Immich Microservices service mainly handles executing jobs, which include the following:
|
|
|
|
- Thumbnail Generation
|
|
- Metadata Extraction
|
|
- Video Transcoding
|
|
- Smart Search
|
|
- Facial Recognition
|
|
- Storage Template Migration
|
|
- Sidecar (see [XMP Sidecars](/docs/features/xmp-sidecars.md))
|
|
- Background jobs (file deletion, user deletion)
|
|
|
|
:::info
|
|
This list closely matches what is available on the [Administration > Jobs](/docs/administration/jobs.md) page, which provides some remote queue management capabilities.
|
|
:::
|
|
|
|
### Machine Learning
|
|
|
|
The machine learning service is written in [Python](https://www.python.org/) and uses [FastAPI](https://fastapi.tiangolo.com/) for HTTP communication.
|
|
|
|
All machine learning related operations have been externalized to this service, `immich-machine-learning`. Python is a natural choice for AI and machine learning. It also has some pretty specific hardware requirements. Running it as a separate container makes it possible to run the container on a separate machine, or easily disable it entirely.
|
|
|
|
Each request to the machine learning service contains the relevant metadata for the model task, model name, and so on. These settings are stored in Postgres along with other system configs. For each request, the microservices container fetches these settings in order to attach them to the request.
|
|
|
|
Internally, the machine learning service downloads, loads and configures the specified model for a given request before processing the text or image payload with it. Models that have been loaded are cached and reused across requests. A thread pool is used to process each request in a different thread so as not to block the async event loop.
|
|
|
|
All models are in ONNX format. This format has wide industry support, meaning that most other model formats can be exported to it and many hardware APIs support it. It's also quite fast.
|
|
|
|
Machine learning models are also quite _large_, requiring _quite a bit_ of memory. We are always looking for ways to improve and optimize this aspect of this container specifically.
|
|
|
|
### Postgres
|
|
|
|
Immich persists data in Postgres, which includes information about access and authorization, users, albums, asset, sharing settings, etc.
|
|
|
|
:::info
|
|
See [Database Migrations](./database-migrations.md) for more information about how to modify the database to create an index, modify a table, add a new column, etc.
|
|
:::
|
|
|
|
### Redis
|
|
|
|
Immich uses [Redis](https://redis.com/) via [BullMQ](https://docs.bullmq.io/) to manage job queues. Some jobs trigger subsequent jobs. For example, Smart Search and Facial Recognition relies on thumbnail generation and automatically run after one is generated.
|