diff --git a/README.md b/README.md index 02ae01857e..60d6316c23 100644 --- a/README.md +++ b/README.md @@ -53,13 +53,13 @@ ## Links - [Documentation](https://docs.immich.app/) -- [About](https://docs.immich.app/overview/introduction) -- [Installation](https://docs.immich.app/install/requirements) +- [About](https://docs.immich.app/introduction/getting-started) +- [Installation](https://docs.immich.app/reference/requirements) - [Roadmap](https://immich.app/roadmap) - [Demo](#demo) - [Features](#features) - [Translations](https://docs.immich.app/developer/translations) -- [Contributing](https://docs.immich.app/overview/support-the-project) +- [Contributing](https://docs.immich.app/support-the-project) ## Demo diff --git a/docker/docker-compose.rootless.yml b/docker/docker-compose.rootless.yml index 65b13f2b9d..38763bccea 100644 --- a/docker/docker-compose.rootless.yml +++ b/docker/docker-compose.rootless.yml @@ -41,7 +41,7 @@ services: # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag. # Example tag: ${IMMICH_VERSION:-release}-cuda image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} - # extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration + # extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/administration/set-up-hardware-accelerated-machine-learning # file: hwaccel.ml.yml # service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable user: '1000:1000' diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 4bcf52ca6e..71ec481772 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -36,7 +36,7 @@ services: # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag. # Example tag: ${IMMICH_VERSION:-release}-cuda image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} - # extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration + # extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/administration/set-up-hardware-accelerated-machine-learning # file: hwaccel.ml.yml # service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable volumes: diff --git a/docker/example.env b/docker/example.env index 2403d69a85..6a83146992 100644 --- a/docker/example.env +++ b/docker/example.env @@ -1,4 +1,4 @@ -# You can find documentation for all the supported env variables at https://docs.immich.app/install/environment-variables +# You can find documentation for all the supported env variables at https://docs.immich.app/reference/environment-variables # The location where your uploaded files are stored UPLOAD_LOCATION=./library diff --git a/docker/hwaccel.ml.yml b/docker/hwaccel.ml.yml index c95ac7ee4c..8e4de36365 100644 --- a/docker/hwaccel.ml.yml +++ b/docker/hwaccel.ml.yml @@ -4,7 +4,7 @@ # you can inline the config for a backend by copying its contents # into the immich-machine-learning service in the docker-compose.yml file. -# See https://docs.immich.app/features/ml-hardware-acceleration for info on usage. +# See https://docs.immich.app/administration/set-up-hardware-accelerated-machine-learning for info on usage. services: armnn: diff --git a/docker/hwaccel.transcoding.yml b/docker/hwaccel.transcoding.yml index 0857faf465..b335bdb3bf 100644 --- a/docker/hwaccel.transcoding.yml +++ b/docker/hwaccel.transcoding.yml @@ -4,7 +4,7 @@ # you can inline the config for a backend by copying its contents # into the immich-microservices service in the docker-compose.yml file. -# See https://docs.immich.app/features/hardware-transcoding for more info on using hardware transcoding. +# See https://docs.immich.app/administration/set-up-hardware-transcoding for more info on using hardware transcoding. services: cpu: {} diff --git a/docs/docs/FAQ.mdx b/docs/docs/FAQ.mdx index 869e84e377..de6e49bef4 100644 --- a/docs/docs/FAQ.mdx +++ b/docs/docs/FAQ.mdx @@ -1,3 +1,7 @@ +--- +sidebar_position: 8 +--- + # FAQ ## Commercial Guidelines @@ -32,11 +36,11 @@ When in doubt or if you have an edge case scenario, we encourage you to contact ### How can I reset the admin password? -The admin password can be reset by running the [reset-admin-password](/administration/server-commands.md) command on the immich-server. +The admin password can be reset by running the [reset-admin-password](/administration/run-a-server-command) command on the immich-server. ### How can I see a list of all users in Immich? -You can see the list of all users by running [list-users](/administration/server-commands.md) Command on the Immich-server. +You can see the list of all users by running [list-users](/administration/run-a-server-command) Command on the Immich-server. ### How can I change my profile picture? @@ -112,20 +116,20 @@ However, Immich will delete original files that have been trashed when the trash When Storage Template is off (default) Immich saves the file names in a random string (also known as random UUIDs) to prevent duplicate file names. To retrieve the original file names, you must enable the Storage Template and then run the STORAGE TEMPLATE MIGRATION job. -It is recommended to read about [Storage Template](/administration/storage-template) before activation. +It is recommended to read about [Storage Template](/administration/use-the-storage-template) before activation. ### Can I add my existing photo library? -Yes, with an [External Library](/features/libraries.md). +Yes, with an [External Library](/administration/add-an-external-library). -### What happens to existing files after I choose a new [Storage Template](/administration/storage-template.mdx)? +### What happens to existing files after I choose a new [Storage Template](/administration/use-the-storage-template)? -Template changes will only apply to _new_ assets. To retroactively apply the template to previously uploaded assets, run the Storage Migration Job, available on the [Jobs](/administration/jobs-workers/#jobs) page. +Template changes will only apply to _new_ assets. To retroactively apply the template to previously uploaded assets, run the Storage Migration Job, available on the [Jobs](/reference/jobs) page. ### Why are only photos and not videos being uploaded to Immich? This often happens when using a reverse proxy in front of Immich. -Make sure to [set your reverse proxy](/administration/reverse-proxy/) to allow large requests. +Make sure to [set your reverse proxy](/administration/set-up-a-reverse-proxy) to allow large requests. Also, check the disk space of your reverse proxy. In some cases, proxies cache requests to disk before passing them on, and if disk space runs out, the request fails. @@ -145,7 +149,7 @@ You can _archive_ them. This will hide the asset from the main timeline and fold ### How can I backup data from Immich? -See [Backup and Restore](/administration/backup-and-restore.md). +See [Backup and Restore](/administration/back-up-and-restore). ### Does Immich support reading existing face tag metadata? @@ -231,7 +235,7 @@ volumes: ### Can I keep my existing album structure while importing assets into Immich? -Yes, by using the [Immich CLI](/features/command-line-interface) along with the `--album` flag. +Yes, by using the [Immich CLI](/user-guide/upload-media-with-the-cli) along with the `--album` flag. ### Is there a way to reorder photos within an album? @@ -272,7 +276,7 @@ Immich uses CLIP models. An ML model converts each image to an "embedding", whic ### How does facial recognition work? -See [How Facial Recognition Works](/features/facial-recognition#how-facial-recognition-works) for details. +See [How Facial Recognition Works](/concepts/facial-recognition#how-facial-recognition-works) for details. ### How can I disable machine learning? @@ -294,7 +298,7 @@ No, this is not supported. Only models listed in the [Hugging Face][huggingface] ### I want to be able to search in other languages besides English. How can I do that? -You can change to a multilingual CLIP model. See [here](/features/searching#clip-models) for instructions. +You can change to a multilingual CLIP model. See [here](/reference/clip-models) for instructions. ### Does Immich support Facial Recognition for videos? @@ -305,7 +309,7 @@ Scanning the entire video for faces may be implemented in the future. No. :::tip -You can use [Smart Search](/features/searching.md) for this to some extent. For example, if you have a Golden Retriever and a Chihuahua, type these words in the smart search and watch the results. +You can use [Smart Search](/user-guide/search-your-library) for this to some extent. For example, if you have a Golden Retriever and a Chihuahua, type these words in the smart search and watch the results. ::: ### I'm getting a lot of "faces" that aren't faces, what can I do? @@ -335,7 +339,7 @@ ls clip/ facial-recognition/ ### Why is Immich slow on low-memory systems like the Raspberry Pi? -Immich optionally uses transcoding and machine learning for several features. However, it can be too heavy to run on a Raspberry Pi. You can [mitigate](/FAQ#can-i-lower-cpu-and-ram-usage) this or host Immich's machine-learning container on a [more powerful system](/guides/remote-machine-learning), or [disable](/FAQ#how-can-i-disable-machine-learning) machine learning entirely. +Immich optionally uses transcoding and machine learning for several features. However, it can be too heavy to run on a Raspberry Pi. You can [mitigate](/FAQ#can-i-lower-cpu-and-ram-usage) this or host Immich's machine-learning container on a [more powerful system](/administration/run-machine-learning-remotely), or [disable](/FAQ#how-can-i-disable-machine-learning) machine learning entirely. ### Can I lower CPU and RAM usage? @@ -389,7 +393,7 @@ Do not exaggerate with the job concurrency because you're probably thoroughly ov ### My server shows Server Status Offline | Version Unknown. What can I do? -You need to [enable WebSockets](/administration/reverse-proxy/) on your reverse proxy. +You need to [enable WebSockets](/administration/set-up-a-reverse-proxy) on your reverse proxy. --- @@ -397,7 +401,7 @@ You need to [enable WebSockets](/administration/reverse-proxy/) on your reverse ### How can I see Immich logs? -Immich components are typically deployed using docker. To see logs for deployed docker containers, you can use the [Docker CLI](https://docs.docker.com/engine/reference/commandline/cli/), specifically the `docker logs` command. For examples, see [Docker Help](/guides/docker-help.md). +Immich components are typically deployed using docker. To see logs for deployed docker containers, you can use the [Docker CLI](https://docs.docker.com/engine/reference/commandline/cli/), specifically the `docker logs` command. For examples, see [Docker Help](/administration/inspect-containers-and-logs). ### How can I reduce the log verbosity of Redis? @@ -442,7 +446,7 @@ cap_drop: Data for Immich comes in two forms: 1. **Metadata** stored in a Postgres database, stored in the `DB_DATA_LOCATION` folder (previously `pg_data` Docker volume). -2. **Files** (originals, thumbs, profile, etc.), stored in the `UPLOAD_LOCATION` folder, more [info](/administration/backup-and-restore#asset-types-and-storage-locations). +2. **Files** (originals, thumbs, profile, etc.), stored in the `UPLOAD_LOCATION` folder, more [info](/reference/storage-locations). :::warning This will destroy your database and reset your instance, meaning that you start from scratch. @@ -480,7 +484,7 @@ If it mentions SIGILL (note the lack of a K) or error code 132, it most likely m ### Why am I getting database ownership errors? If you get database errors such as `FATAL: data directory "/var/lib/postgresql/data" has wrong ownership` upon database startup, this is likely due to an issue with your filesystem. -NTFS and ex/FAT/32 filesystems are not supported. See [here](/install/requirements#special-requirements-for-windows-users) for more details. +NTFS and ex/FAT/32 filesystems are not supported. See [here](/reference/requirements#special-requirements-for-windows-users) for more details. ### How can I verify the integrity of my database? diff --git a/docs/docs/administration/add-an-external-library.md b/docs/docs/administration/add-an-external-library.md new file mode 100644 index 0000000000..dd1bef49f8 --- /dev/null +++ b/docs/docs/administration/add-an-external-library.md @@ -0,0 +1,126 @@ +# Add an external library + +This guide walks you through adding an [external library](/concepts/external-libraries) so Immich can show photos and videos that stay where they already are on disk. It assumes you are running Immich in Docker and that the files you want to access are stored on the same machine. + +We'll use a concrete example throughout. Say you want to add these folders: + +- `/home/user/old-pics`: a folder containing childhood photos. +- `/mnt/nas/christmas-trip`: photos from a christmas trip. The subfolder `/mnt/nas/christmas-trip/Raw` contains the raw files directly from the DSLR. We don't want to import the raw files to Immich. +- `/mnt/media/videos`: videos from the same christmas trip. + +First, plan how to organize the libraries. The christmas trip photos should belong to their own library since we want to exclude the raw files. The videos and old photos can be in the same library since we want to import all files. We could also add all three folders to the same library if there were no files matching the Raw exclusion pattern in the other folders. + +## Step 1 - Mount the directories into the containers + +The `immich-server` container needs access to the gallery. Edit `docker-compose.yml` to add one or more mount points in the `immich-server:` section under `volumes:`: + +```diff title="docker-compose.yml" + immich-server: + volumes: + - ${UPLOAD_LOCATION}:/data ++ - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro ++ - /home/user/old-pics:/mnt/media/old-pics:ro ++ - /mnt/media/videos:/mnt/media/videos:ro ++ - /mnt/media/videos2:/mnt/media/videos2 # WARNING: Immich will be able to delete the files in this folder, as it does not end with :ro ++ - "C:/Users/user_name/Desktop/my media:/mnt/media/my-media:ro" # import path in Windows system. +``` + +:::tip +The `ro` flag at the end only gives read-only access to the volumes. +This will disallow the images from being deleted in the web UI, or adding metadata to the library ([XMP sidecars](/reference/xmp-sidecars)). +::: + +Restart Immich by running `docker compose up -d` to register the changes, and make sure you can see the mounted path inside the container. + +## Step 2 - Create the library + +:::info +External library management requires administrator access and the steps below assume you are using an admin account. +::: + +In the Immich web UI: + +- Click the **Administration** link in the upper right corner. + + +- Select the **External Libraries** tab and click the **Create Library** button. + + +- In the dialog, select which user should own the new library. This **can not** be changed later. + + +- You are now on the library management page. + + +- Click `Add` in the `Folders` section, enter `/mnt/media/christmas-trip` as the path, and click Add. + + +- Click `Edit` Library and rename it to "Christmas Trip". + +:::note +Use the `/mnt/media/christmas-trip` path and not the `/mnt/nas/christmas-trip` path — all paths have to be what the Docker containers see. +::: + +## Step 3 - Exclude the raw files + +Next, add an exclusion pattern to filter out the raw files: + +- Click on `Add` in the `Exclusion Patterns` section. +- Enter `**/Raw/**` and click Add. +- Click the three-dots menu and select **Scan New Library Files**. + + +See [Exclusion patterns](/reference/exclusion-patterns) for the full glob syntax. + +The christmas trip library will now be scanned in the background. In the meantime, let's add the videos and old photos to another library. + +## Step 4 - Create a second library + +- Go back to `Administration -> External Libraries`. +- Click on `Create Library`. +- Select which user owns the library. +- On the library management page, click `Add` in the `Folders` section, enter `/mnt/media/old-pics`, then click Add. +- Click `Add` in the `Folders` section again, enter `/mnt/media/videos`, then click Add. +- Click on `Scan`. +- Click on `Edit` Library and rename it to "Old videos and photos". + +Within seconds, the assets from the old-pics and videos folders should show up in the main timeline. + +## Step 5 - Confirm the scan is running + +- Click **Administration**, then select the **Jobs** tab. + + +- You should see non-zero Active jobs for Library, Generate Thumbnails, and Extract Metadata. + +## Set a custom scan interval + +:::note +Only an admin can do this. +::: + +You can define a custom interval for the external library rescan under Administration -> Settings -> External Library. +You can set the scanning interval using the preset or cron format. For more information you can refer to [Crontab Guru](https://crontab.guru/). + + + +## Browse the library as folders + +Folder view provides an additional view besides the timeline that is similar to a file explorer. It allows you to navigate through the folders and files in the library. This feature is handy for a highly curated and customized external library or a nicely configured storage template. + +You can enable it under [`Account Settings > Features > Folders`](https://my.immich.app/user-settings?isOpen=feature+folders). See [Folder view](/user-guide/use-folder-view) for details. + + + +## Troubleshooting + +Sometimes, an external library will not scan correctly. This can happen if Immich can't access the files. Here are some things to check: + +- In the docker-compose file, are the volumes mounted correctly? +- Are the volumes also mounted to any worker containers? +- Are the import paths set correctly, and do they match the path set in docker-compose file? +- Make sure you don't use symlinks in your import libraries, and that you aren't linking across docker mounts. +- Are the permissions set correctly? +- Make sure you are using forward slashes (`/`) and not backward slashes. + +To validate that Immich can reach your external library, start a shell inside the container. Run `docker exec -it immich_server bash` to a bash shell. If your import path is `/mnt/photos`, check it with `ls /mnt/photos`. If you are using a dedicated microservices container, make sure to add the same mount point and check for availability within the microservices container as well. diff --git a/docs/docs/administration/backup-and-restore.md b/docs/docs/administration/back-up-and-restore.md similarity index 66% rename from docs/docs/administration/backup-and-restore.md rename to docs/docs/administration/back-up-and-restore.md index df34671a1b..bb7b2da18f 100644 --- a/docs/docs/administration/backup-and-restore.md +++ b/docs/docs/administration/back-up-and-restore.md @@ -1,11 +1,13 @@ -# Backup and Restore +# Back up and restore import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import { mdiAlertCircle, mdiCheckCircle } from '@mdi/js'; import Icon from '@mdi/react'; -A [3-2-1 backup strategy](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/) is recommended to protect your data. You should keep copies of your uploaded photos/videos as well as the Immich database for a comprehensive backup solution. This page provides an overview on how to backup the database and the location of user-uploaded pictures and videos. A template bash script that can be run as a cron job is provided [here](/guides/template-backup-script.md) +When it comes to photos and videos, backups are extremely important. To learn what a complete Immich backup consists of, why both the database and the files are required, and how to keep them consistent, see [Backups](/concepts/backups) and the [3-2-1 backup method](/reference/3-2-1-backup-method). + +This page covers the mechanics: preparing the database for backup, which files to copy, and how to restore. A template bash script that can be run as a cron job is provided [here](/administration/use-the-backup-script-template). :::danger The instructions on this page show you how to prepare your Immich instance to be backed up, and which files to take a backup of. You still need to take care of using an actual backup tool to make a backup yourself. @@ -13,8 +15,6 @@ The instructions on this page show you how to prepare your Immich instance to be ## Database -Immich stores [file paths](https://github.com/immich-app/immich/discussions/3299) and user metadata in the database. It does not scan the library folder, so database backups are essential. - ### Automatic Database Backups Immich automatically creates database backups for disaster-recovery purposes. These backups are stored in `UPLOAD_LOCATION/backups` and can be managed through the web interface. @@ -210,7 +210,9 @@ The provided restore process ensures your database is never in a broken state by ## Filesystem -Immich does not handle filesystem backups for you. You have to arrange these yourself! Immich stores two types of content in the filesystem: (a) original, unmodified assets (photos and videos), and (b) generated content. We recommend backing up the entire contents of `UPLOAD_LOCATION`, but only the original content is critical, which is stored in the following folders: +Immich does not handle filesystem backups for you. You have to arrange these yourself! + +Back up the entire contents of `UPLOAD_LOCATION`. If you want a smaller backup, the [original content](/concepts/backups#original-versus-generated-content) is the critical part and lives in these folders: 1. `UPLOAD_LOCATION/library` 2. `UPLOAD_LOCATION/upload` @@ -218,96 +220,12 @@ Immich does not handle filesystem backups for you. You have to arrange these you If you choose to back up only those folders, you will need to rerun the transcoding and thumbnail generation jobs for all assets after you restore from a backup. +For what each directory holds, including how the storage template changes the layout, see [Storage locations](/reference/storage-locations). + :::caution If you moved some of these folders onto a different storage device, such as `profile/`, make sure to adjust the backup path to match your setup ::: -### Asset Types and Storage Locations - -Some storage locations are impacted by the Storage Template. See below for more details. - - - - -:::note -The `UPLOAD_LOCATION/library` folder is not used by default on new machines running version 1.92.0. It is used only if the system administrator activated the storage template engine, -for more info read the [release notes](https://github.com/immich-app/immich/releases/tag/v1.92.0#:~:text=the%20partner%E2%80%99s%20assets.-,Hardening%20storage%20template). -::: - -**1. User-Specific Folders:** - -- Each user has a unique string representing them. -- You can find your user ID in Account Account Settings -> Account -> User ID. - -**2. Asset Types and Storage Locations:** - -- **Source Assets:** - - Original assets uploaded through the browser interface & mobile & CLI. - - Stored in `UPLOAD_LOCATION/upload/`. -- **Avatar Images:** - - User profile images. - - Stored in `UPLOAD_LOCATION/profile/`. -- **Thumbs Images:** - - Preview images (small thumbnails and large previews) for each asset and thumbnails for recognized faces. - - Stored in `UPLOAD_LOCATION/thumbs/`. -- **Encoded Assets:** - - Videos that have been re-encoded from the original for wider compatibility. The original is not removed. - - Stored in `UPLOAD_LOCATION/encoded-video/`. -- **Database Dump Backups:** - - Automatic database backups created by Immich for disaster recovery. - - Stored in `UPLOAD_LOCATION/backups/`. -- **Postgres** - - The Immich database containing all the information to allow the system to function properly. - **Note:** This folder will only appear to users who have made the changes mentioned in [v1.102.0](https://github.com/immich-app/immich/discussions/8930) (an optional, non-mandatory change) or who started with this version. - - Stored in `DB_DATA_LOCATION`. - - - - -:::note -If you choose to activate the storage template engine, it will move all assets to `UPLOAD_LOCATION/library/`. - -When you turn off the storage template engine, it will leave the assets in `UPLOAD_LOCATION/library/` and will not return them to `UPLOAD_LOCATION/upload`. -**New assets** will be saved to `UPLOAD_LOCATION/upload`. -::: - -**1. User-Specific Folders:** - -- Each user has a unique string representing them. - - The administrator can set a Storage Label for a user, which will be used instead of `` for the `library/` folder. - - The Admin has a default storage label of `admin`. -- You can find your user ID and Storage Label in Account Account Settings -> Account -> User ID. - -**2. Asset Types and Storage Locations:** - -- **Source Assets:** - - Original assets uploaded through the browser interface, mobile, and CLI. - - Stored in `UPLOAD_LOCATION/library/`. -- **Avatar Images:** - - User profile images. - - Stored in `UPLOAD_LOCATION/profile/`. -- **Thumbs Images:** - - Preview images (blurred, small, large) for each asset and thumbnails for recognized faces. - - Stored in `UPLOAD_LOCATION/thumbs/`. -- **Encoded Assets:** - - Videos that have been re-encoded from the original for wider compatibility. The original is not removed. - - Stored in `UPLOAD_LOCATION/encoded-video/`. -- **Files in Upload Queue (Mobile):** - - Files uploaded through mobile apps. - - Temporarily located in `UPLOAD_LOCATION/upload/`. - - Transferred to `UPLOAD_LOCATION/library/` upon successful upload. -- **Database Dump Backups:** - - Automatic database backups created by Immich for disaster recovery. - - Stored in `UPLOAD_LOCATION/backups/`. -- **Postgres** - - The Immich database containing all the information to allow the system to function properly. - **Note:** This folder will only appear to users who have made the changes mentioned in [v1.102.0](https://github.com/immich-app/immich/discussions/8930) (an optional, non-mandatory change) or who started with this version. - - Stored in `DB_DATA_LOCATION`. - - - - - :::danger Do not touch the files inside these folders under any circumstances except taking a backup. Changing or removing an asset can cause untracked and missing files. You can think of it as App-Which-Must-Not-Be-Named, the only access to viewing, changing and deleting assets is only through the mobile or browser interface. @@ -315,7 +233,6 @@ You can think of it as App-Which-Must-Not-Be-Named, the only access to viewing, ## Backup ordering -A backup of Immich should contain both the database and the asset files. When backing these up it's possible for them to get out of sync, potentially resulting in broken assets after you restore. -The best way of dealing with this is to stop the immich-server container while you take a backup. If nothing is changing then the backup will always be in sync. +Stop the `immich-server` container while the backup runs. If nothing is changing, the database and the files cannot drift out of sync. -If stopping the container is not an option, then the recommended order is to back up the database first, and the filesystem second. This way, the worst case scenario is that there are files on the filesystem that the database doesn't know about. If necessary, these can be (re)uploaded manually after a restore. If the backup is done the other way around, with the filesystem first and the database second, it's possible for the restored database to reference files that aren't in the filesystem backup, thus resulting in broken assets. +If stopping the container is not an option, back up the database **first** and the filesystem **second**. See [consistency between the database and the files](/concepts/backups#consistency-between-the-database-and-the-files) for why the order matters. diff --git a/docs/docs/administration/change-clip-models.md b/docs/docs/administration/change-clip-models.md new file mode 100644 index 0000000000..ba9a7d6ce9 --- /dev/null +++ b/docs/docs/administration/change-clip-models.md @@ -0,0 +1,22 @@ +# Change CLIP models + +This guide switches the model that powers contextual (smart) search. To decide _which_ model to switch to, see the [CLIP models reference](/reference/clip-models), which compares every supported model by memory use, speed, and recall per language. + +The model is set at `Administration > Settings > Machine Learning Settings > Smart Search`. + +## Steps + +Once you've chosen a model, follow these steps: + +1. Copy the name of the model (e.g. `ViT-B-16-SigLIP__webli`) +2. Go to the [Smart Search settings][smart-search-settings] +3. Paste the model name into the Model Name section +4. Save the settings +5. Go to the [Job Status page][job-status-page] +6. Click "All" next to "Smart Search" to begin re-processing your assets with the new model +7. (Optional) Confirm that the logs for the server and machine learning service don't have relevant errors + +In rare instances, changing the model might leave bits of the old model's incompatible data in the database, causing errors when processing Smart Search jobs. If you notice errors like this in the logs, you can change the model back to the previous one and save, then repeat steps 3-7. + +[smart-search-settings]: https://my.immich.app/admin/system-settings?isOpen=machine-learning+smart-search +[job-status-page]: https://my.immich.app/admin/queues diff --git a/docs/docs/guides/database-gui.md b/docs/docs/administration/connect-a-database-gui.md similarity index 98% rename from docs/docs/guides/database-gui.md rename to docs/docs/administration/connect-a-database-gui.md index f9e90c166c..ef8d14ff9b 100644 --- a/docs/docs/guides/database-gui.md +++ b/docs/docs/administration/connect-a-database-gui.md @@ -1,4 +1,4 @@ -# Database GUI +# Connect a database GUI A short guide on connecting [pgAdmin](https://www.pgadmin.org/) to Immich. diff --git a/docs/docs/guides/img/administration-link.webp b/docs/docs/administration/img/administration-link.webp similarity index 100% rename from docs/docs/guides/img/administration-link.webp rename to docs/docs/administration/img/administration-link.webp diff --git a/docs/docs/administration/img/administration-panel.webp b/docs/docs/administration/img/administration-panel.webp deleted file mode 100644 index f2f171914b..0000000000 Binary files a/docs/docs/administration/img/administration-panel.webp and /dev/null differ diff --git a/docs/docs/administration/img/authentik-redirect.webp b/docs/docs/administration/img/authentik-redirect.webp deleted file mode 100644 index f3aa10fd23..0000000000 Binary files a/docs/docs/administration/img/authentik-redirect.webp and /dev/null differ diff --git a/docs/docs/guides/img/create-external-library.webp b/docs/docs/administration/img/create-external-library.webp similarity index 100% rename from docs/docs/guides/img/create-external-library.webp rename to docs/docs/administration/img/create-external-library.webp diff --git a/docs/docs/administration/img/delete-user.webp b/docs/docs/administration/img/delete-user.webp deleted file mode 100644 index 9d03e5a94a..0000000000 Binary files a/docs/docs/administration/img/delete-user.webp and /dev/null differ diff --git a/docs/docs/administration/img/disable-password-login.webp b/docs/docs/administration/img/disable-password-login.webp deleted file mode 100644 index 5e95177392..0000000000 Binary files a/docs/docs/administration/img/disable-password-login.webp and /dev/null differ diff --git a/docs/docs/guides/img/edit-import-path.webp b/docs/docs/administration/img/edit-import-path.webp similarity index 100% rename from docs/docs/guides/img/edit-import-path.webp rename to docs/docs/administration/img/edit-import-path.webp diff --git a/docs/docs/guides/img/email-ms-settings.webp b/docs/docs/administration/img/email-ms-settings.webp similarity index 100% rename from docs/docs/guides/img/email-ms-settings.webp rename to docs/docs/administration/img/email-ms-settings.webp diff --git a/docs/docs/guides/img/email-settings.webp b/docs/docs/administration/img/email-settings.webp similarity index 100% rename from docs/docs/guides/img/email-settings.webp rename to docs/docs/administration/img/email-settings.webp diff --git a/docs/docs/administration/img/enable-password-login.webp b/docs/docs/administration/img/enable-password-login.webp deleted file mode 100644 index d1401f2afe..0000000000 Binary files a/docs/docs/administration/img/enable-password-login.webp and /dev/null differ diff --git a/docs/docs/features/img/folder-view-1.webp b/docs/docs/administration/img/folder-view-1.webp similarity index 100% rename from docs/docs/features/img/folder-view-1.webp rename to docs/docs/administration/img/folder-view-1.webp diff --git a/docs/docs/guides/img/google-app-password.webp b/docs/docs/administration/img/google-app-password.webp similarity index 100% rename from docs/docs/guides/img/google-app-password.webp rename to docs/docs/administration/img/google-app-password.webp diff --git a/docs/docs/administration/img/immich-email-notefaction.webp b/docs/docs/administration/img/immich-email-notefaction.webp deleted file mode 100644 index 8da19bdc2b..0000000000 Binary files a/docs/docs/administration/img/immich-email-notefaction.webp and /dev/null differ diff --git a/docs/docs/guides/img/immich_map_styles_publish.webp b/docs/docs/administration/img/immich_map_styles_publish.webp similarity index 100% rename from docs/docs/guides/img/immich_map_styles_publish.webp rename to docs/docs/administration/img/immich_map_styles_publish.webp diff --git a/docs/docs/guides/img/jobs-tab.webp b/docs/docs/administration/img/jobs-tab.webp similarity index 100% rename from docs/docs/guides/img/jobs-tab.webp rename to docs/docs/administration/img/jobs-tab.webp diff --git a/docs/docs/features/img/library-custom-scan-interval.webp b/docs/docs/administration/img/library-custom-scan-interval.webp similarity index 100% rename from docs/docs/features/img/library-custom-scan-interval.webp rename to docs/docs/administration/img/library-custom-scan-interval.webp diff --git a/docs/docs/guides/img/library-management-page.webp b/docs/docs/administration/img/library-management-page.webp similarity index 100% rename from docs/docs/guides/img/library-management-page.webp rename to docs/docs/administration/img/library-management-page.webp diff --git a/docs/docs/guides/img/library-owner.webp b/docs/docs/administration/img/library-owner.webp similarity index 100% rename from docs/docs/guides/img/library-owner.webp rename to docs/docs/administration/img/library-owner.webp diff --git a/docs/docs/administration/img/list-users.webp b/docs/docs/administration/img/list-users.webp deleted file mode 100644 index 05b7fb3aa7..0000000000 Binary files a/docs/docs/administration/img/list-users.webp and /dev/null differ diff --git a/docs/docs/administration/img/password-login-settings.webp b/docs/docs/administration/img/password-login-settings.webp deleted file mode 100644 index fd61a18d03..0000000000 Binary files a/docs/docs/administration/img/password-login-settings.webp and /dev/null differ diff --git a/docs/docs/guides/img/pgadmin-add-new-server.webp b/docs/docs/administration/img/pgadmin-add-new-server.webp similarity index 100% rename from docs/docs/guides/img/pgadmin-add-new-server.webp rename to docs/docs/administration/img/pgadmin-add-new-server.webp diff --git a/docs/docs/guides/img/scan-new-library-files.webp b/docs/docs/administration/img/scan-new-library-files.webp similarity index 100% rename from docs/docs/guides/img/scan-new-library-files.webp rename to docs/docs/administration/img/scan-new-library-files.webp diff --git a/docs/docs/administration/img/user-management-update.webp b/docs/docs/administration/img/user-management-update.webp deleted file mode 100644 index 00dda77ce3..0000000000 Binary files a/docs/docs/administration/img/user-management-update.webp and /dev/null differ diff --git a/docs/docs/guides/better-facial-clusters.md b/docs/docs/administration/improve-facial-recognition-clusters.md similarity index 84% rename from docs/docs/guides/better-facial-clusters.md rename to docs/docs/administration/improve-facial-recognition-clusters.md index 40796983a5..817fd68fd4 100644 --- a/docs/docs/guides/better-facial-clusters.md +++ b/docs/docs/administration/improve-facial-recognition-clusters.md @@ -1,8 +1,8 @@ -# Better Facial Recognition Clusters +# Improve facial recognition clusters ## Purpose -This guide explains how to optimize facial recognition in systems with large image libraries. By following these steps, you'll achieve better clustering of faces, reducing the need for manual merging. +This guide explains how to optimize [facial recognition](/concepts/facial-recognition) in systems with large image libraries. By following these steps, you'll achieve better clustering of faces, reducing the need for manual merging. --- @@ -10,7 +10,7 @@ This guide explains how to optimize facial recognition in systems with large ima - **Best Suited For:** Large image libraries after importing a significant number of images. - **Warning:** This method deletes all previously assigned names. -- **Tip:** **Always take a [backup](/administration/backup-and-restore#database) before proceeding!** +- **Tip:** **Always take a [backup](/administration/back-up-and-restore#database) before proceeding!** --- diff --git a/docs/docs/guides/docker-help.md b/docs/docs/administration/inspect-containers-and-logs.md similarity index 75% rename from docs/docs/guides/docker-help.md rename to docs/docs/administration/inspect-containers-and-logs.md index 5f03de2d04..a2be2a439a 100644 --- a/docs/docs/guides/docker-help.md +++ b/docs/docs/administration/inspect-containers-and-logs.md @@ -1,4 +1,6 @@ -# Docker Help +# Inspect containers and logs + +Common Docker commands for looking inside a running Immich deployment. If Immich is configured for [JSON logging](/reference/logging#json-format), the output of `docker logs` is one JSON object per line. ## Containers diff --git a/docs/docs/administration/jobs-workers.md b/docs/docs/administration/jobs-workers.md deleted file mode 100644 index dc2ca55bb9..0000000000 --- a/docs/docs/administration/jobs-workers.md +++ /dev/null @@ -1,74 +0,0 @@ -# Jobs and Workers - -## Workers - -### Architecture - -The `immich-server` container contains multiple workers: - -- `api`: responds to API requests for data and files for the web and mobile app. -- `microservices`: handles most other work, such as thumbnail generation and video encoding, in the form of _jobs_. Simply put, a job is a request to process data in the background. - -## Split workers - -If you prefer to throttle or distribute the workers, you can do this using the [environment variables](/install/environment-variables) to specify which container should pick up which tasks. - -For example, for a simple setup with one container for the Web/API and one for all other microservices, you can do the following: - -Copy the entire `immich-server` block as a new service and make the following changes to the **copy**: - -```diff -- immich-server: -- container_name: immich_server -... -- ports: -- - 2283:2283 -+ immich-microservices: -+ container_name: immich_microservices -``` - -Once you have two copies of the immich-server service, make the following changes to each one. This will allow one container to only serve the web UI and API, and the other one to handle all other tasks. - -```diff -services: - immich-server: - ... -+ environment: -+ IMMICH_WORKERS_INCLUDE: 'api' - - immich-microservices: - ... -+ environment: -+ IMMICH_WORKERS_EXCLUDE: 'api' -``` - -## Jobs - -When a new asset is uploaded it kicks off a series of jobs, which include metadata extraction, thumbnail generation, machine learning tasks, and storage template migration, if enabled. To view the status of a job navigate to the Administration -> Jobs page. - - - -Additionally, some jobs (such as memories generation) run on a schedule, which is every night at midnight by default. To change when they run or enable/disable a job navigate to System Settings -> [Nightly Tasks Settings](https://my.immich.app/admin/system-settings?isOpen=nightly-tasks). - - - -:::note -Some jobs ([External Libraries](/features/libraries) scanning, Database Dump) are configured in their own sections in System Settings. -::: - -## Job processing order - -The below diagram shows the job run order for newly uploaded files - -```mermaid -graph TD - A[Asset Upload] --> B[Metadata Extraction] - B --> C[Storage Template Migration] - C --> D["Thumbnail Generation (Large, small, blurred and person)"] - D --> E[Smart Search] - D --> F[Face Detection] - D --> G[OCR] - D --> H[Video Transcoding] - E --> I[Duplicate Detection] - F --> J[Facial Recognition] -``` diff --git a/docs/docs/administration/user-management.mdx b/docs/docs/administration/manage-users.mdx similarity index 95% rename from docs/docs/administration/user-management.mdx rename to docs/docs/administration/manage-users.mdx index 6d2b2f9062..8028c6ed85 100644 --- a/docs/docs/administration/user-management.mdx +++ b/docs/docs/administration/manage-users.mdx @@ -1,9 +1,9 @@ import RegisterAdminUser from '/docs/partials/_register-admin.md'; import UserCreate from '/docs/partials/_user-create.md'; -# User Management +# Manage users -Immich supports multiple users, each with their own library. +Immich supports multiple users, each with their own library and [storage directories](/reference/storage-locations). ## Register the Admin User diff --git a/docs/docs/administration/migrate-to-vectorchord.md b/docs/docs/administration/migrate-to-vectorchord.md new file mode 100644 index 0000000000..e7f50226ba --- /dev/null +++ b/docs/docs/administration/migrate-to-vectorchord.md @@ -0,0 +1,182 @@ +# Migrate to VectorChord + +VectorChord is the successor to the deprecated pgvecto.rs extension, with better performance, lower memory usage, and higher quality results for smart search and facial recognition. Immich has migrated to it, so instances still on pgvecto.rs need to make this change. + +The steps depend on how the database is deployed — pick the matching section below. + +:::info +If you deploy Immich using Docker Compose, see `ghcr.io/immich-app/postgres` in the `docker-compose.yml` file, and have not explicitly set the `DB_VECTOR_EXTENSION` environment variable, your database is already using VectorChord and none of this applies to you. +::: + +:::important +If you do not deploy Immich using Docker Compose and see a deprecation warning for pgvecto.rs on server startup, refer to the maintainers of your Immich distribution for guidance (if using a turnkey solution) or adapt the instructions for your specific setup. +::: + +Before making any changes, [back up your database](/administration/back-up-and-restore). Every effort has been made to make this migration smooth, but there is always a chance that something goes wrong. See [Backups](/concepts/backups) for what a complete backup includes. + +## Docker Compose + +Modify your `docker-compose.yml` file as follows. + +```diff + [...] + + database: + container_name: immich_postgres +- image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52 ++ image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 + environment: + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_USER: ${DB_USERNAME} + POSTGRES_DB: ${DB_DATABASE_NAME} + POSTGRES_INITDB_ARGS: '--data-checksums' ++ # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs ++ # DB_STORAGE_TYPE: 'HDD' + volumes: + # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file + - ${DB_DATA_LOCATION}:/var/lib/postgresql/data +- healthcheck: +- test: >- +- pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1; +- Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align +- --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; +- echo "checksum failure count is $$Chksum"; +- [ "$$Chksum" = '0' ] || exit 1 +- interval: 5m +- start_interval: 30s +- start_period: 5m +- command: >- +- postgres +- -c shared_preload_libraries=vectors.so +- -c 'search_path="$$user", public, vectors' +- -c logging_collector=on +- -c max_wal_size=2GB +- -c shared_buffers=512MB +- -c wal_compression=on ++ shm_size: 128mb + restart: always + + [...] +``` + +:::important +If you deviated from the defaults of pg14 or pgvectors0.2.0, you must adjust the pg major version and pgvecto.rs version. If you are still using the default `docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0` image, you can just follow the changes above. For example, if the previous image is `docker.io/tensorchord/pgvecto-rs:pg16-v0.3.0`, the new image should be `ghcr.io/immich-app/postgres:16-vectorchord0.3.0-pgvectors0.3.0` instead of the image specified in the diff. +::: + +After making these changes, you can start Immich as normal. Immich will make some changes to the DB during startup, which can take seconds to minutes to finish, depending on hardware and library size. In particular, it’s normal for the server logs to be seemingly stuck at `Reindexing clip_index` and `Reindexing face_index` for some time if you have over 100k assets in Immich and/or Immich is on a relatively weak server. If you see these logs and there are no errors, just give it time. + +:::danger +After switching to VectorChord, you should not downgrade Immich below 1.133.0. +::: + +Please don’t hesitate to contact us on [GitHub](https://github.com/immich-app/immich/discussions) or [Discord](https://discord.immich.app/) if you encounter migration issues. + +## Pre-existing Postgres server + +For an instance using a [pre-existing Postgres server](/administration/use-a-pre-existing-postgres-server), the path depends on which extension is installed today. + +VectorChord is the successor extension to pgvecto.rs, allowing for higher performance, lower memory usage and higher quality results for smart search and facial recognition. + +### From pgvecto.rs + +Support for pgvecto.rs has been dropped as of 3.0, hence all users currently using pgvecto.rs should migrate to VectorChord. There are two primary approaches to do so. + +The easiest option is to have both extensions installed during the migration: + +
+Migration steps (automatic) +1. Ensure you still have pgvecto.rs installed +2. Install `pgvector` (`>= 0.7, < 0.9`). The easiest way to do this is on Debian/Ubuntu by adding the [PostgreSQL Apt repository][pg-apt] and then running `apt install postgresql-NN-pgvector`, where `NN` is your Postgres version (e.g., `16`) +3. [Install VectorChord][vchord-install] +4. Add `shared_preload_libraries= 'vchord.so, vectors.so'` to your `postgresql.conf`, making sure to include _both_ `vchord.so` and `vectors.so`. You may include other libraries here as well if needed +5. Restart the Postgres database +6. If Immich does not have superuser permissions, run the SQL command `CREATE EXTENSION vchord CASCADE;` using psql or your choice of database client +7. Start Immich and wait for the logs `Reindexed face_index` and `Reindexed clip_index` to be output +8. If Immich does not have superuser permissions, run the SQL command `DROP EXTENSION vectors;` +9. Drop the old schema by running `DROP SCHEMA vectors;` +10. Remove the `vectors.so` entry from the `shared_preload_libraries` setting +11. Restart the Postgres database +12. Uninstall pgvecto.rs (e.g. `apt-get purge vectors-pg14` on Debian-based environments, replacing `pg14` as appropriate). `pgvector` must remain installed as it provides the data types used by `vchord` + +
+ +If it is not possible to have both VectorChord and pgvecto.rs installed at the same time, you can perform the migration with more manual steps: + +
+Migration steps (manual) +1. While pgvecto.rs is still installed, run the following SQL command using psql or your choice of database client. Take note of the number outputted by this command as you will need it later + +```sql +SELECT atttypmod as dimsize + FROM pg_attribute f + JOIN pg_class c ON c.oid = f.attrelid + WHERE c.relkind = 'r'::char + AND f.attnum > 0 + AND c.relname = 'smart_search'::text + AND f.attname = 'embedding'::text; +``` + +2. Remove references to pgvecto.rs using the below SQL commands + +```sql +DROP INDEX IF EXISTS clip_index; +DROP INDEX IF EXISTS face_index; +ALTER TABLE smart_search ALTER COLUMN embedding SET DATA TYPE real[]; +ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE real[]; +``` + +3. [Install VectorChord][vchord-install] +4. Change the columns back to the appropriate vector types, replacing `` with the number from step 1 + +```sql +CREATE EXTENSION IF NOT EXISTS vchord CASCADE; +ALTER TABLE smart_search ALTER COLUMN embedding SET DATA TYPE vector(); +ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE vector(512); +``` + +5. Start Immich and let it create new indices using VectorChord + +
+ +### From pgvector + +
+Migration steps +1. Ensure you have at least `0.7.0` of pgvector installed. If it is below that, please upgrade it and run the SQL command `ALTER EXTENSION vector UPDATE;` using psql or your choice of database client +2. Follow the Prerequisites to install VectorChord +3. If Immich does not have superuser permissions, run the SQL command `CREATE EXTENSION vchord CASCADE;` +4. Remove the `DB_VECTOR_EXTENSION=pgvector` environmental variable as it will make Immich still use pgvector if set +5. Start Immich and let it create new indices using VectorChord + +
+ +Note that VectorChord itself uses pgvector types, so you should not uninstall pgvector after following these steps. + +## FAQ + +### I have a separate PostgreSQL instance shared with multiple services. How can I switch to VectorChord? + +Follow [Pre-existing Postgres server](#pre-existing-postgres-server) below instead of the Docker Compose steps. The path differs depending on whether you are currently using pgvecto.rs or pgvector, and on whether Immich has superuser permissions. + +### Why are so many lines removed from the `docker-compose.yml` file? Does this mean the health check is removed? + +These lines are now incorporated into the image itself along with some additional tuning. + +### What does this change mean for my existing DB backups? + +The new DB image includes pgvector and pgvecto.rs in addition to VectorChord, so you can use this image to restore from existing backups that used either of these extensions. However, backups made after switching to VectorChord require an image containing VectorChord to restore successfully. + +### Do I still need pgvecto.rs installed after migrating to VectorChord? + +pgvecto.rs only needs to be available during the migration, or if you need to restore from a backup that used pgvecto.rs. For a leaner DB and a smaller image, you can optionally switch to an image variant that doesn’t have pgvecto.rs installed after you’ve performed the migration and started Immich: `ghcr.io/immich-app/postgres:14-vectorchord0.4.3`, changing the PostgreSQL version as appropriate. + +### Why does it matter whether my database is on an SSD or an HDD? + +These storage mediums have different performance characteristics. As a result, the optimal settings for an SSD are not the same as those for an HDD. Either configuration is compatible with SSD and HDD, but using the right configuration will make Immich snappier. As a general tip, we recommend users store the database on an SSD whenever possible. + +### Can I use the new database image as a general PostgreSQL image outside of Immich? + +It’s a standard PostgreSQL container image that additionally contains the VectorChord, pgvector, and (optionally) pgvecto.rs extensions. If you were using the previous pgvecto.rs image for other purposes, you can similarly do so with this image. + +[vchord-install]: https://docs.vectorchord.ai/vectorchord/getting-started/installation.html +[pg-apt]: https://www.postgresql.org/download/linux/#generic diff --git a/docs/docs/features/monitoring.md b/docs/docs/administration/monitor-immich.md similarity index 63% rename from docs/docs/features/monitoring.md rename to docs/docs/administration/monitor-immich.md index 46063fded6..8cb217ad5a 100644 --- a/docs/docs/features/monitoring.md +++ b/docs/docs/administration/monitor-immich.md @@ -1,34 +1,15 @@ -# Monitoring +# Monitor Immich -## Overview - -Immich provides a variety of performance metrics to allow for local monitoring and insights. This integration is primarily in the form of Prometheus metrics. However, exporting traces is also possible due to the use of OpenTelemetry instrumentation. - -:::note -This is an opt-in feature intended for you to monitor immich's performance. This data isn't sent anywhere beyond what you've configured. -::: +This guide sets up Prometheus and Grafana against an Immich instance, and switches Immich to JSON logging for a log aggregator. For what Immich exposes and why, see [Monitoring](/concepts/monitoring); for the log fields, see [Logging](/reference/logging). ## Prometheus -Prometheus is a tool that collects metrics from a number of sources you configure. It operates in a "pull" strategy - that is, it periodically requests metrics from each defined source. This means that the source doesn't send anything until it's requested. It also means that the source -- immich, in this case -- has to expose an endpoint for Prometheus to target when it requests metrics. - -### Metrics - -These metrics come in a variety of forms: - -- Counters, which can only increase. Example: the number of times an endpoint has been called. -- Gauges, which can increase or decrease within a certain range. Example: CPU utilization. -- Histograms, where each observation is assigned to a certain number of "buckets". Example: response time, where each bucket is a number of milliseconds. This one is a bit more complicated. - - Buckets in this case are _cumulative_; that is, an observation is placed not only into the smallest bucket that contains it, but also to all buckets larger than this. For example, if a histogram has three buckets for 1ms, 5ms and 10ms, an observation of 3ms will be bucketed into both 5ms and 10ms. - -The metrics in immich are grouped into API (endpoint calls and response times), host (memory and CPU utilization), and IO (internal database queries, image processing, and so on). Each group of metrics can be enabled or disabled independently. - ### Configuration Immich will not expose an endpoint for metrics by default. To enable this endpoint, you can add the `IMMICH_TELEMETRY_INCLUDE=all` environmental variable to your `.env` file. Note that only the server container currently use this variable. :::tip -`IMMICH_TELEMETRY_INCLUDE=all` enables all metrics. For a more granular configuration you can enumerate the telemetry metrics that should be included as a comma separated list (e.g. `IMMICH_TELEMETRY_INCLUDE=repo,api`). Alternatively, you can also exclude specific metrics with `IMMICH_TELEMETRY_EXCLUDE`. For more information refer to the [environment section](/install/environment-variables.md#prometheus). +`IMMICH_TELEMETRY_INCLUDE=all` enables all metrics. For a more granular configuration you can enumerate the telemetry metrics that should be included as a comma separated list (e.g. `IMMICH_TELEMETRY_INCLUDE=repo,api`). Alternatively, you can also exclude specific metrics with `IMMICH_TELEMETRY_EXCLUDE`. For more information refer to the [environment section](/reference/environment-variables#prometheus). ::: The next step is to configure a new or existing Prometheus instance to scrape this endpoint. The following steps assume that you do not have an existing Prometheus instance, but the steps will be similar either way. @@ -68,7 +49,7 @@ After bringing down the containers with `docker compose down` and back up with ` :::note To see exactly what metrics are made available, you can additionally add `8081:8081` (API metrics) and `8082:8082` (microservices metrics) to the immich_server container's ports. Visiting the `/metrics` endpoint for these services will show the same raw data that Prometheus collects. -To configure these ports see [`IMMICH_API_METRICS_PORT` & `IMMICH_MICROSERVICES_METRICS_PORT`](/install/environment-variables/#general). +To configure these ports see [`IMMICH_API_METRICS_PORT` & `IMMICH_MICROSERVICES_METRICS_PORT`](/reference/environment-variables#general). ::: ### Usage @@ -128,24 +109,4 @@ IMMICH_LOG_FORMAT=json The default is `IMMICH_LOG_FORMAT=console` for human-readable logs with colors during development. For production deployments using log aggregation, use `IMMICH_LOG_FORMAT=json`. ::: -### JSON Log Format - -When enabled, logs are output in structured JSON format: - -```json -{"level":"log","pid":36,"timestamp":1766533331507,"message":"Initialized websocket server","context":"WebsocketRepository"} -{"level":"warn","pid":48,"timestamp":1766533331629,"message":"Unable to open /build/www/index.html, skipping SSR.","context":"ApiService"} -{"level":"error","pid":36,"timestamp":1766533331690,"message":"Failed to load plugin immich-core:","context":"Error"} -``` - -This format includes: - -- `level`: Log level (log, warn, error, etc.) -- `pid`: Process ID -- `timestamp`: Unix timestamp in milliseconds -- `message`: Log message -- `context`: Service or component that generated the log - -For more information on log formats, see [`IMMICH_LOG_FORMAT`](/install/environment-variables.md#general). - [prom-file]: https://github.com/immich-app/immich/releases/latest/download/prometheus.yml diff --git a/docs/docs/administration/postgres-standalone.md b/docs/docs/administration/postgres-standalone.md deleted file mode 100644 index fa108995c7..0000000000 --- a/docs/docs/administration/postgres-standalone.md +++ /dev/null @@ -1,158 +0,0 @@ -# Pre-existing Postgres - -While not officially recommended, it is possible to run Immich using a pre-existing Postgres server. To use this setup, you should have a baseline level of familiarity with Postgres and the Linux command line. If you do not have these, we recommend using the default setup with a dedicated Postgres container. - -By default, Immich expects superuser permission on the Postgres database and requires certain extensions to be installed. This guide outlines the steps required to prepare a pre-existing Postgres server to be used by Immich. - -:::tip -Running with a pre-existing Postgres server can unlock powerful administrative features, including logical replication and streaming write-ahead log backups using programs like pgBackRest or Barman. -::: - -## Prerequisites - -You must install pgvector as it is a prerequisite for VectorChord. -The easiest way to do this on Debian/Ubuntu is by adding the [PostgreSQL Apt repository][pg-apt] and then -running `apt install postgresql-NN-pgvector`, where `NN` is your Postgres version (e.g., `16`). - -You must install VectorChord into your instance of Postgres using their [instructions][vchord-install]. After installation, add `shared_preload_libraries = 'vchord.so'` to your `postgresql.conf`. If you already have some `shared_preload_libraries` set, you can separate each extension with a comma. For example, `shared_preload_libraries = 'pg_stat_statements, vchord.so'`. - -:::note Supported versions -Immich is known to work with Postgres versions `>= 14, < 20`. - -VectorChord is known to work with pgvector versions `>= 0.7, < 0.9`. - -The Immich server will check the VectorChord version on startup to ensure compatibility, and refuse to start if a compatible version is not found. -The current accepted range for VectorChord is `>= 0.3, < 2.0`. -::: - -## Specifying the connection URL - -You can connect to your pre-existing Postgres server by setting the `DB_URL` environment variable in the `.env` file. - -``` -DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename' - -# require a SSL connection to Postgres -# DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename?sslmode=require' - -# require a SSL connection, but don't enforce checking the certificate name -# DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename?sslmode=require&sslmode=no-verify' -``` - -## With superuser permission - -Typically Immich expects superuser permission in the database, which you can grant by running `ALTER USER WITH SUPERUSER;` at the `psql` console. If you prefer not to grant superuser permissions, follow the instructions in the next section. - -## Without superuser permission - -:::caution -This method is recommended for **advanced users only** and often requires manual intervention when updating Immich. -::: - -:::danger -Currently, automated backups require superuser permission due to the usage of `pg_dumpall`. -::: - -Immich can run without superuser permissions by following the below instructions at the `psql` prompt to prepare the database. - -```sql title="Set up Postgres for Immich" -CREATE DATABASE ; -\c -BEGIN; -ALTER DATABASE OWNER TO ; -CREATE EXTENSION vchord CASCADE; -CREATE EXTENSION earthdistance CASCADE; -COMMIT; -``` - -### Updating VectorChord - -When installing a new version of VectorChord, you will need to manually update the extension and reindex by connecting to the Immich database and running: - -``` -ALTER EXTENSION vchord UPDATE; -REINDEX INDEX face_index; -REINDEX INDEX clip_index; -``` - -## Migrating to VectorChord - -VectorChord is the successor extension to pgvecto.rs, allowing for higher performance, lower memory usage and higher quality results for smart search and facial recognition. - -### Migrating from pgvecto.rs - -Support for pgvecto.rs has been dropped as of 3.0, hence all users currently using pgvecto.rs should migrate to VectorChord. There are two primary approaches to do so. - -The easiest option is to have both extensions installed during the migration: - -
-Migration steps (automatic) -1. Ensure you still have pgvecto.rs installed -2. Install `pgvector` (`>= 0.7, < 0.9`). The easiest way to do this is on Debian/Ubuntu by adding the [PostgreSQL Apt repository][pg-apt] and then running `apt install postgresql-NN-pgvector`, where `NN` is your Postgres version (e.g., `16`) -3. [Install VectorChord][vchord-install] -4. Add `shared_preload_libraries= 'vchord.so, vectors.so'` to your `postgresql.conf`, making sure to include _both_ `vchord.so` and `vectors.so`. You may include other libraries here as well if needed -5. Restart the Postgres database -6. If Immich does not have superuser permissions, run the SQL command `CREATE EXTENSION vchord CASCADE;` using psql or your choice of database client -7. Start Immich and wait for the logs `Reindexed face_index` and `Reindexed clip_index` to be output -8. If Immich does not have superuser permissions, run the SQL command `DROP EXTENSION vectors;` -9. Drop the old schema by running `DROP SCHEMA vectors;` -10. Remove the `vectors.so` entry from the `shared_preload_libraries` setting -11. Restart the Postgres database -12. Uninstall pgvecto.rs (e.g. `apt-get purge vectors-pg14` on Debian-based environments, replacing `pg14` as appropriate). `pgvector` must remain installed as it provides the data types used by `vchord` - -
- -If it is not possible to have both VectorChord and pgvecto.rs installed at the same time, you can perform the migration with more manual steps: - -
-Migration steps (manual) -1. While pgvecto.rs is still installed, run the following SQL command using psql or your choice of database client. Take note of the number outputted by this command as you will need it later - -```sql -SELECT atttypmod as dimsize - FROM pg_attribute f - JOIN pg_class c ON c.oid = f.attrelid - WHERE c.relkind = 'r'::char - AND f.attnum > 0 - AND c.relname = 'smart_search'::text - AND f.attname = 'embedding'::text; -``` - -2. Remove references to pgvecto.rs using the below SQL commands - -```sql -DROP INDEX IF EXISTS clip_index; -DROP INDEX IF EXISTS face_index; -ALTER TABLE smart_search ALTER COLUMN embedding SET DATA TYPE real[]; -ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE real[]; -``` - -3. [Install VectorChord][vchord-install] -4. Change the columns back to the appropriate vector types, replacing `` with the number from step 1 - -```sql -CREATE EXTENSION IF NOT EXISTS vchord CASCADE; -ALTER TABLE smart_search ALTER COLUMN embedding SET DATA TYPE vector(); -ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE vector(512); -``` - -5. Start Immich and let it create new indices using VectorChord - -
- -### Migrating from pgvector - -
-Migration steps -1. Ensure you have at least `0.7.0` of pgvector installed. If it is below that, please upgrade it and run the SQL command `ALTER EXTENSION vector UPDATE;` using psql or your choice of database client -2. Follow the Prerequisites to install VectorChord -3. If Immich does not have superuser permissions, run the SQL command `CREATE EXTENSION vchord CASCADE;` -4. Remove the `DB_VECTOR_EXTENSION=pgvector` environmental variable as it will make Immich still use pgvector if set -5. Start Immich and let it create new indices using VectorChord - -
- -Note that VectorChord itself uses pgvector types, so you should not uninstall pgvector after following these steps. - -[vchord-install]: https://docs.vectorchord.ai/vectorchord/getting-started/installation.html -[pg-apt]: https://www.postgresql.org/download/linux/#generic diff --git a/docs/docs/administration/server-commands.md b/docs/docs/administration/run-a-server-command.md similarity index 55% rename from docs/docs/administration/server-commands.md rename to docs/docs/administration/run-a-server-command.md index 49bcf17700..d5908fe6fe 100644 --- a/docs/docs/administration/server-commands.md +++ b/docs/docs/administration/run-a-server-command.md @@ -1,27 +1,10 @@ -# Server Commands +# Run a server command -The `immich-server` docker image comes preinstalled with an administrative CLI (`immich-admin`) that supports the following commands: +The `immich-server` image ships an administrative CLI called `immich-admin`. Every available command is listed in [Server Commands](/reference/server-commands); this guide covers running them and shows what each one prints. -| Command | Description | -| -------------------------- | ------------------------------------------------------------- | -| `help` | Display help | -| `reset-admin-password` | Reset the password for the admin user | -| `disable-password-login` | Disable password login | -| `enable-password-login` | Enable password login | -| `disable-maintenance-mode` | Disable maintenance mode | -| `enable-maintenance-mode` | Enable maintenance mode | -| `enable-oauth-login` | Enable OAuth login | -| `disable-oauth-login` | Disable OAuth login | -| `list-users` | List Immich users | -| `grant-admin` | Grant admin privileges to a user (by email) | -| `revoke-admin` | Revoke admin privileges from a user (by email) | -| `version` | Print Immich version | -| `change-media-location` | Change database file paths to align with a new media location | -| `schema-check` | Verify database migrations and check for schema drift | +## Run a command -## How to run a command - -To run a command, [connect](/guides/docker-help.md#attach-to-a-container) to the `immich_server` container and then execute the command via `immich-admin `. +To run a command, [connect](/administration/inspect-containers-and-logs#attach-to-a-container) to the `immich_server` container and then execute the command via `immich-admin `. ## Examples diff --git a/docs/docs/guides/database-queries.md b/docs/docs/administration/run-database-queries.md similarity index 95% rename from docs/docs/guides/database-queries.md rename to docs/docs/administration/run-database-queries.md index c2328d2bb8..0d5ddf4d7c 100644 --- a/docs/docs/guides/database-queries.md +++ b/docs/docs/administration/run-database-queries.md @@ -1,13 +1,13 @@ -# Database Queries +# Run database queries :::danger -Keep in mind that mucking around in the database might set the Moon on fire. Avoid modifying the database directly when possible, and always have current backups. +Keep in mind that mucking around in the database might set the Moon on fire. Avoid modifying the database directly when possible, and always have current [backups](/concepts/backups). ::: :::tip Run `docker exec -it immich_postgres psql --dbname= --username=` to connect to the database via the container directly. -(Replace `` and `` with the values from your [`.env` file](/install/environment-variables#database)). +(Replace `` and `` with the values from your [`.env` file](/reference/environment-variables#database)). ::: ## Assets @@ -142,7 +142,7 @@ DELETE FROM "person" WHERE "name" = 'PersonNameHere'; SELECT "key", "value" FROM "system_metadata" WHERE "key" = 'system-config'; ``` -(Only used when not using the [config file](/install/config-file)) +(Only used when not using the [config file](/reference/config-file)) ### File properties diff --git a/docs/docs/guides/remote-machine-learning.md b/docs/docs/administration/run-machine-learning-remotely.md similarity index 97% rename from docs/docs/guides/remote-machine-learning.md rename to docs/docs/administration/run-machine-learning-remotely.md index b677d83b0d..4cf82b26dd 100644 --- a/docs/docs/guides/remote-machine-learning.md +++ b/docs/docs/administration/run-machine-learning-remotely.md @@ -1,4 +1,4 @@ -# Remote Machine Learning +# Run machine learning remotely To alleviate [performance issues on low-memory systems](/FAQ.mdx#why-is-immich-slow-on-low-memory-systems-like-the-raspberry-pi) like the Raspberry Pi, you may also host Immich's machine learning container on a more powerful system, such as your laptop or desktop computer. The server container will send requests containing the image preview to the remote machine learning container for processing. The machine learning container does not persist this data or associate it with a particular user. @@ -14,7 +14,7 @@ Image previews are sent to the remote machine learning container. Use this optio 2. Copy the following `docker-compose.yml` to the remote server :::info -If using hardware acceleration, the [hwaccel.ml.yml](https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml) file also needs to be added and the `docker-compose.yml` needs to be configured as described in the [hardware acceleration documentation](/features/ml-hardware-acceleration) +If using hardware acceleration, the [hwaccel.ml.yml](https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml) file also needs to be added and the `docker-compose.yml` needs to be configured as described in the [hardware acceleration documentation](/administration/set-up-hardware-accelerated-machine-learning) ::: ```yaml diff --git a/docs/docs/administration/reverse-proxy.md b/docs/docs/administration/set-up-a-reverse-proxy.md similarity index 72% rename from docs/docs/administration/reverse-proxy.md rename to docs/docs/administration/set-up-a-reverse-proxy.md index 3c90c26cf9..f987c43153 100644 --- a/docs/docs/administration/reverse-proxy.md +++ b/docs/docs/administration/set-up-a-reverse-proxy.md @@ -1,16 +1,8 @@ -# Reverse Proxy +# Set up a reverse proxy -Users can deploy a custom reverse proxy that forwards requests to Immich. This way, the reverse proxy can handle TLS termination, load balancing, or other advanced features. All reverse proxies between Immich and the user must forward all headers and set the `Host`, `X-Real-IP`, `X-Forwarded-Proto` and `X-Forwarded-For` headers to their appropriate values. Additionally, your reverse proxy should allow for big enough uploads. By following these practices, you ensure that all custom reverse proxies are fully compatible with Immich. +Example configurations for common reverse proxies. Immich has a small set of requirements that any reverse proxy in front of it must meet — headers, upload size, and timeouts — which are listed in [Reverse proxy requirements](/reference/reverse-proxy-requirements). The examples below satisfy them. -:::caution -Immich does not support being served on a sub-path such as `location /immich {`. It has to be served on the root path of a (sub)domain. -::: - -:::info -If your reverse proxy uses the [Let's Encrypt](https://letsencrypt.org/) [http-01 challenge](https://letsencrypt.org/docs/challenge-types/#http-01-challenge), you may want to verify that the Immich well-known endpoint (`/.well-known/immich`) gets correctly routed to Immich, otherwise it will likely be routed elsewhere and the mobile app may run into connection issues. -::: - -### Nginx example config +## Nginx example config Below is an example config for nginx. Make sure to set `public_url` to the front-facing URL of your instance, and `backend_url` to the path of the Immich server. @@ -55,7 +47,7 @@ server { } ``` -### Caddy example config +## Caddy example config As an alternative to nginx, you can also use [Caddy](https://caddyserver.com/) as a reverse proxy (with automatic HTTPS configuration). Below is an example config. @@ -65,7 +57,7 @@ immich.example.org { } ``` -### Apache example config +## Apache example config Below is an example config for Apache2 site configuration. @@ -80,7 +72,7 @@ Below is an example config for Apache2 site configuration. ``` -### Traefik Proxy example config +## Traefik Proxy example config The example below is for Traefik version 3. diff --git a/docs/docs/administration/set-up-an-smtp-provider.md b/docs/docs/administration/set-up-an-smtp-provider.md new file mode 100644 index 0000000000..b1b5b9eaf9 --- /dev/null +++ b/docs/docs/administration/set-up-an-smtp-provider.md @@ -0,0 +1,49 @@ +# Set up an SMTP provider + +Immich sends [email notifications](/administration/set-up-email-notifications) through an SMTP server that you provide. Any SMTP server works; this guide covers obtaining credentials from common providers and where to enter them. + +## Where to enter the settings + +All providers are configured in the same place: `Administration > Settings > Notification Settings`, under Email. + + + +You will need the host, port, username, password, and whether the connection uses SMTPS. The sections below cover where those values come from for each provider. + +## Gmail + +Google requires an app password rather than your account password. + +1. Add [2-Step Verification](https://support.google.com/accounts/answer/185839) to your Google account. This is required before app passwords can be created. +2. [Create an app password](https://myaccount.google.com/apppasswords). + +At the end of creating your app password, a password is displayed. Save it — this is the value for the password field in Immich. + + + +Use your Gmail address as the username. Google documents its current [SMTP server settings](https://support.google.com/mail/answer/7126229) for the host, port, and encryption values. + +## Microsoft 365 + +Microsoft also requires an app password. Which portal you use depends on the type of account: + +| Account type | Portal | +| ------------ | ----------------------------------------------- | +| Personal | https://go.microsoft.com/fwlink/?linkid=2274139 | +| Business | https://myaccount.microsoft.com/security-info | + +Then enter the following: + +| Setting | Value | +| -------- | ---------------------------- | +| Host | `smtp-mail.outlook.com` | +| Port | `587` | +| Username | Your email address | +| Password | The app password you created | +| SMTPS | Disabled | + + + +## Other providers + +Any SMTP server can be used, including a self-hosted one. Consult your provider's documentation for the host, port, and whether to enable SMTPS, and prefer an app password or a dedicated sending credential over your main account password where the provider offers one. diff --git a/docs/docs/administration/email-notification.mdx b/docs/docs/administration/set-up-email-notifications.mdx similarity index 77% rename from docs/docs/administration/email-notification.mdx rename to docs/docs/administration/set-up-email-notifications.mdx index 6273d03b08..8cf623cdf7 100644 --- a/docs/docs/administration/email-notification.mdx +++ b/docs/docs/administration/set-up-email-notifications.mdx @@ -1,6 +1,6 @@ -# Email Notifications +# Set up email notifications -Immich supports the option to send notifications via Email for the following events: +Immich supports the option to send notifications via Email for the following events (see [Notification settings](/reference/system-settings#notification-settings) for the server-side options): - Creating a new user - Notifying a user when they get added to a shared album @@ -12,9 +12,7 @@ You can access the settings panel from the web at `Administration -> Settings -> Under Email, enter the required details to connect with an SMTP server. -You can use [this guide](/guides/smtp-gmail) to use Gmail's SMTP server. - -You can use [this guide](/guides/smtp-microsoft365) to use Microsoft's SMTP server. +See [Set up an SMTP provider](/administration/set-up-an-smtp-provider) for obtaining credentials from Gmail, Microsoft 365, and other providers. ## User's notifications settings diff --git a/docs/docs/features/ml-hardware-acceleration.md b/docs/docs/administration/set-up-hardware-accelerated-machine-learning.md similarity index 88% rename from docs/docs/features/ml-hardware-acceleration.md rename to docs/docs/administration/set-up-hardware-accelerated-machine-learning.md index 5ad0bcd11f..59ac1a4bc5 100644 --- a/docs/docs/features/ml-hardware-acceleration.md +++ b/docs/docs/administration/set-up-hardware-accelerated-machine-learning.md @@ -1,27 +1,13 @@ -# Hardware-Accelerated Machine Learning +# Set up hardware-accelerated machine learning -This feature allows you to use a GPU to accelerate machine learning tasks, such as Smart Search and Facial Recognition, while reducing CPU load. +This feature allows you to use a [GPU](/reference/hardware-acceleration-support#machine-learning) to accelerate machine learning tasks, such as Smart Search and Facial Recognition, while reducing CPU load. As this is a new feature, it is still experimental and may not work on all systems. :::info You do not need to redo any machine learning jobs after enabling hardware acceleration. The acceleration device will be used for any jobs that run after enabling it. ::: -## Supported Backends - -- ARM NN (Mali) -- CUDA (NVIDIA GPUs with [compute capability](https://developer.nvidia.com/cuda-gpus) 5.2 or higher) -- ROCm (AMD GPUs) -- OpenVINO (Intel GPUs such as Iris Xe and Arc) -- RKNN (Rockchip) - -## Limitations - -- The instructions and configurations here are specific to Docker Compose. Other container engines may require different configuration. -- Only Linux and Windows (through WSL2) servers are supported. -- ARM NN is only supported on devices with Mali GPUs. Other Arm devices are not supported. -- Some models may not be compatible with certain backends. CUDA is the most reliable. -- Search latency isn't improved by ARM NN due to model compatibility issues preventing its use. However, smart search jobs do make use of ARM NN. +The backends Immich can use, and what each one cannot do, are listed in [Hardware acceleration support](/reference/hardware-acceleration-support). ## Prerequisites @@ -35,7 +21,7 @@ You do not need to redo any machine learning jobs after enabling hardware accele - Where and how you can get this file depends on device and vendor, but typically, the device vendor also supplies these - The `hwaccel.ml.yml` file assumes the path to it is `/usr/lib/libmali.so`, so update accordingly if it is elsewhere - The `hwaccel.ml.yml` file assumes an additional file `/lib/firmware/mali_csffw.bin`, so update accordingly if your device's driver does not require this file -- Optional: Configure your `.env` file, see [environment variables](/install/environment-variables) for ARM NN specific settings +- Optional: Configure your `.env` file, see [environment variables](/reference/environment-variables) for ARM NN specific settings - In particular, the `MACHINE_LEARNING_ANN_FP16_TURBO` can significantly improve performance at the cost of very slightly lower accuracy #### CUDA @@ -47,10 +33,10 @@ You do not need to redo any machine learning jobs after enabling hardware accele #### ROCm -- On Linux, The [AMDGPU driver module](https://rocm.docs.amd.com/projects/install-on-linux/en/latest/how-to/docker.html) needs to be installed on the server and, if secure boot is used, the signing key of DKMS [needs to be enrolled in UEFI BIOS](https://wiki.debian.org/SecureBoot) +- On Linux, The [AMDGPU driver module](https://rocm.docs.amd.com/projects/install-on-linux/en/latest/guides/docker.html) needs to be installed on the server and, if secure boot is used, the signing key of DKMS [needs to be enrolled in UEFI BIOS](https://wiki.debian.org/SecureBoot) - The GPU must be supported by ROCm. If it isn't officially supported, you can attempt to use the `HSA_OVERRIDE_GFX_VERSION` environmental variable: `HSA_OVERRIDE_GFX_VERSION=`. If this doesn't work, you might need to also set `HSA_USE_SVM=0`. - The ROCm image is quite large and requires at least 35GiB of free disk space. However, pulling later updates to the service through Docker will generally only amount to a few hundred megabytes as the rest will be cached. -- This backend is new and may experience some issues. For example, GPU power consumption can be higher than usual after running inference, even if the machine learning service is idle. In this case, it will only go back to normal after being idle for 5 minutes (configurable with the [MACHINE_LEARNING_MODEL_TTL](/install/environment-variables) setting). +- This backend is new and may experience some issues. For example, GPU power consumption can be higher than usual after running inference, even if the machine learning service is idle. In this case, it will only go back to normal after being idle for 5 minutes (configurable with the [MACHINE_LEARNING_MODEL_TTL](/reference/environment-variables) setting). - MIGraphX is a new backend for AMD cards, which compiles models at runtime. As such, the first few inferences will be slow. #### OpenVINO @@ -82,7 +68,7 @@ You do not need to redo any machine learning jobs after enabling hardware accele - This is usually pre-installed on the device vendor's Linux images - RKNPU driver V0.9.8 or later must be available in the host server - You may confirm this by running `cat /sys/kernel/debug/rknpu/version` to check the version -- Optional: Configure your `.env` file, see [environment variables](/install/environment-variables) for RKNN specific settings +- Optional: Configure your `.env` file, see [environment variables](/reference/environment-variables) for RKNN specific settings - In particular, setting `MACHINE_LEARNING_RKNN_THREADS` to 2 or 3 can _dramatically_ improve performance for RK3576 and RK3588 compared to the default of 1, at the expense of multiplying the amount of RAM each model uses by that amount. ## Setup diff --git a/docs/docs/features/hardware-transcoding.md b/docs/docs/administration/set-up-hardware-transcoding.md similarity index 80% rename from docs/docs/features/hardware-transcoding.md rename to docs/docs/administration/set-up-hardware-transcoding.md index e68f6f6983..d09cc4473a 100644 --- a/docs/docs/features/hardware-transcoding.md +++ b/docs/docs/administration/set-up-hardware-transcoding.md @@ -1,6 +1,6 @@ -# Hardware Transcoding +# Set up hardware transcoding -This feature allows you to use a GPU to accelerate transcoding and reduce CPU load. +This feature allows you to use a [GPU](/reference/hardware-acceleration-support#transcoding) to accelerate transcoding and reduce CPU load. Note that hardware transcoding produces significantly larger videos than software transcoding with similar settings, typically with lower quality. Using slow presets and preferring more efficient codecs can narrow this gap. As this is a new feature, it is still experimental and may not work on all systems. @@ -8,26 +8,7 @@ As this is a new feature, it is still experimental and may not work on all syste You do not need to redo any transcoding jobs after enabling hardware acceleration. The acceleration device will be used for any jobs that run after enabling it. ::: -## Supported APIs - -- NVENC (NVIDIA) -- Quick Sync (Intel) -- RKMPP (Rockchip) -- VAAPI (AMD / NVIDIA / Intel) - -## Limitations - -- The instructions and configurations here are specific to Docker Compose. Other container engines may require different configuration. -- Only Linux and Windows (through WSL2) servers are supported. -- WSL2 does not support Quick Sync. -- Raspberry Pi is currently not supported. -- Two-pass mode is only supported for NVENC. Other APIs will ignore this setting. -- By default, only encoding is currently hardware accelerated. This means the CPU is still used for software decoding and tone-mapping. - - You can benefit from end-to-end acceleration by enabling hardware decoding in the video transcoding settings. -- Hardware dependent - - Codec support varies, but H.264 and HEVC are usually supported. - - Notably, NVIDIA and AMD GPUs do not support VP9 encoding. - - Newer devices tend to have higher transcoding quality. +The APIs and hardware Immich can use, and what each one cannot do, are listed in [Hardware acceleration support](/reference/hardware-acceleration-support). ## Prerequisites @@ -74,7 +55,7 @@ For RKMPP to work:
immich.json -If you use a [configuration file](/install/config-file.md), use the `accel` option to select the hardware (e.g. `qsv` for Intel or `nvenc` for Nvidia). Set `accelDecode` to `true` if you want hardware decoding. +If you use a [configuration file](/reference/config-file), use the `accel` option to select the hardware (e.g. `qsv` for Intel or `nvenc` for Nvidia). Set `accelDecode` to `true` if you want hardware decoding. ```json { diff --git a/docs/docs/administration/oauth.md b/docs/docs/administration/set-up-oauth-authentication.md similarity index 77% rename from docs/docs/administration/oauth.md rename to docs/docs/administration/set-up-oauth-authentication.md index 246b1be7fe..65febd97fb 100644 --- a/docs/docs/administration/oauth.md +++ b/docs/docs/administration/set-up-oauth-authentication.md @@ -1,6 +1,6 @@ -# OAuth Authentication +# Set up OAuth authentication -This page contains details about using OAuth in Immich. +This page contains details about using [OAuth](/reference/oauth-settings) in Immich. :::tip Unable to set `app.immich:///oauth-callback` as a valid redirect URI? See [Mobile Redirect URI](#mobile-redirect-uri) for an alternative solution. @@ -29,7 +29,7 @@ Before enabling OAuth in Immich, a new client application needs to be configured 2. Configure Redirect URIs/Origins The **Sign-in redirect URIs** should include: - - `app.immich:///oauth-callback` - for logging in with OAuth from the [Mobile App](/features/mobile-app.mdx) + - `app.immich:///oauth-callback` - for logging in with OAuth from the [Mobile App](/user-guide/use-the-mobile-app) - `http://DOMAIN:PORT/auth/login` - for logging in with OAuth from the Web Client - `http://DOMAIN:PORT/user-settings` - for manually linking OAuth in the Web Client @@ -58,41 +58,7 @@ Before enabling OAuth in Immich, a new client application needs to be configured Once you have a new OAuth client application configured, Immich can be configured using the Administration Settings page, available on the web (Administration -> Settings). -| Setting | Type | Default | Description | -| ---------------------------------------------------- | ------- | -------------------- | ----------------------------------------------------------------------------------- | -| Enabled | boolean | false | Enable/disable OAuth | -| `issuer_url` | URL | (required) | Required. Self-discovery URL for client (from previous step) | -| `client_id` | string | (required) | Required. Client ID (from previous step) | -| `client_secret` | string | (required) | Required. Client Secret (previous step) | -| `scope` | string | openid email profile | Full list of scopes to send with the request (space delimited) | -| `id_token_signed_response_alg` | string | RS256 | The algorithm used to sign the id token (examples: RS256, HS256) | -| `userinfo_signed_response_alg` | string | none | The algorithm used to sign the userinfo response (examples: RS256, HS256) | -| `prompt` | string | (empty) | Prompt parameter for authorization url (examples: select_account, login, consent) | -| `end_session_endpoint` | URL | (empty) | Http(s) alternative end session endpoint (logout URI) | -| Request timeout | string | 30,000 (30 seconds) | Number of milliseconds to wait for http requests to complete before giving up | -| Storage Label Claim | string | preferred_username | Claim mapping for the user's storage label**¹** | -| Role Claim | string | immich_role | Claim mapping for the user's role. (should return "user" or "admin")**¹** | -| Storage Quota Claim | string | immich_quota | Claim mapping for the user's storage**¹** | -| Default Storage Quota (GiB) | number | 0 | Default quota for user without storage quota claim (empty for unlimited quota) | -| Button Text | string | Login with OAuth | Text for the OAuth button on the web | -| Auto Register | boolean | true | When true, will automatically register a user the first time they sign in | -| [Auto Launch](#auto-launch) | boolean | false | When true, will skip the login page and automatically start the OAuth login process | -| [Mobile Redirect URI Override](#mobile-redirect-uri) | URL | (empty) | Http(s) alternative mobile redirect URI | - -:::note Claim Options [1] - -Claim is only used on user creation and not synchronized after that. - -::: - -:::info -The Issuer URL should look something like the following, and return a valid json document. - -- `https://accounts.google.com/.well-known/openid-configuration` -- `http://localhost:9000/application/o/immich/.well-known/openid-configuration` - -The `.well-known/openid-configuration` part of the url is optional and will be automatically added during discovery. -::: +Every available setting is documented in [OAuth settings](/reference/oauth-settings). ## Auto Launch @@ -107,7 +73,7 @@ The redirect URI for the mobile app is `app.immich:///oauth-callback`, which is 2. Whitelist the new endpoint as a valid redirect URI with your provider. 3. Specify the new endpoint as the `Mobile Redirect URI Override`, in the OAuth settings. -With these steps in place, you should be able to use OAuth from the [Mobile App](/features/mobile-app.mdx) without a custom scheme redirect URI. +With these steps in place, you should be able to use OAuth from the [Mobile App](/user-guide/use-the-mobile-app) without a custom scheme redirect URI. :::info Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to forward requests to `app.immich:///oauth-callback`, and can be used for step 1. diff --git a/docs/docs/administration/split-workers-across-containers.md b/docs/docs/administration/split-workers-across-containers.md new file mode 100644 index 0000000000..53c7b5cecf --- /dev/null +++ b/docs/docs/administration/split-workers-across-containers.md @@ -0,0 +1,32 @@ +# Split workers across containers + +The `immich-server` container runs several [workers](/reference/workers) at once. If you prefer to throttle or distribute them, you can do this using the [environment variables](/reference/environment-variables) to specify which container should pick up which tasks. + +For example, for a simple setup with one container for the Web/API and one for all other microservices, you can do the following: + +Copy the entire `immich-server` block as a new service and make the following changes to the **copy**: + +```diff +- immich-server: +- container_name: immich_server +... +- ports: +- - 2283:2283 ++ immich-microservices: ++ container_name: immich_microservices +``` + +Once you have two copies of the immich-server service, make the following changes to each one. This will allow one container to only serve the web UI and API, and the other one to handle all other tasks. + +```diff +services: + immich-server: + ... ++ environment: ++ IMMICH_WORKERS_INCLUDE: 'api' + + immich-microservices: + ... ++ environment: ++ IMMICH_WORKERS_EXCLUDE: 'api' +``` diff --git a/docs/docs/administration/storage-template.mdx b/docs/docs/administration/storage-template.mdx deleted file mode 100644 index 9eb9d2b8fe..0000000000 --- a/docs/docs/administration/storage-template.mdx +++ /dev/null @@ -1,5 +0,0 @@ -import StorageTemplate from '/docs/partials/_storage-template.md'; - -# Storage Template - - diff --git a/docs/docs/administration/use-a-config-file.md b/docs/docs/administration/use-a-config-file.md new file mode 100644 index 0000000000..77901e2c42 --- /dev/null +++ b/docs/docs/administration/use-a-config-file.md @@ -0,0 +1,58 @@ +# Use a config file + +This guide sets up a config file so Immich's system settings come from a file you control instead of from the web UI. See the [config file reference](/reference/config-file) for the format, the full list of keys, and exactly how values are resolved. + +:::note +Once a config file is in use, the settings under `Administration > Settings` become read-only. Removing `IMMICH_CONFIG_FILE` restores UI editing. +::: + +## Step 1 - Create the config file + +Create a JSON file (e.g. `immich-config.json`) next to your `docker-compose.yml`. YAML is also supported. + +The file only needs the keys you want to change — everything else falls back to its default. To start from your current settings instead, use the button in `Administration > Settings` that copies the current configuration to your clipboard, then paste it into the file. + +For a minimal example, this enables the storage template and nothing else: + +```json title="immich-config.json" +{ + "storageTemplate": { + "enabled": true, + "template": "{{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}}" + } +} +``` + +The [config file reference](/reference/config-file#default-configuration) lists every available key with its default value. + +## Step 2 - Point Immich at the file + +Set `IMMICH_CONFIG_FILE` in your `.env` file to the path of the config file **inside the container**: + +```ini title=".env" +IMMICH_CONFIG_FILE=/config/immich-config.json +``` + +:::info Docker Compose +In your `.env` file, `UPLOAD_LOCATION` and `DB_DATA_LOCATION` refer to locations on the host, but `IMMICH_CONFIG_FILE` refers to a location inside the container. Reuse the variable in `docker-compose.yml` so the two can't drift apart: + +```yaml title="docker-compose.yml" +volumes: + - ./immich-config.json:${IMMICH_CONFIG_FILE} +``` + +::: + +:::note +If you run separate `microservices` workers, mount the config file into those containers as well, at the same path. +::: + +## Step 3 - Restart Immich + +```bash +docker compose up -d +``` + +Immich reads the config file at startup, so restart the containers after every change to the file. + +To confirm it took effect, open `Administration > Settings` — the settings should now be read-only. If the server fails to start, check its logs: an invalid config file is a fatal error, and the log names the key that failed validation. diff --git a/docs/docs/guides/custom-map-styles.md b/docs/docs/administration/use-a-custom-map-style.md similarity index 94% rename from docs/docs/guides/custom-map-styles.md rename to docs/docs/administration/use-a-custom-map-style.md index ac693c16ba..79e87f6033 100644 --- a/docs/docs/guides/custom-map-styles.md +++ b/docs/docs/administration/use-a-custom-map-style.md @@ -1,7 +1,7 @@ -# Custom Map Styles +# Use a custom map style You may decide that you'd like to modify the style document which is used to -draw the maps in Immich. In addition to visual customization, this also allows +draw the [maps](/reference/system-settings) in Immich. In addition to visual customization, this also allows you to pick your own map tile provider instead of the default one. The default `style.json` for [light theme](https://tiles.immich.cloud/v1/style/light.json) and [dark theme](https://tiles.immich.cloud/v1/style/dark.json) diff --git a/docs/docs/administration/use-a-pre-existing-postgres-server.md b/docs/docs/administration/use-a-pre-existing-postgres-server.md new file mode 100644 index 0000000000..d754f884fe --- /dev/null +++ b/docs/docs/administration/use-a-pre-existing-postgres-server.md @@ -0,0 +1,74 @@ +# Use a pre-existing Postgres server + +While not officially recommended, it is possible to run Immich using a pre-existing [Postgres](/reference/requirements#database) server. To use this setup, you should have a baseline level of familiarity with Postgres and the Linux command line. If you do not have these, we recommend using the default setup with a dedicated Postgres container. + +By default, Immich expects superuser permission on the Postgres database and requires certain extensions to be installed. This guide outlines the steps required to prepare a pre-existing Postgres server to be used by Immich. + +If the server is still using pgvecto.rs or pgvector, see [Migrate to VectorChord](/administration/migrate-to-vectorchord) instead. + +:::tip +Running with a pre-existing Postgres server can unlock powerful administrative features, including logical replication and streaming write-ahead log backups using programs like pgBackRest or Barman. +::: + +## Prerequisites + +You must install pgvector as it is a prerequisite for VectorChord. +The easiest way to do this on Debian/Ubuntu is by adding the [PostgreSQL Apt repository][pg-apt] and then +running `apt install postgresql-NN-pgvector`, where `NN` is your Postgres version (e.g., `16`). + +You must install VectorChord into your instance of Postgres using their [instructions][vchord-install]. After installation, add `shared_preload_libraries = 'vchord.so'` to your `postgresql.conf`. If you already have some `shared_preload_libraries` set, you can separate each extension with a comma. For example, `shared_preload_libraries = 'pg_stat_statements, vchord.so'`. + +The versions Immich supports are listed in [Requirements](/reference/requirements#database). + +## Specifying the connection URL + +You can connect to your pre-existing Postgres server by setting the `DB_URL` environment variable in the `.env` file. + +``` +DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename' + +# require a SSL connection to Postgres +# DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename?sslmode=require' + +# require a SSL connection, but don't enforce checking the certificate name +# DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename?sslmode=require&sslmode=no-verify' +``` + +## With superuser permission + +Typically Immich expects superuser permission in the database, which you can grant by running `ALTER USER WITH SUPERUSER;` at the `psql` console. If you prefer not to grant superuser permissions, follow the instructions in the next section. + +## Without superuser permission + +:::caution +This method is recommended for **advanced users only** and often requires manual intervention when updating Immich. +::: + +:::danger +Currently, automated backups require superuser permission due to the usage of `pg_dumpall`. +::: + +Immich can run without superuser permissions by following the below instructions at the `psql` prompt to prepare the database. + +```sql title="Set up Postgres for Immich" +CREATE DATABASE ; +\c +BEGIN; +ALTER DATABASE OWNER TO ; +CREATE EXTENSION vchord CASCADE; +CREATE EXTENSION earthdistance CASCADE; +COMMIT; +``` + +### Updating VectorChord + +When installing a new version of VectorChord, you will need to manually update the extension and reindex by connecting to the Immich database and running: + +``` +ALTER EXTENSION vchord UPDATE; +REINDEX INDEX face_index; +REINDEX INDEX clip_index; +``` + +[vchord-install]: https://docs.vectorchord.ai/vectorchord/getting-started/installation.html +[pg-apt]: https://www.postgresql.org/download/linux/#generic diff --git a/docs/docs/guides/custom-locations.md b/docs/docs/administration/use-custom-file-locations.md similarity index 65% rename from docs/docs/guides/custom-locations.md rename to docs/docs/administration/use-custom-file-locations.md index e0274d3bd9..692a0e543f 100644 --- a/docs/docs/guides/custom-locations.md +++ b/docs/docs/administration/use-custom-file-locations.md @@ -1,6 +1,6 @@ -# Files Custom Locations +# Use custom file locations -This guide explains how to store generated and raw files with docker's volume mount in different locations. +This guide explains how to store [generated and raw files](/reference/storage-locations) with docker's volume mount in different locations. :::caution Backup It is important to remember to update the backup settings after following the guide to back up the new backup paths if using automatic backup tools, especially `profile/`. @@ -9,7 +9,7 @@ It is important to remember to update the backup settings after following the gu In our `.env` file, we will define the paths we want to use. Note that you don't have to define all of these: UPLOAD_LOCATION will be the base folder that files are stored in by default, with the other paths acting as overrides. ```diff title=".env" -# You can find documentation for all the supported environment variables [here](/install/environment-variables) +# You can find documentation for all the supported environment variables [here](/reference/environment-variables) # Custom location where your uploaded, thumbnails, and transcoded video files are stored - UPLOAD_LOCATION=./library @@ -42,11 +42,4 @@ Then restart Immich to register the changes: docker compose up -d ``` -:::note -Because of the underlying properties of docker bind mounts, it is not recommended to mount the `upload/` and `library/` folders as separate bind mounts if they are on the same device. -For this reason, we mount the HDD or the network storage (NAS) to `/data` and then mount the folders we want to access under that folder. - -The `thumbs/` folder contains both the small thumbnails displayed in the timeline and the larger previews shown when clicking into an image. These cannot be separated. - -The storage metrics of the Immich server will track available storage at `UPLOAD_LOCATION`, so the administrator must set up some sort of monitoring to ensure the storage does not run out of space. The `profile/` folder is much smaller, usually less than 1 MB. -::: +See [Storage locations](/reference/storage-locations) for what each directory holds and the constraints on splitting them across devices. diff --git a/docs/docs/administration/maintenance-mode.md b/docs/docs/administration/use-maintenance-mode.md similarity index 57% rename from docs/docs/administration/maintenance-mode.md rename to docs/docs/administration/use-maintenance-mode.md index 47848bef42..54968a383b 100644 --- a/docs/docs/administration/maintenance-mode.md +++ b/docs/docs/administration/use-maintenance-mode.md @@ -1,11 +1,11 @@ -# Maintenance Mode +# Use maintenance mode -Maintenance mode is used to perform administrative tasks such as restoring backups to Immich. +Maintenance mode is used to perform administrative tasks such as restoring [backups](/concepts/backups) to Immich. You can enter maintenance mode by either: - Selecting "Switch to maintenance mode" in `Maintenance` tab in administration. -- Running the enable maintenance mode [administration command](./server-commands.md). +- Running the enable maintenance mode [administration command](/administration/run-a-server-command). ## Logging in during maintenance @@ -14,5 +14,5 @@ Maintenance mode uses a separate login system which is handled automatically beh If you find that you've been logged out, you can: - Open the logs for the Immich server and look for _"🚧 Immich is in maintenance mode, you can log in using the following URL:"_ -- Run the enable maintenance mode [administration command](./server-commands.md) again, this will give you a new URL to login with. -- Run the disable maintenance mode [administration command](./server-commands.md) then re-enter through system settings. +- Run the enable maintenance mode [administration command](/administration/run-a-server-command) again, this will give you a new URL to login with. +- Run the disable maintenance mode [administration command](/administration/run-a-server-command) then re-enter through system settings. diff --git a/docs/docs/guides/template-backup-script.md b/docs/docs/administration/use-the-backup-script-template.md similarity index 92% rename from docs/docs/guides/template-backup-script.md rename to docs/docs/administration/use-the-backup-script-template.md index 19647d4ae1..74f8997c6a 100644 --- a/docs/docs/guides/template-backup-script.md +++ b/docs/docs/administration/use-the-backup-script-template.md @@ -1,13 +1,13 @@ -# Backup Script +# Use the backup script template -[Borg](https://www.borgbackup.org/) is a feature-rich deduplicating archiving software with built-in versioning. We provide a template bash script that can be run daily/weekly as a [cron](https://wiki.archlinux.org/title/cron) job to back up your files and database. We encourage you to read the quick-start guide for Borg before running this script. +[Borg](https://www.borgbackup.org/) is a feature-rich deduplicating archiving software with built-in versioning. We provide a template bash script that can be run daily/weekly as a [cron](https://wiki.archlinux.org/title/cron) job to back up your files and database — see [Backups](/concepts/backups) for what a complete backup has to include. We encourage you to read the quick-start guide for Borg before running this script. This script assumes you have a second hard drive connected to your server for on-site backup and ssh access to a remote machine for your third off-site copy. [BorgBase](https://www.borgbase.com/) is an alternative option for off-site backups with a competitive pricing structure. You may choose to skip off-site backups entirely by removing the relevant lines from the template script. The database is saved to your Immich upload folder in the `database-backup` subdirectory. The database is then backed up and versioned with your assets by Borg. This ensures that the database backup is in sync with your assets in every snapshot. :::info -This script makes backups of your database along with your photo/video library. This is redundant with the [automatic database backup tool](/administration/backup-and-restore#automatic-database-dumps) built into Immich. Using this script to backup your database has two advantages over the built-in backup tool: +This script makes backups of your database along with your photo/video library. This is redundant with the [automatic database backup tool](/administration/back-up-and-restore#automatic-database-backups) built into Immich. Using this script to backup your database has two advantages over the built-in backup tool: - This script uses storage more efficiently by versioning your backups instead of making multiple copies. - The database backups are performed at the same time as the library backup, ensuring that the backups of your database and the library are always in sync. diff --git a/docs/docs/administration/use-the-storage-template.mdx b/docs/docs/administration/use-the-storage-template.mdx new file mode 100644 index 0000000000..b4f05a9edc --- /dev/null +++ b/docs/docs/administration/use-the-storage-template.mdx @@ -0,0 +1,7 @@ +import StorageTemplate from '/docs/partials/_storage-template.md'; + +# Use the storage template + +The storage template controls the path each original asset is written to. It changes where files live on disk, so see [Storage locations](/reference/storage-locations) for the resulting layout before enabling it. + + diff --git a/docs/docs/administration/server-stats.md b/docs/docs/administration/view-server-stats.md similarity index 61% rename from docs/docs/administration/server-stats.md rename to docs/docs/administration/view-server-stats.md index 245056e2ea..92c6b09033 100644 --- a/docs/docs/administration/server-stats.md +++ b/docs/docs/administration/view-server-stats.md @@ -1,6 +1,6 @@ -# Server Stats +# View server stats -Server statistics to show the total number of videos, photos, usage and quota per user. +Server statistics to show the total number of videos, photos, usage and quota per user. Note that this counts the [directories Immich manages](/reference/storage-locations); external libraries are excluded. :::info External library External libraries are not included in the storage quota due to custom mount points. diff --git a/docs/docs/api.md b/docs/docs/api.md deleted file mode 100644 index debd75e4d4..0000000000 --- a/docs/docs/api.md +++ /dev/null @@ -1,13 +0,0 @@ -# API - -Immich uses the [OpenAPI](https://swagger.io/specification/) standard to generate API documentation. To view the published docs see [here](https://api.immich.app/). - -## Generator - -OpenAPI is used to generate the client (Typescript, Dart) SDK. `openapi-generator-cli` can be installed [here](https://openapi-generator.tech/docs/installation/). The generated SDK is based on the `immich-openapi-specs.json` file, which is autogenerated by the server **when running in development mode**. The `immich-openapi-specs.json` file can be modified with `@nestjs/swagger` decorators used or referenced by controller endpoints. See the [NestJS OpenAPI docs](https://docs.nestjs.com/openapi/types-and-parameters) for more info. When you add a new endpoint or modify an existing one, you must run the server in development mode and run the command below to update the client SDK. - -```bash -mise open-api -``` - -You can find the generated client SDK in the `packages/sdk/client` for Typescript SDK and `mobile/generated/openapi` for Dart SDK. diff --git a/docs/docs/concepts/_category_.json b/docs/docs/concepts/_category_.json new file mode 100644 index 0000000000..fec1f0a63c --- /dev/null +++ b/docs/docs/concepts/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Concepts", + "position": 3, + "link": { + "type": "generated-index", + "title": "Concepts", + "description": "Background and discussion of how Immich works and why it works that way. Read these to deepen your understanding, not to complete a task." + } +} diff --git a/docs/docs/concepts/backups.md b/docs/docs/concepts/backups.md new file mode 100644 index 0000000000..06bfc20736 --- /dev/null +++ b/docs/docs/concepts/backups.md @@ -0,0 +1,48 @@ +# Backups + +Photos and videos are usually irreplaceable. Unlike most self-hosted data, there is no upstream copy to re-download and no way to recreate a lost photo — which makes backups the single most important part of running Immich. + +Immich does not back itself up. It creates database dumps, and it tells you which files matter, but taking, storing, and testing an actual backup is left to you and the backup tool of your choice. A [3-2-1 backup](/reference/3-2-1-backup-method) is the usual target: three copies, on two different kinds of storage, with one copy off-site. + +## What a complete backup contains + +An Immich backup has two halves, and it is only useful if you have both: + +- **The database**, which holds asset metadata, album membership, recognized faces, tags, sharing, and the file path of every asset. +- **The original files**, which are the photos and videos themselves. + +Neither half is sufficient alone. Without the files, the database describes assets that no longer exist. Without the database, the files remain on disk but Immich has no record of them — Immich does not scan its library folder to discover assets, so albums, people, and all other metadata are gone even though the images survive. This is why a copy of `UPLOAD_LOCATION` on its own is not a backup. + +## Original versus generated content + +Immich stores two kinds of content in the filesystem: + +- **Original content** — the assets as uploaded, plus profile images. This is the irreplaceable part. +- **Generated content** — thumbnails, previews, and transcoded videos. These are derived from the originals and Immich can rebuild them by re-running the corresponding jobs. + +Backing up everything is simplest and avoids a lengthy regeneration after a restore. Backing up only the original content produces a smaller backup at the cost of re-running the thumbnail and transcoding jobs when you restore. + +## Automatic database backups + +Immich periodically dumps its own database and keeps the last several dumps. These exist so that a database can be recovered without any external tooling — a corrupted database, a failed upgrade, a mistaken deletion. + +They are not a substitute for a backup, for two reasons: + +- They contain **metadata only**, never photos or videos. +- They are written inside `UPLOAD_LOCATION`, so they are lost along with everything else if that storage fails. An off-site copy is what protects against that. + +Treat them as a convenience for recovering the database, and as one of the things your real backup needs to include. + +## Consistency between the database and the files + +Because a backup covers two moving parts, they can drift out of sync while it runs — an asset uploaded mid-backup may be recorded in one half and missing from the other. The result after a restore is broken assets. + +Stopping the `immich-server` container for the duration of the backup removes the problem entirely: if nothing is changing, the two halves always agree. + +If stopping the container is not an option, the order matters. Back up the database **first** and the filesystem **second**. The worst case is then a file on disk that the database does not know about, which can be re-uploaded manually. Backing up in the other order risks a restored database that references files absent from the backup, which cannot be recovered. + +## Restoring + +A restore puts the database back and expects the files to already be in place. Restoring a database taken from a different Immich version may require migrations, which Immich attempts automatically, so keeping backups aligned with the version that produced them makes recovery more predictable. + +The mechanics — where the dumps live, how to trigger one, and every way to restore — are in [Backup and restore](/administration/back-up-and-restore). diff --git a/docs/docs/overview/comparison.md b/docs/docs/concepts/comparison.md similarity index 91% rename from docs/docs/overview/comparison.md rename to docs/docs/concepts/comparison.md index b843562c6e..c69df75167 100644 --- a/docs/docs/overview/comparison.md +++ b/docs/docs/concepts/comparison.md @@ -1,7 +1,3 @@ ---- -sidebar_position: 3 ---- - # Comparison If you're new here and came from other asset self-hosting alternatives you might want to look at a comparison between Immich and your current solution. diff --git a/docs/docs/features/duplicates-utility.md b/docs/docs/concepts/duplicate-detection.md similarity index 69% rename from docs/docs/features/duplicates-utility.md rename to docs/docs/concepts/duplicate-detection.md index 5d68c0ace9..ec648cafdc 100644 --- a/docs/docs/features/duplicates-utility.md +++ b/docs/docs/concepts/duplicate-detection.md @@ -1,19 +1,19 @@ -# Duplicates Utility +# Duplicate detection -Immich comes with a duplicates utility to help you detect assets that look visually similar. The duplicate detection feature relies on machine learning and is enabled by default. For more information about when the duplicate detection job runs, see [Jobs and Workers](/administration/jobs-workers). Once an asset has been processed and added to a duplicate group, it becomes available to review in the "Review duplicates" utility, which can be found [here](https://my.immich.app/utilities/duplicates). +Duplicate detection relies on machine learning and is enabled by default. It compares the search embeddings Immich already generates for contextual search, which is why it finds assets that _look_ alike rather than only byte-identical files — a resized or re-encoded copy of a photo is still detected. -## Reviewing duplicates +This is distinct from the checksum-based deduplication that happens at upload time, which only skips files that are byte-for-byte identical to an existing asset. -The review duplicates page allows the user to individually select which assets should be kept and which ones should be trashed. When more than one asset is kept, there is an option to automatically put the kept assets into a stack. +Detection runs as a job after Smart Search completes for an asset; see [processing order](/reference/jobs#processing-order). Once an asset has been processed and added to a duplicate group, it appears in the review utility. -### Automatic preselection +## How assets are preselected When using "Deduplicate All" or viewing suggestions, Immich automatically preselects which assets to keep based on: 1. **Image size in bytes** — larger files are preferred as they typically have higher quality. 2. **Count of EXIF data** — assets with more metadata are preferred. -### Synchronizing metadata +## What happens to metadata When resolving duplicates, metadata from trashed assets is automatically synchronized to the kept asset. This synchronization only happens when **exactly one** asset is kept and at least one asset is trashed. When more than one asset is kept, metadata is not merged — the assets keep their own metadata and are simply removed from the duplicate group. The following metadata is synchronized: @@ -26,3 +26,5 @@ When resolving duplicates, metadata from trashed assets is automatically synchro | Visibility | The most restrictive visibility is applied to the kept asset. | | Location | Latitude and longitude are copied if all assets with geolocation data in the group share the same coordinates. | | Tag | Tags from all assets in the group are merged and applied to the kept asset. | + +To work through the results, see [Review duplicates](/user-guide/review-duplicates). diff --git a/docs/docs/concepts/external-libraries.md b/docs/docs/concepts/external-libraries.md new file mode 100644 index 0000000000..c515deba54 --- /dev/null +++ b/docs/docs/concepts/external-libraries.md @@ -0,0 +1,51 @@ +# External libraries + +:::info +Currently an external library can only belong to a single user which is selected when the library is initially created. +::: + +External libraries track assets stored in the filesystem outside of Immich. When the external library is scanned, Immich will load videos and photos from disk and create the corresponding assets. These assets will then be shown in the main timeline, and they will look and behave like any other asset, including viewing on the map, adding to albums, etc. Later, if a file is modified outside of Immich, you need to scan the library for the changes to show up. + +If an external asset is deleted from disk, Immich will move it to trash on rescan. To restore the asset, you need to restore the original file. After 30 days the file will be removed from trash, and any changes to metadata within Immich will be lost. + +:::caution + +If you add metadata to an external asset in any way (i.e. add it to an album or edit the description), that metadata is only stored inside Immich and will not be persisted to the external asset file. If you move an asset to another location within the library all such metadata will be lost upon rescan. This is because the asset is considered a new asset after the move. This is a known issue and will be fixed in a future release. + +::: + +:::caution + +Due to aggressive caching it can take some time for a refreshed asset to appear correctly in the web view. You need to clear the cache in your browser to see the changes. This is a known issue and will be fixed in a future release. In Chrome, you need to open the developer console with F12, then reload the page with F5, and finally right click on the reload button and select "Empty Cache and Hard Reload". + +::: + +To set one up, see [Add an external library](/administration/add-an-external-library). + +## What a library contains + +A library's contents are defined by its **import paths** — the directories it scans — minus its **exclusion patterns**. Both are properties of the library, and both are evaluated on every scan, so changing either one adds or removes assets on the next scan rather than only affecting new files. + +That symmetry is the thing to keep in mind: a file that stops matching, because a path was removed or a pattern was added, leaves the library the same way a file deleted from disk would. + +See [External Library settings](/reference/system-settings#external-library) for how these are configured, and [Exclusion patterns](/reference/exclusion-patterns) for the pattern syntax. + +## Automatic watching (EXPERIMENTAL) + +This feature is considered experimental and for advanced users only. If enabled, it will allow automatic watching of the filesystem which means new assets are automatically imported to Immich without needing to rescan. + +If your photos are on a network drive, automatic file watching likely won't work. In that case, you will have to rely on a [periodic library refresh](/administration/add-an-external-library#set-a-custom-scan-interval) to pull in your changes. + +### Troubleshooting + +If you encounter an `ENOSPC` error, you need to increase your file watcher limit. In sysctl, this key is called `fs.inotify.max_user_watches` and has a default value of 8192. Increase this number to a suitable value greater than the number of files you will be watching. Note that Immich has to watch all files in your import paths including any ignored files. + +``` +ERROR [LibraryService] Library watcher for library c69faf55-f96d-4aa0-b83b-2d80cbc27d98 encountered error: Error: ENOSPC: System limit for number of file watchers reached, watch '/media/photo.jpg' +``` + +In rare cases, the library watcher can hang, preventing Immich from starting up. In this case, disable the library watcher in the configuration file. If the watcher is enabled from within Immich, the app must be started without the microservices. Disable the microservices in the docker compose file, start Immich, disable the library watcher in the admin settings, close Immich, re-enable the microservices, and then Immich can be started normally. + +## Deleting a library + +When deleting an external library, all assets inside are immediately deleted along with the library. Note that while a library can take a long time to fully delete in the background, it is immediately removed from the library list. If the deletion process is interrupted (for example, due to server restart), it will be cleaned up in the next nightly cron job. The cleanup process can also be manually initiated by clicking the "Scan All Libraries" button in the library list. diff --git a/docs/docs/features/facial-recognition.md b/docs/docs/concepts/facial-recognition.md similarity index 74% rename from docs/docs/features/facial-recognition.md rename to docs/docs/concepts/facial-recognition.md index cb896ca19e..0c6dd6b726 100644 --- a/docs/docs/features/facial-recognition.md +++ b/docs/docs/concepts/facial-recognition.md @@ -1,40 +1,12 @@ -# Facial Recognition +# Facial recognition -## Overview +Immich detects faces in your photos and videos, then groups the detected faces into people. Two separate machine learning steps are involved, and this page explains what each one does and how the settings that control them interact. For the day-to-day actions — naming, merging, hiding people — see [Browse and manage people](/user-guide/browse-and-manage-people). -Immich recognizes faces in your photos and videos and groups them together into people. You can then assign names to these people and search for them. - -The list of people is shown in the Explore page. - - - -Upon clicking on a person, a list of assets that contain their face will be shown. - - - -The asset detail view will also show the faces that are recognized in the asset. - - - -## Actions - -Additional actions you can do include: - -- Changing the feature photo of the person -- Hiding the faces of a person from the Explore page and detail view -- Setting a person's date of birth, so that the age of the person can be shown at the time the photo was taken -- Merging two or more detected people into one person -- Favoriting a person to pin them to the top of the list - -It can be found from the app bar when you access the detail view of a person. - - - -## How Face Detection Works +## How face detection works Face detection sends the generated preview image to the machine learning service for processing. The service checks if it has the relevant model downloaded and downloads it if not. The image is decoded, pre-processed and passed to the face detection model (with hardware acceleration if configured). The bounding boxes and scores outputted from this model are used to crop and preprocess the image once again to be passed to a facial recognition model (also accelerated if configured). The embeddings from the recognition model, together with the bounding boxes and scores from the face detection model, are then sent back to the server to be added to the database. The embeddings in particular are indexed so they can be searched quickly during facial recognition clustering. -## How Facial Recognition Works +## How facial recognition works The facial recognition algorithm we use is derived from [DBSCAN](https://www.youtube.com/watch?v=RDZUdRSDOok), a popular clustering algorithm. It essentially treats each detected face as a point in a graph and aims to group points that are close to each other. @@ -70,7 +42,7 @@ Navigating to Administration > Settings > Machine Learning Settings > Facial Rec :::tip It's better to only tweak the parameters here than to set them to something very different unless you're ready to test a variety of options. If you do need to set a parameter to a strict setting, relaxing other settings can be a good option to compensate, and vice versa. -You can learn how the tune the result in this [Guide](/guides/better-facial-clusters) +You can learn how to tune the result in [Better facial recognition clusters](/administration/improve-facial-recognition-clusters) ::: ### Facial recognition model @@ -85,10 +57,10 @@ After changing this setting, it will only apply to new face detection jobs. To a ### Maximum recognition distance -The distance threshold described in How Facial Recognition Works. The default works well for most people, but it may be worth lowering it if the library has twins or otherwise very similar looking people. A threshold that's too low just means needing to merge duplicate people after facial recognition, whereas a threshold too high can produce unsalvageable results. It is strongly recommended not to go below 0.3 or above 0.7. +The distance threshold described in [How facial recognition works](#how-facial-recognition-works). The default works well for most people, but it may be worth lowering it if the library has twins or otherwise very similar looking people. A threshold that's too low just means needing to merge duplicate people after facial recognition, whereas a threshold too high can produce unsalvageable results. It is strongly recommended not to go below 0.3 or above 0.7. ### Minimum recognized faces -The core point threshold described in How Facial Recognition Works. This setting has a few implications. First, it takes effect immediately in that people with fewer faces than this are hidden from view. Secondly, it makes clustering more robust as it prevents loosely-related faces from being linked to each other by requiring a certain level of density. +The core point threshold described in [How facial recognition works](#how-facial-recognition-works). This setting has a few implications. First, it takes effect immediately in that people with fewer faces than this are hidden from view. Secondly, it makes clustering more robust as it prevents loosely-related faces from being linked to each other by requiring a certain level of density. Increasing this setting is a good idea if you increase the recognition distance or reduce the minimum detection score. Setting it to 1 effectively disables the concept of core points, but can be an option if you prefer a more hands-on approach. diff --git a/docs/docs/features/img/android-backup-options.webp b/docs/docs/concepts/img/android-backup-options.webp similarity index 100% rename from docs/docs/features/img/android-backup-options.webp rename to docs/docs/concepts/img/android-backup-options.webp diff --git a/docs/docs/features/img/background-app-refresh.webp b/docs/docs/concepts/img/background-app-refresh.webp similarity index 100% rename from docs/docs/features/img/background-app-refresh.webp rename to docs/docs/concepts/img/background-app-refresh.webp diff --git a/docs/docs/features/img/backup-album-selection.webp b/docs/docs/concepts/img/backup-album-selection.webp similarity index 100% rename from docs/docs/features/img/backup-album-selection.webp rename to docs/docs/concepts/img/backup-album-selection.webp diff --git a/docs/docs/features/img/backup-album-sync.webp b/docs/docs/concepts/img/backup-album-sync.webp similarity index 100% rename from docs/docs/features/img/backup-album-sync.webp rename to docs/docs/concepts/img/backup-album-sync.webp diff --git a/docs/docs/features/img/backup-options.webp b/docs/docs/concepts/img/backup-options.webp similarity index 100% rename from docs/docs/features/img/backup-options.webp rename to docs/docs/concepts/img/backup-options.webp diff --git a/docs/docs/features/img/enable-backup-button.webp b/docs/docs/concepts/img/enable-backup-button.webp similarity index 100% rename from docs/docs/features/img/enable-backup-button.webp rename to docs/docs/concepts/img/enable-backup-button.webp diff --git a/docs/docs/features/img/reverse-geocoding-mobile1.webp b/docs/docs/concepts/img/reverse-geocoding-mobile1.webp similarity index 100% rename from docs/docs/features/img/reverse-geocoding-mobile1.webp rename to docs/docs/concepts/img/reverse-geocoding-mobile1.webp diff --git a/docs/docs/features/img/reverse-geocoding-mobile2.webp b/docs/docs/concepts/img/reverse-geocoding-mobile2.webp similarity index 100% rename from docs/docs/features/img/reverse-geocoding-mobile2.webp rename to docs/docs/concepts/img/reverse-geocoding-mobile2.webp diff --git a/docs/docs/features/img/reverse-geocoding-mobile3.webp b/docs/docs/concepts/img/reverse-geocoding-mobile3.webp similarity index 100% rename from docs/docs/features/img/reverse-geocoding-mobile3.webp rename to docs/docs/concepts/img/reverse-geocoding-mobile3.webp diff --git a/docs/docs/features/mobile-backup.md b/docs/docs/concepts/mobile-backup.md similarity index 79% rename from docs/docs/features/mobile-backup.md rename to docs/docs/concepts/mobile-backup.md index f3eb1a359c..a23452ee31 100644 --- a/docs/docs/features/mobile-backup.md +++ b/docs/docs/concepts/mobile-backup.md @@ -1,7 +1,3 @@ ---- -sidebar_position: 1 ---- - # Mobile Backup ## Overview @@ -54,6 +50,20 @@ When enabled, Immich automatically creates albums on the server that mirror the This is a one-way sync from your device to the server. You can enable this feature at any time and use the **Reorganize into album** button to backfill existing uploads into their corresponding albums. +### Album synchronization semantics + +- **One-Way Sync:** Synchronization is one-way, from the device to the server. + +- **Name Matching:** If an album on the server has the same name as the album on the device, images from the device will be merged with the existing images in the server album. + +- **Shared Albums:** If the matching album on the server is shared, the new photos merged into the album will also be shared. + +- **Album Structure:** When an album is created for the first time, its structure is based on the initial state. Future updates made on the phone (such as deleting or repositioning photos) will not be reflected in Immich. + +- **User-Specific Sync:** Album synchronization is unique to each server user and does not sync between different users or partners. + +- **Mobile-Only Feature:** Album synchronization is currently only available on mobile. For similar options on a computer, refer to [Libraries](/concepts/external-libraries) for further details. + ## Platform Specific Features ### Android diff --git a/docs/docs/concepts/monitoring.md b/docs/docs/concepts/monitoring.md new file mode 100644 index 0000000000..8850a4fa64 --- /dev/null +++ b/docs/docs/concepts/monitoring.md @@ -0,0 +1,24 @@ +# Monitoring + +Immich exposes performance metrics so an instance can be observed locally. The integration is primarily Prometheus metrics, though exporting traces is also possible because the instrumentation uses OpenTelemetry. + +This is an opt-in feature. Nothing is sent anywhere beyond what you configure — see [Monitor Immich](/administration/monitor-immich) to turn it on. + +## How Prometheus collects metrics + +Prometheus is a tool that collects metrics from a number of sources you configure. It operates in a "pull" strategy - that is, it periodically requests metrics from each defined source. This means that the source doesn't send anything until it's requested. It also means that the source -- immich, in this case -- has to expose an endpoint for Prometheus to target when it requests metrics. + +## Kinds of metric + +These metrics come in a variety of forms: + +- Counters, which can only increase. Example: the number of times an endpoint has been called. +- Gauges, which can increase or decrease within a certain range. Example: CPU utilization. +- Histograms, where each observation is assigned to a certain number of "buckets". Example: response time, where each bucket is a number of milliseconds. This one is a bit more complicated. + - Buckets in this case are _cumulative_; that is, an observation is placed not only into the smallest bucket that contains it, but also to all buckets larger than this. For example, if a histogram has three buckets for 1ms, 5ms and 10ms, an observation of 3ms will be bucketed into both 5ms and 10ms. + +The metrics in immich are grouped into API (endpoint calls and response times), host (memory and CPU utilization), and IO (internal database queries, image processing, and so on). Each group of metrics can be enabled or disabled independently. + +## Structured logging + +By default Immich writes human-readable console logs. It can instead emit one JSON object per log line, which is what log aggregation systems such as Grafana Loki, the ELK stack, Datadog, or Splunk expect to ingest. The field names and an example are in [Logging](/reference/logging#log-format). diff --git a/docs/docs/concepts/open-source.md b/docs/docs/concepts/open-source.md new file mode 100644 index 0000000000..08731a176d --- /dev/null +++ b/docs/docs/concepts/open-source.md @@ -0,0 +1 @@ +# Open Source diff --git a/docs/docs/guides/remote-access.md b/docs/docs/concepts/remote-access.md similarity index 99% rename from docs/docs/guides/remote-access.md rename to docs/docs/concepts/remote-access.md index 09e34c5107..69dc76ec22 100644 --- a/docs/docs/guides/remote-access.md +++ b/docs/docs/concepts/remote-access.md @@ -46,7 +46,7 @@ You can learn how to set up Tailscale together with Immich with the [tutorial vi A reverse proxy is a service that sits between web servers and clients. A reverse proxy can either be hosted on the server itself or remotely. Clients can connect to the reverse proxy via https, and the proxy relays data to Immich. This setup makes most sense if you have your own domain and want to access your Immich instance just like any other website, from outside your LAN. You can also use a DDNS provider like DuckDNS or no-ip if you don't have a domain. This configuration allows the Immich Android and iphone apps to connect to your server without a VPN or tailscale app on the client side. -If you're hosting your own reverse proxy, [Nginx](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) is a great option. An example configuration for Nginx is provided [here](/administration/reverse-proxy.md). +If you're hosting your own reverse proxy, [Nginx](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) is a great option. An example configuration for Nginx is provided [here](/administration/set-up-a-reverse-proxy). You'll also need your own certificate to authenticate https connections. If you're making Immich publicly accessible, [Let's Encrypt](https://letsencrypt.org/) can provide a free certificate for your domain and is the recommended option. Alternatively, a [self-signed certificate](https://en.wikipedia.org/wiki/Self-signed_certificate) allows you to encrypt your connection to Immich, but it raises a security warning on the client's browser. diff --git a/docs/docs/concepts/reverse-geocoding.md b/docs/docs/concepts/reverse-geocoding.md new file mode 100644 index 0000000000..c4c4143123 --- /dev/null +++ b/docs/docs/concepts/reverse-geocoding.md @@ -0,0 +1,41 @@ +# Reverse Geocoding + +Reverse geocoding turns the coordinates stored in a photo into place names — city, state, and country. Immich does this [locally](https://en.wikipedia.org/wiki/Reverse_geocoding) using a copy of the [GeoNames](https://www.geonames.org/) geographical database that lives in your own Postgres database, so no coordinates are ever sent to a third-party service. + +## How it works + +1. The [Metadata Extraction](/reference/jobs#extract-metadata) job reads `GPSLatitude` and `GPSLongitude` from the asset. Coordinates of exactly `0,0` are treated as no location, since that is what many devices write when there is no GPS fix. +2. If reverse geocoding is enabled, those coordinates are looked up against the GeoNames data already loaded into Postgres. +3. Immich searches for populated places within roughly 25 km of the coordinates and takes the **nearest** one. +4. That place supplies the city name and the state (its first-level administrative division); the country comes from the place's ISO country code. +5. The resulting city, state, and country are stored on the asset alongside the coordinates. + +Because the result is stored rather than computed on demand, it is only recalculated when metadata extraction runs again for that asset. + +## When no place is nearby + +The GeoNames data Immich uses covers populated places with a population of 500 or more. Coordinates in the ocean, in wilderness, or in sparsely populated regions may have no such place within the search radius. + +In that case Immich falls back to matching the coordinates against country boundaries, which yields a **country only** — no state and no city. If even that fails, the asset keeps its coordinates but has no place names at all. + +The nearest-match rule also means a photo taken between towns is attributed to whichever qualifying place is closest, which is not necessarily the one you would name yourself. + +## What the place names are used for + +The stored values drive three things: + +- The location shown in the asset detail panel. +- The **Locations** filter in [search](/user-guide/search-your-library), which matches on city, state, and country. +- Grouping in the Places view. + +Coordinates themselves are what the map view uses, so the map still works for assets whose reverse geocoding produced nothing. + + + + + +## Keeping the data current + +The GeoNames dataset is imported into Postgres on minor version upgrades, so place names improve as the dataset does. Existing assets are not re-geocoded automatically — re-running metadata extraction is what applies newer data to assets that were already processed. + +Reverse geocoding can be turned off entirely in `Administration > Settings > Map & GPS Settings`. Coordinates continue to be extracted and stored when it is disabled; only the place-name lookup is skipped. diff --git a/docs/docs/concepts/scaling.md b/docs/docs/concepts/scaling.md new file mode 100644 index 0000000000..1d42cbddcc --- /dev/null +++ b/docs/docs/concepts/scaling.md @@ -0,0 +1,49 @@ +# Scaling + +Immich is built to scale. Rather than a single process doing everything, the server is divided into independent **workers**, and most of the actual work is expressed as **jobs** that are queued and processed in the background. That division is what makes it possible to run Immich on one small machine or spread it across several. + +## Why the server is divided + +Serving the timeline and processing a video are very different workloads. One needs to answer quickly and constantly; the other is slow, CPU-hungry, and can be deferred. Running both in one undivided process means a transcoding backlog degrades browsing. + +Splitting them apart is what avoids that: + +- The `api` worker handles requests from the web and mobile apps. +- The `microservices` worker runs the jobs — thumbnail generation, transcoding, machine learning, and everything else that happens after an upload. + +Because the two are separate processes coordinating only through Postgres and Redis, they do not have to run together. A single container runs both by default, but they can be split across containers, or across machines, with each set pointed at the same shared infrastructure. + +## Why work is expressed as jobs + +Treating background work as discrete, queued jobs has consequences beyond scheduling: + +- Work survives restarts, because the queue is durable rather than in-memory. +- Progress is observable and jobs can be re-run, which is what makes it possible to reprocess a library after changing a setting. +- Each kind of work gets its own concurrency limit, so an expensive job type cannot starve the rest. +- Jobs can depend on each other, forming an order that is followed for every asset. + +## Running multiple instances + +The backend is designed so that multiple instances of its [workers](/reference/workers) can run in parallel. The only hard requirement is that every instance is connected to the same shared infrastructure: the same Postgres and Redis instances, and the same files mounted into the containers. + +This is useful when the hardware you have is uneven. You might have a gaming PC you want to use for transcoding and thumbnail generation, or a Kubernetes cluster of a few powerful servers you want to make use of. + +If you are scaling up only to get through background work faster, you can run additional containers with the API worker disabled so they do nothing but process jobs — see [Split workers across containers](/administration/split-workers-across-containers). + +:::info +If you only have a single machine to run Immich on, scaling to multiple containers is unlikely to provide any benefit. An Immich container already runs multiple background tasks at once, and their [concurrency](/reference/jobs#concurrency) can be raised from the admin panel. +::: + +How to actually scale across machines varies widely between environments and takes some knowledge to set up, so there is no single recipe. In some cases it is as easy as incrementing the replica count on a Kubernetes deployment; in others it means configuring network tunnels or NFS mounts. + +## Scaling down + +The same properties allow scaling in the other direction. All state lives in Postgres, Redis, and the filesystem, so stopping a running `immich-server` container carries no risk — for example, to free up a GPU for something else. + +As long as one API worker is running, Immich remains browsable, and jobs simply wait in their queues until a worker is available to process them. + +## Where to go next + +- [Jobs](/reference/jobs) — every job, what it does, and the order they run in +- [Workers](/reference/workers) — the worker types and how to select them +- [Split workers across containers](/administration/split-workers-across-containers) diff --git a/docs/docs/concepts/self-hosted.md b/docs/docs/concepts/self-hosted.md new file mode 100644 index 0000000000..d7a84994df --- /dev/null +++ b/docs/docs/concepts/self-hosted.md @@ -0,0 +1,3 @@ +# Self-hosted + +Self-hosted has a few different meanings depending what you are referring to, but in the case of Immich it means running software on your own hardware, whether that be an old laptop, server, or rented VPS. Self-hosted is different from SaaS (software as a service) in that installation, upgrades, diff --git a/docs/docs/concepts/sharing.md b/docs/docs/concepts/sharing.md new file mode 100644 index 0000000000..cc1934982a --- /dev/null +++ b/docs/docs/concepts/sharing.md @@ -0,0 +1,52 @@ +# Sharing + +Immich has three distinct ways to give someone access to assets, and they differ in who the recipient is, how much of the library they reach, and what they can do with it. + +| Mechanism | Recipient | Scope | +| --------------- | ------------------------------- | ----------------------------------------- | +| Shared album | A user on the same instance | The assets in that album | +| Partner sharing | A user on the same instance | The sharer's entire library | +| Public link | Anyone with the URL, no account | The assets or album the link was made for | + +## Shared albums + +Albums can be shared between users on the same Immich instance. The shared users can view and add their own photos and videos to the shared album. When sharing an album, each user is assigned a permission — editor (read-write) or viewer (read-only). + +## Partner sharing + +Partner sharing allows you to share your _entire_ library with other users of your choice. They can then view your library and download the assets. + +Partner sharing includes: + +- Access to all non-archived and trashed photos and videos. +- Access to all metadata, including GPS information. +- Access to share assets via shared links, albums, etc. + +Partner sharing does _not_ include: + +- Already existing partner albums +- If an asset is favorited +- People and facial recognition data + +:::note + +- Partner sharing is one-way. To view your partner's assets, they must also share them with you. +- Partner sharing may result in displaying duplicate assets on the main timeline, as duplicates are only detected on a per-user basis. + +::: + +## Public links + +You can create a public link to share a group of photos or videos, or an album, with anyone. The public link can be shared via email, social media, or any other method. There are a variety of options to customize the public link, such as setting an expiration date, password protection, and more. Public shared link is handy when you want to share a group of photos or videos with someone who doesn't have an Immich account and allow the shared user to upload their photos or videos to your account. + +The public shared link is generated with a random URL, which acts as as a secret to avoid the link being guessed by unwanted parties, for instance. + +A public link has no account behind it, so the URL itself is the credential. Immich generates a long random path for exactly this reason — the secret is the link, and anyone who obtains it has whatever access the link grants: + +``` +https://my.immich.app/share/JUckRMxlgpo7F9BpyqGk_cZEwDzaU_U5LU5_oNZp1ETIBa9dpQ0b5ghNm_22QVJfn3k +``` + +Because of that, links can be given an expiration date and a password, and the actions allowed through them can be restricted. + +To create and configure them, see [Share photos and albums](/user-guide/share-photos-and-albums). diff --git a/docs/docs/administration/system-integrity.md b/docs/docs/concepts/system-integrity.md similarity index 100% rename from docs/docs/administration/system-integrity.md rename to docs/docs/concepts/system-integrity.md diff --git a/docs/docs/concepts/versioning.md b/docs/docs/concepts/versioning.md new file mode 100644 index 0000000000..c53e2ebdf7 --- /dev/null +++ b/docs/docs/concepts/versioning.md @@ -0,0 +1,18 @@ +# Versioning + +Immich follows [semantic versioning](https://semver.org/), which tags releases in the format `..`. Breaking changes, including those to the API or to deployment, are intended to be limited to major version releases. + +## Pinning a version + +A Docker image can point at the current major version using a metatag, such as `:v3`. Metatags do not follow release candidates, so an instance pinned this way stays on stable releases within that major version. + +## Client and server compatibility + +The mobile app is typically compatible with the current and prior major version, but the server is only compatible with the matching major version. This asymmetry is why the recommended order is to upgrade all mobile clients **before** upgrading the server: a newer app can talk to the older server during the transition, while an older app cannot talk to a newer server. + +## What is and is not supported + +- Patches are not backported to earlier versions, so a fix is only available by moving to the most recent stable release. +- Downgrading to an earlier version is not supported, even within the same minor version. Database migrations run on upgrade and are not reversible, which is also why a [backup](/concepts/backups) before a major upgrade matters. + +For the mechanics of upgrading, see [Upgrading](/install/upgrading). diff --git a/docs/docs/developer/_category_.json b/docs/docs/developer/_category_.json index 502009dc7c..a0d850d125 100644 --- a/docs/docs/developer/_category_.json +++ b/docs/docs/developer/_category_.json @@ -1,4 +1,4 @@ { "label": "Developer", - "position": 5 + "position": 6 } diff --git a/docs/docs/developer/architecture.mdx b/docs/docs/developer/architecture.mdx index 954d264d55..d6d9bba011 100644 --- a/docs/docs/developer/architecture.mdx +++ b/docs/docs/developer/architecture.mdx @@ -24,7 +24,7 @@ Immich has three main clients: 3. CLI - Command-line utility for bulk upload :::info -All three clients use [OpenAPI](/api.md) to auto-generate rest clients for easy integration. For more information about this process, see [OpenAPI](/api.md). +All three clients use [OpenAPI](/developer/open-api) to auto-generate rest clients for easy integration. For more information about this process, see [OpenAPI](/developer/open-api). ::: ### Mobile App @@ -44,7 +44,7 @@ The web app is a [TypeScript](https://www.typescriptlang.org/) project that uses ### 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](/features/command-line-interface.md) for more information. +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](/reference/immich-cli) for more information. ## Server @@ -71,7 +71,7 @@ An incoming HTTP request is mapped to a controller (`src/controllers`). Controll ### Domain Transfer Objects (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](/api.md) schemas and control the generated code used by each client. +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](/developer/open-api) schemas and control the generated code used by each client. ### Background Jobs @@ -83,11 +83,11 @@ Immich uses a [worker](https://github.com/immich-app/immich/blob/main/server/src - Smart Search - Facial Recognition - Storage Template Migration -- Sidecar (see [XMP Sidecars](/features/xmp-sidecars.md)) +- Sidecar (see [XMP Sidecars](/reference/xmp-sidecars)) - Background jobs (file deletion, user deletion) :::info -This list closely matches what is available on the [Administration > Jobs](/administration/jobs-workers/#jobs) page, which provides some remote queue management capabilities. +This list closely matches what is available on the [Administration > Jobs](/reference/jobs) page, which provides some remote queue management capabilities. ::: ### Machine Learning diff --git a/docs/docs/developer/open-api.md b/docs/docs/developer/open-api.md new file mode 100644 index 0000000000..7a2f2b9a75 --- /dev/null +++ b/docs/docs/developer/open-api.md @@ -0,0 +1,26 @@ +# OpenAPI + +Immich uses [OpenAPI](https://swagger.io/specification/) to describe its REST API, and generates the TypeScript and Dart client SDKs from that description. The published API documentation is at [api.immich.app](https://api.immich.app/); see [Immich API](/reference/immich-api) for the API itself. + +## How the specification is produced + +The specification is written to `immich-openapi-specs.json`, which is autogenerated by the server **when running in development mode**. Do not edit it by hand. + +Its contents are controlled by [`@nestjs/swagger`](https://docs.nestjs.com/openapi/types-and-parameters) decorators used or referenced by controller endpoints, so changes to the API surface are made there. + +## Regenerating the client SDKs + +When you add a new endpoint or modify an existing one, run the server in development mode and then run: + +```bash +mise open-api +``` + +The generated SDKs are written to: + +| SDK | Location | +| ---------- | -------------------------- | +| TypeScript | `packages/sdk/client` | +| Dart | `mobile/generated/openapi` | + +Generation uses `openapi-generator-cli`, which can be installed by following its [installation instructions](https://openapi-generator.tech/docs/installation/). diff --git a/docs/docs/developer/pr-checklist.md b/docs/docs/developer/pr-checklist.md index 4ad232a312..7b0ac79451 100644 --- a/docs/docs/developer/pr-checklist.md +++ b/docs/docs/developer/pr-checklist.md @@ -74,7 +74,7 @@ Run all machine learning checks with `mise //machine-learning:checklist` ## OpenAPI -The OpenAPI client libraries need to be regenerated whenever there are changes to the `immich-openapi-specs.json` file. Note that you should not modify this file directly as it is auto-generated. See [OpenAPI](/api.md) for more details. +The OpenAPI client libraries need to be regenerated whenever there are changes to the `immich-openapi-specs.json` file. Note that you should not modify this file directly as it is auto-generated. See [OpenAPI](/developer/open-api) for more details. ## Database Migrations diff --git a/docs/docs/features/_category_.json b/docs/docs/features/_category_.json deleted file mode 100644 index 4aaeb07417..0000000000 --- a/docs/docs/features/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Features", - "position": 3 -} diff --git a/docs/docs/features/command-line-interface.md b/docs/docs/features/command-line-interface.md deleted file mode 100644 index c3eab1605f..0000000000 --- a/docs/docs/features/command-line-interface.md +++ /dev/null @@ -1,202 +0,0 @@ -# The Immich CLI - -Immich has a command line interface (CLI) that allows you to perform certain actions from the command line. - -## Features - -- Upload photos and videos to Immich -- Check server version - -More features are planned for the future. - -:::tip Google Photos Takeout -If you are looking to import your Google Photos takeout, we recommend this community maintained tool [immich-go](https://github.com/simulot/immich-go) -::: - -## Requirements - -- Node.js 20 or above -- Npm - -If you can't install node/npm, there is also a Docker version available below. - -## Installation (NPM) - -```bash -npm i -g @immich/cli -``` - -NOTE: if you previously installed the legacy CLI, you will need to uninstall it first: - -```bash -npm uninstall -g immich -``` - -## Installation (Docker) - -If npm is not available on your system you can try the Docker version - -```bash -docker run -it -v "$(pwd)":/import:ro -e IMMICH_INSTANCE_URL=https://your-immich-instance/api -e IMMICH_API_KEY=your-api-key ghcr.io/immich-app/immich-cli:latest -``` - -Please modify the `IMMICH_INSTANCE_URL` and `IMMICH_API_KEY` environment variables as suitable. You can also use a Docker env file to store your sensitive API key. - -This `docker run` command will directly run the command `immich` inside the container. You can directly append the desired parameters (see under "usage") to the commandline like this: - -```bash -docker run -it -v "$(pwd)":/import:ro -e IMMICH_INSTANCE_URL=https://your-immich-instance/api -e IMMICH_API_KEY=your-api-key ghcr.io/immich-app/immich-cli:latest upload -a -c 5 --recursive directory/ -``` - -## Usage - -
-Usage - -``` -$ immich -Usage: immich [options] [command] - -Command line interface for Immich - -Options: - -V, --version output the version number - -d, --config-directory Configuration directory where auth.yml will be stored (default: "~/.config/immich/", env: - IMMICH_CONFIG_DIR) - -u, --url [url] Immich server URL (env: IMMICH_INSTANCE_URL) - -k, --key [key] Immich API key (env: IMMICH_API_KEY) - -h, --help display help for command - -Commands: - login|login-key Login using an API key - logout Remove stored credentials - server-info Display server information - upload [options] [paths...] Upload assets - help [command] display help for command -``` - -
- -## Commands - -The upload command supports the following options: - -
-Options - -``` -Usage: immich upload [paths...] [options] - -Upload assets - -Arguments: - paths One or more paths to assets to be uploaded - -Options: - -r, --recursive Recursive (default: false, env: IMMICH_RECURSIVE) - -i, --ignore Pattern to ignore (env: IMMICH_IGNORE_PATHS) - -h, --skip-hash Don't hash files before upload (default: false, env: IMMICH_SKIP_HASH) - -H, --include-hidden Include hidden folders (default: false, env: IMMICH_INCLUDE_HIDDEN) - -a, --album Automatically create albums based on folder name (default: false, env: IMMICH_AUTO_CREATE_ALBUM) - -A, --album-name Add all assets to specified album (env: IMMICH_ALBUM_NAME) - --visibility Set the visibility of uploaded assets (choices: "archive", "timeline", "hidden", "locked", env: IMMICH_VISIBILITY) - -n, --dry-run Don't perform any actions, just show what will be done (default: false, env: IMMICH_DRY_RUN) - -c, --concurrency Number of assets to upload at the same time (default: 4, env: IMMICH_UPLOAD_CONCURRENCY) - -j, --json-output Output detailed information in json format (default: false, env: IMMICH_JSON_OUTPUT) - --delete Delete local assets after upload (env: IMMICH_DELETE_ASSETS) - --delete-duplicates Delete local assets that are duplicates (already exist on server) (env: IMMICH_DELETE_DUPLICATES) - --no-progress Hide progress bars (env: IMMICH_PROGRESS_BAR) - --watch Watch for changes and upload automatically (default: false, env: IMMICH_WATCH_CHANGES) - --help display help for command -``` - -
- -Note that the above options can read from environment variables as well. - -## Quick Start - -You begin by authenticating to your Immich server. For instance: - -```bash -# immich login [url] [key] -immich login http://192.168.1.216:2283/api HFEJ38DNSDUEG -``` - -This will store your credentials in a `auth.yml` file in the configuration directory which defaults to `~/.config/immich/`. The directory can be set with the `-d` option or the environment variable `IMMICH_CONFIG_DIR`. Please keep the file secure, either by performing the logout command after you are done, or deleting it manually. - -Once you are authenticated, you can upload assets to your Immich server. - -```bash -immich upload file1.jpg file2.jpg -``` - -By default, subfolders are not included. To upload a directory including subfolder, use the --recursive option: - -```bash -immich upload --recursive directory/ -``` - -If you are unsure what will happen, you can use the `--dry-run` option to see what would happen without actually performing any actions. - -```bash -immich upload --dry-run --recursive directory/ -``` - -By default, the upload command will hash the files before uploading them. This is to avoid uploading the same file multiple times. If you are sure that the files are unique, you can skip this step by passing the `--skip-hash` option. Note that Immich always performs its own deduplication through hashing, so this is merely a performance consideration. If you have good bandwidth it might be faster to skip hashing. - -```bash -immich upload --skip-hash --recursive directory/ -``` - -You can automatically create albums based on the folder name by passing the `--album` option. This will automatically create albums for each uploaded asset based on the name of the folder they are in. - -```bash -immich upload --album --recursive directory/ -``` - -You can also choose to upload all assets to a specific album with the `--album-name` option. - -```bash -immich upload --album-name "My summer holiday" --recursive directory/ -``` - -It is possible to skip assets matching a glob pattern by passing the `--ignore` option. See [the library documentation](docs/features/libraries.md) on how to use glob patterns. You can add several exclusion patterns if needed. - -```bash -immich upload --ignore **/Raw/** --recursive directory/ -``` - -```bash -immich upload --ignore **/Raw/** **/*.tif --recursive directory/ -``` - -By default, hidden files are skipped. If you want to include hidden files, use the `--include-hidden` option: - -```bash -immich upload --include-hidden --recursive directory/ -``` - -You can set the visibility of uploaded assets to `archive`, `timeline`, `hidden`, or `locked` with the `--visibility` option: - -```bash -immich upload --visibility archive --recursive directory/ -``` - -You can use the `--json-output` option to get a json printed which includes -three keys: `newFiles`, `duplicates` and `newAssets`. Due to some logging -output you will need to strip the first three lines of output to get the json. -For example to get a list of files that would be uploaded for further -processing: - -```bash -immich upload --dry-run --json-output . | tail -n +6 | jq .newFiles[] -``` - -### Obtain the API Key - -The API key can be obtained in the user setting panel on the web interface. You can also specify permissions for the key to limit its access. - -![Obtain Api Key](./img/obtain-api-key.webp) - -![Specify permissions for the key](./img/obtain-api-key-2.webp) diff --git a/docs/docs/features/img/backup-settings-access.webp b/docs/docs/features/img/backup-settings-access.webp deleted file mode 100644 index 06243af799..0000000000 Binary files a/docs/docs/features/img/backup-settings-access.webp and /dev/null differ diff --git a/docs/docs/features/img/me.webp b/docs/docs/features/img/me.webp deleted file mode 100644 index a177086ec2..0000000000 Binary files a/docs/docs/features/img/me.webp and /dev/null differ diff --git a/docs/docs/features/img/mobile-upload-open-photo.webp b/docs/docs/features/img/mobile-upload-open-photo.webp deleted file mode 100644 index fafa4c9048..0000000000 Binary files a/docs/docs/features/img/mobile-upload-open-photo.webp and /dev/null differ diff --git a/docs/docs/features/img/user-change-password.webp b/docs/docs/features/img/user-change-password.webp deleted file mode 100644 index a5d36ea2d9..0000000000 Binary files a/docs/docs/features/img/user-change-password.webp and /dev/null differ diff --git a/docs/docs/features/img/user-popup.webp b/docs/docs/features/img/user-popup.webp deleted file mode 100644 index f3d3c08e5f..0000000000 Binary files a/docs/docs/features/img/user-popup.webp and /dev/null differ diff --git a/docs/docs/features/img/user-profile.webp b/docs/docs/features/img/user-profile.webp deleted file mode 100644 index bba9499557..0000000000 Binary files a/docs/docs/features/img/user-profile.webp and /dev/null differ diff --git a/docs/docs/features/libraries.md b/docs/docs/features/libraries.md deleted file mode 100644 index 62831ab089..0000000000 --- a/docs/docs/features/libraries.md +++ /dev/null @@ -1,176 +0,0 @@ -# External Libraries - -:::info -Currently an external library can only belong to a single user which is selected when the library is initially created. -::: - -External libraries track assets stored in the filesystem outside of Immich. When the external library is scanned, Immich will load videos and photos from disk and create the corresponding assets. These assets will then be shown in the main timeline, and they will look and behave like any other asset, including viewing on the map, adding to albums, etc. Later, if a file is modified outside of Immich, you need to scan the library for the changes to show up. - -If an external asset is deleted from disk, Immich will move it to trash on rescan. To restore the asset, you need to restore the original file. After 30 days the file will be removed from trash, and any changes to metadata within Immich will be lost. - -:::caution - -If you add metadata to an external asset in any way (i.e. add it to an album or edit the description), that metadata is only stored inside Immich and will not be persisted to the external asset file. If you move an asset to another location within the library all such metadata will be lost upon rescan. This is because the asset is considered a new asset after the move. This is a known issue and will be fixed in a future release. - -::: - -:::caution - -Due to aggressive caching it can take some time for a refreshed asset to appear correctly in the web view. You need to clear the cache in your browser to see the changes. This is a known issue and will be fixed in a future release. In Chrome, you need to open the developer console with F12, then reload the page with F5, and finally right click on the reload button and select "Empty Cache and Hard Reload". - -::: - -### Import Paths - -External libraries use import paths to determine which files to scan. Each library can have multiple import paths so that files from different locations can be added to the same library. Import paths are scanned recursively, and if a file is in multiple import paths, it will only be added once. Each import file must be a readable directory that exists on the filesystem; the import path dialog will alert you of any paths that are not accessible. - -If the import paths are edited in a way that an external file is no longer in any import path, it will be removed from the library in the same way a deleted file would. If the file is moved back to an import path, it will be added again as if it was a new file. - -### Troubleshooting - -Sometimes, an external library will not scan correctly. This can happen if Immich can't access the files. Here are some things to check: - -- In the docker-compose file, are the volumes mounted correctly? -- Are the volumes also mounted to any worker containers? -- Are the import paths set correctly, and do they match the path set in docker-compose file? -- Make sure you don't use symlinks in your import libraries, and that you aren't linking across docker mounts. -- Are the permissions set correctly? -- Make sure you are using forward slashes (`/`) and not backward slashes. - -To validate that Immich can reach your external library, start a shell inside the container. Run `docker exec -it immich_server bash` to a bash shell. If your import path is `/mnt/photos`, check it with `ls /mnt/photos`. If you are using a dedicated microservices container, make sure to add the same mount point and check for availability within the microservices container as well. - -### Exclusion Patterns - -By default, all files in the import paths will be added to the library. If there are files that should not be added, exclusion patterns can be used to exclude them. Exclusion patterns are glob patterns are matched against the full file path. If a file matches an exclusion pattern, it will not be added to the library. Exclusion patterns can be added in the Scan Settings page for each library. - -Some basic examples: - -- `**/*.tif` will exclude all files with the extension `.tif` -- `**/hidden.jpg` will exclude all files named `hidden.jpg` -- `**/Raw/**` will exclude all files in any directory named `Raw` -- `**/*.{tif,jpg}` will exclude all files with the extension `.tif` or `.jpg` - -Note that `*` is a wildcard matching zero or more characters (i.e., withinin a filename or single directory name). `**` matches zero or more subdirectories, recursively. It also includes any/all files within a subdirectory, i.e., when used at the end of a pattern. For example, `**/exclude_me/**` will exclude all files in any directory named `exclude_me`, as well as all files in any subdirectories of `exclude_me`, recursively. - -Special characters such as @ should be escaped, for instance: - -- `**/\@eaDir/**` will exclude all files in any directory named `@eaDir` - -:::info -Internally, Immich uses the [glob](https://www.npmjs.com/package/glob) package to process exclusion patterns, and sometimes those patterns are translated into [Postgres LIKE patterns](https://www.postgresql.org/docs/current/functions-matching.html). The intention is to support basic folder exclusions but we recommend against advanced usage since those can't reliably be translated to the Postgres syntax. Please refer to the [glob documentation](https://github.com/isaacs/node-glob#glob-primer) for a basic overview on glob patterns. -::: - -### Automatic watching (EXPERIMENTAL) - -This feature is considered experimental and for advanced users only. If enabled, it will allow automatic watching of the filesystem which means new assets are automatically imported to Immich without needing to rescan. - -If your photos are on a network drive, automatic file watching likely won't work. In that case, you will have to rely on a [periodic library refresh](#set-custom-scan-interval) to pull in your changes. - -#### Troubleshooting - -If you encounter an `ENOSPC` error, you need to increase your file watcher limit. In sysctl, this key is called `fs.inotify.max_user_watches` and has a default value of 8192. Increase this number to a suitable value greater than the number of files you will be watching. Note that Immich has to watch all files in your import paths including any ignored files. - -``` -ERROR [LibraryService] Library watcher for library c69faf55-f96d-4aa0-b83b-2d80cbc27d98 encountered error: Error: ENOSPC: System limit for number of file watchers reached, watch '/media/photo.jpg' -``` - -In rare cases, the library watcher can hang, preventing Immich from starting up. In this case, disable the library watcher in the configuration file. If the watcher is enabled from within Immich, the app must be started without the microservices. Disable the microservices in the docker compose file, start Immich, disable the library watcher in the admin settings, close Immich, re-enable the microservices, and then Immich can be started normally. - -### Nightly job - -There is an automatic scan job that is scheduled to run once a day. Its schedule is configurable, see [Set Custom Scan Interval](#set-custom-scan-interval). - -This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library management page. - -### Deleting a Library - -When deleting an external library, all assets inside are immediately deleted along with the library. Note that while a library can take a long time to fully delete in the background, it is immediately removed from the library list. If the deletion process is interrupted (for example, due to server restart), it will be cleaned up in the next nightly cron job. The cleanup process can also be manually initiated by clicking the "Scan All Libraries" button in the library list. - -## Usage - -Let's show a concrete example where we add an existing gallery to Immich. Here, we have the following folders we want to add: - -- `/home/user/old-pics`: a folder containing childhood photos. -- `/mnt/nas/christmas-trip`: photos from a christmas trip. The subfolder `/mnt/nas/christmas-trip/Raw` contains the raw files directly from the DSLR. We don't want to import the raw files to Immich -- `/mnt/media/videos`: Videos from the same christmas trip. - -First, we need to plan how we want to organize the libraries. The christmas trip photos should belong to its own library since we want to exclude the raw files. The videos and old photos can be in the same library since we want to import all files. We could also add all three folders to the same library if there are no files matching the Raw exclusion pattern in the other folders. - -### Mount Docker Volumes - -The `immich-server` container will need access to the gallery. Modify your docker compose file as follows - -```diff title="docker-compose.yml" - immich-server: - volumes: - - ${UPLOAD_LOCATION}:/data -+ - /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro -+ - /home/user/old-pics:/mnt/media/old-pics:ro -+ - /mnt/media/videos:/mnt/media/videos:ro -+ - /mnt/media/videos2:/mnt/media/videos2 # WARNING: Immich will be able to delete the files in this folder, as it does not end with :ro -+ - "C:/Users/user_name/Desktop/my media:/mnt/media/my-media:ro" # import path in Windows system. -``` - -:::tip -The `ro` flag at the end only gives read-only access to the volumes. -This will disallow the images from being deleted in the web UI, or adding metadata to the library ([XMP sidecars](/features/xmp-sidecars)). -::: - -:::info -_Remember to run `docker compose up -d` to register the changes. Make sure you can see the mounted path in the container._ -::: - -### Create A New Library - -These actions must be performed by the Immich administrator. - -- Click on your avatar in the upper right corner. -- Click on `Administration -> External Libraries`. -- Click on `Create Library`. -- Select which user owns the library, this **can not** be changed later -- You are now entering the library management page. -- Click on `Add` in the `Folders` section. -- Enter `/mnt/media/christmas-trip` then click Add. -- Click on `Edit` Library and rename it to "Christmas Trip". - -NOTE: We have to use the `/mnt/media/christmas-trip` path and not the `/mnt/nas/christmas-trip` path since all paths have to be what the Docker containers see. - -Next, we'll add an exclusion pattern to filter out raw files. - -- Click on `Add` in the `Exclusion Patterns` section. -- Enter `**/Raw/**` and click Add. -- Click on `Scan` - -The christmas trip library will now be scanned in the background. In the meantime, let's add the videos and old photos to another library. - -- Go back to `Administration -> External Libraries`. -- Click on `Create Library`. -- Select which user owns the library, -- You are now entering the library management page. -- Click on `Add` in the `Folders` section. -- Enter `/mnt/media/old-pics` then click Add -- Click on `Add` in the `Folders` section. -- Enter `/mnt/media/videos` then click Add -- Click on `Scan` -- Click on `Edit` Library and rename it to "Old videos and photos". - -Within seconds, the assets from the old-pics and videos folders should show up in the main timeline. - -### Folder view - -Folder view provides an additional view besides the timeline that is similar to a file explorer. It allows you to navigate through the folders and files in the library. This feature is handy for a highly curated and customized external library or a nicely configured storage template. - -You can enable this feature under [`Account Settings > Features > Folders`](https://my.immich.app/user-settings?isOpen=feature+folders) - - - -### Set Custom Scan Interval - -:::note -Only an admin can do this. -::: - -You can define a custom interval for the trigger external library rescan under Administration -> Settings -> External Library. -You can set the scanning interval using the preset or cron format. For more information you can refer to [Crontab Guru](https://crontab.guru/). - - diff --git a/docs/docs/features/reverse-geocoding.md b/docs/docs/features/reverse-geocoding.md deleted file mode 100644 index b1aee74a99..0000000000 --- a/docs/docs/features/reverse-geocoding.md +++ /dev/null @@ -1,15 +0,0 @@ -# Reverse Geocoding - -Immich supports local [Reverse Geocoding](https://en.wikipedia.org/wiki/Reverse_geocoding) using data from the [GeoNames](https://www.geonames.org/) geographical database. This data is loaded into the Postgres database on each minor version upgrade, allowing all queries to be run on your own server. - -## Extraction - -During Exif Extraction, assets with latitudes and longitudes are reverse geocoded to determine their City, State, and Country. - -## Usage - -Data from a reverse geocode is displayed in the image details, and used in [Smart Search](/features/searching.md). - - - - diff --git a/docs/docs/guides/_category_.json b/docs/docs/guides/_category_.json deleted file mode 100644 index 6b51b67c73..0000000000 --- a/docs/docs/guides/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Guides", - "position": 6 -} diff --git a/docs/docs/guides/assets/20231219_183007_add-new-server-option.png b/docs/docs/guides/assets/20231219_183007_add-new-server-option.png deleted file mode 100644 index 934c8c792f..0000000000 Binary files a/docs/docs/guides/assets/20231219_183007_add-new-server-option.png and /dev/null differ diff --git a/docs/docs/guides/external-library.md b/docs/docs/guides/external-library.md deleted file mode 100644 index a1c8092732..0000000000 --- a/docs/docs/guides/external-library.md +++ /dev/null @@ -1,57 +0,0 @@ -# External Library - -This guide walks you through adding an [External Library](/features/libraries). -This guide assumes you are running Immich in Docker and that the files you wish to access are stored -in a directory on the same machine. - -# Mount the directory into the containers. - -Edit `docker-compose.yml` to add one or more new mount points in the section `immich-server:` under `volumes:`. -If you want Immich to be able to delete the images in the external library or add metadata ([XMP sidecars](/features/xmp-sidecars)), remove `:ro` from the end of the mount point. - -```diff -immich-server: - volumes: - - ${UPLOAD_LOCATION}:/data -+ - /home/user/photos1:/home/user/photos1:ro -+ - /mnt/photos2:/mnt/photos2:ro # you can delete this line if you only have one mount point, or you can add more lines if you have more than two -``` - -Restart Immich by running `docker compose up -d`. - -# Create the library - -:::info -External library management requires administrator access and the steps below assume you are using an admin account. -::: - -In the Immich web UI: - -- click the **Administration** link in the upper right corner. - - -- Select the **External Libraries** tab and click the **Create Library** button - - -- In the dialog, select which user should own the new library - - -- You are now entering the library management page. - - -- Click `Add` in the Folder section to specify a path for scanning and enter **/home/user/photos1** as the path and click Add - - -- Click the three-dots menu and select **Scan New Library Files** - - -# Confirm stuff is happening - -- Click **Administration** - - -- Select the **Jobs** tab - - -- You should see non-zero Active jobs for - Library, Generate Thumbnails, and Extract Metadata. diff --git a/docs/docs/guides/img/add-path-button.webp b/docs/docs/guides/img/add-path-button.webp deleted file mode 100644 index 014999069f..0000000000 Binary files a/docs/docs/guides/img/add-path-button.webp and /dev/null differ diff --git a/docs/docs/guides/img/add-path-field.webp b/docs/docs/guides/img/add-path-field.webp deleted file mode 100644 index 6ac5a33e30..0000000000 Binary files a/docs/docs/guides/img/add-path-field.webp and /dev/null differ diff --git a/docs/docs/guides/img/edit-import-paths.webp b/docs/docs/guides/img/edit-import-paths.webp deleted file mode 100644 index 70cc1cf7cf..0000000000 Binary files a/docs/docs/guides/img/edit-import-paths.webp and /dev/null differ diff --git a/docs/docs/guides/img/libraries-dropdown.webp b/docs/docs/guides/img/libraries-dropdown.webp deleted file mode 100644 index fe9d1fcf47..0000000000 Binary files a/docs/docs/guides/img/libraries-dropdown.webp and /dev/null differ diff --git a/docs/docs/guides/img/path-save.webp b/docs/docs/guides/img/path-save.webp deleted file mode 100644 index df0256a3df..0000000000 Binary files a/docs/docs/guides/img/path-save.webp and /dev/null differ diff --git a/docs/docs/guides/img/user-avatar.webp b/docs/docs/guides/img/user-avatar.webp deleted file mode 100644 index 78a8fd9270..0000000000 Binary files a/docs/docs/guides/img/user-avatar.webp and /dev/null differ diff --git a/docs/docs/guides/scaling-immich.md b/docs/docs/guides/scaling-immich.md deleted file mode 100644 index a8d916ae2a..0000000000 --- a/docs/docs/guides/scaling-immich.md +++ /dev/null @@ -1,19 +0,0 @@ -# Scaling Immich - -Immich is built with modern deployment practices in mind, and the backend is designed to be able to run multiple instances in parallel. When doing this, the only requirement you need to be aware of is that every instance needs to be connected to the shared infrastructure. That means they should all have access to the same Postgres and Redis instances, and have the same files mounted into the containers. - -Scaling can be useful for many reasons. Maybe you have a gaming PC that you want to use for transcoding and thumbnail generation, or perhaps you run a Kubernetes cluster across a handful of powerful servers that you want to make use of. - -:::info -If you only have a single machine to run Immich on, scaling to multiple containers is unlikely to provide any benefit. An Immich container will run multiple background tasks at once, and you can increase their number from the admin panel. -::: - -The details of how to scale across multiple machines will vary widely between different environments and require some knowledge to set up, and as such this guide gives no specific instructions. In some cases scaling up can be as easy as incrementing the amount of replicas on a Kubernetes deployment, in others it might need you to configure network tunnels or NFS mounts. The details are left as an exercise for the reader ;) - -## Workers - -By default, each running `immich-server` container comes with multiple internal workers. If you're scaling up only to handle more background tasks, you can choose to disable the worker responsible for the API. See [workers](../administration/jobs-workers.md) for more detail. - -## Scaling down - -In the same way you can scale up to multiple containers, you can also choose to scale down. All state is stored in Postgres, Redis, and the filesystem so there is no risk in stopping a running immich-server container, for example if you want to use your GPU to play some games. As long as there is an API worker running you will still be able to browse Immich, and jobs will wait to be processed until there is a worker available for them. diff --git a/docs/docs/guides/smtp-gmail.md b/docs/docs/guides/smtp-gmail.md deleted file mode 100644 index 58c598c308..0000000000 --- a/docs/docs/guides/smtp-gmail.md +++ /dev/null @@ -1,20 +0,0 @@ -# SMTP settings using Gmail - -This guide walks you through how to get the information you need to set up your Immich instance to send emails using Gmail's SMTP server. - -## Create an app password - -From your Google account settings - -- Add [2-Step Verification](https://support.google.com/accounts/answer/185839) to your Google account (Required) -- [Create an app password](https://myaccount.google.com/apppasswords). - -At the end of creating your app passwords, a password will be displayed; save it, it will be used for the password field when setting up the SMTP server in Immich. - - - -## Entering the SMTP credential in Immich - -Entering your credential in Immich's email notification settings at `Administration -> Settings -> Notification Settings` - - diff --git a/docs/docs/guides/smtp-microsoft365.md b/docs/docs/guides/smtp-microsoft365.md deleted file mode 100644 index 2ba78a4e18..0000000000 --- a/docs/docs/guides/smtp-microsoft365.md +++ /dev/null @@ -1,19 +0,0 @@ -# SMTP settings using Microsoft 365 - -This guide walks you through how to get the information you need to set up your Immich instance to send emails using Microsoft's SMTP server. - -## Create an app password - -You will need to generate an app password to use your Microsoft email in Immich. Depending on if you have a personal or business account, you can use https://go.microsoft.com/fwlink/?linkid=2274139 or https://myaccount.microsoft.com/securtiy-info respectively. - -## Entering the SMTP credential in Immich - -Entering your credential in Immich's email notification settings at `Administration -> Settings -> Notification Settings` - -Host: smtp-mail.outlook.com -Port: 587 -username: your mail address -Password: app password you created earlier -SMTPS: set it to disabled - - diff --git a/docs/docs/overview/help.md b/docs/docs/help-me.md similarity index 95% rename from docs/docs/overview/help.md rename to docs/docs/help-me.md index e6523547fa..3642c75412 100644 --- a/docs/docs/overview/help.md +++ b/docs/docs/help-me.md @@ -1,5 +1,5 @@ --- -sidebar_position: 6 +sidebar_position: 9 --- # Help Me! diff --git a/docs/docs/install/all-in-one.md b/docs/docs/install/all-in-one.md index 4d37952179..8df06981f7 100644 --- a/docs/docs/install/all-in-one.md +++ b/docs/docs/install/all-in-one.md @@ -2,13 +2,15 @@ sidebar_position: 70 --- -# All-In-One [Community] +import CommunityDisclaimer from '@site/src/components/community-disclaimer'; -:::note -This is a community contribution and not officially supported by the Immich team, but included here for convenience. +# Install with All-in-One -**Please report issues to the corresponding [Github Repository][github].** -::: + + +Support and issue reports go to the [imagegenius/docker-immich][github] repository, not to the Immich team. + + ## Installation diff --git a/docs/docs/install/docker-compose.mdx b/docs/docs/install/docker-compose.mdx index 46b144eb4a..1e15fb90ba 100644 --- a/docs/docs/install/docker-compose.mdx +++ b/docs/docs/install/docker-compose.mdx @@ -2,7 +2,7 @@ sidebar_position: 30 --- -# Docker Compose [Recommended] +# Install with Docker Compose [Recommended] Docker Compose is the recommended method to run Immich in production. Below are the steps to deploy Immich with Docker Compose. @@ -29,4 +29,4 @@ If you get an error `can't set healthcheck.start_interval as feature require Doc ## Next Steps -Read the [Post Installation](/install/post-install.mdx) steps and [upgrade instructions](/install/upgrading.md). +Read the [next steps](/introduction/next-steps) and the [upgrade instructions](/install/upgrading). diff --git a/docs/docs/install/img/jobs-tab.webp b/docs/docs/install/img/jobs-tab.webp new file mode 100644 index 0000000000..4cd5ec5026 Binary files /dev/null and b/docs/docs/install/img/jobs-tab.webp differ diff --git a/docs/docs/overview/img/upload-button.webp b/docs/docs/install/img/upload-button.webp similarity index 100% rename from docs/docs/overview/img/upload-button.webp rename to docs/docs/install/img/upload-button.webp diff --git a/docs/docs/install/index.md b/docs/docs/install/index.md new file mode 100644 index 0000000000..5874fe5c0c --- /dev/null +++ b/docs/docs/install/index.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 0 +--- + +# Install and upgrade + +Pick an installation method below, then keep the instance up to date with [Upgrading](/install/upgrading). If you just want to try Immich, [Quick start](/install/quick-start) walks through the shortest path to a working instance. + +Check the [requirements](/reference/requirements) before you begin. + +## Official methods + +Maintained by the Immich team. Report problems on the [Immich repository](https://github.com/immich-app/immich). + +| Method | Notes | +| ----------------------------------------- | -------------------------------------------------------------------- | +| [Docker Compose](/install/docker-compose) | **Recommended.** The method every other official method is built on. | +| [Portainer](/install/portainer) | Deploys the official Compose file through Portainer's Stack editor. | +| [Kubernetes](/install/kubernetes) | Uses the official Helm chart. | +| [Install script](/install/script) | Experimental, Linux only. Not recommended for production. | + +## Community methods + +Contributed and maintained outside the Immich team, and included here for convenience. They are not officially supported — support and issue reports go to the project or platform listed, not to the Immich repository. + +| Method | Support | +| -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| [Unraid](/install/unraid) | Dedicated channel on the [Discord server](https://discord.immich.app/) | +| [TrueNAS](/install/truenas) | [truenas/apps](https://github.com/truenas/apps/tree/master/trains/community/immich) repository, plus Discord | +| [Synology](/install/synology) | Synology-specific support platforms | +| [All-in-One](/install/all-in-one) | [imagegenius/docker-immich](https://github.com/imagegenius/docker-immich/) repository | +| [One-click cloud marketplaces](/install/one-click) | The cloud provider hosting the marketplace image | diff --git a/docs/docs/install/kubernetes.md b/docs/docs/install/kubernetes.md index 34062c1286..0537571bd9 100644 --- a/docs/docs/install/kubernetes.md +++ b/docs/docs/install/kubernetes.md @@ -2,7 +2,7 @@ sidebar_position: 40 --- -# Kubernetes +# Install on Kubernetes You can deploy Immich on Kubernetes using [the official Helm chart](https://github.com/immich-app/immich-charts/blob/main/README.md). diff --git a/docs/docs/install/one-click.md b/docs/docs/install/one-click.md index 53fcb20d21..312d53dec0 100644 --- a/docs/docs/install/one-click.md +++ b/docs/docs/install/one-click.md @@ -2,14 +2,15 @@ sidebar_position: 65 --- -# One-Click [Cloud Service] +import CommunityDisclaimer from '@site/src/components/community-disclaimer'; -:::note -This version of Immich is provided via cloud service providers' one-click marketplaces. Hosting costs are set by the cloud service providers. -Support for these are provided by the individual cloud service providers. +# Install with one click [Cloud Service] -**Please report issues to the corresponding [Github Repository][github].** -::: + + +Immich is provided here via cloud service providers' one-click marketplaces. Hosting costs are set by the provider, and support is provided by the individual cloud service provider. + + ## Installation @@ -24,9 +25,3 @@ https://marketplace.digitalocean.com/apps/immich ### Vultr https://www.vultr.com/marketplace/apps/immich - -## Issues - -For issues, open an issue on the associated [GitHub Repository][github]. - -[github]: https://github.com/immich-app/immich/ diff --git a/docs/docs/install/portainer.md b/docs/docs/install/portainer.md index 07fd255292..ecda7f0f7e 100644 --- a/docs/docs/install/portainer.md +++ b/docs/docs/install/portainer.md @@ -2,7 +2,7 @@ sidebar_position: 50 --- -# Portainer +# Install with Portainer Install Immich using Portainer's Stack feature. @@ -45,5 +45,5 @@ alt="Dot Env Example" 11. Click on "**Deploy the stack**". :::tip -For more information on how to use the application, please refer to the [Post Installation](/install/post-install.mdx) guide. +For more information on how to use the application, please refer to [Next steps](/introduction/next-steps). ::: diff --git a/docs/docs/overview/quick-start.mdx b/docs/docs/install/quick-start.mdx similarity index 69% rename from docs/docs/overview/quick-start.mdx rename to docs/docs/install/quick-start.mdx index 521d0a232c..85ce045a24 100644 --- a/docs/docs/overview/quick-start.mdx +++ b/docs/docs/install/quick-start.mdx @@ -1,19 +1,17 @@ --- -sidebar_position: 2 +sidebar_position: 10 --- # Quick start -Here is a quick, no-choices path to install Immich and take it for a test drive. -Once you've tried it, you might use one of the many other ways -to install and use it. +A quick, no-choices path to a running Immich instance, so you can try it before deciding how you want to deploy it for real. It installs with Docker Compose, uploads a photo from the web app, and connects the mobile app. ## Requirements - A system with at least 6GB of RAM and 2 CPU cores. - [Docker](https://docs.docker.com/engine/install/) -> For a more detailed list of requirements, see the [requirements page](/install/requirements). +> For the full list, see [Requirements](/reference/requirements). --- @@ -61,18 +59,18 @@ import MobileAppBackup from '/docs/partials/_mobile-app-backup.md'; The backup time differs depending on how many photos are on your mobile device. Large uploads may take quite a while. -To quickly get going, you can selectively upload few photos first, by following this [guide](/features/mobile-app#sync-only-selected-photos). +To quickly get going, you can selectively upload few photos first, by following this [guide](/user-guide/use-the-mobile-app#sync-only-selected-photos). You can select the **Job Queues** tab to see Immich processing your photos. - + --- ## Review the database backup and restore process Immich has built-in database backups. You can refer to the -[database backup](/administration/backup-and-restore) for more information. +[database backup](/administration/back-up-and-restore) for more information. :::danger The database only contains metadata and user information. You must setup manual backups of the images and videos stored in `UPLOAD_LOCATION`. @@ -82,12 +80,12 @@ The database only contains metadata and user information. You must setup manual ## Where to go from here? -You may decide you'd like to install the server a different way; the Install category on the left menu provides many options. +You may decide you'd like to install the server a different way; [Install and upgrade](/install/) lists every method. You may decide you'd like to add the _rest_ of your photos from Google Photos, even those not on your mobile device, via Google Takeout. You can use [immich-go](https://github.com/simulot/immich-go) for this. -You may want to [upload photos from your own archive](/features/command-line-interface). +You may want to [upload photos from your own archive](/user-guide/upload-media-with-the-cli). -You may want to incorporate a pre-existing archive of photos from an [External Library](/features/libraries); there's a [guide](/guides/external-library) for that. +You may want to incorporate a pre-existing archive of photos from an [External Library](/concepts/external-libraries); there's a [guide](/administration/add-an-external-library) for that. -You may want your mobile device to [back photos up to your server automatically](/features/mobile-backup). +You may want your mobile device to [back photos up to your server automatically](/concepts/mobile-backup). diff --git a/docs/docs/install/requirements.md b/docs/docs/install/requirements.md deleted file mode 100644 index 155aa1ae75..0000000000 --- a/docs/docs/install/requirements.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -sidebar_position: 10 ---- - -# Requirements - -Hardware and software requirements for Immich: - -## Hardware - -- **OS**: Recommended Linux or \*nix 64-bit operating system (Ubuntu, Debian, etc). - - Non-Linux OSes tend to provide a poor Docker experience and are strongly discouraged. - Our ability to assist with setup or troubleshooting on non-Linux OSes will be severely reduced. - If you still want to try to use a non-Linux OS, you can set it up as follows: - - Windows: [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/) or [WSL 2](https://docs.docker.com/desktop/wsl/). - - macOS: [Docker Desktop on Mac](https://docs.docker.com/desktop/install/mac-install/). - - Immich runs well in a virtualized environment when running in a full virtual machine. - The use of Docker in LXC containers is [not recommended](https://pve.proxmox.com/wiki/Linux_Container), but may be possible for advanced users. - If you have issues, we recommend that you switch to a supported VM deployment. -- **RAM**: Minimum 6GB, recommended 8GB. -- **CPU**: Minimum 2 cores, recommended 4 cores. - - Immich runs on the `amd64` and `arm64` platforms. - Since `v3`, the machine learning container on `amd64` requires the `>= x86-64-v2` [microarchitecture level](https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels). - Most CPUs released since ~2012 support this microarchitecture. - If you are using a virtual machine, ensure you have selected a [supported microarchitecture](https://pve.proxmox.com/pve-docs/chapter-qm.html#_qemu_cpu_types). - If you are unable to support this instruction set, the last version to support `x86-64-v1` is `v2.7.5`. - Note that this release is no longer supported, and you must run a matching `immich-server` version. -- **Storage**: Recommended Unix-compatible filesystem (EXT4, ZFS, APFS, etc.) with support for user/group ownership and permissions. - - The generation of thumbnails and transcoded video can increase the size of the photo library by 10-20% on average. - -:::note RAM requirements -For a smooth experience, especially during asset upload, Immich requires at least 6GB of RAM. -For systems with only 4GB of RAM, Immich can be run with machine learning features disabled. -::: - -:::tip Postgres setup -Good performance and a stable connection to the Postgres database is critical to a smooth Immich experience. -The Postgres database files are typically between 1-3 GB in size. -For this reason, the Postgres database (`DB_DATA_LOCATION`) should ideally use local SSD storage, and never a network share of any kind. -Additionally, if Docker resource limits are used, the Postgres database requires at least 2GB of RAM. -Windows users may run into issues with non-Unix-compatible filesystems, see below for more details. -::: - -## Software - -Immich requires [**Docker**](https://docs.docker.com/get-started/get-docker/) with the **Docker Compose plugin**: - -- **Docker Engine**: This CLI variant is designed for Linux servers (or Windows via WSL2). -- **Docker Desktop**: This GUI variant is **not recommended** for Linux, but is available for Windows or macOS. - -The Compose plugin will be installed by both Docker Engine and Desktop by following the linked installation guides; it can also be [separately installed](https://docs.docker.com/compose/install/). - -:::note -Immich requires the command `docker compose`; the similarly named `docker-compose` is [deprecated](https://docs.docker.com/retired/#docker-compose-v1-replaced-by-compose-v2) and is no longer supported by Immich. -::: - -### Special requirements for Windows users - -
-Database storage on Windows systems - -The Immich Postgres database (`DB_DATA_LOCATION`) must be located on a filesystem that supports user/group -ownership and permissions (EXT2/3/4, ZFS, APFS, BTRFS, XFS, etc.). It will not work on any filesystem formatted in NTFS or ex/FAT/32. -It will not work in WSL (Windows Subsystem for Linux) when using a mounted host directory (commonly under `/mnt`). -If this is an issue, you can change the bind mount to a Docker volume instead as follows: - -Make the following change to `.env`: - -```diff -- DB_DATA_LOCATION=./postgres -+ DB_DATA_LOCATION=pgdata -``` - -Add the following line to the bottom of `docker-compose.yml`: - -```diff -volumes: - model-cache: -+ pgdata: -``` - -
diff --git a/docs/docs/install/script.md b/docs/docs/install/script.md index ce05dc82d9..15ca83f4d3 100644 --- a/docs/docs/install/script.md +++ b/docs/docs/install/script.md @@ -2,15 +2,15 @@ sidebar_position: 20 --- -# Install script [Experimental] +# Install with the install script [Experimental] :::caution -This method is experimental and not currently recommended for production use. For production, please refer to installing with [Docker Compose](/install/docker-compose.mdx). +This method is experimental and not currently recommended for production use. For production, please refer to installing with [Docker Compose](/install/docker-compose). ::: ## Requirements -Follow the [requirements page](/install/requirements) to get started. +Follow the [requirements page](/reference/requirements) to get started. The install script only supports Linux operating systems and requires Docker to be already installed on the system. @@ -32,5 +32,5 @@ The web application and mobile app will be available at `http:// + +Support should be directed to Synology-specific support platforms, not to the Immich team. + + Immich can easily be installed on a Synology NAS using Container Manager within DSM. If you have not installed Container Manager already, you can install it in the Packages Center. Refer to the [Container Manager docs](https://kb.synology.com/en-us/DSM/help/ContainerManager/docker_desc?version=7) for more information on using Container Manager. @@ -70,7 +72,7 @@ Click "**Edit Rules**" and add the following firewall rules: ## Next Steps -Read the [Post Installation](/install/post-install.mdx) steps and [upgrade instructions](/install/upgrading.md). +Read the [next steps](/introduction/next-steps) and the [upgrade instructions](/install/upgrading).
Updating Immich using Container Manager diff --git a/docs/docs/install/truenas.md b/docs/docs/install/truenas.md index 9135b72fe6..aa8b8f4cf6 100644 --- a/docs/docs/install/truenas.md +++ b/docs/docs/install/truenas.md @@ -2,18 +2,17 @@ sidebar_position: 80 --- +import CommunityDisclaimer from '@site/src/components/community-disclaimer'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -# TrueNAS [Community] +# Install on TrueNAS -:::note -This is a community contribution and not officially supported by the Immich team, but included here for convenience. + -Community support can be found in the dedicated channel on the [Discord Server](https://discord.immich.app/). +App issues go to the [truenas/apps](https://github.com/truenas/apps/tree/master/trains/community/immich) repository. Community support can be found in the dedicated channel on the [Discord server](https://discord.immich.app/). -**Please report app issues to the corresponding [GitHub Repository](https://github.com/truenas/apps/tree/master/trains/community/immich).** -::: + :::warning This guide covers the installation of Immich on TrueNAS Community Edition 24.10.2.2 (Electric Eel) and later. @@ -66,7 +65,7 @@ Thumbnails can also be stored on the SSDs for faster access. This is an advanced :::warning If you just created the datasets using the **Apps** preset, you can skip this warning section. -If the **data** dataset uses ACL it must have [ACL mode](https://www.truenas.com/docs/scale/scaletutorials/datasets/permissionsscale/) set to `Passthrough` if you plan on using a [storage template](/administration/storage-template.mdx) and the dataset is configured for network sharing (its ACL type is set to `SMB/NFSv4`). When the template is applied and files need to be moved from **upload** to **library** (internal folder created by Immich within the **data** dataset), Immich performs `chmod` internally and must be allowed to execute the command. [More info.](https://github.com/immich-app/immich/pull/13017) +If the **data** dataset uses ACL it must have [ACL mode](https://www.truenas.com/docs/scale/scaletutorials/datasets/permissionsscale/) set to `Passthrough` if you plan on using a [storage template](/administration/use-the-storage-template) and the dataset is configured for network sharing (its ACL type is set to `SMB/NFSv4`). When the template is applied and files need to be moved from **upload** to **library** (internal folder created by Immich within the **data** dataset), Immich performs `chmod` internally and must be allowed to execute the command. [More info.](https://github.com/immich-app/immich/pull/13017) To change or verify the ACL mode, go to the **Datasets** screen, select the **library** dataset, click on the **Edit** button next to **Dataset Details**, then click on the **Advanced Options** tab, scroll down to the **ACL Mode** section, and select `Passthrough` from the dropdown menu. Click **Save** to apply the changes. If the option is greyed out, set the **ACL Type** to `SMB/NFSv4` first, then you can change the **ACL Mode** to `Passthrough`. ::: @@ -129,7 +128,7 @@ The **Timezone** is set to the system default, which usually matches your local **Enable Machine Learning** is enabled by default. It allows Immich to use machine learning features such as face recognition, image search, and smart duplicate detection. Untick this option if you do not want to use these features. -Select the **Machine Learning Image Type** based on the hardware you have. More details here: [Hardware-Accelerated Machine Learning](/features/ml-hardware-acceleration.md) +Select the **Machine Learning Image Type** based on the hardware you have. More details here: [Hardware-Accelerated Machine Learning](/administration/set-up-hardware-accelerated-machine-learning) **Database Password** should be set to a custom value using only the characters `A-Za-z0-9`. This password is used to secure the Postgres database. @@ -156,7 +155,7 @@ className="border rounded-xl" /> These are used to add custom configuration options or to enable specific features. -More information on available environment variables can be found in the **[environment variables documentation](/install/environment-variables/)**. +More information on available environment variables can be found in the **[environment variables documentation](/reference/environment-variables)**. :::info Some environment variables are not available for the TrueNAS Community Edition app as they can be configured through GUI options in the [Edit Immich screen](#edit-app-settings). @@ -242,7 +241,7 @@ alt="Add External Libraries with Additional Storage" className="border rounded-xl" /> -You may configure [external libraries](/features/libraries) by mounting them using **Additional Storage**. +You may configure [external libraries](/administration/add-an-external-library) by mounting them using **Additional Storage**. The dataset that contains your external library files must at least give **read** access to the user running Immich (Default: `apps` (UID 568), `apps` (GID 568)). If you want to be able to delete files or edit metadata in the external library using Immich, you will need to give the **modify** permission to the user running Immich. @@ -266,7 +265,7 @@ A general recommendation is to mount any external libraries to a path beginning This feature should only be used by advanced users. ::: -Immich can use multiple datasets for its storage, allowing you to manage your data more granularly, similar to the old storage configuration. This is useful if you want to separate your data into different datasets for performance or organizational reasons. There is a general guide for this [here](/guides/custom-locations), but read on for the TrueNAS guide. +Immich can use multiple datasets for its storage, allowing you to manage your data more granularly, similar to the old storage configuration. This is useful if you want to separate your data into different datasets for performance or organizational reasons. There is a general guide for this [here](/administration/use-custom-file-locations), but read on for the TrueNAS guide. Each additional dataset has to give the permission **_modify_** to the user who will run Immich (Default: `apps` (UID 568), `apps` (GID 568)) As described in the [Setting up Storage Datasets](#setting-up-storage-datasets) section above, you have to create the datasets with the **Apps** preset to ensure the correct permissions are set, or you can set the permissions manually after creating the datasets. @@ -309,7 +308,7 @@ className="border rounded-xl" Both **CPU** and **Memory** are limits, not reservations. This means that Immich can use up to the specified amount of CPU threads and RAM, but it will not reserve that amount of resources at all times. The system will allocate resources as needed, and Immich will use less than the specified amount most of the time. -- Enable **GPU Configuration** options if you have a GPU or CPU with integrated graphics that you will use for [Hardware Transcoding](/features/hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/features/ml-hardware-acceleration.md). +- Enable **GPU Configuration** options if you have a GPU or CPU with integrated graphics that you will use for [Hardware Transcoding](/administration/set-up-hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/administration/set-up-hardware-accelerated-machine-learning). The process for NVIDIA GPU passthrough requires additional steps. More details here: [GPU Passthrough Docs for TrueNAS Apps](https://apps.truenas.com/managing-apps/installing-apps/#gpu-passthrough) @@ -332,7 +331,7 @@ Click **Web Portal** on the **Application Info** widget, or go to the URL `http: After that, you can start using Immich to upload and manage your photos and videos. :::tip -For more information on how to use the application once installed, please refer to the [Post Install](/install/post-install.mdx) guide. +For more information on how to use the application once installed, please refer to [Next steps](/introduction/next-steps). ::: ## Edit App Settings @@ -347,7 +346,7 @@ For more information on how to use the application once installed, please refer ## Updating the App :::danger -Make sure to read the general [upgrade instructions](/install/upgrading.md). +Make sure to read the general [upgrade instructions](/install/upgrading). ::: When updates become available, TrueNAS alerts and provides easy updates. diff --git a/docs/docs/install/unraid.md b/docs/docs/install/unraid.md index 3ce98dc2e1..05321d0202 100644 --- a/docs/docs/install/unraid.md +++ b/docs/docs/install/unraid.md @@ -2,13 +2,15 @@ sidebar_position: 70 --- -# Unraid [ Community ] +import CommunityDisclaimer from '@site/src/components/community-disclaimer'; -:::note -This is a community contribution and not officially supported by the Immich team, but included here for convenience. +# Install on Unraid -Community support can be found in the dedicated channel on the [Discord Server](https://discord.immich.app/). -::: + + +Community support can be found in the dedicated channel on the [Discord server](https://discord.immich.app/), not from the Immich team. + + Immich can easily be installed and updated on Unraid via: @@ -131,13 +133,13 @@ alt="Go to Docker Tab and visit the address listed next to immich-web"
:::tip -For more information on how to use the application once installed, please refer to the [Post Install](/install/post-install.mdx) guide. +For more information on how to use the application once installed, please refer to [Next steps](/introduction/next-steps). ::: ## Updating Steps :::danger -Make sure to read the general [upgrade instructions](/install/upgrading.md). +Make sure to read the general [upgrade instructions](/install/upgrading). ::: Updating is extremely easy however it's important to be aware that containers managed via the Docker Compose Manager plugin do not integrate with Unraid's native dockerman UI, the label "_update ready_" will always be present on containers installed via the Docker Compose Manager. diff --git a/docs/docs/install/upgrading.md b/docs/docs/install/upgrading.md index f302719c76..55e71e381b 100644 --- a/docs/docs/install/upgrading.md +++ b/docs/docs/install/upgrading.md @@ -8,6 +8,8 @@ sidebar_position: 95 You can see versions that had breaking changes [here][breaking]. ::: +Immich only supports upgrading to the most recent stable release, and the server and mobile app have to be upgraded in a particular order — see [Versioning](/concepts/versioning) before a major-version upgrade. + When a new version of Immich is [released][releases], you should read the release notes and account for any breaking changes noted (as mentioned above). If you use `IMMICH_VERSION` in your `.env` file, it will need to be updated to the latest or desired version. After that, the application can be upgraded and restarted with the following commands, run in the directory with the `docker-compose.yml` file: @@ -22,115 +24,10 @@ To clean up disk space, the old version's obsolete container images can be delet docker image prune ``` +## Migrating to VectorChord + +Instances still using the deprecated pgvecto.rs database extension have to move to VectorChord. See [Migrate to VectorChord](/administration/migrate-to-vectorchord). + [watchtower]: https://containrrr.dev/watchtower/ [breaking]: https://github.com/immich-app/immich/discussions?discussions_q=label%3Achangelog%3Abreaking-change+sort%3Adate_created [releases]: https://github.com/immich-app/immich/releases - -## Versioning Policy - -Immich follows [semantic versioning][semver], which tags releases in the format `..`. -We intend for breaking changes, including those to the API or deployment, to be limited to major version releases. -You can configure your Docker image to point to the current major version by using a metatag, such as `:v3`. These metatags do not follow release candidates. - -The mobile app is typically compatible with the current and prior major version. However, the server is only compatible with the matching major version. -Thus, we recommend upgrading all mobile clients before upgrading the server to ensure compatibility. - -We do not backport patches to earlier versions. We encourage all users to run the most recent stable release of Immich. -Downgrading to an earlier version, even within the same minor version, is not supported. - -[semver]: https://semver.org/ - -## Migrating to VectorChord - -:::info -If you deploy Immich using Docker Compose, see `ghcr.io/immich-app/postgres` in the `docker-compose.yml` file and have not explicitly set the `DB_VECTOR_EXTENSION` environmental variable, your Immich database is already using VectorChord and this section does not apply to you. -::: - -:::important -If you do not deploy Immich using Docker Compose and see a deprecation warning for pgvecto.rs on server startup, you should refer to the maintainers of the Immich distribution for guidance (if using a turnkey solution) or adapt the instructions for your specific setup. -::: - -Immich has migrated off of the deprecated pgvecto.rs database extension to its successor, [VectorChord](https://github.com/tensorchord/VectorChord), which comes with performance improvements in almost every aspect. This section will guide you on how to make this change in a Docker Compose setup. - -Before making any changes, please [back up your database](/administration/backup-and-restore). While every effort has been made to make this migration as smooth as possible, there’s always a chance that something can go wrong. - -After making a backup, please modify your `docker-compose.yml` file with the following information. - -```diff - [...] - - database: - container_name: immich_postgres -- image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:739cdd626151ff1f796dc95a6591b55a714f341c737e27f045019ceabf8e8c52 -+ image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 - environment: - POSTGRES_PASSWORD: ${DB_PASSWORD} - POSTGRES_USER: ${DB_USERNAME} - POSTGRES_DB: ${DB_DATABASE_NAME} - POSTGRES_INITDB_ARGS: '--data-checksums' -+ # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs -+ # DB_STORAGE_TYPE: 'HDD' - volumes: - # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file - - ${DB_DATA_LOCATION}:/var/lib/postgresql/data -- healthcheck: -- test: >- -- pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1; -- Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align -- --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; -- echo "checksum failure count is $$Chksum"; -- [ "$$Chksum" = '0' ] || exit 1 -- interval: 5m -- start_interval: 30s -- start_period: 5m -- command: >- -- postgres -- -c shared_preload_libraries=vectors.so -- -c 'search_path="$$user", public, vectors' -- -c logging_collector=on -- -c max_wal_size=2GB -- -c shared_buffers=512MB -- -c wal_compression=on -+ shm_size: 128mb - restart: always - - [...] -``` - -:::important -If you deviated from the defaults of pg14 or pgvectors0.2.0, you must adjust the pg major version and pgvecto.rs version. If you are still using the default `docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0` image, you can just follow the changes above. For example, if the previous image is `docker.io/tensorchord/pgvecto-rs:pg16-v0.3.0`, the new image should be `ghcr.io/immich-app/postgres:16-vectorchord0.3.0-pgvectors0.3.0` instead of the image specified in the diff. -::: - -After making these changes, you can start Immich as normal. Immich will make some changes to the DB during startup, which can take seconds to minutes to finish, depending on hardware and library size. In particular, it’s normal for the server logs to be seemingly stuck at `Reindexing clip_index` and `Reindexing face_index` for some time if you have over 100k assets in Immich and/or Immich is on a relatively weak server. If you see these logs and there are no errors, just give it time. - -:::danger -After switching to VectorChord, you should not downgrade Immich below 1.133.0. -::: - -Please don’t hesitate to contact us on [GitHub](https://github.com/immich-app/immich/discussions) or [Discord](https://discord.immich.app/) if you encounter migration issues. - -### VectorChord FAQ - -#### I have a separate PostgreSQL instance shared with multiple services. How can I switch to VectorChord? - -Please see the [standalone PostgreSQL documentation](/administration/postgres-standalone#migrating-to-vectorchord) for migration instructions. The migration path will be different depending on whether you’re currently using pgvecto.rs or pgvector, as well as whether Immich has superuser DB permissions. - -#### Why are so many lines removed from the `docker-compose.yml` file? Does this mean the health check is removed? - -These lines are now incorporated into the image itself along with some additional tuning. - -#### What does this change mean for my existing DB backups? - -The new DB image includes pgvector and pgvecto.rs in addition to VectorChord, so you can use this image to restore from existing backups that used either of these extensions. However, backups made after switching to VectorChord require an image containing VectorChord to restore successfully. - -#### Do I still need pgvecto.rs installed after migrating to VectorChord? - -pgvecto.rs only needs to be available during the migration, or if you need to restore from a backup that used pgvecto.rs. For a leaner DB and a smaller image, you can optionally switch to an image variant that doesn’t have pgvecto.rs installed after you’ve performed the migration and started Immich: `ghcr.io/immich-app/postgres:14-vectorchord0.4.3`, changing the PostgreSQL version as appropriate. - -#### Why does it matter whether my database is on an SSD or an HDD? - -These storage mediums have different performance characteristics. As a result, the optimal settings for an SSD are not the same as those for an HDD. Either configuration is compatible with SSD and HDD, but using the right configuration will make Immich snappier. As a general tip, we recommend users store the database on an SSD whenever possible. - -#### Can I use the new database image as a general PostgreSQL image outside of Immich? - -It’s a standard PostgreSQL container image that additionally contains the VectorChord, pgvector, and (optionally) pgvecto.rs extensions. If you were using the previous pgvecto.rs image for other purposes, you can similarly do so with this image. diff --git a/docs/docs/introduction/_category_.json b/docs/docs/introduction/_category_.json new file mode 100644 index 0000000000..9500aa765a --- /dev/null +++ b/docs/docs/introduction/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Introduction", + "position": 1, + "link": { + "type": "generated-index", + "title": "Introduction", + "description": "Start here. These lessons take you from nothing to a working Immich instance, step by step, with every step spelled out. Follow them in order and don't worry about why each step is needed yet." + } +} diff --git a/docs/docs/introduction/getting-started.mdx b/docs/docs/introduction/getting-started.mdx new file mode 100644 index 0000000000..82d66829d2 --- /dev/null +++ b/docs/docs/introduction/getting-started.mdx @@ -0,0 +1,25 @@ +--- +sidebar_position: 2 +--- + +# Getting started + +Welcome to the Immich documentation! This page will give you a quick introduction to the project and how to start using it. + +## Introduction + +Immich is an [open-source](/concepts/open-source), [self-hosted](/concepts/self-hosted) software solution for managing photos and videos. The project's primary goal is to make it easier for you to backup, organize, and share your photos and videos. + +## Prerequisites + +Immich is just software and needs a computer to run on, whether that be an old laptop, server, our rented cloud machine. You can learn more about the system requirements on the [hardware and software](/reference/requirements) page. + +## Install Immich + +Once [Install and upgrade](/install/). Docker Compose is the recommended method and is what the rest of the documentation assumes. + +If you would rather try Immich before committing to a deployment, [Quick start](/install/quick-start) walks through the shortest path to a working instance. + +## After installing + +[Next steps](/introduction/next-steps) covers registering the admin user, setting up backups, and the optional features worth knowing about. diff --git a/docs/docs/install/post-install.mdx b/docs/docs/introduction/next-steps.mdx similarity index 72% rename from docs/docs/install/post-install.mdx rename to docs/docs/introduction/next-steps.mdx index b30e91f3cd..56ad3e982b 100644 --- a/docs/docs/install/post-install.mdx +++ b/docs/docs/introduction/next-steps.mdx @@ -10,7 +10,7 @@ import MobileAppLogin from '/docs/partials/_mobile-app-login.md'; import MobileAppBackup from '/docs/partials/_mobile-app-backup.md'; import ServerBackup from '/docs/partials/_server-backup.md'; -# Post installation steps +# Next steps A list of common steps to take after installing Immich include: @@ -44,6 +44,6 @@ A list of common steps to take after installing Immich include: ## Setting up optional features -- [External Libraries](/features/libraries.md): Adding your existing photo library to Immich -- [Hardware Transcoding](/features/hardware-transcoding.md): Speeding up video transcoding -- [Hardware-Accelerated Machine Learning](/features/ml-hardware-acceleration.md): Speeding up various machine learning tasks in Immich +- [External Libraries](/administration/add-an-external-library): Adding your existing photo library to Immich +- [Hardware Transcoding](/administration/set-up-hardware-transcoding): Speeding up video transcoding +- [Hardware-Accelerated Machine Learning](/administration/set-up-hardware-accelerated-machine-learning): Speeding up various machine learning tasks in Immich diff --git a/docs/docs/overview/_category_.json b/docs/docs/overview/_category_.json deleted file mode 100644 index e224ed81cd..0000000000 --- a/docs/docs/overview/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Overview", - "position": 1 -} diff --git a/docs/docs/overview/img/alex-picture.jpeg b/docs/docs/overview/img/alex-picture.jpeg deleted file mode 100644 index c99523a987..0000000000 Binary files a/docs/docs/overview/img/alex-picture.jpeg and /dev/null differ diff --git a/docs/docs/overview/img/appicon.webp b/docs/docs/overview/img/appicon.webp deleted file mode 100644 index ffbfc1383d..0000000000 Binary files a/docs/docs/overview/img/appicon.webp and /dev/null differ diff --git a/docs/docs/overview/img/feature-panel.webp b/docs/docs/overview/img/feature-panel.webp deleted file mode 100644 index 5f10198ed3..0000000000 Binary files a/docs/docs/overview/img/feature-panel.webp and /dev/null differ diff --git a/docs/docs/partials/_mobile-app-backup.md b/docs/docs/partials/_mobile-app-backup.md index 777a989334..8e0e3505a6 100644 --- a/docs/docs/partials/_mobile-app-backup.md +++ b/docs/docs/partials/_mobile-app-backup.md @@ -9,5 +9,5 @@ 3. Scroll down to the bottom and press "**Enable Backup**" to start the backup process. This will upload all the assets in the selected albums. :::info -You can read more about backup options [here](/features/mobile-backup.md). +You can read more about backup options [here](/concepts/mobile-backup). ::: diff --git a/docs/docs/partials/_server-backup.md b/docs/docs/partials/_server-backup.md index 34e09670e9..9eba811d3d 100644 --- a/docs/docs/partials/_server-backup.md +++ b/docs/docs/partials/_server-backup.md @@ -1,5 +1,5 @@ Now that you have imported some pictures, you should setup server backups to preserve your memories. -You can do so by following our [backup guide](/administration/backup-and-restore.md). +You can do so by following our [backup guide](/administration/back-up-and-restore). :::info A 3-2-1 backup strategy is still crucial. The team has the responsibility to ensure that the application doesn’t cause loss of your precious memories; however, we cannot guarantee that hard drives will not fail, or an electrical event causes unexpected shutdown of your server/system, leading to data loss. Therefore, we still encourage users to follow best practices when safeguarding their data. Keep multiple copies of your most precious data: at least two local copies and one copy offsite in cold storage. diff --git a/docs/docs/partials/_storage-template.md b/docs/docs/partials/_storage-template.md index 1cd9572c11..36b32a7b26 100644 --- a/docs/docs/partials/_storage-template.md +++ b/docs/docs/partials/_storage-template.md @@ -1,7 +1,7 @@ -Immich allows the admin user to set the uploaded filename pattern at the directory and filename level as well as the [storage label for a user](/administration/user-management/#set-storage-label-for-user). +Immich allows the admin user to set the uploaded filename pattern at the directory and filename level as well as the [storage label for a user](/administration/manage-users#set-storage-label-for-user). :::tip -You can read more about the differences between storage template engine on and off [here](/administration/backup-and-restore#asset-types-and-storage-locations) +You can read more about the differences between storage template engine on and off [here](/reference/storage-locations) ::: The admin user can set the template by using the template builder in the `Administration -> Settings -> Storage Template`. Immich provides a set of variables that you can use in constructing the template, along with additional custom text. If the template produces [multiple files with the same filename, they won't be overwritten](https://github.com/immich-app/immich/discussions/3324) as a sequence number is appended to the filename. diff --git a/docs/docs/reference/3-2-1-backup-method.md b/docs/docs/reference/3-2-1-backup-method.md new file mode 100644 index 0000000000..27cdad839a --- /dev/null +++ b/docs/docs/reference/3-2-1-backup-method.md @@ -0,0 +1,29 @@ +# 3-2-1 backup method + +The 3-2-1 method is a widely used rule of thumb for how many copies of data to keep and where to keep them. It originates from photographer Peter Krogh's writing on digital asset management and is now common guidance across the backup industry. + +A 3-2-1 backup means: + +| Rule | Meaning | +| ------------------------ | --------------------------------------------------------------------------------------------------------------------------- | +| **3** copies of the data | The live copy you use day to day, plus two backups. | +| On **2** different media | The copies do not share a single point of failure — for example one disk plus one NAS, not two partitions of the same disk. | +| **1** copy off-site | At least one copy is in a different physical location, so a fire, flood, or theft cannot destroy every copy. | + +The live copy counts as one of the three. Two backups on two separate devices, one of which is kept elsewhere, satisfies the rule. + +## What does not count as a copy + +- A second partition, dataset, or directory on the same physical disk. +- A RAID mirror. RAID protects against a disk failing; it does not protect against accidental deletion, corruption, ransomware, or the machine itself being destroyed, because every change is applied to all members immediately. +- A snapshot on the same filesystem as the original. +- A copy that is never verified. A backup whose restore has never been tested is not known to be a copy. + +## Common variations + +- **3-2-1-1-0** adds one copy that is offline, air-gapped, or immutable, and zero errors when the backup is verified. +- **4-3-2** raises the counts for data where the recovery requirements are stricter. + +For how this applies to an Immich instance and what a complete Immich backup contains, see [Backups](/concepts/backups). For the mechanics of taking and restoring one, see [Backup and restore](/administration/back-up-and-restore). + +Further reading: [The 3-2-1 backup strategy](https://www.backblaze.com/blog/the-3-2-1-backup-strategy/). diff --git a/docs/docs/reference/_category_.json b/docs/docs/reference/_category_.json new file mode 100644 index 0000000000..945cd6a0ac --- /dev/null +++ b/docs/docs/reference/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Reference", + "position": 7, + "link": { + "type": "generated-index", + "title": "Reference", + "description": "Technical description of the machinery: every setting, environment variable, command, and supported format. Consult it when you need to look something up, not to learn how to do something." + } +} diff --git a/docs/docs/features/searching.md b/docs/docs/reference/clip-models.md similarity index 97% rename from docs/docs/features/searching.md rename to docs/docs/reference/clip-models.md index 1bdfeca8ba..7d5ed119a8 100644 --- a/docs/docs/features/searching.md +++ b/docs/docs/reference/clip-models.md @@ -1,47 +1,10 @@ -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; +# CLIP models -# Searching +Contextual (smart) search is powered by [CLIP](https://openai.com/research/clip) models. This page documents the models Immich supports and how they compare, so you can pick the one that fits your hardware and the languages your users search in. -Immich uses Postgres as its search database for both metadata and contextual CLIP search. +To switch to a different model, see [Change CLIP models](/administration/change-clip-models). -Contextual CLIP search is powered by the [VectorChord](https://github.com/tensorchord/VectorChord) extension, utilizing machine learning models like [CLIP](https://openai.com/research/clip) to provide relevant search results. This allows for freeform searches without requiring specific keywords in the image or video metadata. - -## Advanced Search Filters - -In addition, Immich offers advanced search functionality, allowing you to find specific content using customizable search filters. These filters include location, one or more faces, specific albums, and more. You can try out the search filters on the [Demo site](https://demo.immich.app). - -You can search the following types of content: - -| Type | Description | -| ----------------------------------- | ----------------------------------------------------- | -| People | Faces that are recognized in your photos/videos. | -| Contextual | Content of the photos and videos. | -| File name or extension | Full or partial file's name, or file's extension | -| Full path or folder | Full or partial folder names from the original path. | -| Description | Description added to assets. | -| Optical Character Recognition (OCR) | Text in images | -| Locations | Cities, states, and countries from reverse geocoding. | -| Tags | Tags assigned or extracted from assets. | -| Camera | make, model and lens model | -| Time frame | Start and end date of a specific time bucket | -| Media type | Image or video or both | -| Display options | In Archive, in Favorites or Not in any album | -| Star rating | User-assigned star rating | - - - -### Full path or folder - -Use this mode when you know a folder name or part of the original asset path. - -Example: for /John/Projects/3D_Printing/2026-07-01/IMG_0001.jpg, searches like Projects, 3D, Printing, or 2026 match the asset. - -## Configuration - -Navigating to `Administration > Settings > Machine Learning Settings > Smart Search` will show the options available. - -### CLIP models +## Choosing a model The default search model is fast, but there are many other options that can provide better search results. The tradeoff of using these models is that they're slower and/or use more memory (both when indexing images with background Smart Search jobs and when searching). @@ -58,17 +21,7 @@ If your users will only search in English, then the [CLIP][huggingface-clip] sec For more details, check the tables below to see how they compare in memory usage, speed and quality by language. -Once you've chosen a model, follow these steps: - -1. Copy the name of the model (e.g. `ViT-B-16-SigLIP__webli`) -2. Go to the [Smart Search settings][smart-search-settings] -3. Paste the model name into the Model Name section -4. Save the settings -5. Go to the [Job Status page][job-status-page] -6. Click "All" next to "Smart Search" to begin re-processing your assets with the new model -7. (Optional) Confirm that the logs for the server and machine learning service don't have relevant errors - -In rare instances, changing the model might leave bits of the old model's incompatible data in the database, causing errors when processing Smart Search jobs. If you notice errors like this in the logs, you can change the model back to the previous one and save, then repeat steps 3-7. +## Model comparison Please note that memory and execution time values are only _estimates_: actual usage will be different depending on many factors. As such, it's mainly intended as a way to compare the relative tradeoffs of each model. @@ -1208,5 +1161,3 @@ Feel free to make a feature request if there's a model you want to use that we d [huggingface-clip]: https://huggingface.co/collections/immich-app/clip-654eaefb077425890874cd07 [huggingface-multilingual-clip]: https://huggingface.co/collections/immich-app/multilingual-clip-654eb08c2382f591eeb8c2a7 -[smart-search-settings]: https://my.immich.app/admin/system-settings?isOpen=machine-learning+smart-search -[job-status-page]: https://my.immich.app/admin/queues diff --git a/docs/docs/install/config-file.md b/docs/docs/reference/config-file.md similarity index 62% rename from docs/docs/install/config-file.md rename to docs/docs/reference/config-file.md index 5c34acdd9d..513d7b6533 100644 --- a/docs/docs/install/config-file.md +++ b/docs/docs/reference/config-file.md @@ -2,19 +2,50 @@ sidebar_position: 100 --- -# Config File +# Config file -A config file can be provided as an alternative to the UI configuration. +Immich's system configuration — everything under `Administration > Settings` — is normally stored in the database and edited from the web UI. When the `IMMICH_CONFIG_FILE` environment variable is set, Immich reads that configuration from a file instead. -:::note Interaction with the web UI -While the config file does not need to include all keys from the below example, specifying `IMMICH_CONFIG_FILE` will disable the ability to edit other properties from the Immich web UI. -::: +For a walkthrough of setting one up, see [Use a config file](/administration/use-a-config-file). -### Step 1 - Create a new config file +## Format -In JSON format, create a new config file (e.g. `immich-config.json`) and put it in a location mounted in the container that can be accessed by Immich. -YAML-formatted config files are also supported. -The default configuration looks like this: +The file may be written as JSON or YAML. It is parsed as YAML, and JSON is a subset of YAML, so both are accepted regardless of the file extension. + +## Location + +`IMMICH_CONFIG_FILE` holds the path to the file **as seen from inside the container**, not a path on the host. Every container that runs Immich reads its own configuration, so a deployment with separate `microservices` workers needs the file mounted into those containers at the same path. + +See [Environment Variables](/reference/environment-variables) for the variable itself. + +## How values are resolved + +- **Partial files are valid.** Any key absent from the file takes its default value, so the file only needs to contain the settings that differ from the defaults. +- **The database configuration is ignored.** While `IMMICH_CONFIG_FILE` is set, the file is the only source of system configuration; it is not merged with settings previously saved through the web UI. Those saved settings are left untouched in the database and apply again if the variable is removed. +- **Unknown keys are ignored.** They are reported as a warning in the server log. +- **Changes are not picked up automatically.** The configuration is read and cached when Immich loads it. Restart the containers to apply an edited file. + +## Failure behavior + +A config file is validated more strictly than the database configuration, because a mistake in it cannot be corrected from the UI: + +| Condition | Result | +| ------------------------------------------------ | ------------------------------------------------------------- | +| File missing, unreadable, or not valid YAML/JSON | The error is logged and configuration loading fails | +| A value fails schema validation | The error is logged with the offending key, and loading fails | +| An unknown key is present | Logged as a warning; the key is ignored | + +Without a config file, schema validation failures are logged but non-fatal. + +## Effect on the web UI and API + +- The settings in `Administration > Settings` are shown read-only. +- Requests to update the system configuration are rejected with `400 Cannot update configuration while IMMICH_CONFIG_FILE is in use`. +- The server reports `configFile: true` in its feature flags, and admin onboarding is treated as complete. + +## Default configuration + +The full set of keys and their default values:
immich-config.json @@ -246,30 +277,3 @@ The default configuration looks like this: ```
- -:::tip -In Administration > Settings is a button to copy the current configuration to your clipboard. -So you can just grab it from there, paste it into a file and you're pretty much good to go. -::: - -### Step 2 - Specify the file location - -:::note -If you have any `microservices` workers, they will also need to have the config file mounted to their container. -::: - -In your `.env` file, set the variable `IMMICH_CONFIG_FILE` to the path of your config. -For more information, refer to the [Environment Variables](/install/environment-variables.md) section. - -:::info Docker Compose -In your `.env` file, the variables `UPLOAD_LOCATION` and `DB_DATA_LOCATION` concern the location on the host. -However, the variable `IMMICH_CONFIG_FILE` concerns the location inside the container, and informs the `immich-server` container that a configuration file is present. - -It is recommended to reuse this variable in your `docker-compose.yml`: - -```yaml -volumes: - - ./immich-config.json:${IMMICH_CONFIG_FILE} -``` - -::: diff --git a/docs/docs/reference/docker.md b/docs/docs/reference/docker.md new file mode 100644 index 0000000000..fdc7f33f7e --- /dev/null +++ b/docs/docs/reference/docker.md @@ -0,0 +1,42 @@ +# Docker + +Immich is distributed as a set of container images and is run with [Docker](https://docs.docker.com/get-started/get-docker/) and the Docker Compose plugin. This page describes what Immich requires from Docker. + +## Docker Engine vs Docker Desktop + +Docker is available in two variants, and either satisfies Immich's requirement as long as the Compose plugin is present. + +| Variant | Description | Recommended for | +| ------------------ | ------------------------------------- | ------------------------------------------------------------------ | +| **Docker Engine** | The CLI variant, designed for servers | Linux (including Windows via WSL2). This is the recommended setup. | +| **Docker Desktop** | The GUI variant | Windows or macOS. **Not recommended** on Linux. | + +## Docker Compose + +Immich's deployment is defined as a Compose file, so the Compose plugin is required. It is installed by both Docker Engine and Docker Desktop when following their official installation guides, and can also be [installed separately](https://docs.docker.com/compose/install/). + +:::note +Immich requires the `docker compose` command. The similarly named `docker-compose` is [deprecated](https://docs.docker.com/retired/#docker-compose-v1-replaced-by-compose-v2) and is no longer supported by Immich. +::: + +## Containers + +A default deployment runs the following containers: + +| Container | Purpose | +| ------------------------- | ---------------------------------------------------------------------- | +| `immich_server` | The API and web app, and the background [workers](/reference/workers) | +| `immich_machine_learning` | Smart search, face detection, and OCR models | +| `immich_postgres` | The database, including the vector extension used for search | +| `immich_redis` | The job queue (a [Valkey](https://valkey.io/) image, despite the name) | + +## Container environments + +Docker in LXC containers is [not recommended](https://pve.proxmox.com/wiki/Linux_Container), but may be possible for advanced users. Immich runs well in a full virtual machine. See [Requirements](/reference/requirements#os) for the supported combinations. + +## Related pages + +- [Install with Docker Compose](/install/docker-compose) — the recommended installation method +- [Inspect containers and logs](/administration/inspect-containers-and-logs) — day-to-day `docker` commands +- [Environment Variables](/reference/environment-variables) — what can be configured through the Compose environment +- [Storage locations](/reference/storage-locations) — what the mounted volumes hold diff --git a/docs/docs/install/environment-variables.md b/docs/docs/reference/environment-variables.md similarity index 99% rename from docs/docs/install/environment-variables.md rename to docs/docs/reference/environment-variables.md index c10a858ed9..98bef72599 100644 --- a/docs/docs/install/environment-variables.md +++ b/docs/docs/reference/environment-variables.md @@ -44,7 +44,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N | `IMMICH_MICROSERVICES_METRICS_PORT` | Port for the OTEL metrics | `8082` | server | microservices | | `IMMICH_PROCESS_INVALID_IMAGES` | When `true`, generate thumbnails for invalid images | | server | microservices | | `IMMICH_TRUSTED_PROXIES` | List of comma-separated IPs set as trusted proxies | | server | api | -| `IMMICH_IGNORE_MOUNT_CHECK_ERRORS` | See [System Integrity](/administration/system-integrity) | | server | api, microservices | +| `IMMICH_IGNORE_MOUNT_CHECK_ERRORS` | See [System Integrity](/concepts/system-integrity) | | server | api, microservices | | `IMMICH_ALLOW_SETUP` | When `false` disables the `/auth/admin-sign-up` and `/admin/database-backups/start-restore` endpoints | `true` | server | api | \*1: `TZ` should be set to a `TZ identifier` from [this list][tz-list]. For example, `TZ="Etc/UTC"`. @@ -62,7 +62,7 @@ These environment variables are used by the `docker-compose.yml` file and do **N | `IMMICH_WORKERS_EXCLUDE` | Do not run these workers. Matches against default workers, or `IMMICH_WORKERS_INCLUDE` if specified. | | server | :::info -Information on the current workers can be found [here](/administration/jobs-workers). +Information on the current workers can be found in the [Workers](/reference/workers) reference. ::: ## Ports diff --git a/docs/docs/reference/exclusion-patterns.md b/docs/docs/reference/exclusion-patterns.md new file mode 100644 index 0000000000..5f30a94743 --- /dev/null +++ b/docs/docs/reference/exclusion-patterns.md @@ -0,0 +1,37 @@ +# Exclusion patterns + +:::info +Exclusion patterns are a feature of [external libraries](/concepts/external-libraries). They are set per library on its Scan Settings page and have no effect on assets uploaded to Immich normally. +::: + +Exclusion patterns are glob patterns that prevent files from being imported. They are matched against the **full file path**, and a file matching any pattern is not added. + +See [External libraries](/concepts/external-libraries#what-a-library-contains) for how patterns fit into scanning, [External Library settings](/reference/system-settings#external-library) for where they are configured, and [Add an external library](/administration/add-an-external-library#step-3---exclude-the-raw-files) for a worked example. + +The [Immich CLI](/reference/immich-cli) is separate from external libraries, but its `--ignore` option accepts the same glob syntax documented below. + +## Syntax + +| Token | Matches | +| ------- | --------------------------------------------------------------------------------------------------- | +| `*` | Zero or more characters within a single filename or directory name | +| `**` | Zero or more directories, recursively. At the end of a pattern it also matches all files beneath it | +| `{a,b}` | Either alternative, e.g. `{tif,jpg}` | +| `\` | Escapes the following character, needed for special characters such as `@` | + +## Examples + +| Pattern | Effect | +| ------------------ | -------------------------------------------------------------------------------------------------------- | +| `**/*.tif` | Excludes all files with the extension `.tif` | +| `**/hidden.jpg` | Excludes all files named `hidden.jpg` | +| `**/Raw/**` | Excludes all files in any directory named `Raw` | +| `**/*.{tif,jpg}` | Excludes all files with the extension `.tif` or `.jpg` | +| `**/exclude_me/**` | Excludes all files in any directory named `exclude_me`, and all files in its subdirectories, recursively | +| `**/\@eaDir/**` | Excludes all files in any directory named `@eaDir` | + +## Implementation + +Immich processes exclusion patterns with the [glob](https://www.npmjs.com/package/glob) package, and sometimes translates them into [Postgres LIKE patterns](https://www.postgresql.org/docs/current/functions-matching.html). + +Because not every glob construct can be reliably translated to the Postgres syntax, only basic folder and extension exclusions are supported; advanced glob usage is not recommended. See the [glob primer](https://github.com/isaacs/node-glob#glob-primer) for an overview of the syntax in general. diff --git a/docs/docs/reference/exif-tags.md b/docs/docs/reference/exif-tags.md new file mode 100644 index 0000000000..2fe35ad32b --- /dev/null +++ b/docs/docs/reference/exif-tags.md @@ -0,0 +1,140 @@ +# EXIF tags + +During the [Metadata Extraction](/reference/jobs#extract-metadata) job, Immich reads metadata from each asset with [ExifTool](https://exiftool.org/) and, for videos, supplements it with stream information from [ffprobe](https://ffmpeg.org/ffprobe.html). This page lists which tags feed which feature. + +Where several tags are listed for one field, they are tried **in order** and the first one present is used. Tags read from an [XMP sidecar](/reference/xmp-sidecars) take precedence over tags embedded in the asset itself. + +## Date and time + +The asset's date is taken from the first of these tags that contains a valid date: + +1. `SubSecDateTimeOriginal` +2. `SubSecCreateDate` +3. `DateTimeOriginal` +4. `CreationDate` +5. `CreateDate` +6. `MediaCreateDate` +7. `DateTimeCreated` +8. `GPSDateTime` +9. `DateTimeUTC` +10. `SonyDateTime2` +11. `SourceImageCreateTime` — undocumented, non-standard tag written by Insta360 in the `xmp.GPano` namespace + +If none of them yields a date, Immich falls back to the **earliest of the file's creation and modification times**. This is why assets with no date metadata often show up dated by when the file was copied or created. + +The time zone comes from the offset on whichever date tag was used. A raw value ending in `Z` or `+00:00` is treated as `UTC+0`. If no zone can be determined, the timestamp is stored as-is and treated as local time. + +## Location + +| Field | Tags | +| ---------------------- | ----------------------------- | +| Latitude and longitude | `GPSLatitude`, `GPSLongitude` | + +Coordinates are ignored when both values are `0`, which is how many devices write "no fix". City, state, and country are not read from the file — they are derived from the coordinates by [reverse geocoding](/concepts/reverse-geocoding). + +## Camera and lens + +| Field | Tags (in order) | +| ------------- | ------------------------------------------------------------------ | +| Make | `Make`, `Device.Manufacturer`, `AndroidMake`, `DeviceManufacturer` | +| Model | `Model`, `Device.ModelName`, `AndroidModel`, `DeviceModelName` | +| Lens model | `LensID`, `LensType`, `LensSpec`, `LensModel` | +| ISO | `ISO` | +| Exposure time | `ExposureTime` | +| Aperture | `FNumber` | +| Focal length | `FocalLength` | +| Frame rate | ffprobe frame rate, else `VideoFrameRate` | + +A lens model of `----`, or one beginning with `Unknown`, is discarded rather than stored. + +## Image properties + +| Field | Tags (in order) | +| --------------- | ------------------------------------------------------------------------------------ | +| Dimensions | `ImageSize`, else `ImageWidth` and `ImageHeight` | +| Orientation | `Orientation` | +| Projection type | `ProjectionType` | +| Bits per sample | `BitsPerSample`, `ComponentBitDepth`, `ImagePixelDepth`, `BitDepth`, `ColorBitDepth` | +| Color space | `ColorSpace` | +| Duration | `Duration` | + +`ImageSize` is preferred because for RAW formats such as CR2 and RAF, `ImageWidth` and `ImageHeight` describe the embedded preview rather than the image itself. + +When `Orientation` indicates the image is rotated a quarter turn, the stored width and height are swapped so the asset's dimensions match how it is displayed. + +A bit depth of 24 or more that divides evenly by three is treated as a per-pixel value and divided by three to get bits per channel. + +`ProjectionType` is what marks an asset as a 360° photo. + +## Description and rating + +| Field | Tags (in order) | +| ------------------- | --------------------------------- | +| Description | `ImageDescription`, `Description` | +| Profile description | `ProfileDescription` | +| Rating | `Rating` | + +Ratings are accepted in the range 1–5; a rating of `0` is stored as no rating. + +## Tags + +| Field | Tags (in order) | Used for | +| ----- | --------------------------------------------- | -------------------------------------------------------------------------- | +| Tags | `TagsList`, `HierarchicalSubject`, `Keywords` | [Tagging](/user-guide/use-tags), including [hierarchy](#hierarchical-tags) | + +Only the first of the three that is present is used — they are not merged. `TagsList` (written by digiKam and others) is the preferred source because it already carries hierarchy. `HierarchicalSubject` (written by Lightroom) is converted as described below, and `Keywords` is a flat list. + +### Hierarchical tags + +Immich stores tag hierarchy in a single string per tag, using `/` as the level separator. When a tag is applied, the value is split on `/` and every level is created as a real tag, with each level parented to the one before it. + +The tag `Nature/Birds/Owl` therefore produces three tags: + +| Tag value | Parent | +| ------------------ | -------------- | +| `Nature` | — | +| `Nature/Birds` | `Nature` | +| `Nature/Birds/Owl` | `Nature/Birds` | + +and the asset is assigned the deepest one, `Nature/Birds/Owl`. Empty segments are dropped, so `Nature//Owl` is the same as `Nature/Owl`. + +`HierarchicalSubject` uses `|` as its separator instead, so its values are converted on import: + +- `|` becomes `/`, making each level a level in Immich. +- A literal `/` already inside a level is replaced with `|`, so it does not create an unintended extra level. + +For example, Lightroom's `Travel|Roadtrip 2024|Route 66/Arizona` is imported as `Travel/Roadtrip 2024/Route 66|Arizona` — three levels, with the slash in the last one preserved as a `|`. + +Because splitting happens on the way in, a flat `Keywords` entry that happens to contain a `/` is also treated as a hierarchy. + +## Grouping + +| Feature | Tags (in order) | +| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| Live photo pairing | `ContentIdentifier`, `MediaGroupUUID` | +| Automatic stacking | `BurstID`, `BurstUUID`, `CameraBurstID`, `MediaUniqueID` | +| Motion photo detection | `MotionPhoto`, `MicroVideo`, `MicroVideoOffset`, `MotionPhotoVideo`, `EmbeddedVideoType`, `EmbeddedVideoFile`, `ContainerDirectory` | + +Live photo pairing matches a still and a video that share the same identifier. Automatic stacking groups assets that a camera wrote with the same burst identifier. For motion photos, the embedded video is extracted into a separate asset and linked to the still. + +## Faces + +| Field | Tag | +| ------------ | ------------ | +| Tagged faces | `RegionInfo` | + +`RegionInfo` is only read when **Import faces from metadata** is enabled in the machine learning settings. It is used when it contains both `AppliedToDimensions` and a non-empty `RegionList`; region coordinates are interpreted as normalized values per the MWG guidelines and are rotated to match the asset's `Orientation`. + +## Tags Immich writes + +The [Sidecar Write](/reference/jobs#sidecar-metadata) job writes these tags back to the asset's `.xmp` sidecar: + +| Tag | Source | +| --------------------------------- | ------------------------- | +| `Description`, `ImageDescription` | The asset's description | +| `DateTimeOriginal` | The asset's date and time | +| `GPSLatitude`, `GPSLongitude` | The asset's location | +| `Rating` | The asset's rating | +| `TagsList` | The asset's tags | + +Nothing is written back into the original file. See [XMP Sidecars](/reference/xmp-sidecars) for how sidecar files are discovered and named. diff --git a/docs/docs/reference/hardware-acceleration-support.md b/docs/docs/reference/hardware-acceleration-support.md new file mode 100644 index 0000000000..72fd1a1d70 --- /dev/null +++ b/docs/docs/reference/hardware-acceleration-support.md @@ -0,0 +1,46 @@ +# Hardware acceleration support + +Immich can offload video transcoding and machine learning to a GPU. The two use different backends and have different constraints, listed separately below. + +Setup instructions are in [Set up hardware transcoding](/administration/set-up-hardware-transcoding) and [Set up hardware-accelerated machine learning](/administration/set-up-hardware-accelerated-machine-learning). + +## Transcoding + +### Supported APIs + +- NVENC (NVIDIA) +- Quick Sync (Intel) +- RKMPP (Rockchip) +- VAAPI (AMD / NVIDIA / Intel) + +### Limitations + +- The instructions and configurations here are specific to Docker Compose. Other container engines may require different configuration. +- Only Linux and Windows (through WSL2) servers are supported. +- WSL2 does not support Quick Sync. +- Raspberry Pi is currently not supported. +- Two-pass mode is only supported for NVENC. Other APIs will ignore this setting. +- By default, only encoding is currently hardware accelerated. This means the CPU is still used for software decoding and tone-mapping. + - You can benefit from end-to-end acceleration by enabling hardware decoding in the video transcoding settings. +- Hardware dependent + - Codec support varies, but H.264 and HEVC are usually supported. + - Notably, NVIDIA and AMD GPUs do not support VP9 encoding. + - Newer devices tend to have higher transcoding quality. + +## Machine learning + +### Supported backends + +- ARM NN (Mali) +- CUDA (NVIDIA GPUs with [compute capability](https://developer.nvidia.com/cuda-gpus) 5.2 or higher) +- ROCm (AMD GPUs) +- OpenVINO (Intel GPUs such as Iris Xe and Arc) +- RKNN (Rockchip) + +### Limitations + +- The instructions and configurations here are specific to Docker Compose. Other container engines may require different configuration. +- Only Linux and Windows (through WSL2) servers are supported. +- ARM NN is only supported on devices with Mali GPUs. Other Arm devices are not supported. +- Some models may not be compatible with certain backends. CUDA is the most reliable. +- Search latency isn't improved by ARM NN due to model compatibility issues preventing its use. However, smart search jobs do make use of ARM NN. diff --git a/docs/docs/administration/img/admin-jobs.webp b/docs/docs/reference/img/admin-jobs.webp similarity index 100% rename from docs/docs/administration/img/admin-jobs.webp rename to docs/docs/reference/img/admin-jobs.webp diff --git a/docs/docs/administration/img/admin-nightly-tasks.webp b/docs/docs/reference/img/admin-nightly-tasks.webp similarity index 100% rename from docs/docs/administration/img/admin-nightly-tasks.webp rename to docs/docs/reference/img/admin-nightly-tasks.webp diff --git a/docs/docs/features/img/sidecar-jobs.webp b/docs/docs/reference/img/sidecar-jobs.webp similarity index 100% rename from docs/docs/features/img/sidecar-jobs.webp rename to docs/docs/reference/img/sidecar-jobs.webp diff --git a/docs/docs/reference/immich-api.md b/docs/docs/reference/immich-api.md new file mode 100644 index 0000000000..4e2a6f6e5e --- /dev/null +++ b/docs/docs/reference/immich-api.md @@ -0,0 +1,9 @@ +# Immich API + +Immich exposes a REST API that the web app, mobile app, and [CLI](/reference/immich-cli) all use. Anything those clients can do can be done through the API. + +The API is described with the [OpenAPI](https://swagger.io/specification/) standard. The published, browsable documentation lives at [api.immich.app](https://api.immich.app/). + +Requests are authenticated with an API key, which is created per user under Account Settings and can be scoped to specific permissions. See [Manage your user settings](/user-guide/manage-your-user-settings). + +For generated client SDKs and how the specification is produced, see [OpenAPI](/developer/open-api). diff --git a/docs/docs/reference/immich-cli.md b/docs/docs/reference/immich-cli.md new file mode 100644 index 0000000000..a7d4f0e2c0 --- /dev/null +++ b/docs/docs/reference/immich-cli.md @@ -0,0 +1,95 @@ +# Immich CLI + +Immich CLI is a command-line-interface (CLI) that uploads media to an Immich instance. It is available as both an npm package and a Docker image. + +This page describes every command and option. For worked examples, see [Upload media with the CLI](/user-guide/upload-media-with-the-cli). + +## Install + +### npm package + +Immich CLI is published as [`@immich/cli`](https://www.npmjs.com/package/@immich/cli) on the npm registry and requires a minimum [Node.js](https://nodejs.org/) version of `v20.x`. + +```bash +npm i -g @immich/cli +``` + +If you previously installed the legacy CLI, uninstall it first: + +```bash +npm uninstall -g immich +``` + +### Docker + +Immich CLI is available as a Docker image on both [GitHub](https://hub.docker.com/r/immichapp/immich-cli) and [Docker Hub](https://hub.docker.com/r/immichapp/immich-cli). See below for the image name on each platform. + +| Platform | Image name | +| ---------- | ------------------------------- | +| GitHub | `ghcr.io/immich-app/immich-cli` | +| Docker Hub | `immichapp/immich-cli` | + +The image entrypoint is the `immich` command itself, so arguments passed to `docker run` are passed straight to the CLI. + +## Global options + +The following options apply to all commands. + +| Option | Environment variable | Default value | Description | +| ------------------------------------ | --------------------- | ------------------- | ------------------------------------------------------- | +| `-d, --config-directory ` | `IMMICH_CONFIG_DIR` | `~/.config/immich/` | Configuration directory where `auth.yml` will be stored | +| `-u, --url [url]` | `IMMICH_INSTANCE_URL` | | Immich server URL | +| `-k, --key [key]` | `IMMICH_API_KEY` | | Immich API key | +| `-V, --version` | | | Output the version number | +| `-h, --help` | | | Display help for command | + +## Commands + +### `login` + +`immich login ` + +Login using an API key. The credentials are stored in `auth.yml` inside the configuration directory. Also available as `immich login-key`. + +| Argument | Description | +| -------- | ----------------- | +| `url` | Immich server URL | +| `key` | Immich API key | + +### `logout` + +`immich logout` + +Removes the stored credentials. + +### `server-info` + +`immich server-info` + +Displays information about the server, including its version. + +### `upload` + +`immich upload [paths...] [options]` + +| Option | Environment variable | Default value | Description | +| ---------------------------- | --------------------------- | ------------------------------ | -------------------------------------------------------------------- | +| `[paths...]` | | | One or more paths to assets to be uploaded | +| `-r, --recursive` | `IMMICH_RECURSIVE` | `false` | Recursively crawl directories | +| `-i, --ignore ` | `IMMICH_IGNORE_PATHS` | | Pattern to ignore | +| `--skip-hash` | `IMMICH_SKIP_HASH` | `false` | Don't hash files before upload | +| `-H, --include-hidden` | `IMMICH_INCLUDE_HIDDEN` | `false` | Include hidden folders | +| `-a, --album` | `IMMICH_AUTO_CREATE_ALBUM` | `false` | Automatically create albums based on folder name | +| `-A, --album-name ` | `IMMICH_ALBUM_NAME` | | Add all assets to specified album (conflicts with `--album`) | +| `--visibility ` | `IMMICH_VISIBILITY` | | Set the visibility of uploaded assets | +| `-n, --dry-run` | `IMMICH_DRY_RUN` | `false` | Don't perform any actions, just show what will be done | +| `-c, --concurrency ` | `IMMICH_UPLOAD_CONCURRENCY` | number of CPU cores, minus one | Number of assets to upload at the same time | +| `-j, --json-output` | `IMMICH_JSON_OUTPUT` | `false` | Output detailed information in json format | +| `--delete` | `IMMICH_DELETE_ASSETS` | | Delete local assets after upload | +| `--delete-duplicates` | `IMMICH_DELETE_DUPLICATES` | | Delete local assets that are duplicates (already exist on server) | +| `--no-progress` | `IMMICH_PROGRESS_BAR` | progress bars are shown | Hide progress bars | +| `--watch` | `IMMICH_WATCH_CHANGES` | `false` | Watch for changes and upload automatically (implies `--no-progress`) | + +`--visibility` accepts `archive`, `timeline`, `hidden`, or `locked`. `--dry-run` conflicts with `--skip-hash`, and `--album-name` conflicts with `--album`. + +With `--json-output`, the printed JSON contains three keys: `newFiles`, `duplicates`, and `newAssets`. diff --git a/docs/docs/reference/jobs.md b/docs/docs/reference/jobs.md new file mode 100644 index 0000000000..97a3275061 --- /dev/null +++ b/docs/docs/reference/jobs.md @@ -0,0 +1,130 @@ +# Jobs + +Immich performs most of its work in background jobs, each with its own queue. The queues are visible at `Administration > Job Queues`, where they can be watched and manually triggered. + +Jobs run on the `microservices` [worker](/reference/workers), and each queue is processed in order. The **Actions** listed for each job are defined under [Running a job manually](#running-a-job-manually). + + + +## Extract metadata + +Reads metadata from each asset — date, GPS, camera, dimensions, faces, and tags. See [EXIF tags](/reference/exif-tags) for every tag involved and which feature each one drives. + +**Actions:** All, Missing + +## Generate Thumbnails + +Generates large, small, and blurred thumbnails for each asset, as well as a thumbnail for each person. + +**Actions:** All, Missing + +## Transcode videos + +Transcodes videos for wider compatibility with browsers and devices, according to the transcode policy in the video transcoding settings. The original file is never replaced. + +**Actions:** All, Missing + +## Smart Search + +Runs the [CLIP model](/reference/clip-models) over each asset to produce the embeddings that power contextual search. + +**Actions:** All, Missing — requires machine learning to be enabled + +## Face detection + +Detects the faces in assets using machine learning. For videos, only the thumbnail is considered. Detected faces are queued for Facial Recognition once detection completes. + +**Actions:** Reset, Refresh, Missing — requires machine learning to be enabled + +## Facial Recognition + +Groups detected faces into people. This step runs after Face detection is complete. See [Facial recognition](/concepts/facial-recognition) for how the clustering works. + +**Actions:** Reset, Missing — requires machine learning to be enabled + +## OCR + +Uses machine learning to recognize text in images so that it can be searched. + +**Actions:** All, Missing — requires machine learning to be enabled + +## Duplicate Detection + +Detects visually similar assets. Relies on the embeddings produced by Smart Search. See [Duplicate detection](/concepts/duplicate-detection). + +**Actions:** All, Missing — requires machine learning to be enabled + +## Sidecar metadata + +Discovers and synchronizes [XMP sidecar](/reference/xmp-sidecars) files on the filesystem. The same queue runs Sidecar Write, which writes edited metadata back out to the sidecar. + +**Actions:** Sync, Discover + +## External Libraries + +Scans [external libraries](/concepts/external-libraries) for new and changed assets, and cleans up libraries that are stuck in deletion. + +**Actions:** Rescan + +## Storage template migration + +Moves existing files to match the current [storage template](/administration/use-the-storage-template). Only needed after changing the template; new assets are placed correctly on upload. + +**Actions:** Start + +## Migration + +Moves thumbnails for assets and faces to the latest folder structure. + +**Actions:** Start + +## Processing order + +Jobs are queued in a fixed order, with later jobs depending on the output of earlier ones. Uploading an asset runs the following: + +```mermaid +graph TD + A[Asset Upload] --> B[Metadata Extraction] + B --> C[Storage Template Migration] + C --> D["Thumbnail Generation (Large, small, blurred and person)"] + D --> E[Smart Search] + D --> F[Face Detection] + D --> G[OCR] + D --> H[Video Transcoding] + E --> I[Duplicate Detection] + F --> J[Facial Recognition] +``` + +Thumbnail generation is the fan-out point: Smart Search, Face detection, OCR, and video transcoding all wait for it, because they operate on the generated preview rather than the original. Duplicate Detection then depends on Smart Search, and Facial Recognition on Face detection. + +## Running a job manually + +Each queue offers some combination of the following actions: + +| Action | Effect | +| ----------------------- | ------------------------------------------------------------------------------- | +| **All** | Queues every asset, reprocessing assets that already have a result. | +| **Missing** | Queues only assets that have not been processed yet. | +| **Refresh** | Reprocesses all assets without discarding existing data first. | +| **Reset** | Clears existing results and reprocesses everything. | +| **Sync** / **Discover** | Synchronizes metadata from known sidecar files, or discovers new sidecar files. | +| **Rescan** | Rescans external libraries for changes. | +| **Start** | Begins a one-off migration. | + +Resetting face data is destructive — it discards all detected faces, and people have to be rebuilt by Facial Recognition. + +## Concurrency + +Each job's concurrency is set independently at `Administration > Settings > Job Settings`, and the defaults are listed under `job` in the [config file reference](/reference/config-file#default-configuration). Video transcoding and the machine learning jobs are the most resource-intensive, which is why their defaults are lower than the rest. + +## Jobs configured elsewhere + +Some scheduled work does not appear on the Job Queues page: + +- **Nightly tasks** — memory generation, database cleanup, missing thumbnails, and face clustering. These run every night at midnight by default; the schedule and which tasks run are set under [Nightly Tasks Settings](https://my.immich.app/admin/system-settings?isOpen=nightly-tasks). + + + +- **Database backups** — see [Backups](/concepts/backups). +- **External library scanning** — the periodic scan interval is configured per library, not on the queue page. +- **Integrity checks** — see [System Integrity](/concepts/system-integrity). diff --git a/docs/docs/reference/logging.md b/docs/docs/reference/logging.md new file mode 100644 index 0000000000..4f637e0fef --- /dev/null +++ b/docs/docs/reference/logging.md @@ -0,0 +1,59 @@ +# Logging + +Immich logs to standard output, so logs are read with `docker logs` — see [Inspect containers and logs](/administration/inspect-containers-and-logs). Three environment variables control what is logged and how it is formatted. + +## Log level + +`IMMICH_LOG_LEVEL` sets the minimum severity that is logged. The levels, from most to least verbose: + +| Level | Notes | +| --------- | ------------------------------------------------- | +| `verbose` | Very noisy; useful when diagnosing a specific job | +| `debug` | | +| `log` | The default, commonly known as `info` | +| `warn` | | +| `error` | | +| `fatal` | Only errors that stop the server | + +The level can also be set from the web UI under `Administration > Settings > Logging`. When `IMMICH_LOG_LEVEL` is set, it takes precedence and the setting cannot be changed from the UI. + +## Log format + +`IMMICH_LOG_FORMAT` selects the output format. + +| Value | Output | +| --------- | ----------------------------------------------- | +| `console` | The default. Human-readable, one line per entry | +| `json` | One JSON object per line, for log aggregation | + +Use `json` for deployments that ship logs to a system such as Grafana Loki, the ELK stack, Datadog, or Splunk. + +### JSON format + +```json +{"level":"log","pid":36,"timestamp":1766533331507,"message":"Initialized websocket server","context":"WebsocketRepository"} +{"level":"warn","pid":48,"timestamp":1766533331629,"message":"Unable to open /build/www/index.html, skipping SSR.","context":"ApiService"} +{"level":"error","pid":36,"timestamp":1766533331690,"message":"Failed to load plugin immich-core:","context":"Error"} +``` + +Each object contains: + +| Field | Meaning | +| ----------- | --------------------------------------------- | +| `level` | Log level of the entry | +| `pid` | Process ID that emitted it | +| `timestamp` | Unix timestamp in milliseconds | +| `message` | The log message | +| `context` | Service or component that generated the entry | + +## Color + +Console output is color-coded by default. Setting `NO_COLOR` to any non-empty value disables it, following the [NO_COLOR convention](https://no-color.org/). + +| Variable | Effect | +| ---------- | ------------------------------------------------------- | +| `NO_COLOR` | Any non-empty value disables color-coded console output | + +This is worth setting when logs are captured to a file or piped into a tool that does not interpret ANSI escape codes, since the escape sequences would otherwise appear as literal characters. It has no effect on `json` output, which is never colorized. + +See [Environment Variables](/reference/environment-variables#general) for these variables alongside the rest, and [Monitor Immich](/administration/monitor-immich) for wiring logs into a monitoring stack. diff --git a/docs/docs/reference/oauth-settings.md b/docs/docs/reference/oauth-settings.md new file mode 100644 index 0000000000..ac96ff540b --- /dev/null +++ b/docs/docs/reference/oauth-settings.md @@ -0,0 +1,41 @@ +# OAuth settings + +The settings below are configured on the web at `Administration > Settings > Authentication`. For the steps to register a client application with a provider and turn OAuth on, see [Set up OAuth authentication](/administration/set-up-oauth-authentication). + +| Setting | Type | Default | Description | +| ----------------------------------------------------------------------------------------------- | ------- | -------------------- | ----------------------------------------------------------------------------------- | +| Enabled | boolean | false | Enable/disable OAuth | +| `issuer_url` | URL | (required) | Required. Self-discovery URL for client (from previous step) | +| `client_id` | string | (required) | Required. Client ID (from previous step) | +| `client_secret` | string | (required) | Required. Client Secret (previous step) | +| `scope` | string | openid email profile | Full list of scopes to send with the request (space delimited) | +| `id_token_signed_response_alg` | string | RS256 | The algorithm used to sign the id token (examples: RS256, HS256) | +| `userinfo_signed_response_alg` | string | none | The algorithm used to sign the userinfo response (examples: RS256, HS256) | +| `prompt` | string | (empty) | Prompt parameter for authorization url (examples: select_account, login, consent) | +| `end_session_endpoint` | URL | (empty) | Http(s) alternative end session endpoint (logout URI) | +| Request timeout | string | 30,000 (30 seconds) | Number of milliseconds to wait for http requests to complete before giving up | +| Storage Label Claim | string | preferred_username | Claim mapping for the user's storage label**¹** | +| Role Claim | string | immich_role | Claim mapping for the user's role. (should return "user" or "admin")**¹** | +| Storage Quota Claim | string | immich_quota | Claim mapping for the user's storage**¹** | +| Default Storage Quota (GiB) | number | 0 | Default quota for user without storage quota claim (empty for unlimited quota) | +| Button Text | string | Login with OAuth | Text for the OAuth button on the web | +| Auto Register | boolean | true | When true, will automatically register a user the first time they sign in | +| [Auto Launch](/administration/set-up-oauth-authentication#auto-launch) | boolean | false | When true, will skip the login page and automatically start the OAuth login process | +| [Mobile Redirect URI Override](/administration/set-up-oauth-authentication#mobile-redirect-uri) | URL | (empty) | Http(s) alternative mobile redirect URI | + +:::note Claim Options [1] + +Claim is only used on user creation and not synchronized after that. + +::: + +:::note Claim options [1] +Claims are only used on user creation and are not synchronized after that. +::: + +The Issuer URL should return a valid JSON document, for example: + +- `https://accounts.google.com/.well-known/openid-configuration` +- `http://localhost:9000/application/o/immich/.well-known/openid-configuration` + +The `.well-known/openid-configuration` part of the URL is optional and is added automatically during discovery. diff --git a/docs/docs/reference/requirements.md b/docs/docs/reference/requirements.md new file mode 100644 index 0000000000..a823d2165d --- /dev/null +++ b/docs/docs/reference/requirements.md @@ -0,0 +1,90 @@ +--- +sidebar_position: 10 +--- + +# Requirements + +This page lists the software and hardware requirements for running Immich. + +## Software + +Immich is distributed as a set of Docker images. Running them requires [Docker](/reference/docker) with the [Docker Compose](https://docs.docker.com/compose/) plugin. + +:::info +`docker compose` and `docker-compose` are two different distributions of Docker Compose, with the latter being [deprecated](https://docs.docker.com/retired/#docker-compose-v1-replaced-by-compose-v2) and no longer supported. Make sure that you are installing and using `docker compose`. +::: + +### Special requirements for Windows users + +
+Database storage on Windows systems + +The Immich Postgres database (`DB_DATA_LOCATION`) must be located on a filesystem that supports user/group +ownership and permissions (EXT2/3/4, ZFS, APFS, BTRFS, XFS, etc.). It will not work on any filesystem formatted in NTFS or ex/FAT/32. +It will not work in WSL (Windows Subsystem for Linux) when using a mounted host directory (commonly under `/mnt`). +If this is an issue, you can change the bind mount to a Docker volume instead as follows: + +Make the following change to `.env`: + +```diff +- DB_DATA_LOCATION=./postgres ++ DB_DATA_LOCATION=pgdata +``` + +Add the following line to the bottom of `docker-compose.yml`: + +```diff +volumes: + model-cache: ++ pgdata: +``` + +
+ +## Hardware + +### OS + +A Linux or \*nix 64-bit operating system (Ubuntu, Debian, etc.) is recommended. + +Non-Linux operating systems tend to provide a poor Docker experience and are strongly discouraged. Our ability to assist with setup or troubleshooting on non-Linux operating systems will be severely reduced. If you still want to use one: + +- Windows: [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/) or [WSL 2](https://docs.docker.com/desktop/wsl/). +- macOS: [Docker Desktop on Mac](https://docs.docker.com/desktop/install/mac-install/). + +Immich runs well in a virtualized environment when running in a full virtual machine. The use of Docker in LXC containers is [not recommended](https://pve.proxmox.com/wiki/Linux_Container), but may be possible for advanced users. If you have issues, we recommend that you switch to a supported VM deployment. + +Windows users should also review [special requirements for Windows users](#special-requirements-for-windows-users). + +### RAM + +Minimum 6GB, recommended 8GB. + +For a smooth experience, especially during asset upload, Immich requires at least 6GB of RAM. For systems with only 4GB of RAM, Immich can be run with machine learning features disabled. + +If Docker resource limits are used, the Postgres database requires at least 2GB of RAM on its own. + +### CPU + +Minimum 2 cores, recommended 4 cores. + +Immich runs on the `amd64` and `arm64` platforms. Since `v3`, the machine learning container on `amd64` requires the `>= x86-64-v2` [microarchitecture level](https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels). Most CPUs released since ~2012 support this microarchitecture. If you are using a virtual machine, ensure you have selected a [supported microarchitecture](https://pve.proxmox.com/pve-docs/chapter-qm.html#_qemu_cpu_types). + +If you are unable to support this instruction set, the last version to support `x86-64-v1` is `v2.7.5`. Note that this release is no longer supported, and you must run a matching `immich-server` version. + +### Storage + +A Unix-compatible filesystem (EXT4, ZFS, APFS, etc.) with support for user/group ownership and permissions is recommended. + +The generation of thumbnails and transcoded video can increase the size of the photo library by 10-20% on average. See [Storage locations](/reference/storage-locations) for what Immich writes where. + +Good performance and a stable connection to the Postgres database is critical to a smooth Immich experience. The Postgres database files are typically between 1-3 GB in size. For this reason, the Postgres database (`DB_DATA_LOCATION`) should ideally use local SSD storage, and never a network share of any kind. + +## Database + +Immich is known to work with Postgres versions `>= 14, < 20`. + +VectorChord is known to work with pgvector versions `>= 0.7, < 0.9`. + +The Immich server will check the VectorChord version on startup to ensure compatibility, and refuse to start if a compatible version is not found. +The current accepted range for VectorChord is `>= 0.3, < 2.0`. diff --git a/docs/docs/reference/reverse-proxy-requirements.md b/docs/docs/reference/reverse-proxy-requirements.md new file mode 100644 index 0000000000..7657e6483d --- /dev/null +++ b/docs/docs/reference/reverse-proxy-requirements.md @@ -0,0 +1,32 @@ +# Reverse proxy requirements + +A custom reverse proxy can sit in front of Immich to handle TLS termination, load balancing, or other advanced features. Any proxy between Immich and the user must meet the requirements below. For configurations that satisfy them, see [Set up a reverse proxy](/administration/set-up-a-reverse-proxy). + +## Headers + +All headers must be forwarded, and these must be set to their appropriate values: + +| Header | Value | +| ------------------- | ------------------------------------------- | +| `Host` | The front-facing host | +| `X-Real-IP` | The client address | +| `X-Forwarded-Proto` | The scheme the client used (`http`/`https`) | +| `X-Forwarded-For` | The client address chain | + +WebSocket upgrades must also be passed through. + +## Upload size + +The proxy must allow uploads large enough for the assets being sent. A body-size limit lower than the largest asset will fail uploads. + +## Timeouts + +Response timeouts need to be long enough for large uploads. A default of 60 seconds is too low and causes video uploads to stop after a minute (error code 499). + +## Path + +Immich does not support being served on a sub-path such as `location /immich {`. It has to be served on the root path of a (sub)domain. + +## Let's Encrypt http-01 + +If the reverse proxy uses the [Let's Encrypt](https://letsencrypt.org/) [http-01 challenge](https://letsencrypt.org/docs/challenge-types/#http-01-challenge), verify that the Immich well-known endpoint (`/.well-known/immich`) is routed to Immich. Otherwise it will likely be routed elsewhere and the mobile app may run into connection issues. diff --git a/docs/docs/reference/server-commands.md b/docs/docs/reference/server-commands.md new file mode 100644 index 0000000000..44c6cb9b94 --- /dev/null +++ b/docs/docs/reference/server-commands.md @@ -0,0 +1,61 @@ +# Server Commands + +The `immich-server` docker image comes preinstalled with an administrative CLI (`immich-admin`) that supports the commands below. + +To run one, see [Run a server command](/administration/run-a-server-command), which includes example output for each command. + +## `help` + +Display the list of available commands. + +## `reset-admin-password` + +Reset the password for the admin user, optionally invalidating existing sessions at the same time. This is the recovery path when nobody can log in as admin; the equivalent for other users is [Password Reset](/administration/manage-users#password-reset). + +## `disable-password-login` + +Disable password login for the entire instance, the same as turning it off under [Password Authentication](/reference/system-settings#password-authentication). + +## `enable-password-login` + +Enable password login, the same as turning it on under [Password Authentication](/reference/system-settings#password-authentication). This is how to recover when password login was disabled while OAuth was also unavailable, which otherwise leaves nobody able to log in. + +## `disable-maintenance-mode` + +Take the instance out of [maintenance mode](/administration/use-maintenance-mode). + +## `enable-maintenance-mode` + +Put the instance into [maintenance mode](/administration/use-maintenance-mode) and print a URL for logging in to it. Running it again issues a new URL, which is how to regain access if you are logged out while maintenance mode is active. + +## `enable-oauth-login` + +Enable OAuth login, the same as turning it on under [OAuth Authentication](/reference/system-settings#oauth-authentication). See [Set up OAuth authentication](/administration/set-up-oauth-authentication) for configuring a provider and [OAuth settings](/reference/oauth-settings) for every available option. + +## `disable-oauth-login` + +Disable OAuth login, the same as turning it off under [OAuth Authentication](/reference/system-settings#oauth-authentication). + +## `list-users` + +Print every user on the instance, including id, email, storage label, and admin status. See [Manage users](/administration/manage-users). + +## `grant-admin` + +Grant admin privileges to a user, selected by email. See [Manage users](/administration/manage-users). + +## `revoke-admin` + +Revoke admin privileges from a user, selected by email. See [Manage users](/administration/manage-users). + +## `version` + +Print the running Immich version. See [Versioning](/concepts/versioning) for what the version number implies about compatibility and upgrades. + +## `change-media-location` + +Rewrite the file paths stored in the database to match a new value of `IMMICH_MEDIA_LOCATION`. Run this after moving media to a new location — the command updates the database, it does not move any files. See [Storage locations](/reference/storage-locations). + +## `schema-check` + +Verify that database migrations are up to date and check for schema drift. See [Schema drift](/errors#schema-drift) for what to do when drift is reported. diff --git a/docs/docs/reference/storage-locations.md b/docs/docs/reference/storage-locations.md new file mode 100644 index 0000000000..2e4868b1ba --- /dev/null +++ b/docs/docs/reference/storage-locations.md @@ -0,0 +1,101 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Storage locations + +Immich stores original assets, generated content, database dumps, and the database itself in separate directories. This page describes what each one holds. Some locations depend on whether the [storage template](/administration/use-the-storage-template) is enabled. + +The root of this layout is `UPLOAD_LOCATION`; individual directories can be redirected elsewhere with the location environment variables documented in [Environment Variables](/reference/environment-variables). For which of these to include in a backup, see [Backups](/concepts/backups). + +## Directories + + + + +:::note +The `UPLOAD_LOCATION/library` folder is not used by default on new machines running version 1.92.0. It is used only if the system administrator activated the storage template engine, +for more info read the [release notes](https://github.com/immich-app/immich/releases/tag/v1.92.0#:~:text=the%20partner%E2%80%99s%20assets.-,Hardening%20storage%20template). +::: + +**User-specific folders** + +- Each user has a unique string representing them. +- You can find your user ID in Account Account Settings -> Account -> User ID. + +**Contents** + +- **Source Assets:** + - Original assets uploaded through the browser interface & mobile & CLI. + - Stored in `UPLOAD_LOCATION/upload/`. +- **Avatar Images:** + - User profile images. + - Stored in `UPLOAD_LOCATION/profile/`. +- **Thumbs Images:** + - Preview images (small thumbnails and large previews) for each asset and thumbnails for recognized faces. + - Stored in `UPLOAD_LOCATION/thumbs/`. +- **Encoded Assets:** + - Videos that have been re-encoded from the original for wider compatibility. The original is not removed. + - Stored in `UPLOAD_LOCATION/encoded-video/`. +- **Database Dump Backups:** + - Automatic database backups created by Immich for disaster recovery. + - Stored in `UPLOAD_LOCATION/backups/`. +- **Postgres** + - The Immich database containing all the information to allow the system to function properly. + **Note:** This folder will only appear to users who have made the changes mentioned in [v1.102.0](https://github.com/immich-app/immich/discussions/8930) (an optional, non-mandatory change) or who started with this version. + - Stored in `DB_DATA_LOCATION`. + + + + +:::note +If you choose to activate the storage template engine, it will move all assets to `UPLOAD_LOCATION/library/`. + +When you turn off the storage template engine, it will leave the assets in `UPLOAD_LOCATION/library/` and will not return them to `UPLOAD_LOCATION/upload`. +**New assets** will be saved to `UPLOAD_LOCATION/upload`. +::: + +**User-specific folders** + +- Each user has a unique string representing them. + - The administrator can set a Storage Label for a user, which will be used instead of `` for the `library/` folder. + - The Admin has a default storage label of `admin`. +- You can find your user ID and Storage Label in Account Account Settings -> Account -> User ID. + +**Contents** + +- **Source Assets:** + - Original assets uploaded through the browser interface, mobile, and CLI. + - Stored in `UPLOAD_LOCATION/library/`. +- **Avatar Images:** + - User profile images. + - Stored in `UPLOAD_LOCATION/profile/`. +- **Thumbs Images:** + - Preview images (blurred, small, large) for each asset and thumbnails for recognized faces. + - Stored in `UPLOAD_LOCATION/thumbs/`. +- **Encoded Assets:** + - Videos that have been re-encoded from the original for wider compatibility. The original is not removed. + - Stored in `UPLOAD_LOCATION/encoded-video/`. +- **Files in Upload Queue (Mobile):** + - Files uploaded through mobile apps. + - Temporarily located in `UPLOAD_LOCATION/upload/`. + - Transferred to `UPLOAD_LOCATION/library/` upon successful upload. +- **Database Dump Backups:** + - Automatic database backups created by Immich for disaster recovery. + - Stored in `UPLOAD_LOCATION/backups/`. +- **Postgres** + - The Immich database containing all the information to allow the system to function properly. + **Note:** This folder will only appear to users who have made the changes mentioned in [v1.102.0](https://github.com/immich-app/immich/discussions/8930) (an optional, non-mandatory change) or who started with this version. + - Stored in `DB_DATA_LOCATION`. + + + + + +## Constraints + +Because of the underlying properties of docker bind mounts, it is not recommended to mount the `upload/` and `library/` folders as separate bind mounts if they are on the same device. +For this reason, we mount the HDD or the network storage (NAS) to `/data` and then mount the folders we want to access under that folder. + +The `thumbs/` folder contains both the small thumbnails displayed in the timeline and the larger previews shown when clicking into an image. These cannot be separated. + +The storage metrics of the Immich server will track available storage at `UPLOAD_LOCATION`, so the administrator must set up some sort of monitoring to ensure the storage does not run out of space. The `profile/` folder is much smaller, usually less than 1 MB. diff --git a/docs/docs/features/supported-formats.md b/docs/docs/reference/supported-media-formats.md similarity index 96% rename from docs/docs/features/supported-formats.md rename to docs/docs/reference/supported-media-formats.md index 917950dd2a..16999cf095 100644 --- a/docs/docs/features/supported-formats.md +++ b/docs/docs/reference/supported-media-formats.md @@ -1,6 +1,6 @@ # Supported Media Formats -Immich supports a number of image and video formats, the most common of which are outlined here. +Immich supports a variety of image and video formats, the most common of which are outlined here. :::note For the full list, refer to the [Immich source code](https://github.com/immich-app/immich/blob/main/server/src/utils/mime-types.ts). diff --git a/docs/docs/administration/system-settings.md b/docs/docs/reference/system-settings.md similarity index 81% rename from docs/docs/administration/system-settings.md rename to docs/docs/reference/system-settings.md index 7dc9c08db3..7131f10967 100644 --- a/docs/docs/administration/system-settings.md +++ b/docs/docs/reference/system-settings.md @@ -12,14 +12,14 @@ Manage password, OAuth, and other authentication settings ### OAuth Authentication -Immich supports OAuth Authentication. Read more about this feature and its configuration [here](/administration/oauth). +Immich supports OAuth Authentication. Read more about this feature and its configuration [here](/administration/set-up-oauth-authentication). ### Password Authentication -The administrator can choose to disable login with username and password for the entire instance. This means that **no one**, including the system administrator, will be able to log using this method. If [OAuth Authentication](/administration/oauth) is also disabled, no users will be able to login using **any** method. Changing this setting does not affect existing sessions, just new login attempts. +The administrator can choose to disable login with username and password for the entire instance. This means that **no one**, including the system administrator, will be able to log using this method. If [OAuth Authentication](/administration/set-up-oauth-authentication) is also disabled, no users will be able to login using **any** method. Changing this setting does not affect existing sessions, just new login attempts. :::tip -You can always use the [Server CLI](/administration/server-commands) to re-enable password login. +You can always use the [server CLI](/administration/run-a-server-command) to re-enable password login. ::: ## Image Settings (thumbnails and previews) @@ -80,15 +80,33 @@ The Facial Recognition Concurrency value cannot be changed because ## External Library +Settings for [external libraries](/concepts/external-libraries), which track assets that stay on disk outside of Immich. Individual libraries, along with their import paths and exclusion patterns, are managed at `Administration > External Libraries` rather than here. + +### Import paths + +Each library has one or more import paths, which determine the files it scans. Paths are scanned recursively, and a file present in more than one import path is added only once. Each path must be a readable directory that exists inside the container — the import path dialog reports paths it cannot access. + +Paths are what define membership: if the import paths are edited so that a file is no longer under any of them, that file is removed from the library exactly as a deleted file would be. Moving it back adds it again as a new file. + +### Exclusion patterns + +Exclusion patterns subtract from the import paths. Each is a glob pattern matched against the full file path, and a file matching any pattern is skipped. Adding a pattern that matches an already-imported file removes it on the next scan; removing the pattern brings it back as new. + +See [Exclusion patterns](/reference/exclusion-patterns) for the syntax and worked examples. + ### Library watching (EXPERIMENTAL) External libraries can automatically import changed files without a full rescan. It will import the file whenever the operating system reports a file change. If your photos are mounted over the network, this does not work. +This feature is for advanced users only. See [automatic watching](/concepts/external-libraries#automatic-watching-experimental) for its limitations and for how to recover if the watcher fails. + ### Periodic Scanning You can define a custom interval for the trigger external library rescan under Administration -> Settings -> Library. You can set the scanning interval using the preset or cron format. For more information please refer to e.g. [Crontab Guru](https://crontab.guru/). +The same scheduled job also cleans up any libraries stuck in deletion. It can be triggered manually with "Scan all libraries" on the library management page. + ## Logging The default Immich log level is `Log` (commonly known as `Info`). The Immich administrator can choose a higher or lower log level according to personal preference or as requested by the Immich support team. @@ -108,7 +126,7 @@ If more than one URL is provided, each server will be attempted one-at-a-time un ### Smart Search -The [smart search](/features/searching) settings allow you to change the [CLIP model](https://openai.com/research/clip). Larger models will typically provide [more accurate search results](https://github.com/immich-app/immich/discussions/11862) but consume more processing power and RAM. When [changing the CLIP model](/FAQ#can-i-use-a-custom-clip-model) it is mandatory to re-run the Smart Search job on all images to fully apply the change. +The [smart search](/reference/clip-models) settings allow you to change the [CLIP model](https://openai.com/research/clip). Larger models will typically provide [more accurate search results](https://github.com/immich-app/immich/discussions/11862) but consume more processing power and RAM. When [changing the CLIP model](/FAQ#can-i-use-a-custom-clip-model) it is mandatory to re-run the Smart Search job on all images to fully apply the change. :::info Internet connection Changing models requires a connection to the Internet to download the model. @@ -132,7 +150,7 @@ Editable settings: - **Max Recognition Distance** - **Min Recognized Faces** -You can learn more about these options on the [Facial Recognition page](/features/facial-recognition#how-face-detection-works) +You can learn more about these options on the [Facial Recognition page](/concepts/facial-recognition#how-face-detection-works) :::info When changing the values in Min Detection Score, Max Recognition Distance, and Min Recognized Faces. @@ -154,15 +172,15 @@ The map can be adjusted via [OpenMapTiles](https://openmaptiles.org/styles/) for ### Reverse Geocoding Settings -Immich supports [Reverse Geocoding](/features/reverse-geocoding) using data from the [GeoNames](https://www.geonames.org/) geographical database. +Immich supports [Reverse Geocoding](/concepts/reverse-geocoding) using data from the [GeoNames](https://www.geonames.org/) geographical database. ## Notification Settings -SMTP server setup, for user creation notifications, new albums, etc. More information can be found [here](/administration/email-notification) +SMTP server setup, for user creation notifications, new albums, etc. More information can be found [here](/administration/set-up-email-notifications) ## Notification Templates -Override the default notifications text with notification templates. More information can be found [here](/administration/email-notification) +Override the default notifications text with notification templates. More information can be found [here](/administration/set-up-email-notifications) ## Server Settings @@ -176,7 +194,7 @@ The administrator can set a custom message on the login screen (the message will ## Storage Template -Immich supports a custom [Storage Template](/administration/storage-template). Learn more about this feature and its configuration [here](/administration/storage-template). +Immich supports a custom [Storage Template](/administration/use-the-storage-template). Learn more about this feature and its configuration [here](/administration/use-the-storage-template). ## Theme Settings diff --git a/docs/docs/reference/workers.md b/docs/docs/reference/workers.md new file mode 100644 index 0000000000..17a25bbfd8 --- /dev/null +++ b/docs/docs/reference/workers.md @@ -0,0 +1,25 @@ +# Workers + +A worker is an independent process inside the `immich-server` container. Which workers a container runs determines what work it takes on, which is what makes it possible to split responsibilities across containers or machines. + +## Worker types + +| Worker | Responsibility | +| --------------- | -------------------------------------------------------------------------------------------------------- | +| `api` | Responds to API requests for data and files from the web and mobile apps. | +| `microservices` | Runs the background [jobs](/reference/jobs) — thumbnail generation, video transcoding, machine learning. | + +By default a container runs both. + +A third worker, `maintenance`, is not selectable. It is started in place of the others while the instance is in [maintenance mode](/administration/use-maintenance-mode). + +## Selecting workers + +| Variable | Effect | +| ------------------------ | ----------------------------------------------------------------------------------------- | +| `IMMICH_WORKERS_INCLUDE` | Replaces the default set — only the listed workers run. | +| `IMMICH_WORKERS_EXCLUDE` | Subtracts from the default set, or from `IMMICH_WORKERS_INCLUDE` when both are specified. | + +Both accept a comma-separated list. An unrecognized worker name is a startup error: the server refuses to start rather than running a partial set. + +To put these into practice, see [Split workers across containers](/administration/split-workers-across-containers). For running several containers at once, see [Scaling](/concepts/scaling). diff --git a/docs/docs/features/xmp-sidecars.md b/docs/docs/reference/xmp-sidecars.md similarity index 91% rename from docs/docs/features/xmp-sidecars.md rename to docs/docs/reference/xmp-sidecars.md index 3536777d8a..e5e089f782 100644 --- a/docs/docs/features/xmp-sidecars.md +++ b/docs/docs/reference/xmp-sidecars.md @@ -8,7 +8,7 @@ Tools like Lightroom, Darktable, digiKam and other applications can also be conf ## Metadata Fields -Immich does not support _all_ metadata fields. Below is a table showing what fields Immich can _read_ and _write_. It's important to note that writes do not replace the entire file contents, but are merged together with any existing fields. +Immich does not support _all_ metadata fields. Below is a table showing what fields Immich can _read_ and _write_. For every tag Immich reads and which feature each one drives, see [EXIF tags](/reference/exif-tags). It's important to note that writes do not replace the entire file contents, but are merged together with any existing fields. :::info Immich automatically queues a Sidecar Write job after editing the description, rating, or updating tags. @@ -20,7 +20,7 @@ Immich automatically queues a Sidecar Write job after editing the description, r | **Rating** | `xmp:Rating` | `xmp:Rating` | | **DateTime** | `exif:DateTimeOriginal`, `photoshop:DateCreated` | In prioritized order:
`exif:SubSecDateTimeOriginal`
`exif:DateTimeOriginal`
`xmp:SubSecCreateDate`
`xmp:CreateDate`
`xmp:CreationDate`
`xmp:MediaCreateDate`
`xmp:SubSecMediaCreateDate`
`xmp:DateTimeCreated` | | **Location** | `exif:GPSLatitude`, `exif:GPSLongitude` | `exif:GPSLatitude`, `exif:GPSLongitude` | -| **Tags** | `digiKam:TagsList` | In prioritized order:
`digiKam:TagsList`
`lr:HierarchicalSubject`
`IPTC:Keywords` | +| **Tags** | `digiKam:TagsList` | In prioritized order:
`digiKam:TagsList`
`lr:HierarchicalSubject`
`IPTC:Keywords`
See [hierarchical tags](/reference/exif-tags#hierarchical-tags) for how levels are split | :::note All other fields (e.g. `Creator`, `Source`, IPTC, Lightroom edits) remain in the `.xmp` file and are **not searchable** in Immich. diff --git a/docs/docs/overview/support-the-project.md b/docs/docs/support-the-project.md similarity index 98% rename from docs/docs/overview/support-the-project.md rename to docs/docs/support-the-project.md index ae24a3f1ce..17cd3e8fd8 100644 --- a/docs/docs/overview/support-the-project.md +++ b/docs/docs/support-the-project.md @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 10 --- # Support The Project diff --git a/docs/docs/user-guide/_category_.json b/docs/docs/user-guide/_category_.json new file mode 100644 index 0000000000..2e41e63c01 --- /dev/null +++ b/docs/docs/user-guide/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "User Guide", + "position": 5 +} diff --git a/docs/docs/user-guide/browse-and-manage-people.md b/docs/docs/user-guide/browse-and-manage-people.md new file mode 100644 index 0000000000..2673fb6c7b --- /dev/null +++ b/docs/docs/user-guide/browse-and-manage-people.md @@ -0,0 +1,33 @@ +# Browse and manage people + +Immich recognizes faces in your photos and videos and groups them together into people. You can then assign names to these people and search for them. To understand how the grouping actually works, see [Facial recognition](/concepts/facial-recognition). + +## Find the people in your library + +The list of people is shown in the Explore page. + + + +Upon clicking on a person, a list of assets that contain their face will be shown. + + + +The asset detail view will also show the faces that are recognized in the asset. + + + +## Manage a person + +From the app bar in the detail view of a person, you can: + +- Change the feature photo of the person +- Hide the faces of a person from the Explore page and detail view +- Set a person's date of birth, so that the age of the person can be shown at the time the photo was taken +- Merge two or more detected people into one person +- Favorite a person to pin them to the top of the list + + + +## Improve the results + +If the grouping is poor — the same person split across several entries, or unrelated faces lumped together — the settings under `Administration > Settings > Machine Learning Settings > Facial Recognition` control it. See [tuning facial recognition](/concepts/facial-recognition#configuration) for what each setting does, and [Better facial recognition clusters](/administration/improve-facial-recognition-clusters) for a step-by-step tuning procedure. diff --git a/docs/docs/features/casting.md b/docs/docs/user-guide/cast-media.md similarity index 79% rename from docs/docs/features/casting.md rename to docs/docs/user-guide/cast-media.md index 2a6785dc6c..81f64be069 100644 --- a/docs/docs/features/casting.md +++ b/docs/docs/user-guide/cast-media.md @@ -1,6 +1,6 @@ -# Chromecast support +# Cast media -Immich supports the Google's Cast protocol so that photos and videos can be cast to devices such as a Chromecast and a Nest Hub. This feature is considered experimental and has several important limitations listed below. Currently, this feature is only supported by the web client, support on Android and iOS is planned for the future. +Immich supports the Google's Cast protocol so that photos and videos can be cast to devices such as a Chromecast and a Nest Hub. This feature is considered experimental and has several important limitations listed below. ## Enable Google Cast Support @@ -16,4 +16,4 @@ To use casting with Immich, there are a few prerequisites: 1. Your instance must be accessed via an HTTPS connection in order for the casting menu to show. 2. Your instance must be publicly accessible via HTTPS and a DNS record for the server must be accessible via Google's DNS servers (`8.8.8.8` and `8.8.4.4`) -3. Videos must be in a format that is compatible with Google Cast. For more info, check out [Google's documentation](https://developers.google.com/cast/docs/media) +3. Videos must be in a format that is compatible with Google Cast (see [Supported Media Formats](/reference/supported-media-formats) for what Immich itself accepts). For more info, check out [Google's documentation](https://developers.google.com/cast/docs/media) diff --git a/docs/docs/features/editing.mdx b/docs/docs/user-guide/edit-photos.mdx similarity index 98% rename from docs/docs/features/editing.mdx rename to docs/docs/user-guide/edit-photos.mdx index 5d51798e15..af6579e4ff 100644 --- a/docs/docs/features/editing.mdx +++ b/docs/docs/user-guide/edit-photos.mdx @@ -1,4 +1,4 @@ -# Editing +# Edit photos Immich supports non-destructive editing of photos. This means that any edits you make to an asset do not modify the original file, but instead create a new version of the asset with the edits applied. You can always revert back to the original asset if needed. diff --git a/docs/docs/features/img/advanced-search-filters.webp b/docs/docs/user-guide/img/advanced-search-filters.webp similarity index 100% rename from docs/docs/features/img/advanced-search-filters.webp rename to docs/docs/user-guide/img/advanced-search-filters.webp diff --git a/docs/docs/user-guide/img/backup-album-sync.webp b/docs/docs/user-guide/img/backup-album-sync.webp new file mode 100644 index 0000000000..1a05ef0584 Binary files /dev/null and b/docs/docs/user-guide/img/backup-album-sync.webp differ diff --git a/docs/docs/features/img/facial-recognition-1.webp b/docs/docs/user-guide/img/facial-recognition-1.webp similarity index 100% rename from docs/docs/features/img/facial-recognition-1.webp rename to docs/docs/user-guide/img/facial-recognition-1.webp diff --git a/docs/docs/features/img/facial-recognition-2.webp b/docs/docs/user-guide/img/facial-recognition-2.webp similarity index 100% rename from docs/docs/features/img/facial-recognition-2.webp rename to docs/docs/user-guide/img/facial-recognition-2.webp diff --git a/docs/docs/features/img/facial-recognition-3.webp b/docs/docs/user-guide/img/facial-recognition-3.webp similarity index 100% rename from docs/docs/features/img/facial-recognition-3.webp rename to docs/docs/user-guide/img/facial-recognition-3.webp diff --git a/docs/docs/features/img/facial-recognition-4.webp b/docs/docs/user-guide/img/facial-recognition-4.webp similarity index 100% rename from docs/docs/features/img/facial-recognition-4.webp rename to docs/docs/user-guide/img/facial-recognition-4.webp diff --git a/docs/docs/features/img/folder-access.webp b/docs/docs/user-guide/img/folder-access.webp similarity index 100% rename from docs/docs/features/img/folder-access.webp rename to docs/docs/user-guide/img/folder-access.webp diff --git a/docs/docs/user-guide/img/folder-view-1.webp b/docs/docs/user-guide/img/folder-view-1.webp new file mode 100644 index 0000000000..be4a55873d Binary files /dev/null and b/docs/docs/user-guide/img/folder-view-1.webp differ diff --git a/docs/docs/features/img/folder-view-enable.webp b/docs/docs/user-guide/img/folder-view-enable.webp similarity index 100% rename from docs/docs/features/img/folder-view-enable.webp rename to docs/docs/user-guide/img/folder-view-enable.webp diff --git a/docs/docs/features/img/free-up-space.webp b/docs/docs/user-guide/img/free-up-space.webp similarity index 100% rename from docs/docs/features/img/free-up-space.webp rename to docs/docs/user-guide/img/free-up-space.webp diff --git a/docs/docs/features/img/gcast-enable.webp b/docs/docs/user-guide/img/gcast-enable.webp similarity index 100% rename from docs/docs/features/img/gcast-enable.webp rename to docs/docs/user-guide/img/gcast-enable.webp diff --git a/docs/docs/features/img/mobile-upload-selected-photos.webp b/docs/docs/user-guide/img/mobile-upload-selected-photos.webp similarity index 100% rename from docs/docs/features/img/mobile-upload-selected-photos.webp rename to docs/docs/user-guide/img/mobile-upload-selected-photos.webp diff --git a/docs/docs/features/img/obtain-api-key-2.webp b/docs/docs/user-guide/img/obtain-api-key-2.webp similarity index 100% rename from docs/docs/features/img/obtain-api-key-2.webp rename to docs/docs/user-guide/img/obtain-api-key-2.webp diff --git a/docs/docs/features/img/obtain-api-key.webp b/docs/docs/user-guide/img/obtain-api-key.webp similarity index 100% rename from docs/docs/features/img/obtain-api-key.webp rename to docs/docs/user-guide/img/obtain-api-key.webp diff --git a/docs/docs/features/img/partner-sharing-1.webp b/docs/docs/user-guide/img/partner-sharing-1.webp similarity index 100% rename from docs/docs/features/img/partner-sharing-1.webp rename to docs/docs/user-guide/img/partner-sharing-1.webp diff --git a/docs/docs/features/img/partner-sharing-2.webp b/docs/docs/user-guide/img/partner-sharing-2.webp similarity index 100% rename from docs/docs/features/img/partner-sharing-2.webp rename to docs/docs/user-guide/img/partner-sharing-2.webp diff --git a/docs/docs/features/img/partner-sharing-3.webp b/docs/docs/user-guide/img/partner-sharing-3.webp similarity index 100% rename from docs/docs/features/img/partner-sharing-3.webp rename to docs/docs/user-guide/img/partner-sharing-3.webp diff --git a/docs/docs/features/img/partner-sharing-4.webp b/docs/docs/user-guide/img/partner-sharing-4.webp similarity index 100% rename from docs/docs/features/img/partner-sharing-4.webp rename to docs/docs/user-guide/img/partner-sharing-4.webp diff --git a/docs/docs/features/img/partner-sharing-5.webp b/docs/docs/user-guide/img/partner-sharing-5.webp similarity index 100% rename from docs/docs/features/img/partner-sharing-5.webp rename to docs/docs/user-guide/img/partner-sharing-5.webp diff --git a/docs/docs/features/img/partner-sharing-6.webp b/docs/docs/user-guide/img/partner-sharing-6.webp similarity index 100% rename from docs/docs/features/img/partner-sharing-6.webp rename to docs/docs/user-guide/img/partner-sharing-6.webp diff --git a/docs/docs/features/img/partner-sharing-7.webp b/docs/docs/user-guide/img/partner-sharing-7.webp similarity index 100% rename from docs/docs/features/img/partner-sharing-7.webp rename to docs/docs/user-guide/img/partner-sharing-7.webp diff --git a/docs/docs/features/img/partner-sharing-8.webp b/docs/docs/user-guide/img/partner-sharing-8.webp similarity index 100% rename from docs/docs/features/img/partner-sharing-8.webp rename to docs/docs/user-guide/img/partner-sharing-8.webp diff --git a/docs/docs/features/img/public-shared-link-album.webp b/docs/docs/user-guide/img/public-shared-link-album.webp similarity index 100% rename from docs/docs/features/img/public-shared-link-album.webp rename to docs/docs/user-guide/img/public-shared-link-album.webp diff --git a/docs/docs/features/img/public-shared-link-form.webp b/docs/docs/user-guide/img/public-shared-link-form.webp similarity index 100% rename from docs/docs/features/img/public-shared-link-form.webp rename to docs/docs/user-guide/img/public-shared-link-form.webp diff --git a/docs/docs/features/img/public-shared-link-individual.webp b/docs/docs/user-guide/img/public-shared-link-individual.webp similarity index 100% rename from docs/docs/features/img/public-shared-link-individual.webp rename to docs/docs/user-guide/img/public-shared-link-individual.webp diff --git a/docs/docs/features/img/read-only-mode.webp b/docs/docs/user-guide/img/read-only-mode.webp similarity index 100% rename from docs/docs/features/img/read-only-mode.webp rename to docs/docs/user-guide/img/read-only-mode.webp diff --git a/docs/docs/features/img/shared-album-mobile.webp b/docs/docs/user-guide/img/shared-album-mobile.webp similarity index 100% rename from docs/docs/features/img/shared-album-mobile.webp rename to docs/docs/user-guide/img/shared-album-mobile.webp diff --git a/docs/docs/features/img/shared-album-user-selection.webp b/docs/docs/user-guide/img/shared-album-user-selection.webp similarity index 100% rename from docs/docs/features/img/shared-album-user-selection.webp rename to docs/docs/user-guide/img/shared-album-user-selection.webp diff --git a/docs/docs/features/img/shared-album.webp b/docs/docs/user-guide/img/shared-album.webp similarity index 100% rename from docs/docs/features/img/shared-album.webp rename to docs/docs/user-guide/img/shared-album.webp diff --git a/docs/docs/features/img/tag-creation.webp b/docs/docs/user-guide/img/tag-creation.webp similarity index 100% rename from docs/docs/features/img/tag-creation.webp rename to docs/docs/user-guide/img/tag-creation.webp diff --git a/docs/docs/features/img/tag-enable.webp b/docs/docs/user-guide/img/tag-enable.webp similarity index 100% rename from docs/docs/features/img/tag-enable.webp rename to docs/docs/user-guide/img/tag-enable.webp diff --git a/docs/docs/features/img/tag-form.webp b/docs/docs/user-guide/img/tag-form.webp similarity index 100% rename from docs/docs/features/img/tag-form.webp rename to docs/docs/user-guide/img/tag-form.webp diff --git a/docs/docs/features/img/tag-view.webp b/docs/docs/user-guide/img/tag-view.webp similarity index 100% rename from docs/docs/features/img/tag-view.webp rename to docs/docs/user-guide/img/tag-view.webp diff --git a/docs/docs/features/img/user-settings-1.webp b/docs/docs/user-guide/img/user-settings-1.webp similarity index 100% rename from docs/docs/features/img/user-settings-1.webp rename to docs/docs/user-guide/img/user-settings-1.webp diff --git a/docs/docs/features/img/user-settings-2.webp b/docs/docs/user-guide/img/user-settings-2.webp similarity index 100% rename from docs/docs/features/img/user-settings-2.webp rename to docs/docs/user-guide/img/user-settings-2.webp diff --git a/docs/docs/features/img/user-settings-3.webp b/docs/docs/user-guide/img/user-settings-3.webp similarity index 100% rename from docs/docs/features/img/user-settings-3.webp rename to docs/docs/user-guide/img/user-settings-3.webp diff --git a/docs/docs/features/img/web-edit-download.webp b/docs/docs/user-guide/img/web-edit-download.webp similarity index 100% rename from docs/docs/features/img/web-edit-download.webp rename to docs/docs/user-guide/img/web-edit-download.webp diff --git a/docs/docs/features/img/web-edit-interface.webp b/docs/docs/user-guide/img/web-edit-interface.webp similarity index 100% rename from docs/docs/features/img/web-edit-interface.webp rename to docs/docs/user-guide/img/web-edit-interface.webp diff --git a/docs/docs/features/user-settings.md b/docs/docs/user-guide/manage-your-user-settings.md similarity index 72% rename from docs/docs/features/user-settings.md rename to docs/docs/user-guide/manage-your-user-settings.md index 402105cd43..025a0ab371 100644 --- a/docs/docs/features/user-settings.md +++ b/docs/docs/user-guide/manage-your-user-settings.md @@ -1,6 +1,6 @@ -# User Settings +# Manage your user settings -Immich gives each user the ability to manage their own settings. This includes being able to update their profile, toggle certain feature, generate API keys, manage the logged in devices, a view of account usage statistics, and more. +Immich gives each user the ability to manage their own settings. This includes being able to update their profile, toggle certain feature, generate [API keys](/reference/immich-api), manage the logged in devices, a view of account usage statistics, and more. @@ -15,9 +15,9 @@ You can access the [user settings](https://my.immich.app/user-settings) by click --- :::tip Reset Password -The admin can reset a user password through the [User Management](/administration/user-management.mdx) screen. +The admin can reset a user password through the [User Management](/administration/manage-users) screen. ::: :::tip Reset Admin Password -The admin password can be reset using a [Server Command](/administration/server-commands.md) +The admin password can be reset using a [server command](/administration/run-a-server-command) ::: diff --git a/docs/docs/user-guide/review-duplicates.md b/docs/docs/user-guide/review-duplicates.md new file mode 100644 index 0000000000..d4a047b0e5 --- /dev/null +++ b/docs/docs/user-guide/review-duplicates.md @@ -0,0 +1,9 @@ +# Review duplicates + +The "Review duplicates" utility lists assets that Immich has found to be [visually similar](/concepts/duplicate-detection), and lets you choose what to keep. Open it [here](https://my.immich.app/utilities/duplicates). + +For how detection works, how Immich decides what to preselect, and what happens to the metadata of the assets you trash, see [Duplicate detection](/concepts/duplicate-detection). + +## Reviewing duplicates + +The review duplicates page allows the user to individually select which assets should be kept and which ones should be trashed. When more than one asset is kept, there is an option to automatically put the kept assets into a stack. diff --git a/docs/docs/user-guide/search-your-library.md b/docs/docs/user-guide/search-your-library.md new file mode 100644 index 0000000000..f927575301 --- /dev/null +++ b/docs/docs/user-guide/search-your-library.md @@ -0,0 +1,37 @@ +# Search your library + +Immich offers two ways to find assets: contextual search, which understands the content of your photos and videos, and advanced search filters, which narrow results by metadata. You can try both on the [Demo site](https://demo.immich.app). + +Contextual search works without any specific keywords in the metadata — describe what you remember about the photo. Which model powers it, and how to change it, is covered in the [CLIP models reference](/reference/clip-models). + +## Search with advanced filters + +Advanced search lets you find specific content using customizable filters, including location, one or more faces, specific albums, and more. You can search the following types of content: + +| Type | Description | +| ----------------------------------- | ----------------------------------------------------- | +| People | Faces that are recognized in your photos/videos. | +| Contextual | Content of the photos and videos. | +| File name or extension | Full or partial file's name, or file's extension | +| Full path or folder | Full or partial folder names from the original path. | +| Description | Description added to assets. | +| Optical Character Recognition (OCR) | Text in images | +| Locations | Cities, states, and countries from reverse geocoding. | +| Tags | Tags assigned or extracted from assets. | +| Camera | make, model and lens model | +| Time frame | Start and end date of a specific time bucket | +| Media type | Image or video or both | +| Display options | In Archive, in Favorites or Not in any album | +| Star rating | User-assigned star rating | + + + +## Search by folder or path + +Use the **Full path or folder** filter when you know a folder name or part of the original asset path. + +For example, for `/John/Projects/3D_Printing/2026-07-01/IMG_0001.jpg`, searches like `Projects`, `3D`, `Printing`, or `2026` all match the asset. + +## Search by location + +Cities, states, and countries come from [reverse geocoding](/concepts/reverse-geocoding), which runs during metadata extraction — so location search only works for assets that have GPS coordinates. diff --git a/docs/docs/features/sharing.md b/docs/docs/user-guide/share-photos-and-albums.md similarity index 53% rename from docs/docs/features/sharing.md rename to docs/docs/user-guide/share-photos-and-albums.md index a884884bee..3c1d918016 100644 --- a/docs/docs/features/sharing.md +++ b/docs/docs/user-guide/share-photos-and-albums.md @@ -1,13 +1,11 @@ -# Sharing +# Share photos and albums -Immich supports local sharing, with users on the same Immich instance, and public sharing via public links. +Immich supports sharing albums and partner libraries with users on the same instance, and public links for people without an account. For how the three differ, see [Sharing](/concepts/sharing). ## Local sharing ### Albums -Albums can be shared between users on the same Immich instance. The shared users can view and add their own photos and videos to the shared album. - After creating an album, you can access the sharing options by clicking on the share icon. When sharing an album, you can select the users you want to share the album with and assign them permissions either as editors (read-write) or viewers (read-only). #### Web @@ -22,20 +20,10 @@ After creating an album, you can access the sharing options by clicking on the s ### Partners -Partner sharing allows you to share your _entire_ library with other users of your choice. They can then view your library and download the assets. - -You can read this guide to learn more about [partner sharing](/features/partner-sharing). +You can read this guide to learn more about [partner sharing](/user-guide/share-with-a-partner). ## Public sharing -You can create a public link to share a group of photos or videos, or an album, with anyone. The public link can be shared via email, social media, or any other method. There are a variety of options to customize the public link, such as setting an expiration date, password protection, and more. Public shared link is handy when you want to share a group of photos or videos with someone who doesn't have an Immich account and allow the shared user to upload their photos or videos to your account. - -The public shared link is generated with a random URL, which acts as as a secret to avoid the link being guessed by unwanted parties, for instance. - -``` -https://my.immich.app/share/JUckRMxlgpo7F9BpyqGk_cZEwDzaU_U5LU5_oNZp1ETIBa9dpQ0b5ghNm_22QVJfn3k -``` - ### Creating a public share link You can create a public share link by selecting the photos or videos, or from the share icon on an album. diff --git a/docs/docs/features/partner-sharing.md b/docs/docs/user-guide/share-with-a-partner.md similarity index 64% rename from docs/docs/features/partner-sharing.md rename to docs/docs/user-guide/share-with-a-partner.md index 1934344d01..0d5e2cb3a0 100644 --- a/docs/docs/features/partner-sharing.md +++ b/docs/docs/user-guide/share-with-a-partner.md @@ -1,25 +1,8 @@ -# Partner Sharing +# Share with a partner -Immich allows you to share your library with other users. They can then view your library and download the assets. You can manage Partner Sharing from the [User Settings](docs/features/user-settings.md) page on the web. +Immich allows you to [share your entire library](/concepts/sharing#partner-sharing) with other users. They can then view your library and download the assets. You can manage Partner Sharing from the [User Settings](/user-guide/manage-your-user-settings) page on the web. -Partner sharing includes: - -- Access to all non-archived and trashed photos and videos. -- Access to all metadata, including GPS information. -- Access to share assets via shared links, albums, etc. - -Partner sharing does _not_ include: - -- Already existing partner albums -- If an asset is favorited -- People and facial recognition data - -:::note - -- Partner sharing is one-way. To view your partner's assets, they must also share them with you. -- Partner sharing may result in displaying duplicate assets on the main timeline, as duplicates are only detected on a per-user basis. - -::: +For exactly what a partner can and cannot see, see [Sharing](/concepts/sharing#partner-sharing). ## Sharing with a Partner diff --git a/docs/docs/guides/python-file-upload.md b/docs/docs/user-guide/upload-files-with-python.md similarity index 76% rename from docs/docs/guides/python-file-upload.md rename to docs/docs/user-guide/upload-files-with-python.md index 6816924e6f..99e3b2ee9d 100644 --- a/docs/docs/guides/python-file-upload.md +++ b/docs/docs/user-guide/upload-files-with-python.md @@ -1,4 +1,6 @@ -# Python File Upload +# Upload files with Python + +A minimal example of uploading an asset by calling the API directly, for cases where the [CLI](/reference/immich-cli) is not a good fit. See the [Immich API](/reference/immich-api) reference for the published API documentation. ```python #!/usr/bin/python3 diff --git a/docs/docs/user-guide/upload-media-with-the-cli.md b/docs/docs/user-guide/upload-media-with-the-cli.md new file mode 100644 index 0000000000..49e140a624 --- /dev/null +++ b/docs/docs/user-guide/upload-media-with-the-cli.md @@ -0,0 +1,122 @@ +# Upload media with the CLI + +This guide covers uploading photos and videos to Immich from a terminal with the [Immich CLI](/reference/immich-cli). Install it first, then come back here. + +:::tip Google Photos Takeout +If you are looking to import your Google Photos takeout, we recommend this community maintained tool [immich-go](https://github.com/simulot/immich-go). +::: + +## Obtain an API key + +The API key can be obtained in the user setting panel on the web interface. You can also specify permissions for the key to limit its access. + +![Obtain Api Key](./img/obtain-api-key.webp) + +![Specify permissions for the key](./img/obtain-api-key-2.webp) + +## Authenticate + +Log in with your server URL and API key: + +```bash +# immich login [url] [key] +immich login http://192.168.1.216:2283/api HFEJ38DNSDUEG +``` + +This stores your credentials in an `auth.yml` file in the configuration directory, which defaults to `~/.config/immich/`. The directory can be set with the `-d` option or the environment variable `IMMICH_CONFIG_DIR`. Keep the file secure, either by running `immich logout` when you are done or by deleting it manually. + +## Upload individual files + +```bash +immich upload file1.jpg file2.jpg +``` + +## Upload a directory and its subfolders + +By default, subfolders are not included. To upload a directory including subfolders, use the `--recursive` option: + +```bash +immich upload --recursive directory/ +``` + +## Preview what would happen + +If you are unsure what will happen, use the `--dry-run` option to see what would be uploaded without actually performing any actions: + +```bash +immich upload --dry-run --recursive directory/ +``` + +## Skip hashing to upload faster + +By default, the upload command hashes files before uploading them to avoid uploading the same file multiple times. If you are sure that the files are unique, you can skip this step with `--skip-hash`. Immich always performs its own deduplication through hashing, so this is merely a performance consideration — if you have good bandwidth it might be faster to skip hashing. + +```bash +immich upload --skip-hash --recursive directory/ +``` + +## Create albums from folder names + +`--album` creates an album for each uploaded asset based on the name of the folder it is in: + +```bash +immich upload --album --recursive directory/ +``` + +To put everything into one specific album instead, use `--album-name`: + +```bash +immich upload --album-name "My summer holiday" --recursive directory/ +``` + +## Skip files matching a pattern + +`--ignore` skips assets matching a glob pattern. See [Exclusion patterns](/reference/exclusion-patterns) for how to write glob patterns. You can add several exclusion patterns if needed. + +```bash +immich upload --ignore **/Raw/** --recursive directory/ +``` + +```bash +immich upload --ignore **/Raw/** **/*.tif --recursive directory/ +``` + +## Include hidden files + +By default, hidden files are skipped: + +```bash +immich upload --include-hidden --recursive directory/ +``` + +## Set the visibility of uploaded assets + +You can set the visibility of uploaded assets to `archive`, `timeline`, `hidden`, or `locked`: + +```bash +immich upload --visibility archive --recursive directory/ +``` + +## Post-process the results as JSON + +The `--json-output` option prints JSON with three keys: `newFiles`, `duplicates` and `newAssets`. Due to some logging output you need to strip the first few lines of output to get at the JSON. For example, to get a list of files that would be uploaded for further processing: + +```bash +immich upload --dry-run --json-output . | tail -n +6 | jq .newFiles[] +``` + +## Run the CLI from Docker + +If npm is not available on your system, you can use the Docker image instead: + +```bash +docker run -it -v "$(pwd)":/import:ro -e IMMICH_INSTANCE_URL=https://your-immich-instance/api -e IMMICH_API_KEY=your-api-key ghcr.io/immich-app/immich-cli:latest +``` + +Modify the `IMMICH_INSTANCE_URL` and `IMMICH_API_KEY` environment variables as appropriate. You can also use a Docker env file to store your sensitive API key. + +This `docker run` command runs the `immich` command inside the container, so you can append the desired parameters directly to the command line: + +```bash +docker run -it -v "$(pwd)":/import:ro -e IMMICH_INSTANCE_URL=https://your-immich-instance/api -e IMMICH_API_KEY=your-api-key ghcr.io/immich-app/immich-cli:latest upload -a -c 5 --recursive directory/ +``` diff --git a/docs/docs/features/folder-view.md b/docs/docs/user-guide/use-folder-view.md similarity index 81% rename from docs/docs/features/folder-view.md rename to docs/docs/user-guide/use-folder-view.md index 3d8613a042..48e19cb41f 100644 --- a/docs/docs/features/folder-view.md +++ b/docs/docs/user-guide/use-folder-view.md @@ -1,6 +1,6 @@ -# Folder View +# Use folder view -Folder view provides an additional view besides the timeline that is similar to a file explorer. It allows you to navigate through the folders and files in the library. This feature is handy for a highly curated and customized external library or a nicely configured storage template. +Folder view provides an additional view besides the timeline that is similar to a file explorer. It allows you to navigate through the folders and files in the library. This feature is handy for a highly curated and customized [external library](/concepts/external-libraries) or a nicely configured [storage template](/reference/storage-locations). You can enable this feature under [`Account Settings > Features > Folders`](https://my.immich.app/user-settings?isOpen=feature+folders) diff --git a/docs/docs/features/tags.md b/docs/docs/user-guide/use-tags.md similarity index 67% rename from docs/docs/features/tags.md rename to docs/docs/user-guide/use-tags.md index 79a9696d9a..f6d425518d 100644 --- a/docs/docs/features/tags.md +++ b/docs/docs/user-guide/use-tags.md @@ -1,6 +1,6 @@ -# Tags +# Use tags -Immich supports hierarchical tags, with the ability to read existing tags from the XMP `TagsList` field and IPTC `Keywords` field. Any changes to tags made through Immich are also written back to a [sidecar](/features/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags. +Immich supports [hierarchical tags](/reference/exif-tags#hierarchical-tags), and can import tags that already exist in your files — see [EXIF tags](/reference/exif-tags#tags) for which metadata fields are read. Any changes to tags made through Immich are also written back to a [sidecar](/reference/xmp-sidecars) file. You can re-run the metadata extraction jobs for all assets to import your existing tags. ## Enable tags feature diff --git a/docs/docs/features/mobile-app.mdx b/docs/docs/user-guide/use-the-mobile-app.mdx similarity index 87% rename from docs/docs/features/mobile-app.mdx rename to docs/docs/user-guide/use-the-mobile-app.mdx index 1b7c7e21d5..66301c8e92 100644 --- a/docs/docs/features/mobile-app.mdx +++ b/docs/docs/user-guide/use-the-mobile-app.mdx @@ -4,7 +4,9 @@ import MobileAppDownload from '/docs/partials/_mobile-app-download.md'; import MobileAppLogin from '/docs/partials/_mobile-app-login.md'; import MobileAppBackup from '/docs/partials/_mobile-app-backup.md'; -# Mobile App +# Use the mobile app + +Installing the app, signing in, and the settings that control what it uploads. For how mobile backup behaves — deduplication, networking, album sync, and platform differences — see [Mobile Backup](/concepts/mobile-backup). ## Download @@ -74,7 +76,7 @@ Now make sure that the local album is selected in the backup screen (steps 1-2 a To use the reclaimed space right away, you must empty the system/gallery trash manually outside of Immich. ::: -Provided the server is healthy and [backed up](/administration/backup-and-restore.md), assets removed by Free Up Space can always be accessed in the Immich app. +Provided the server is healthy and [backed up](/administration/back-up-and-restore), assets removed by Free Up Space can always be accessed in the Immich app. ### iCloud Photos @@ -100,19 +102,7 @@ If Immich backs up your WhatsApp folder and you run **Free Up Space**, the local You can sync or mirror an album from your phone to the Immich server on your account. For example, if you select Recents, Camera and Videos album for backup, the corresponding album with the same name will be created on the server. Once the assets from those albums are uploaded, they will be put into the target albums automatically. -### Album Synchronization Highlights - -- **One-Way Sync:** Synchronization is one-way, from the device to the server. - -- **Name Matching:** If an album on the server has the same name as the album on the device, images from the device will be merged with the existing images in the server album. - -- **Shared Albums:** If the matching album on the server is shared, the new photos merged into the album will also be shared. - -- **Album Structure:** When an album is created for the first time, its structure is based on the initial state. Future updates made on the phone (such as deleting or repositioning photos) will not be reflected in Immich. - -- **User-Specific Sync:** Album synchronization is unique to each server user and does not sync between different users or partners. - -- **Mobile-Only Feature:** Album synchronization is currently only available on mobile. For similar options on a computer, refer to [Libraries](/features/libraries) for further details. +For the semantics of the sync — what matches, what merges, and what is not propagated — see [Mobile Backup](/concepts/mobile-backup#album-synchronization-semantics). ### Synchronizing albums from the past diff --git a/docs/src/components/community-disclaimer.tsx b/docs/src/components/community-disclaimer.tsx new file mode 100644 index 0000000000..c3523c8bc7 --- /dev/null +++ b/docs/src/components/community-disclaimer.tsx @@ -0,0 +1,18 @@ +import Admonition from '@theme/Admonition'; +import React from 'react'; + +/** + * Disclaimer shown at the top of every community-contributed installation guide. + * Pass the platform's support venue as children. + */ +export default function CommunityDisclaimer({ children }: { children?: React.ReactNode }): JSX.Element { + return ( + +

+ This is a community contribution, not officially supported by the Immich team, and is included here for + convenience. Use it at your own risk. +

+ {children} +
+ ); +} diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx index 37455cde16..ea18917eec 100644 --- a/docs/src/pages/index.tsx +++ b/docs/src/pages/index.tsx @@ -1,5 +1,5 @@ import { Redirect } from '@docusaurus/router'; export default function Home(): JSX.Element { - return ; + return ; } diff --git a/docs/static/_redirects b/docs/static/_redirects index 633025ac17..a3c5caf4a5 100644 --- a/docs/static/_redirects +++ b/docs/static/_redirects @@ -1,39 +1,93 @@ -/ /overview/quick-start 307 -/mobile-app-beta-program /features/mobile-app 307 -/contribution-guidelines /overview/support-the-project#contributing 307 -/install /install/docker-compose 307 +/ /introduction/getting-started 307 +/mobile-app-beta-program /user-guide/use-the-mobile-app 307 +/contribution-guidelines /support-the-project#contributing 307 /installation/one-step-installation /install/script 307 /installation/portainer-installation /install/portainer 307 /installation/recommended-installation /install/docker-compose 307 /installation/unraid /install/unraid 307 -/installation/requirements /install/requirements 307 +/installation/requirements /reference/requirements 307 /overview/logo-meaning /overview/logo 307 /overview/technology-stack /developer/architecture 307 -/usage/automatic-backup /features/automatic-backup 307 -/usage/bulk-upload /features/command-line-interface 307 -/features/bulk-upload /features/command-line-interface 307 -/usage/oauth /administration/oauth 307 -/usage/post-installation /install/post-install 307 +/usage/automatic-backup /concepts/mobile-backup 307 +/usage/bulk-upload /user-guide/upload-media-with-the-cli 307 +/features/bulk-upload /user-guide/upload-media-with-the-cli 307 +/usage/oauth /administration/set-up-oauth-authentication 307 +/usage/post-installation /introduction/next-steps 307 /usage/update /install/docker-compose#step-4---upgrading 307 -/usage/server-commands /administration/server-commands 307 -/features/jobs /administration/jobs 307 -/features/oauth /administration/oauth 307 -/features/password-login /administration/password-login 307 -/features/server-commands /administration/server-commands 307 -/features/storage-template /administration/storage-template 307 -/features/user-management /administration/user-management 307 +/usage/server-commands /reference/server-commands 307 +/features/jobs /concepts/scaling 307 +/features/oauth /administration/set-up-oauth-authentication 307 +/features/password-login /reference/system-settings 307 +/features/server-commands /reference/server-commands 307 +/features/storage-template /administration/use-the-storage-template 307 +/features/user-management /administration/manage-users 307 /developer/contributing /developer/pr-checklist 307 -/developer/open-api /api 307 -/guides/machine-learning /guides/remote-machine-learning 307 -/administration/password-login /administration/system-settings 307 -/features/search /features/searching 307 -/features/smart-search /features/searching 307 +/guides/machine-learning /administration/run-machine-learning-remotely 307 +/administration/password-login /reference/system-settings 307 +/features/search /user-guide/search-your-library 307 +/features/smart-search /user-guide/search-your-library 307 /guides/api-album-sync https://awesome.immich.app/ 307 /guides/remove-offline-files https://awesome.immich.app/ 307 /community-guides https://awesome.immich.app/ 307 /community-projects https://awesome.immich.app/ 307 -/overview/introduction /overview/quick-start 307 -/overview/welcome /overview/quick-start 307 +/overview/introduction /introduction/getting-started 307 +/overview/welcome /introduction/getting-started 307 /docs/* /:splat 307 -/features/automatic-backup /features/mobile-backup 307 +/features/automatic-backup /concepts/mobile-backup 307 /privacy-policy https://immich.app/privacy-policy 307 +/overview/quick-start /introduction/getting-started 307 +/overview/comparison /concepts/comparison 307 +/overview/help /help-me 307 +/overview/support-the-project /support-the-project 307 +/api /reference/immich-api 307 +/install/post-install /introduction/next-steps 307 +/install/requirements /reference/requirements 307 +/install/environment-variables /reference/environment-variables 307 +/install/config-file /reference/config-file 307 +/features/command-line-interface /reference/immich-cli 307 +/features/supported-formats /reference/supported-media-formats 307 +/features/xmp-sidecars /reference/xmp-sidecars 307 +/features/searching /user-guide/search-your-library 307 +/features/casting /user-guide/cast-media 307 +/features/duplicates-utility /user-guide/review-duplicates 307 +/features/editing /user-guide/edit-photos 307 +/features/folder-view /user-guide/use-folder-view 307 +/features/hardware-transcoding /administration/set-up-hardware-transcoding 307 +/features/ml-hardware-acceleration /administration/set-up-hardware-accelerated-machine-learning 307 +/features/mobile-app /user-guide/use-the-mobile-app 307 +/features/monitoring /administration/monitor-immich 307 +/features/partner-sharing /user-guide/share-with-a-partner 307 +/features/sharing /user-guide/share-photos-and-albums 307 +/features/tags /user-guide/use-tags 307 +/features/user-settings /user-guide/manage-your-user-settings 307 +/features/libraries /concepts/external-libraries 307 +/features/facial-recognition /concepts/facial-recognition 307 +/features/mobile-backup /concepts/mobile-backup 307 +/features/reverse-geocoding /concepts/reverse-geocoding 307 +/guides/external-library /administration/add-an-external-library 307 +/guides/remote-access /concepts/remote-access 307 +/administration/backup-and-restore /administration/back-up-and-restore 307 +/administration/email-notification /administration/set-up-email-notifications 307 +/administration/maintenance-mode /administration/use-maintenance-mode 307 +/administration/oauth /administration/set-up-oauth-authentication 307 +/administration/postgres-standalone /administration/use-a-pre-existing-postgres-server 307 +/administration/reverse-proxy /administration/set-up-a-reverse-proxy 307 +/administration/server-stats /administration/view-server-stats 307 +/administration/storage-template /administration/use-the-storage-template 307 +/administration/user-management /administration/manage-users 307 +/administration/server-commands /reference/server-commands 307 +/administration/system-settings /reference/system-settings 307 +/administration/jobs-workers /concepts/scaling 307 +/administration/system-integrity /concepts/system-integrity 307 +/guides/better-facial-clusters /administration/improve-facial-recognition-clusters 307 +/guides/custom-locations /administration/use-custom-file-locations 307 +/guides/custom-map-styles /administration/use-a-custom-map-style 307 +/guides/database-gui /administration/connect-a-database-gui 307 +/guides/database-queries /administration/run-database-queries 307 +/guides/docker-help /administration/inspect-containers-and-logs 307 +/guides/python-file-upload /user-guide/upload-files-with-python 307 +/guides/remote-machine-learning /administration/run-machine-learning-remotely 307 +/guides/scaling-immich /concepts/scaling 307 +/guides/smtp-gmail /administration/set-up-an-smtp-provider 307 +/guides/smtp-microsoft365 /administration/set-up-an-smtp-provider 307 +/guides/template-backup-script /administration/use-the-backup-script-template 307 diff --git a/packages/cli/README.md b/packages/cli/README.md index 92582fccc4..ef8ecb7738 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -1,6 +1,6 @@ A command-line interface for interfacing with the self-hosted photo manager [Immich](https://immich.app/). -Please see the [Immich CLI documentation](https://docs.immich.app/features/command-line-interface). +Please see the [Immich CLI documentation](https://docs.immich.app/reference/immich-cli). # For developers diff --git a/readme_i18n/README_ar_JO.md b/readme_i18n/README_ar_JO.md index b28f9bbf1b..4072f6d8c9 100644 --- a/readme_i18n/README_ar_JO.md +++ b/readme_i18n/README_ar_JO.md @@ -49,13 +49,13 @@ ## روابط - [الوثائق الرسمية](https://docs.immich.app/) -- [مقدمة](https://docs.immich.app/overview/introduction) -- [تعليمات التحميل](https://docs.immich.app/install/requirements) +- [مقدمة](https://docs.immich.app/introduction/getting-started) +- [تعليمات التحميل](https://docs.immich.app/reference/requirements) - [خريطة الطريق](https://immich.app/roadmap) - [تجريبي](#تجريبي) - [سمات](#سمات) - [الترجمات](https://docs.immich.app/developer/translations) -- [قواعد المساهمة](https://docs.immich.app/overview/support-the-project) +- [قواعد المساهمة](https://docs.immich.app/support-the-project) ## تجريبي diff --git a/readme_i18n/README_bg_BG.md b/readme_i18n/README_bg_BG.md index 7870bb23b8..3a58291764 100644 --- a/readme_i18n/README_bg_BG.md +++ b/readme_i18n/README_bg_BG.md @@ -49,13 +49,13 @@ ## Връзки - [Документация](https://docs.immich.app) -- [За проекта](https://docs.immich.app/overview/introduction) -- [Инсталиране](https://docs.immich.app/install/requirements) +- [За проекта](https://docs.immich.app/introduction/getting-started) +- [Инсталиране](https://docs.immich.app/reference/requirements) - [Пътна карта](https://immich.app/roadmap) - [Демо](#демо) - [Функции](#функции) - [Преводи](https://docs.immich.app/developer/translations) -- [Принос към проекта](https://docs.immich.app/overview/support-the-project) +- [Принос към проекта](https://docs.immich.app/support-the-project) ## Демо diff --git a/readme_i18n/README_ca_ES.md b/readme_i18n/README_ca_ES.md index 68a3b3cf6f..0abb1c1627 100644 --- a/readme_i18n/README_ca_ES.md +++ b/readme_i18n/README_ca_ES.md @@ -49,13 +49,13 @@ ## Contingut - [Documentació](https://docs.immich.app/) -- [Introducció](https://docs.immich.app/overview/introduction) -- [Instal·lació](https://docs.immich.app/install/requirements) +- [Introducció](https://docs.immich.app/introduction/getting-started) +- [Instal·lació](https://docs.immich.app/reference/requirements) - [Mapa de ruta](https://immich.app/roadmap) - [Demo](#demo) - [Funcionalitats](#funcionalitats) - [Traduccions](https://docs.immich.app/developer/translations) -- [Directrius de contribució](https://docs.immich.app/overview/support-the-project) +- [Directrius de contribució](https://docs.immich.app/support-the-project) ## Demo diff --git a/readme_i18n/README_de_DE.md b/readme_i18n/README_de_DE.md index 80f432071b..40cbe93c54 100644 --- a/readme_i18n/README_de_DE.md +++ b/readme_i18n/README_de_DE.md @@ -51,13 +51,13 @@ ## Inhalt - [Offizielle Dokumentation](https://docs.immich.app) -- [Über Immich](https://docs.immich.app/overview/introduction) -- [Installation](https://docs.immich.app/install/requirements) +- [Über Immich](https://docs.immich.app/introduction/getting-started) +- [Installation](https://docs.immich.app/reference/requirements) - [Roadmap](https://immich.app/roadmap) - [Demo](#demo) - [Funktionen](#funktionen) - [Übersetzungen](https://docs.immich.app/developer/translations) -- [Beitragsrichtlinien](https://docs.immich.app/overview/support-the-project) +- [Beitragsrichtlinien](https://docs.immich.app/support-the-project) ## Demo diff --git a/readme_i18n/README_es_ES.md b/readme_i18n/README_es_ES.md index e35e7b938e..6b0fc466d1 100644 --- a/readme_i18n/README_es_ES.md +++ b/readme_i18n/README_es_ES.md @@ -49,13 +49,13 @@ ## Contenido - [Documentación](https://docs.immich.app/) -- [Introducción](https://docs.immich.app/overview/introduction) -- [Instalación](https://docs.immich.app/install/requirements) +- [Introducción](https://docs.immich.app/introduction/getting-started) +- [Instalación](https://docs.immich.app/reference/requirements) - [Hoja de ruta](https://immich.app/roadmap) - [Demo](#demo) - [Funciones](#funciones) - [Traducciones](https://docs.immich.app/developer/translations) -- [Directrices para contribuir](https://docs.immich.app/overview/support-the-project) +- [Directrices para contribuir](https://docs.immich.app/support-the-project) ## Demo diff --git a/readme_i18n/README_fr_FR.md b/readme_i18n/README_fr_FR.md index 9ae59b414f..3937b64e43 100644 --- a/readme_i18n/README_fr_FR.md +++ b/readme_i18n/README_fr_FR.md @@ -49,13 +49,13 @@ ## Sommaire - [Documentation](https://docs.immich.app/) -- [Introduction](https://docs.immich.app/overview/introduction) -- [Installation](https://docs.immich.app/install/requirements) +- [Introduction](https://docs.immich.app/introduction/getting-started) +- [Installation](https://docs.immich.app/reference/requirements) - [Feuille de route](https://immich.app/roadmap) - [Démo](#démo) - [Fonctionnalités](#fonctionnalités) - [Traductions](https://docs.immich.app/developer/translations) -- [Contribution](https://docs.immich.app/overview/support-the-project) +- [Contribution](https://docs.immich.app/support-the-project) ## Démo diff --git a/readme_i18n/README_it_IT.md b/readme_i18n/README_it_IT.md index 96e720856c..03c93e9c94 100644 --- a/readme_i18n/README_it_IT.md +++ b/readme_i18n/README_it_IT.md @@ -50,13 +50,13 @@ ## Link utili - [Documentazione](https://docs.immich.app) -- [Informazioni](https://docs.immich.app/overview/introduction) -- [Installazione](https://docs.immich.app/install/requirements) +- [Informazioni](https://docs.immich.app/introduction/getting-started) +- [Installazione](https://docs.immich.app/reference/requirements) - [Roadmap](https://immich.app/roadmap) - [Demo](#demo) - [Funzionalità](#funzionalità) - [Traduzioni](https://docs.immich.app/developer/translations) -- [Contribuire](https://docs.immich.app/overview/support-the-project) +- [Contribuire](https://docs.immich.app/support-the-project) ## Demo diff --git a/readme_i18n/README_ja_JP.md b/readme_i18n/README_ja_JP.md index 1b7ab98dfb..d224a26da1 100644 --- a/readme_i18n/README_ja_JP.md +++ b/readme_i18n/README_ja_JP.md @@ -48,13 +48,13 @@ ## コンテンツ - [公式ドキュメント](https://docs.immich.app/) -- [紹介](https://docs.immich.app/overview/introduction) -- [インストール](https://docs.immich.app/install/requirements) +- [紹介](https://docs.immich.app/introduction/getting-started) +- [インストール](https://docs.immich.app/reference/requirements) - [ロードマップ](https://immich.app/roadmap) - [デモ](#デモ) - [機能](#機能) - [翻訳](https://docs.immich.app/developer/translations) -- [コントリビューションガイド](https://docs.immich.app/overview/support-the-project) +- [コントリビューションガイド](https://docs.immich.app/support-the-project) ## デモ diff --git a/readme_i18n/README_ko_KR.md b/readme_i18n/README_ko_KR.md index 4bd0b24a2c..2df2e02e8e 100644 --- a/readme_i18n/README_ko_KR.md +++ b/readme_i18n/README_ko_KR.md @@ -51,13 +51,13 @@ ## 링크 - [문서](https://docs.immich.app) -- [소개](https://docs.immich.app/overview/introduction) -- [설치](https://docs.immich.app/install/requirements) +- [소개](https://docs.immich.app/introduction/getting-started) +- [설치](https://docs.immich.app/reference/requirements) - [로드맵](https://immich.app/roadmap) - [데모](#데모) - [기능](#기능) - [번역](https://docs.immich.app/developer/translations) -- [기여](https://docs.immich.app/overview/support-the-project) +- [기여](https://docs.immich.app/support-the-project) ## 데모 diff --git a/readme_i18n/README_ml_IN.md b/readme_i18n/README_ml_IN.md index 238cfa9a6a..eef4f8a90c 100644 --- a/readme_i18n/README_ml_IN.md +++ b/readme_i18n/README_ml_IN.md @@ -51,13 +51,13 @@ ## ലിങ്കുകൾ - [ഡോക്യുമെന്റേഷൻ](https://docs.immich.app/) -- [വിവരങ്ങൾ](https://docs.immich.app/overview/introduction) -- [ഇൻസ്റ്റാളേഷൻ](https://docs.immich.app/install/requirements) +- [വിവരങ്ങൾ](https://docs.immich.app/introduction/getting-started) +- [ഇൻസ്റ്റാളേഷൻ](https://docs.immich.app/reference/requirements) - [റോഡ്മാപ്പ്](https://immich.app/roadmap) - [ഡെമോ](#ഡെമോ) - [സവിശേഷതകൾ](#സവിശേഷതകൾ) - [വിവർത്തനങ്ങൾ](https://docs.immich.app/developer/translations) -- [സംഭാവന നൽകൽ](https://docs.immich.app/overview/support-the-project) +- [സംഭാവന നൽകൽ](https://docs.immich.app/support-the-project) ## ഡെമോ diff --git a/readme_i18n/README_nl_NL.md b/readme_i18n/README_nl_NL.md index 062938c9b0..288376e1bd 100644 --- a/readme_i18n/README_nl_NL.md +++ b/readme_i18n/README_nl_NL.md @@ -49,13 +49,13 @@ ## Inhoud - [Officiële documentatie](https://docs.immich.app/) -- [Introductie](https://docs.immich.app/overview/introduction) -- [Installatie](https://docs.immich.app/install/requirements) +- [Introductie](https://docs.immich.app/introduction/getting-started) +- [Installatie](https://docs.immich.app/reference/requirements) - [Toekomstplannen](https://immich.app/roadmap) - [Demo](#demo) - [Functies](#functies) - [Vertalingen](https://docs.immich.app/developer/translations) -- [Richtlijnen voor bijdragen](https://docs.immich.app/overview/support-the-project) +- [Richtlijnen voor bijdragen](https://docs.immich.app/support-the-project) ## Demo diff --git a/readme_i18n/README_pt_BR.md b/readme_i18n/README_pt_BR.md index 360c05dee0..91d1c1cc35 100644 --- a/readme_i18n/README_pt_BR.md +++ b/readme_i18n/README_pt_BR.md @@ -52,13 +52,13 @@ ## Links - [Documentação](https://docs.immich.app) -- [Sobre](https://docs.immich.app/overview/introduction) -- [Instalação](https://docs.immich.app/install/requirements) +- [Sobre](https://docs.immich.app/introduction/getting-started) +- [Instalação](https://docs.immich.app/reference/requirements) - [Roadmap](https://github.com/orgs/immich-app/projects/1) - [Demonstração](#demonstração) - [Funcionalidades](#funcionalidades) - [Traduções](https://docs.immich.app/developer/translations) -- [Diretrizes de Contribuição](https://docs.immich.app/overview/support-the-project) +- [Diretrizes de Contribuição](https://docs.immich.app/support-the-project) ## Demonstração diff --git a/readme_i18n/README_ru_RU.md b/readme_i18n/README_ru_RU.md index 4ada3c0a54..84f2ad242d 100644 --- a/readme_i18n/README_ru_RU.md +++ b/readme_i18n/README_ru_RU.md @@ -51,13 +51,13 @@ ## Содержание - [Официальная документация](https://docs.immich.app) -- [Введение](https://docs.immich.app/overview/introduction) -- [Установка](https://docs.immich.app/install/requirements) +- [Введение](https://docs.immich.app/introduction/getting-started) +- [Установка](https://docs.immich.app/reference/requirements) - [План разработки](https://immich.app/roadmap) - [Демо](#demo) - [Возможности](#features) - [Перевод](https://docs.immich.app/developer/translations) -- [Гид по участию и поддержке проекта](https://docs.immich.app/overview/support-the-project) +- [Гид по участию и поддержке проекта](https://docs.immich.app/support-the-project) ## Демо diff --git a/readme_i18n/README_sv_SE.md b/readme_i18n/README_sv_SE.md index 2d85ac4c71..41abb150f1 100644 --- a/readme_i18n/README_sv_SE.md +++ b/readme_i18n/README_sv_SE.md @@ -50,13 +50,13 @@ ## Innehåll - [Officiell Dokumentation](https://docs.immich.app/) -- [Introduktion](https://docs.immich.app/overview/introduction) -- [Installation](https://docs.immich.app/install/requirements) +- [Introduktion](https://docs.immich.app/introduction/getting-started) +- [Installation](https://docs.immich.app/reference/requirements) - [Roadmap](https://immich.app/roadmap) - [Demo](#demo) - [Funktioner](#funktioner) - [Översättningar](https://docs.immich.app/developer/translations) -- [Riktlinjer för Bidrag](https://docs.immich.app/overview/support-the-project) +- [Riktlinjer för Bidrag](https://docs.immich.app/support-the-project) ## Demo diff --git a/readme_i18n/README_th_TH.md b/readme_i18n/README_th_TH.md index ed2b70e336..5a2397ffb7 100644 --- a/readme_i18n/README_th_TH.md +++ b/readme_i18n/README_th_TH.md @@ -55,13 +55,13 @@ ## ลิงก์ - [คู่มือ](https://docs.immich.app) -- [เกี่ยวกับ](https://docs.immich.app/overview/introduction) -- [การติดตั้ง](https://docs.immich.app/install/requirements) +- [เกี่ยวกับ](https://docs.immich.app/introduction/getting-started) +- [การติดตั้ง](https://docs.immich.app/reference/requirements) - [โรดแมป](https://immich.app/roadmap) - [สาธิต](#สาธิต) - [คุณสมบัติ](#คุณสมบัติ) - [การแปลภาษา](https://docs.immich.app/developer/translations) -- [สนับสนุนโพรเจกต์](https://docs.immich.app/overview/support-the-project) +- [สนับสนุนโพรเจกต์](https://docs.immich.app/support-the-project) ## สาธิต diff --git a/readme_i18n/README_tr_TR.md b/readme_i18n/README_tr_TR.md index a279c23614..678d37a26d 100644 --- a/readme_i18n/README_tr_TR.md +++ b/readme_i18n/README_tr_TR.md @@ -49,13 +49,13 @@ ## Bağlantılar - [Resmi Belgeler](https://docs.immich.app/) -- [Giriş](https://docs.immich.app/overview/introduction) -- [Kurulum](https://docs.immich.app/install/requirements) +- [Giriş](https://docs.immich.app/introduction/getting-started) +- [Kurulum](https://docs.immich.app/reference/requirements) - [Yol Haritası](https://immich.app/roadmap) - [Demo](#demo) - [Özellikler](#özellikler) - [Çeviriler](https://docs.immich.app/developer/translations) -- [Katkı Sağlama Rehberi](https://docs.immich.app/overview/support-the-project) +- [Katkı Sağlama Rehberi](https://docs.immich.app/support-the-project) ## Demo diff --git a/readme_i18n/README_uk_UA.md b/readme_i18n/README_uk_UA.md index 0fa6bdf21a..3ebca0e2d6 100644 --- a/readme_i18n/README_uk_UA.md +++ b/readme_i18n/README_uk_UA.md @@ -51,13 +51,13 @@ ## Посилання - [Документація](https://docs.immich.app) -- [Про проєкт](https://docs.immich.app/overview/introduction) -- [Встановлення](https://docs.immich.app/install/requirements) +- [Про проєкт](https://docs.immich.app/introduction/getting-started) +- [Встановлення](https://docs.immich.app/reference/requirements) - [Дорожня карта](https://immich.app/roadmap) - [Демо](#демо) - [Функції](#функції) - [Переклади](https://docs.immich.app/developer/translations) -- [Гід для розробки проєкту](https://docs.immich.app/overview/support-the-project) +- [Гід для розробки проєкту](https://docs.immich.app/support-the-project) ## Демо diff --git a/readme_i18n/README_vi_VN.md b/readme_i18n/README_vi_VN.md index 6ceb27b24d..1c4fed301f 100644 --- a/readme_i18n/README_vi_VN.md +++ b/readme_i18n/README_vi_VN.md @@ -53,13 +53,13 @@ ## Liên kết - [Tài liệu](https://docs.immich.app) -- [Giới thiệu](https://docs.immich.app/overview/introduction) -- [Cài đặt](https://docs.immich.app/install/requirements) +- [Giới thiệu](https://docs.immich.app/introduction/getting-started) +- [Cài đặt](https://docs.immich.app/reference/requirements) - [Lộ trình](https://immich.app/roadmap) - [Demo](#demo) - [Tính năng](#Tính-năng) - [Dịch thuật](https://docs.immich.app/developer/translations) -- [Đóng góp](https://docs.immich.app/overview/support-the-project) +- [Đóng góp](https://docs.immich.app/support-the-project) ## Demo diff --git a/readme_i18n/README_zh_CN.md b/readme_i18n/README_zh_CN.md index e704054678..9ba11a5487 100644 --- a/readme_i18n/README_zh_CN.md +++ b/readme_i18n/README_zh_CN.md @@ -55,13 +55,13 @@ ## 目录 - [官方文档](https://docs.immich.app) -- [项目总览](https://docs.immich.app/overview/introduction) -- [安装教程](https://docs.immich.app/install/requirements) +- [项目总览](https://docs.immich.app/introduction/getting-started) +- [安装教程](https://docs.immich.app/reference/requirements) - [路线图](https://immich.app/roadmap) - [在线演示](#示例) - [功能特性](#功能特性) - [多语言](https://docs.immich.app/developer/translations) -- [贡献者](https://docs.immich.app/overview/support-the-project) +- [贡献者](https://docs.immich.app/support-the-project) ## 示例 diff --git a/readme_i18n/README_zh_TW.md b/readme_i18n/README_zh_TW.md index 5ddfbdbd43..55e8f85771 100644 --- a/readme_i18n/README_zh_TW.md +++ b/readme_i18n/README_zh_TW.md @@ -52,13 +52,13 @@ ## 連結 - [說明文件](https://docs.immich.app/) -- [關於](https://docs.immich.app/overview/introduction) -- [安裝](https://docs.immich.app/install/requirements) +- [關於](https://docs.immich.app/introduction/getting-started) +- [安裝](https://docs.immich.app/reference/requirements) - [發展藍圖](https://immich.app/roadmap) - [線上體驗](#線上體驗) - [功能](#功能) - [翻譯](https://docs.immich.app/developer/translations) -- [貢獻指南](https://docs.immich.app/overview/support-the-project) +- [貢獻指南](https://docs.immich.app/support-the-project) ## 線上體驗 diff --git a/server/src/services/database.service.ts b/server/src/services/database.service.ts index 3201f76dab..f2dcc1235a 100644 --- a/server/src/services/database.service.ts +++ b/server/src/services/database.service.ts @@ -21,7 +21,7 @@ const messages = { The ${name} extension version is ${version}, which means it is a nightly release. Please run 'DROP EXTENSION IF EXISTS ${extension}' and switch to a release version. - See https://docs.immich.app/guides/database-queries for how to query the database.`, + See https://docs.immich.app/administration/run-database-queries for how to query the database.`, outOfRange: ({ name, version, range }: OutOfRangeArgs) => `The ${name} extension version is ${version}, but Immich only supports ${range}. Please change ${name} to a compatible version in the Postgres instance.`, @@ -31,20 +31,20 @@ const messages = { If the Postgres instance already has ${name} installed, Immich may not have the necessary permissions to activate it. In this case, please run 'CREATE EXTENSION IF NOT EXISTS ${extension} CASCADE' manually as a superuser. - See https://docs.immich.app/guides/database-queries for how to query the database.`, + See https://docs.immich.app/administration/run-database-queries for how to query the database.`, updateFailed: ({ name, extension, availableVersion }: UpdateFailedArgs) => `The ${name} extension can be updated to ${availableVersion}. Immich attempted to update the extension, but failed to do so. This may be because Immich does not have the necessary permissions to update the extension. Please run 'ALTER EXTENSION ${extension} UPDATE' manually as a superuser. - See https://docs.immich.app/guides/database-queries for how to query the database.`, + See https://docs.immich.app/administration/run-database-queries for how to query the database.`, dropFailed: ({ name, extension }: DropFailedArgs) => `The ${name} extension is no longer needed, but could not be dropped. This may be because Immich does not have the necessary permissions to drop the extension. Please run 'DROP EXTENSION ${extension};' manually as a superuser. - See https://docs.immich.app/guides/database-queries for how to query the database.`, + See https://docs.immich.app/administration/run-database-queries for how to query the database.`, invalidDowngrade: ({ name, installedVersion, availableVersion }: InvalidDowngradeArgs) => `The database currently has ${name} ${installedVersion} activated, but the Postgres instance only has ${availableVersion} available. This most likely means the extension was downgraded. diff --git a/server/src/services/storage.service.ts b/server/src/services/storage.service.ts index 95926d6509..12ed73c434 100644 --- a/server/src/services/storage.service.ts +++ b/server/src/services/storage.service.ts @@ -16,7 +16,7 @@ import { BaseService } from 'src/services/base.service'; import { JobOf, SystemFlags } from 'src/types'; import { ImmichStartupError } from 'src/utils/misc'; -const docsMessage = `Please see https://docs.immich.app/administration/system-integrity#folder-checks for more information.`; +const docsMessage = `Please see https://docs.immich.app/concepts/system-integrity#folder-checks for more information.`; @Injectable() export class StorageService extends BaseService { diff --git a/web/src/lib/components/admin-settings/StorageTemplateSettings.svelte b/web/src/lib/components/admin-settings/StorageTemplateSettings.svelte index e22808bbf1..8a149764a0 100644 --- a/web/src/lib/components/admin-settings/StorageTemplateSettings.svelte +++ b/web/src/lib/components/admin-settings/StorageTemplateSettings.svelte @@ -112,9 +112,9 @@ {#snippet children({ tag, message })} {#if tag === 'template-link'} - {message} + {message} {:else if tag === 'implications-link'} - + {message} {/if} diff --git a/web/src/lib/modals/AuthDisableLoginConfirmModal.svelte b/web/src/lib/modals/AuthDisableLoginConfirmModal.svelte index d9e215d945..6998d960f6 100644 --- a/web/src/lib/modals/AuthDisableLoginConfirmModal.svelte +++ b/web/src/lib/modals/AuthDisableLoginConfirmModal.svelte @@ -18,7 +18,7 @@

{#snippet children({ message })} - {message} + {message} {/snippet}

diff --git a/web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte index f673abec63..e5f5daa6df 100644 --- a/web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -255,7 +255,10 @@
{#if duplicates && duplicates.length > 0} -

{$t('duplicates_description')}

+

+ {$t('duplicates_description')} + +

{#key duplicates[duplicatesIndex].duplicateId} diff --git a/web/src/routes/ErrorLayout.svelte b/web/src/routes/ErrorLayout.svelte index 8976e88fee..a66c82eb33 100644 --- a/web/src/routes/ErrorLayout.svelte +++ b/web/src/routes/ErrorLayout.svelte @@ -78,7 +78,10 @@ {$t('read_changelog')} - + {$t('check_logs')} diff --git a/web/src/routes/admin/system-settings/AuthSettings.svelte b/web/src/routes/admin/system-settings/AuthSettings.svelte index 22118d97a8..d1a1b921bc 100644 --- a/web/src/routes/admin/system-settings/AuthSettings.svelte +++ b/web/src/routes/admin/system-settings/AuthSettings.svelte @@ -75,7 +75,7 @@ {#snippet children({ message })} - {message} + {message} {/snippet} diff --git a/web/src/routes/admin/system-settings/MapSettings.svelte b/web/src/routes/admin/system-settings/MapSettings.svelte index 07eb5292ae..e9eb9f23e8 100644 --- a/web/src/routes/admin/system-settings/MapSettings.svelte +++ b/web/src/routes/admin/system-settings/MapSettings.svelte @@ -55,7 +55,7 @@

{#snippet children({ message })} - {message} + {message} {/snippet}

diff --git a/web/src/routes/auth/onboarding/OnboardingBackup.svelte b/web/src/routes/auth/onboarding/OnboardingBackup.svelte index ce64f64fd8..05d6f3d58b 100644 --- a/web/src/routes/auth/onboarding/OnboardingBackup.svelte +++ b/web/src/routes/auth/onboarding/OnboardingBackup.svelte @@ -47,7 +47,7 @@

{#snippet children({ message })} - {message} + {message} {/snippet}

diff --git a/web/src/routes/auth/onboarding/OnboardingStorageTemplate.svelte b/web/src/routes/auth/onboarding/OnboardingStorageTemplate.svelte index aea4d7349d..4c18775c64 100644 --- a/web/src/routes/auth/onboarding/OnboardingStorageTemplate.svelte +++ b/web/src/routes/auth/onboarding/OnboardingStorageTemplate.svelte @@ -9,7 +9,7 @@

{#snippet children({ message })} - {message} + {message} {/snippet}

diff --git a/web/src/routes/maintenance/+page.svelte b/web/src/routes/maintenance/+page.svelte index 566231692d..e3b6b2d02e 100644 --- a/web/src/routes/maintenance/+page.svelte +++ b/web/src/routes/maintenance/+page.svelte @@ -73,7 +73,7 @@ {#snippet children({ tag, message })} {#if tag === 'link'} - + {message} {/if}