From 4adb78c181d5856238a11e93b649f7f75bf33eff Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Fri, 31 Jul 2026 18:22:01 -0400 Subject: [PATCH] feat(docs): reorganize --- README.md | 6 +- docker/docker-compose.rootless.yml | 2 +- docker/docker-compose.yml | 2 +- docker/example.env | 2 +- docker/hwaccel.ml.yml | 2 +- docker/hwaccel.transcoding.yml | 2 +- docs/docs/FAQ.mdx | 38 ++-- .../administration/add-an-external-library.md | 126 +++++++++++ ...-and-restore.md => back-up-and-restore.md} | 105 +-------- .../docs/administration/change-clip-models.md | 22 ++ .../connect-a-database-gui.md} | 2 +- .../img/administration-link.webp | Bin .../img/administration-panel.webp | Bin 8832 -> 0 bytes .../img/authentik-redirect.webp | Bin 18626 -> 0 bytes .../img/create-external-library.webp | Bin docs/docs/administration/img/delete-user.webp | Bin 7296 -> 0 bytes .../img/disable-password-login.webp | Bin 3444 -> 0 bytes .../img/edit-import-path.webp | Bin .../img/email-ms-settings.webp | Bin .../img/email-settings.webp | Bin .../img/enable-password-login.webp | Bin 3350 -> 0 bytes .../img/folder-view-1.webp | Bin .../img/google-app-password.webp | Bin .../img/immich-email-notefaction.webp | Bin 18550 -> 0 bytes .../img/immich_map_styles_publish.webp | Bin .../img/jobs-tab.webp | Bin .../img/library-custom-scan-interval.webp | Bin .../img/library-management-page.webp | Bin .../img/library-owner.webp | Bin docs/docs/administration/img/list-users.webp | Bin 16960 -> 0 bytes .../img/password-login-settings.webp | Bin 4968 -> 0 bytes .../img/pgadmin-add-new-server.webp | Bin .../img/scan-new-library-files.webp | Bin .../img/user-management-update.webp | Bin 15830 -> 0 bytes .../improve-facial-recognition-clusters.md} | 6 +- .../inspect-containers-and-logs.md} | 4 +- docs/docs/administration/jobs-workers.md | 74 ------- .../{user-management.mdx => manage-users.mdx} | 4 +- .../administration/migrate-to-vectorchord.md | 182 ++++++++++++++++ .../monitor-immich.md} | 47 +--- .../administration/postgres-standalone.md | 158 -------------- ...er-commands.md => run-a-server-command.md} | 25 +-- .../run-database-queries.md} | 8 +- .../run-machine-learning-remotely.md} | 4 +- ...rse-proxy.md => set-up-a-reverse-proxy.md} | 20 +- .../administration/set-up-an-smtp-provider.md | 49 +++++ ...ion.mdx => set-up-email-notifications.mdx} | 8 +- ...-hardware-accelerated-machine-learning.md} | 28 +-- .../set-up-hardware-transcoding.md} | 27 +-- ...auth.md => set-up-oauth-authentication.md} | 44 +--- .../split-workers-across-containers.md | 32 +++ docs/docs/administration/storage-template.mdx | 5 - docs/docs/administration/use-a-config-file.md | 58 +++++ .../use-a-custom-map-style.md} | 4 +- .../use-a-pre-existing-postgres-server.md | 74 +++++++ .../use-custom-file-locations.md} | 15 +- ...enance-mode.md => use-maintenance-mode.md} | 10 +- .../use-the-backup-script-template.md} | 6 +- .../use-the-storage-template.mdx | 7 + .../{server-stats.md => view-server-stats.md} | 4 +- docs/docs/api.md | 13 -- docs/docs/concepts/_category_.json | 9 + docs/docs/concepts/backups.md | 48 +++++ .../docs/{overview => concepts}/comparison.md | 4 - .../duplicate-detection.md} | 14 +- docs/docs/concepts/external-libraries.md | 51 +++++ .../facial-recognition.md | 42 +--- .../img/android-backup-options.webp | Bin .../img/background-app-refresh.webp | Bin .../img/backup-album-selection.webp | Bin .../img/backup-album-sync.webp | Bin .../img/backup-options.webp | Bin .../img/enable-backup-button.webp | Bin .../img/reverse-geocoding-mobile1.webp | Bin .../img/reverse-geocoding-mobile2.webp | Bin .../img/reverse-geocoding-mobile3.webp | Bin .../{features => concepts}/mobile-backup.md | 18 +- docs/docs/concepts/monitoring.md | 24 +++ docs/docs/concepts/open-source.md | 1 + .../{guides => concepts}/remote-access.md | 2 +- docs/docs/concepts/reverse-geocoding.md | 41 ++++ docs/docs/concepts/scaling.md | 49 +++++ docs/docs/concepts/self-hosted.md | 3 + docs/docs/concepts/sharing.md | 52 +++++ .../system-integrity.md | 0 docs/docs/concepts/versioning.md | 18 ++ docs/docs/developer/_category_.json | 2 +- docs/docs/developer/architecture.mdx | 10 +- docs/docs/developer/open-api.md | 26 +++ docs/docs/developer/pr-checklist.md | 2 +- docs/docs/features/_category_.json | 4 - docs/docs/features/command-line-interface.md | 202 ------------------ .../features/img/backup-settings-access.webp | Bin 15062 -> 0 bytes docs/docs/features/img/me.webp | Bin 15884 -> 0 bytes .../img/mobile-upload-open-photo.webp | Bin 20354 -> 0 bytes .../features/img/user-change-password.webp | Bin 4802 -> 0 bytes docs/docs/features/img/user-popup.webp | Bin 3164 -> 0 bytes docs/docs/features/img/user-profile.webp | Bin 6894 -> 0 bytes docs/docs/features/libraries.md | 176 --------------- docs/docs/features/reverse-geocoding.md | 15 -- docs/docs/guides/_category_.json | 4 - .../20231219_183007_add-new-server-option.png | Bin 39500 -> 0 bytes docs/docs/guides/external-library.md | 57 ----- docs/docs/guides/img/add-path-button.webp | Bin 1462 -> 0 bytes docs/docs/guides/img/add-path-field.webp | Bin 11576 -> 0 bytes docs/docs/guides/img/edit-import-paths.webp | Bin 2928 -> 0 bytes docs/docs/guides/img/libraries-dropdown.webp | Bin 1896 -> 0 bytes docs/docs/guides/img/path-save.webp | Bin 3302 -> 0 bytes docs/docs/guides/img/user-avatar.webp | Bin 1798 -> 0 bytes docs/docs/guides/scaling-immich.md | 19 -- docs/docs/guides/smtp-gmail.md | 20 -- docs/docs/guides/smtp-microsoft365.md | 19 -- docs/docs/{overview/help.md => help-me.md} | 2 +- docs/docs/install/all-in-one.md | 12 +- docs/docs/install/docker-compose.mdx | 4 +- docs/docs/install/img/jobs-tab.webp | Bin 0 -> 21128 bytes .../img/upload-button.webp | Bin docs/docs/install/index.md | 32 +++ docs/docs/install/kubernetes.md | 2 +- docs/docs/install/one-click.md | 19 +- docs/docs/install/portainer.md | 4 +- .../{overview => install}/quick-start.mdx | 22 +- docs/docs/install/requirements.md | 82 ------- docs/docs/install/script.md | 8 +- docs/docs/install/synology.md | 14 +- docs/docs/install/truenas.md | 27 ++- docs/docs/install/unraid.md | 16 +- docs/docs/install/upgrading.md | 115 +--------- docs/docs/introduction/_category_.json | 9 + docs/docs/introduction/getting-started.mdx | 25 +++ .../next-steps.mdx} | 8 +- docs/docs/overview/_category_.json | 4 - docs/docs/overview/img/alex-picture.jpeg | Bin 20900 -> 0 bytes docs/docs/overview/img/appicon.webp | Bin 59530 -> 0 bytes docs/docs/overview/img/feature-panel.webp | Bin 52680 -> 0 bytes docs/docs/partials/_mobile-app-backup.md | 2 +- docs/docs/partials/_server-backup.md | 2 +- docs/docs/partials/_storage-template.md | 4 +- docs/docs/reference/3-2-1-backup-method.md | 29 +++ docs/docs/reference/_category_.json | 9 + .../searching.md => reference/clip-models.md} | 59 +---- .../{install => reference}/config-file.md | 76 +++---- docs/docs/reference/docker.md | 42 ++++ .../environment-variables.md | 4 +- docs/docs/reference/exclusion-patterns.md | 37 ++++ docs/docs/reference/exif-tags.md | 140 ++++++++++++ .../hardware-acceleration-support.md | 46 ++++ .../img/admin-jobs.webp | Bin .../img/admin-nightly-tasks.webp | Bin .../img/sidecar-jobs.webp | Bin docs/docs/reference/immich-api.md | 9 + docs/docs/reference/immich-cli.md | 95 ++++++++ docs/docs/reference/jobs.md | 130 +++++++++++ docs/docs/reference/logging.md | 59 +++++ docs/docs/reference/oauth-settings.md | 41 ++++ docs/docs/reference/requirements.md | 90 ++++++++ .../reference/reverse-proxy-requirements.md | 32 +++ docs/docs/reference/server-commands.md | 61 ++++++ docs/docs/reference/storage-locations.md | 101 +++++++++ .../supported-media-formats.md} | 2 +- .../system-settings.md | 36 +++- docs/docs/reference/workers.md | 25 +++ .../{features => reference}/xmp-sidecars.md | 4 +- .../{overview => }/support-the-project.md | 2 +- docs/docs/user-guide/_category_.json | 4 + .../user-guide/browse-and-manage-people.md | 33 +++ .../casting.md => user-guide/cast-media.md} | 6 +- .../edit-photos.mdx} | 2 +- .../img/advanced-search-filters.webp | Bin .../user-guide/img/backup-album-sync.webp | Bin 0 -> 27772 bytes .../img/facial-recognition-1.webp | Bin .../img/facial-recognition-2.webp | Bin .../img/facial-recognition-3.webp | Bin .../img/facial-recognition-4.webp | Bin .../img/folder-access.webp | Bin docs/docs/user-guide/img/folder-view-1.webp | Bin 0 -> 112562 bytes .../img/folder-view-enable.webp | Bin .../img/free-up-space.webp | Bin .../img/gcast-enable.webp | Bin .../img/mobile-upload-selected-photos.webp | Bin .../img/obtain-api-key-2.webp | Bin .../img/obtain-api-key.webp | Bin .../img/partner-sharing-1.webp | Bin .../img/partner-sharing-2.webp | Bin .../img/partner-sharing-3.webp | Bin .../img/partner-sharing-4.webp | Bin .../img/partner-sharing-5.webp | Bin .../img/partner-sharing-6.webp | Bin .../img/partner-sharing-7.webp | Bin .../img/partner-sharing-8.webp | Bin .../img/public-shared-link-album.webp | Bin .../img/public-shared-link-form.webp | Bin .../img/public-shared-link-individual.webp | Bin .../img/read-only-mode.webp | Bin .../img/shared-album-mobile.webp | Bin .../img/shared-album-user-selection.webp | Bin .../img/shared-album.webp | Bin .../img/tag-creation.webp | Bin .../img/tag-enable.webp | Bin .../img/tag-form.webp | Bin .../img/tag-view.webp | Bin .../img/user-settings-1.webp | Bin .../img/user-settings-2.webp | Bin .../img/user-settings-3.webp | Bin .../img/web-edit-download.webp | Bin .../img/web-edit-interface.webp | Bin .../manage-your-user-settings.md} | 8 +- docs/docs/user-guide/review-duplicates.md | 9 + docs/docs/user-guide/search-your-library.md | 37 ++++ .../share-photos-and-albums.md} | 18 +- .../share-with-a-partner.md} | 23 +- .../upload-files-with-python.md} | 4 +- .../user-guide/upload-media-with-the-cli.md | 122 +++++++++++ .../use-folder-view.md} | 4 +- .../tags.md => user-guide/use-tags.md} | 4 +- .../use-the-mobile-app.mdx} | 20 +- docs/src/components/community-disclaimer.tsx | 18 ++ docs/src/pages/index.tsx | 2 +- docs/static/_redirects | 104 ++++++--- packages/cli/README.md | 2 +- readme_i18n/README_ar_JO.md | 6 +- readme_i18n/README_bg_BG.md | 6 +- readme_i18n/README_ca_ES.md | 6 +- readme_i18n/README_de_DE.md | 6 +- readme_i18n/README_es_ES.md | 6 +- readme_i18n/README_fr_FR.md | 6 +- readme_i18n/README_it_IT.md | 6 +- readme_i18n/README_ja_JP.md | 6 +- readme_i18n/README_ko_KR.md | 6 +- readme_i18n/README_ml_IN.md | 6 +- readme_i18n/README_nl_NL.md | 6 +- readme_i18n/README_pt_BR.md | 6 +- readme_i18n/README_ru_RU.md | 6 +- readme_i18n/README_sv_SE.md | 6 +- readme_i18n/README_th_TH.md | 6 +- readme_i18n/README_tr_TR.md | 6 +- readme_i18n/README_uk_UA.md | 6 +- readme_i18n/README_vi_VN.md | 6 +- readme_i18n/README_zh_CN.md | 6 +- readme_i18n/README_zh_TW.md | 6 +- server/src/services/database.service.ts | 8 +- server/src/services/storage.service.ts | 2 +- .../StorageTemplateSettings.svelte | 4 +- .../AuthDisableLoginConfirmModal.svelte | 2 +- .../[[assetId=id]]/+page.svelte | 5 +- web/src/routes/ErrorLayout.svelte | 5 +- .../admin/system-settings/AuthSettings.svelte | 2 +- .../admin/system-settings/MapSettings.svelte | 2 +- .../auth/onboarding/OnboardingBackup.svelte | 2 +- .../OnboardingStorageTemplate.svelte | 2 +- web/src/routes/maintenance/+page.svelte | 2 +- 251 files changed, 2592 insertions(+), 1683 deletions(-) create mode 100644 docs/docs/administration/add-an-external-library.md rename docs/docs/administration/{backup-and-restore.md => back-up-and-restore.md} (66%) create mode 100644 docs/docs/administration/change-clip-models.md rename docs/docs/{guides/database-gui.md => administration/connect-a-database-gui.md} (98%) rename docs/docs/{guides => administration}/img/administration-link.webp (100%) delete mode 100644 docs/docs/administration/img/administration-panel.webp delete mode 100644 docs/docs/administration/img/authentik-redirect.webp rename docs/docs/{guides => administration}/img/create-external-library.webp (100%) delete mode 100644 docs/docs/administration/img/delete-user.webp delete mode 100644 docs/docs/administration/img/disable-password-login.webp rename docs/docs/{guides => administration}/img/edit-import-path.webp (100%) rename docs/docs/{guides => administration}/img/email-ms-settings.webp (100%) rename docs/docs/{guides => administration}/img/email-settings.webp (100%) delete mode 100644 docs/docs/administration/img/enable-password-login.webp rename docs/docs/{features => administration}/img/folder-view-1.webp (100%) rename docs/docs/{guides => administration}/img/google-app-password.webp (100%) delete mode 100644 docs/docs/administration/img/immich-email-notefaction.webp rename docs/docs/{guides => administration}/img/immich_map_styles_publish.webp (100%) rename docs/docs/{guides => administration}/img/jobs-tab.webp (100%) rename docs/docs/{features => administration}/img/library-custom-scan-interval.webp (100%) rename docs/docs/{guides => administration}/img/library-management-page.webp (100%) rename docs/docs/{guides => administration}/img/library-owner.webp (100%) delete mode 100644 docs/docs/administration/img/list-users.webp delete mode 100644 docs/docs/administration/img/password-login-settings.webp rename docs/docs/{guides => administration}/img/pgadmin-add-new-server.webp (100%) rename docs/docs/{guides => administration}/img/scan-new-library-files.webp (100%) delete mode 100644 docs/docs/administration/img/user-management-update.webp rename docs/docs/{guides/better-facial-clusters.md => administration/improve-facial-recognition-clusters.md} (84%) rename docs/docs/{guides/docker-help.md => administration/inspect-containers-and-logs.md} (75%) delete mode 100644 docs/docs/administration/jobs-workers.md rename docs/docs/administration/{user-management.mdx => manage-users.mdx} (95%) create mode 100644 docs/docs/administration/migrate-to-vectorchord.md rename docs/docs/{features/monitoring.md => administration/monitor-immich.md} (63%) delete mode 100644 docs/docs/administration/postgres-standalone.md rename docs/docs/administration/{server-commands.md => run-a-server-command.md} (55%) rename docs/docs/{guides/database-queries.md => administration/run-database-queries.md} (95%) rename docs/docs/{guides/remote-machine-learning.md => administration/run-machine-learning-remotely.md} (97%) rename docs/docs/administration/{reverse-proxy.md => set-up-a-reverse-proxy.md} (72%) create mode 100644 docs/docs/administration/set-up-an-smtp-provider.md rename docs/docs/administration/{email-notification.mdx => set-up-email-notifications.mdx} (77%) rename docs/docs/{features/ml-hardware-acceleration.md => administration/set-up-hardware-accelerated-machine-learning.md} (88%) rename docs/docs/{features/hardware-transcoding.md => administration/set-up-hardware-transcoding.md} (80%) rename docs/docs/administration/{oauth.md => set-up-oauth-authentication.md} (77%) create mode 100644 docs/docs/administration/split-workers-across-containers.md delete mode 100644 docs/docs/administration/storage-template.mdx create mode 100644 docs/docs/administration/use-a-config-file.md rename docs/docs/{guides/custom-map-styles.md => administration/use-a-custom-map-style.md} (94%) create mode 100644 docs/docs/administration/use-a-pre-existing-postgres-server.md rename docs/docs/{guides/custom-locations.md => administration/use-custom-file-locations.md} (65%) rename docs/docs/administration/{maintenance-mode.md => use-maintenance-mode.md} (57%) rename docs/docs/{guides/template-backup-script.md => administration/use-the-backup-script-template.md} (92%) create mode 100644 docs/docs/administration/use-the-storage-template.mdx rename docs/docs/administration/{server-stats.md => view-server-stats.md} (61%) delete mode 100644 docs/docs/api.md create mode 100644 docs/docs/concepts/_category_.json create mode 100644 docs/docs/concepts/backups.md rename docs/docs/{overview => concepts}/comparison.md (91%) rename docs/docs/{features/duplicates-utility.md => concepts/duplicate-detection.md} (69%) create mode 100644 docs/docs/concepts/external-libraries.md rename docs/docs/{features => concepts}/facial-recognition.md (74%) rename docs/docs/{features => concepts}/img/android-backup-options.webp (100%) rename docs/docs/{features => concepts}/img/background-app-refresh.webp (100%) rename docs/docs/{features => concepts}/img/backup-album-selection.webp (100%) rename docs/docs/{features => concepts}/img/backup-album-sync.webp (100%) rename docs/docs/{features => concepts}/img/backup-options.webp (100%) rename docs/docs/{features => concepts}/img/enable-backup-button.webp (100%) rename docs/docs/{features => concepts}/img/reverse-geocoding-mobile1.webp (100%) rename docs/docs/{features => concepts}/img/reverse-geocoding-mobile2.webp (100%) rename docs/docs/{features => concepts}/img/reverse-geocoding-mobile3.webp (100%) rename docs/docs/{features => concepts}/mobile-backup.md (79%) create mode 100644 docs/docs/concepts/monitoring.md create mode 100644 docs/docs/concepts/open-source.md rename docs/docs/{guides => concepts}/remote-access.md (99%) create mode 100644 docs/docs/concepts/reverse-geocoding.md create mode 100644 docs/docs/concepts/scaling.md create mode 100644 docs/docs/concepts/self-hosted.md create mode 100644 docs/docs/concepts/sharing.md rename docs/docs/{administration => concepts}/system-integrity.md (100%) create mode 100644 docs/docs/concepts/versioning.md create mode 100644 docs/docs/developer/open-api.md delete mode 100644 docs/docs/features/_category_.json delete mode 100644 docs/docs/features/command-line-interface.md delete mode 100644 docs/docs/features/img/backup-settings-access.webp delete mode 100644 docs/docs/features/img/me.webp delete mode 100644 docs/docs/features/img/mobile-upload-open-photo.webp delete mode 100644 docs/docs/features/img/user-change-password.webp delete mode 100644 docs/docs/features/img/user-popup.webp delete mode 100644 docs/docs/features/img/user-profile.webp delete mode 100644 docs/docs/features/libraries.md delete mode 100644 docs/docs/features/reverse-geocoding.md delete mode 100644 docs/docs/guides/_category_.json delete mode 100644 docs/docs/guides/assets/20231219_183007_add-new-server-option.png delete mode 100644 docs/docs/guides/external-library.md delete mode 100644 docs/docs/guides/img/add-path-button.webp delete mode 100644 docs/docs/guides/img/add-path-field.webp delete mode 100644 docs/docs/guides/img/edit-import-paths.webp delete mode 100644 docs/docs/guides/img/libraries-dropdown.webp delete mode 100644 docs/docs/guides/img/path-save.webp delete mode 100644 docs/docs/guides/img/user-avatar.webp delete mode 100644 docs/docs/guides/scaling-immich.md delete mode 100644 docs/docs/guides/smtp-gmail.md delete mode 100644 docs/docs/guides/smtp-microsoft365.md rename docs/docs/{overview/help.md => help-me.md} (95%) create mode 100644 docs/docs/install/img/jobs-tab.webp rename docs/docs/{overview => install}/img/upload-button.webp (100%) create mode 100644 docs/docs/install/index.md rename docs/docs/{overview => install}/quick-start.mdx (69%) delete mode 100644 docs/docs/install/requirements.md create mode 100644 docs/docs/introduction/_category_.json create mode 100644 docs/docs/introduction/getting-started.mdx rename docs/docs/{install/post-install.mdx => introduction/next-steps.mdx} (72%) delete mode 100644 docs/docs/overview/_category_.json delete mode 100644 docs/docs/overview/img/alex-picture.jpeg delete mode 100644 docs/docs/overview/img/appicon.webp delete mode 100644 docs/docs/overview/img/feature-panel.webp create mode 100644 docs/docs/reference/3-2-1-backup-method.md create mode 100644 docs/docs/reference/_category_.json rename docs/docs/{features/searching.md => reference/clip-models.md} (97%) rename docs/docs/{install => reference}/config-file.md (62%) create mode 100644 docs/docs/reference/docker.md rename docs/docs/{install => reference}/environment-variables.md (99%) create mode 100644 docs/docs/reference/exclusion-patterns.md create mode 100644 docs/docs/reference/exif-tags.md create mode 100644 docs/docs/reference/hardware-acceleration-support.md rename docs/docs/{administration => reference}/img/admin-jobs.webp (100%) rename docs/docs/{administration => reference}/img/admin-nightly-tasks.webp (100%) rename docs/docs/{features => reference}/img/sidecar-jobs.webp (100%) create mode 100644 docs/docs/reference/immich-api.md create mode 100644 docs/docs/reference/immich-cli.md create mode 100644 docs/docs/reference/jobs.md create mode 100644 docs/docs/reference/logging.md create mode 100644 docs/docs/reference/oauth-settings.md create mode 100644 docs/docs/reference/requirements.md create mode 100644 docs/docs/reference/reverse-proxy-requirements.md create mode 100644 docs/docs/reference/server-commands.md create mode 100644 docs/docs/reference/storage-locations.md rename docs/docs/{features/supported-formats.md => reference/supported-media-formats.md} (96%) rename docs/docs/{administration => reference}/system-settings.md (81%) create mode 100644 docs/docs/reference/workers.md rename docs/docs/{features => reference}/xmp-sidecars.md (91%) rename docs/docs/{overview => }/support-the-project.md (98%) create mode 100644 docs/docs/user-guide/_category_.json create mode 100644 docs/docs/user-guide/browse-and-manage-people.md rename docs/docs/{features/casting.md => user-guide/cast-media.md} (79%) rename docs/docs/{features/editing.mdx => user-guide/edit-photos.mdx} (98%) rename docs/docs/{features => user-guide}/img/advanced-search-filters.webp (100%) create mode 100644 docs/docs/user-guide/img/backup-album-sync.webp rename docs/docs/{features => user-guide}/img/facial-recognition-1.webp (100%) rename docs/docs/{features => user-guide}/img/facial-recognition-2.webp (100%) rename docs/docs/{features => user-guide}/img/facial-recognition-3.webp (100%) rename docs/docs/{features => user-guide}/img/facial-recognition-4.webp (100%) rename docs/docs/{features => user-guide}/img/folder-access.webp (100%) create mode 100644 docs/docs/user-guide/img/folder-view-1.webp rename docs/docs/{features => user-guide}/img/folder-view-enable.webp (100%) rename docs/docs/{features => user-guide}/img/free-up-space.webp (100%) rename docs/docs/{features => user-guide}/img/gcast-enable.webp (100%) rename docs/docs/{features => user-guide}/img/mobile-upload-selected-photos.webp (100%) rename docs/docs/{features => user-guide}/img/obtain-api-key-2.webp (100%) rename docs/docs/{features => user-guide}/img/obtain-api-key.webp (100%) rename docs/docs/{features => user-guide}/img/partner-sharing-1.webp (100%) rename docs/docs/{features => user-guide}/img/partner-sharing-2.webp (100%) rename docs/docs/{features => user-guide}/img/partner-sharing-3.webp (100%) rename docs/docs/{features => user-guide}/img/partner-sharing-4.webp (100%) rename docs/docs/{features => user-guide}/img/partner-sharing-5.webp (100%) rename docs/docs/{features => user-guide}/img/partner-sharing-6.webp (100%) rename docs/docs/{features => user-guide}/img/partner-sharing-7.webp (100%) rename docs/docs/{features => user-guide}/img/partner-sharing-8.webp (100%) rename docs/docs/{features => user-guide}/img/public-shared-link-album.webp (100%) rename docs/docs/{features => user-guide}/img/public-shared-link-form.webp (100%) rename docs/docs/{features => user-guide}/img/public-shared-link-individual.webp (100%) rename docs/docs/{features => user-guide}/img/read-only-mode.webp (100%) rename docs/docs/{features => user-guide}/img/shared-album-mobile.webp (100%) rename docs/docs/{features => user-guide}/img/shared-album-user-selection.webp (100%) rename docs/docs/{features => user-guide}/img/shared-album.webp (100%) rename docs/docs/{features => user-guide}/img/tag-creation.webp (100%) rename docs/docs/{features => user-guide}/img/tag-enable.webp (100%) rename docs/docs/{features => user-guide}/img/tag-form.webp (100%) rename docs/docs/{features => user-guide}/img/tag-view.webp (100%) rename docs/docs/{features => user-guide}/img/user-settings-1.webp (100%) rename docs/docs/{features => user-guide}/img/user-settings-2.webp (100%) rename docs/docs/{features => user-guide}/img/user-settings-3.webp (100%) rename docs/docs/{features => user-guide}/img/web-edit-download.webp (100%) rename docs/docs/{features => user-guide}/img/web-edit-interface.webp (100%) rename docs/docs/{features/user-settings.md => user-guide/manage-your-user-settings.md} (72%) create mode 100644 docs/docs/user-guide/review-duplicates.md create mode 100644 docs/docs/user-guide/search-your-library.md rename docs/docs/{features/sharing.md => user-guide/share-photos-and-albums.md} (53%) rename docs/docs/{features/partner-sharing.md => user-guide/share-with-a-partner.md} (64%) rename docs/docs/{guides/python-file-upload.md => user-guide/upload-files-with-python.md} (76%) create mode 100644 docs/docs/user-guide/upload-media-with-the-cli.md rename docs/docs/{features/folder-view.md => user-guide/use-folder-view.md} (81%) rename docs/docs/{features/tags.md => user-guide/use-tags.md} (67%) rename docs/docs/{features/mobile-app.mdx => user-guide/use-the-mobile-app.mdx} (87%) create mode 100644 docs/src/components/community-disclaimer.tsx 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 f2f171914be1b80b4b4d12c567ca7c46b8e87e28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8832 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 V&WPGZyR(7WPqlu3_h-X_X|!#5yGa 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 Tk2;{GqzD0R9{>OV00000u>?;v 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 9d03e5a94a740264804b22e3d1719656fd3c8cd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7296 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 W#C!AMBme^VU+oYe000000002Mw#}XZ 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 d1401f2afe87414a1e5bf048e0d0f12fa4b97d39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3350 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 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 8da19bdc2b83d829f555441005f32c31f9c022ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18550 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

3^ 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–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 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 05b7fb3aa747932e47a14fb9aea9181a1e49d741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16960 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 AzyJUM 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 fd61a18d03c684517b7c9a958245e8c2e52cb2b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4968 zcmY+Ebx;(Jw#S#Hq(gG4r4f*&J0v6)RvMI)ZWd5LKsuL{ZUhMl1*CiViFDV}9fE{Q zH~a3JH*?>;|DEs5neX?U&zU)T8mg*qp8^2JFO_tRbR@wB|Eeck0r^+6k~@4X220raDn~{8EMkYX<5=! z*#qJt?N(a-#{`8xWn=FwiK!(Jyh~D87!!yUVc%o_<#Vt;gVk=&Xml=_IJ2wlyk9Op zJx6D25s)wY1eEJwp_DIoEa9wWT+wu&#V8bc7|#7Y2bDm*ceB9WS1-yr?ec8?>PA7u zbvi3Fa@obu|6mI3ny8>+|EiD4LqJXm=6IoIzbyMw88U`yrY6dC zfQ40IjWCOo2;gbv-4vt*{@{+cHaLa%5LeV_zmxRa0CKm`sufR2Tpr`iIT9=Rn&wiK z8DFb?nP9990d}K6S5N3!|97E(W7DCDGI$uv-eVUqcKEZ^{9n=PA<6$a$^S{^D~aQ$ z8Jo|~T6xB6Hm~af`Jg)0>QEh(*3~d?NxsW(1L5$^E1u<@`CY?#0-w(6noviYg@GGh zTmCihv;Sb=T1Ri1lkTt`Fw-*!2Gdn;j`x|t=JS>E!A*dlJeF%-3LQr=H?Cudq5A*7 zaqXGKL1qq!nu@ACv`8471v?qF+8NY)bltq_squUiTKTh9WDh_7g?pR!pTHmO?qA?M z+P1aCx=@Dz9;<*J`C**{*2k1dW%m@DCQ(!Wgp}NWnUox1Nf6=tI--~2awnYU{Nd}S z%_ffURhSJI!@`5K$&{L_fPl+@lZ`hj@MSRwo%RO&E5tonVb7%GIgqEFf56iI_+E?%AKlK^^_1d~QORL?DOPR?|}(3hkbLdnY*sOB83s`%@Ky)m%en1l|O=n&JHO^sn}%R2?P^@EL=M zTr=*Nn|)M)8j>P55Z6eU z-A|F?N86(5p=0z(^&JVYX{Z3aKd-1e^S5+6HX_;gn>tz}UKVr$8Ckauvez~(Ni-Fq zSlFU6fE#ub>+{kq-O3?x>Pi-s_DgkscuhVbl-v8^in~7O6QeP7K>-yjajHj#SvN9% z;oAG-Hpzp?`&-A@B^GQqV6)QYbhSs!9vkq{hpa|#I;@^ocm+=zvlloc>dgczHwix* zv`wx+!b}R&q~I2?CiY?XY0f+6F=OQ$zeL!Ef6n^WiJuGy^&O|~Ez2p3$}f|Mwe`2j z7HI)G7pk*M<>x!5-T_+1>>wFycU0S&TuLvo3!7MVl#+3JLmMPZzTtvZ6V%J1^L--a zWg~M#ms*^$!uIa>2s@ci=1P3-h7h7$m2Jqmglg9s8`ShEZ`(u?Hyps+f2&Zu53YSmShFMCoJu;hL+CAgstR&2D z-#RDG25`8#baKRI|_Dv4q&Y0)K&*HAqqP^&UA}*Wr z@Tq$W!ExkGXY(b+=kq;I+@P@NNZTH(305eYTmMz$_0tG*kxe1>dWKm#6<>3p468Vh zar>@kR7BK=+V0sA9nYC~n8)5bJL^TKBbAn4{>v-5cx{1R`TSEOxUB zdTa9Tbw0Ox?M7lr3T7b-B&)5(83DFfc_k=GrZ%PaBV2B4CA&{J>A6Y8%Jq{&QZh5# z(4Jo~&eM-U3!7RQ*piAkL(z}=>bB{xL+Fe~NRgh|W0vWPD}M%TVMX5#( zpz^=y0*-FLWqJ6j&(y*w>^1PG_>*EPZZng{ZQ4fRv^QddwNUStGDCZM_h{JV0GGvc ziTBox_;jr&Z<>>o(Ebuh@%k-@nurnTwE$nEge1K|C1;bFAq!t}$MooqZ`u#enP$gV zNt|zA?J#tx1_%e69xAL7dywJxXTpgWad-o)n7F|n$l$jVz9~d!&EJyXBM7JdNW)qZ zI$CaegHFEZ!bxlC#Iw`9-;9-Y<=9cad`n}@rLt$x3%gAvk0UzNKlPthJ=@T~LRR(I z_IqThwOZ21xUy4yzLTnNoj=HS`0>Q(L>QzsyBo4?-9-Q03b_2sRr>O#DNXqFQjnrzItw_Uw4+pRjF-_2`JU8a1y;uUP4 z+9JixATJ8`dJ1JI9r$q=wdj(h6QpWFg^Oz_*7EjpLVVeuGQile>cIk8T+4B1w%I5* z)=@J_WM+LJb{Imd48;9WcTLUcQOg-SaDP^y6i4|fr^+11#k!uFFzh;{s;mt!{`0`4 z^|9YZdtmP)pUIe+^_17VpSA;D0G}g=14g7GJcv&}hCV`#g%Xh<_f-nn2n=_N>+RQ& z9ow*cW&h1LdKK^_zqT)^?bFM7Ls~QDg{&+wIgN@fryibVdy>}G*t~+fOq1l$HYdG| zdozSjd&7#zaE0rLl~rh;?E=~tWGfbw?Y8ZJ|L3xU)A8%*95;h;)mzGU?3XVskB8du z(8+Ot6NUOT%nPB14~5S!%xDRJGNjw&>l{XGzKK+n)WF~gr&NKln-fN4$isoRPunU5 z9Bb@`N{@!0i0SDkrWff6FsO2TN}sTyD^2_^U#;0zikhgX!5GB=|Xn)u2%UjD!;<|cl)<=5AZ^}3YYZN#2cJrm;A3Eg0o7-x zFwePoW4Op~p_m%ZAieGj{tV>&k9w#%qcbBAbhK#JcPwWAC0TCi-ABZhG(Mi$Fe%eQ zq3OiyTls;KW>N>;xU5IB!th8!6qiYmpxDJZeP!^9yjF|-Yar_Y8??ppo@=J-WZ;te zx5nB;D&ER4I@Zb}^rt|T7`|H8t?&hNVyoSfC5`$_^`V%(N#+1%;Qc22C4;w!HV;A0 zy7=S!);-0Wzpc*eUE@I!gREHMpG=tGAE>{sON)@Cvrq*4IvGdh{M2<|-S0X7vjK>% z{oc~?dA{>qXIlP(T9>qUBW4X7BnLUqle3Kw_y;8|W>O;um@PFD_aFM&2KwjAg*77H z0br-3*;U}pz_!-)eL2WFDTa4EvBim;G^Pw4*Q$eQKW|ru=LA ztFYVGUTo9I48?_P+QH8BDYxVCZwxaPl?PC0yUi_>Gm39sad6tRo)_IekvmB28l3(MU)Ie!_sIt^ix=V7O=4%rwH}XzR8M#H z4xIhw9h7-)k(obl8fD8)9Npl2doj*|E0O=&fq*5bZz(B^`Ff8TT-<572-~wXu^Djh zn^p%fa7VvCjUu;ry$%2Xur5pM0YV!uk+Mhjt2~p<-HjE`5R_y7{t6kVzN*}hc@o(f zz3-S+fvb6RYmT06<(7)$KASTm6F0KeVrJ6z?nXD=-)DDqIt~-fk&NUvcdYw#b{xD6 zjd=C^ENQ=e{a$q?pO)qi*&5OpOSyCRnOWQ~`{ZtwD*sG#*Qb`;n(+OZHt)QI=3>n8 z-+&MpuMcWj!AGQfha@`9>yOl5Mh9PC-L`uPWY|auWEQxI_&6t4wR@&PuMsHrV-<*q z18Q3CdjnMhiW0W<{Xoa1%xh<_d_Q`Gk;hlGi<;FN%)YO+t~}~3Z_C?|KcdSt4{L*r zSAK<f@1JhVQxqVH+wh~^t!%Hbw1e%>NRCmEbdbEJPNJGj0V zX=rnW2{IBJul9EuuZbMo^V~x}@~28LQAtXy>%1w4+(H*BJ0|DZ`5+{x zc9I+t@?Oc!;1!1tciIW01yyGy+iVrAc$COu8lC0o}VJ zdGNlAy!Eg(prV*n4&JK65S7vR|bi4yW(;fiL8#J?P0V1U~kHChz=V{Z3*lmnj_2GKhQ43@zj z0-9;61EN7Lq|$@m=YVTPi0xM)V_)x%x1Ujw2}Q##qzQ1l1Xh&KFxl7^oWTuEN6T`yHiM!qBJfL ziiKnipq74t!uKJ?qL=Oy^DGsA8|o4$_^Y*cDYc(;?o#xJ=c6`Q{+RzrGX#7I>R#00 Xv&NsKK^U!?+!q4Eqke(^^+)~(4zbL({uCud zMW=ZI05uUoc~yB1g8qN*YbAiPfT;F>LP7ZEj4KoSF15vx)GjdIXFKd-)pZK_b{FGoj;CW?cX0CCs%S2_%?rkK1#lR z)=NI4-}wSQZNK$|e3HJ}zSv*o*nXCM96qfc^$rl;e)jkYy9Ig}zkR-YK3d}RUif!E zGMxDz^d5fZJ%K-jp6K8C4}HkJ;d|=7Z_epYcD8!XeNsQmJ^^P2LI2_uvZVDd})+hTI&xZpBGO+Ap%S2Kk{x1V@5^n6o8O-N> z4L>8u@(+bmjQhwC!DKGV+Olk3tEoGocgorfE(Z3z?`vaDKH?wsi>MKB&dt8#<=HdP z5TpMv`j0V}Vx8OWAW1ZYt#v!nw6giB|9Rtft-@f7JN~~e-lY!soh(_BRrQh@L0*fS zP5GO=ylS>jAB*W1WySrk&Voqq2qLPr{0)_T)aV+?<tHh~ehSmfx*mNrNYh032PBeu+P5(jvsE{`hFZz3o_d$6Uw?(f}ism;Ky(!Hs>gJ0sSL5M0yfz*h4-`gp7yb6})4OWghrqV7SF%m->a||%W?_IvMV*k~LI=3#M>t9lZm1?P zGQkr_zz-^X2wf)YWMc}~;06wS8%mq{C#GWC_v^@<|NEM7Oj!t2i{ z?o%Wl;9V}R^a+NK!taK>%#EwcGq}_9X{?A|cONuFF)6wI!1w4IcDblwbjbk^610Nj zJ_$f5X2v7>`esV`0ZV%wy#E2%=pz=CBdL-8v5zjGJ;{Ihf42&iqL=nnp9FW>X|9y) zwT{gXtq|BPNzEUMIXkL2nmvpdgwa@s0P0D&`aiT`?keTs2I);qu5@0}`QK}?v*!lu zm)S^iUVV0AYm9mk9q}@yROnN<;y$lov@C9s+49@N`9H4z54qK8*M0gwxC`++f_>HD z1(|b0twb@mlR1a}lSDhgp;Ye>wCw ziJ(iU&@)ZX=qo*_MrArvE?o2SHhs-Npv#^j?}Kwp`j0On1t9qlNa%1|_eKdDRL|Q1 zBr&pEU5bmnppAQOMa^7xO&SN~Sn_QrT?rP!x8zZl=UUsD!#r2N1vA4V8dj1?UpKAyt-4YR+c_vBt`n^JUGT7Y4BP-dd!KA4 zb4u(p63}T}qF@*sofF5PUw2{?lPLrEB2uwq4bb4J-cGFtR>+gCHRC@5P{FH8WO7ty zL+IT2;E;34rJrhr8D-ehvC#qoe!t7wfZv^|$Iq@XfUYACqxMA4qTL-baBYouk0#UC?fhZp#Kvg{Qft8kM-jkULwOPFa<7Q zdt!DoH!~wV@{P16>_&;KW+9VbfezDH|GO>zGhBuRFVl}ZJnS)Nh1vc;{qZv|=iZA( zGGOXnuSL}>Oj=SY#!YM@w9Xo+O1!erb~767y5wV~626gfFHbi~34?tFD@6qzI65&GktxCFXbEFXveBLEgUV4EgM zL1_=tvUA>5*QQzqXOMSL+~|~>`vg3{K;dyF^uo&inkXfeoa;gcU6myPf{JB*@OIIk7T<~2Km`gpHZriGpdW;`1S7AaPNiP=>&Ks*X~aEUYytvRC>~Co7sTGWT zu#YI~GWS)nLfoD!FmGkSsV}jY9?{!V_jaTf823KMjrE^U!0M1VX0R}bB)8lM4}Wpn zC6h8+Iz93i&{~~G#NcanhA=PLYZDoah;<(cLt_tUi)uzBa99XcOoYNK(mWJ(F**91 zOZ#T87fCv$$d5fwGT}e;RtE7ScF9=ry>i*Au@b8vo3_B_`(F^$ge!c}HYPobs z`T~HkBgdJXb;r)NHN!6h!3`fOLOfwbw{oQ`-@gGs9|oByDaxl{hcH}ZiBNL1bxwgPw_*^H*MXe-YZv)F zQ+BU6oQM{+O5>B2c45{Kk2Vlf;fM5MI@p_@q&r#^-qXA zZYjav=fo5=kK`iXW`?Dc)Th^Vl1Vau#B&Kaw)y@DK7@n!6>EbT^WMhJmpys|D$!@; zt;@gm*V&y<(`*GOFB)xKqTsKw^#ZShNW`#aA7=!^6WN8S zD5uNLNm(E=>LPZ;Q#=qCO_FqkF{4JD;}S^&LcwKC0X0{btlkc-(WZA!jG0BUx-E}Y zqQ9@@^Xy=td@<;Tzt;JItd$3f{dog|nUoBmf%_1;peuCi~ABv3I9&LSG=)w3g&n8YBKPE1Y`*Lnd#p+J}M89vLHjc9qE ze-Mp>TgJ=!f)4Qtj+P^b<>n7&(f|w*Q4!PXH4C`Qt#i@YxfC{+{;EGAD!wMl&2AH% znYNb%4sf0)>oKOyb6Pnp41pRS7U{6=n>7G z*P{eft7xNWC~F{IzPD-GM}eycobDt&uh#=Ql9a%DV%F72`gKs;A?N!|^X_&pI3$<- ztdq|}-5+b67+CcR55BDTXh*r|2+eztm_sLE5;qm5Tg!~FLrNyM zJ;W8WWJH-0RVuPaw>b^IRdWo zR{8mb{_;COz}WbA9*1yhEowZZIWC7L8Di57ZAHA*R-S^9=q(H7J{&T zzLsN=Q4Bik8=*BKAh#^7g{&xRE6EaGbcs!~5^mW738XQVhpjOEPJzc)0LNDd-OcM_ z%Yw%!gTfOxlRf|}U)30MkAGnWp#!lTh_DaxhPED50FXMbCzf@`KY?~y28nYh@iJM^3w%@7b7i@^NUt#rc{GzEH;f&=N2yNv!>_xGVKU@* z!UAFP(nq>4<@cy|LD|_w%tFkXcxqtr>#AL3$o%7F^SV?@&B^)$pGNQFv_NeY&p*8J zX#)4OXgsi%15r=PQW9%viw)wVFpWl51aox%M~84dxNGwVQ#T<*EmexAge}ZJC`6_0 z@r)=zQcMF>OBf1+ujLd8$cNOa1!pAoY;3=V$f)MY?W`zm9M-J0Yz~fa8)&g`M{PkS zwS49A400h{KheObIPr%mmzvHk!^q#0PHr+FQwM!}qp`lqF2dhz-*v1gt?+xjpDo;T z{4v`EML{PW=2X7}uK`ODk8*+)(gr@eWQfNfZV~)KS_+U~siLcm#!w9HVLmrc7n}NK ze%hAgexlmOy51DW40{CBrCc!zuwR~C@lBXA~N7kgYfTk^ZbTC`N-2Ut$LvK6-< zSU_G$6o}N+`N>$zxGXkh)GTdtPzdnt>b3Ti#a*jm&@J#C%#npdPlRrL63-`r9MTYX z$zCiG9efRQ7grzmE_D$OJTC*OG z`-}Ld%5n0WEe75L&8$Nnr%4IwK+E?v3*7_`5|e(dKo!q|AK?^?>%IUZQ9Pkjt8YBY z)V$?5eyDyasn8ltz7xt_Gwj)&skke+#tGZk185G!-}8(iJF9$Y8DcH}1R~+Fx8Bhd zrp!=IM}7b8o(Wapdb>@s{S^eVkL>1N=g_3{g(7EsrHW~{lS;4PJTTmMAGI$Wu^)?$ zCVB`rd;JHMq!j?#4GveoVpB;z1`jFQ3NT(`j}KNRH4Y&Q@QK5=3Az9kriL=>AOB@! z`{n2%>a!%+J;*|Hw@Fj#&x-!%nEkNA6K7*kC1WH$HD0lboNSD5T4CksJrj&F$I`}kf;uNw=Oz~oPu9O~5pAFi6Z9yv!StO6oNJ^`b!fMKZb5T=vr7>G`&N-oZQOsT`@kR*Aa{tXgw z`Z2k@fplVsi&y^cw0fr)Di^{G?riofRM+x&Ri9j0k(rA-BRY*H^gd<47>OCvv>1F7 zLh<=?_Lcl00c=wMey!R0jwWulw8&03Up`@>)?D<+p29nFL!6|kJ;K}Gu5m)Li7)_{ zl4C}p<1SXbFpFFzMVJwd#K0RS4nE9pLY&yAHcoN~T_`RJO31s`tXE!;lB&upr64#n zvj;@CXLNfihQxr7weurk(5go<0Ox2osLQ^GINWw@{f2pZ`-uaQ=w4@b6s-zYb8u32 zN69md7)kAoNyvU=>=rHY01Y-qt(nk}3JC+9O>F(VBT<+Z8LUOu`d z+Z>P<`{|pq-4p+zv;i-sBrD44WC*|V8kY1UtG$PA|3<27uVMM@I9}b!p@p4@LDM(& z?(3Ya8bb2r6;7FsKBPu%4pNWi?dxO>0$|2cgzme6?@%1s+OaD)soE7R58j3+LL8n5 zy`?Jx?E|awbde;3<=sU$+te{B3R2dgtKY=(v}tkN?d=j*2yFuR&ruk_KE{`%W`d+j zN*q!L8t+(*HHt&_qRmQQ1btQWG?ME`w1gX+#j~E}lXJVcH!ujxhTnws!@s#wu&ozH z;MeD&Fviu~rH2Tc1#F&xJl)a(0IMx9OdU{@i-CT9HRviBNFezn`bH~|X^Pki+aA~w;@RS?EU8t147<#}j1FrU=No)!&WsC67< zJ~ZexdMxAozl1rOs?&Flkv_~TlfJ_7XpC3hjq{wg1(35+L9-iwZCr)r|6UY6 z!xwpSh6^01lBuSMo9AGW$W(z}O8x4?(ckgYD%*4B%6tT^vuXmD%$sf}mt-uP|0~b$ zX;n?B{$&4xv{!_Mgy)>KPv|X)x3RzeWWV&WETjm9(*AuG_CepWIsO`4M1qUQC~!aF z$LFVPAbXoGb{mB64Tkk&q=XEM|Gok{N2GegT%sB=l)Ud|6u7T+L!hiofi*>Ra>7dMgSov1iISVbaS89v-d;74l3JozTEQ&!n6&F5?2jQc8R|jyM0=ej zQ0n=*<1CQ=JG3JpgfEfa4sir;ry}_|e|;z5C;#LO6*JH(BO$`O;lAkfS#k6y?yd

z;Ky$QD}&O|mPJn}kFsc~1^HbT)CFU0`qvm1jV}l*|#apg%-Ph2)3&}+mPIUe8$_z(Eo|?`NCT2_llM+lk!(h$sgh3+Lm+(YAQ?A!%o`^Q{vwHcK}P5reV`m^g* zQ5BKiz(~)xz$~B=<3xCJ)9w0WQY&&MoG(1dxHFhNAcZN0Bm*xGIL(+dmLchAWe;Q9 z0Y%dwJLXLRQm27pfIFLkx07hzxl z_j|rPzP^2!-d`KkBcm<95l*MGLL4MMP+6rmps{l!U^i|k#d2(xvY3;PKu zD@bsW+UDz3zVUhr+gg&W$mE{~@1utoA|cYI9ysh09yZIu$ci9(9So|iBC3e*fO{A9 z4x~fRfr!o?jaq_2B(Psx_Q?nj@G@?lU`Knx=E*25!!PFXvOg)pcZ{23k13k z!{T3_-&9l(AwpRzgXh7?W~k(rc1mH9LU2V3_{#3<7*WfTZ;;yat#+uO|rnv-tzY+$ny8=3=Oq%Cc$JEA>vb+QY2Z zH#oNm+}ZjqqkB?^Mx&XRT~!%Iu5R+`>F7`+s#~#dHFD$$8#9qn>ett4iW919U^Df> ztEGV{7W#HScB8Jv)VUwmsi$)a^|j{P&S;Y@!>N|kjFzgjN_vXBf;G`NzHW+=c3XT{ zKMk(#FRE-fL!r1(=<9?*!PyUt76H2Qw5kSjQfClm+z}A(>Xz$61k7Xq8j%B)(r$~V zta`<{H<-0SDr&|OwzM;;k*l(oK$z?-AF>sOP5`8v#T$4^1}6K6m_ZI#73dKsPnGwC zx$e#?mEqjcAKBumgQp?00201g?Gg2m%F(DL2U>!-WGakz3X#9H)RRJMb~kPAM4Hg_ z#{O&rNv-{C0GWz@%hSAJ3^Y;E#C#@nl)ze|P^~dJ;oTm=9fO$HQ1y7MUB;}_NA^Q; z7=`ymR?I9=0@t462nag~LW~4rY+-*iaFhQ)4|QsI3a`8XkWF@%ola_=qmzqocIcPD z-_zpG-;e4xH1}H*%hPh=%cdPU)~7JNEUR5CirxtkA_ZERd_rNJ{W%)!eyz^ z0Vt<|)Vv5~B`Msam?S(OjJ$^(d$+?rAV>v=j0qES`o{;~Y;j0?VE@NZ95u!~WsGbYv~h{4sokW?tA4 z&tYbbx47)bZyaoFg{a0(-}wu-kXr>VV?|?B#EPi<&V8$&JxcRUb)c+EYzKkBRUFyf zG2bo{7@C{i0&yGsAE+!SkSnq=3Wjs%1ZMnC?aACXF#4nfb|%*x0MgDw_JbcGkq^Yt z#2RHE23MnvAWFZ1)dO=9G%Vh8_##PgSfhoB`mcJV+ndPY!_o3bk6c=cz!h=x0`!uh zxb;4F@;zmW2Ob>6fn$hdH&P26RoewZtAQ=AqXAtW&Ce`)dTL4aqSvx$2Z}_DmX}RN z8yeQ7Z_ze|MX(dElAGMTXM4MVoO-*Syc+Q;>za$ywo%t7&A)z0mHoqWnEJgy!mU3C zGTCmBEHmrEIzoAN9_!qK2dTEcqZq|Kc=5smBSyrsdp`~s9=j2AB1eHOu89UCo9}pW zwaqal4tp46#u8=3O&|~~5wDeBtPwOTz*tY2dJ`u~55ynKXRw(`#uZM}}ph5Tq}9Gs+$Rb-Ar|KRqFLRTZC=}N;%+eD}M zY=bX6ZP}zCC5`&6RH}>l7uG0R0_9R*%GzSegs&P=%EJFn0F%-;f|N^s@CXbbr>zNJ zNm^9-Ynt}l9>MyxmjJgGx1~FZw+qu?C1rCnlBvNfr!%IEFsP5(@ih>(f;lOIaxVG1 zcp;?{%)kY|disNZbwTR4*}Gs|SYDMXqs&Bzrxu5Kvcd4B{(L9ZWAHlu2%$T@1W8fk z&(^B4*Cb^;FRN0ikkZN~wJ~|J@t@nKI2x@J5Z8~8to#Uo&wCjo-hCDJp7z0WiQN4| z#%2iRX$Vt^zU4WYaGR^e!@xaOGi|}Lc@h2$RROWoLcle_z0}E%OG=^F$L@<3Zj=c7=y>u78{GtaGGoFAWx6 zg2w?Cm`&}Y+f)}BtZ}&<)cPB3vj;My)42%e7V(*hPBCdF_7+^#gZP8iHiIIj?LiQ* zhJ`y~LYu|TXRw#^&jQ4TS^;=Gai%f#uFnbN*)FlVbtJJ`pKjOAzWMR*%{I;@xW08Y zOXV9ieH19p6@R8-dhl|sBvyV5s-8$&Za)rzxeieKV_RD_8Ct)^Y~hi^8i|eesvsxJ zWvU$#l0+a3xn5B*MjTw&LKN}0+~f3{ox+)UephIPix@P^KR*BeO%}cT4GF zchV?@&eyH;8bOrQj%bU1I|;a{5Fs$1PZ&nAuipxFb-3#WBpjnfytYI--`lOk9EA3; z88ST_a9x8WrwWpxo+%2idg9v9S!z@V4h~a$o@CCr{b52X7cxR0Xrt|DcEK!5&qFa4 z-ir6gHjx_Tyl<@n)FMeX4I(z%)8n0s+I{E4aZ3YOYQrt%BA|27;@fc)P@;WX%nAkR zZX4P?L*Kh3x#vt>ABI2$kOJhMFwsyU4iw0PZa26_kEQL;l>BDugU00RwLhRo7>H)K zb>OIhuESq%OpDG@0bsxR^$zAvc>kzB$CcuJTrXDO*vW%$l$6_VaVIxjO!$Kh5@p9P z1ZRX}z@Hpi*o0z(;AXBmOZz9i(ebp#;;m>C&-hdeB>mPXpz=3ujt$N$!FcGCwkS5R zESZ4Ibmv3y;au_7exzzZ$Q2A%MILJ_$U8BF7O7ie{7{bz?{d{6nDOaI5nXqeH}aFG zA(+D6gyx&S2Z^nVw4D+4?~kGLA5UDmvnhqNn&$OF+528<=Q~ALXQs2aQB#8KY`wl- z7|`(uTTX;R6d&Zot${Zk1&edoSUn(34V#;-1(u4yuLhw2Y8_m9xJaNE^JK~YNgl2= z)lj|H?D6sZp&>Ai)_sAAs(o?!!H9H4QJ znSS-hf=sRu40mCHjepp~I$lEhfn}$tnCHs+Bg#F*U{1&~F& zKy^Zhmqgxtwy?j(5bi8ffTi2k$(cWEzI+#!GLM9wp6+bYAw-DJep5qv zxedJZ=f)!yLFWNUVO0`i=&x!`%}^jwpv#Tm$= zJRX<$w93 zL%;_yp$76y)&c5Nf58Qm;Y!naG7#~*Cvd9sN~{kZEv{>3l(w;8JyP1!L9C68Pu9oQ_%h z`8b5-dphG{0{zLe1KK?dQP5UCO>#}nv9x&3IpO7Nos~+HFRK&*ctddlnnt3 z(s?&T3RM;gEK72*X?kDOGF*Q@AKLQctI-?TZ0)16(PNyV6t2-6ZXc}3hv`0BfdpdG zwkKh5XWo|v<6!j{oY_mKw*HQGwX=g8%8Tk3>M2M^7h`_(v~^S~z^NO3DGQlFO#s;k zQB7vwnU@OrO{t(2QpHdjRTf^{>m|180EU&OO}L+!TC!KELOW= z>a*}mpaL4WPN+37lZLwB-1nn5--Fj7T5^(_Xf+ufx+;k%lQ%q^q&#;f{^J# z>$YcZ^dYkaDp^8B%p^l5UX$fD(Tf>QknIFuS;<&7sK0oLhfDhV~hm*R(O2H^ErBhyM^Xj-)CY=B}jAT_S{V z9tLUlr-c?N_6k0sXxOgA4Mv22kzFL|9m!k#kid5LBqA88@`lVbK_WFa=_B26-&%9WIBX&B}0(1#%9_H1&z@uSN6I`(TzuI8;H%*SE< zN)Du@h1AqUY-}VnHxrzn4Jyk0$>L(J53fHm+uepMCG??9m0ZOVq92jNLa(u9fhgwh zindnan_*${+le|=oU3Nwd0TycSWNQpBOtv1x11nL_zQ%}J&gA*Ssn|<;fIpPcE^1xm{ zKW6l0-=_WL8&Ye5zR?fGTL!!(WP1p=W-`%^C2R#qYX72;EB9NajvG)@Fq>Rzmx`R0 zlA*+yKrEUYTkX!hj$ofQZiUFXR%dCKS;pxIzj>8)80UA_rqTl+F6Cj(HBf?MDzcf% zj~<_wCkcw!Q|;N$iNBMV565fows$IAdFl)g1L*WElZ$-Y_b?1Pym0%Q>~wEI)a+)ay~GkRqKM`i zUq8SMoRi1dr2NX`9r_il^eak?*#Xt|%0=~B27F)*xzWx@==5X+ z5pJnwvv_mH3^t6pXSJX5TGtUEOp`uo>WY?WJth2MQwI(CcbTS04anGLOCYx`ZJoM{ ztuw5x>7CT5HhnFnwEpL}^puH9KZNGFz>PF7nK0vW*cvzdljBx$l4O#YO@60ko(uLEtyBfSYQdcH)%Q30vex5wg;`Dy)Kpe)l>biC{BBSV-SEBe zctQ`W$o;%CY-38dk1zbLaq74*TRcPEm7`dD;T3y(tXbflOv3|x4BVzBMVx*aFklYE zqLSxVwc5DS=$IvJX*3-FUt`IPRV63Or;6HS*q5&5+~T*+H1AL{QyA(4YB8%MNnckh zOS_%|8k}>FE5@;Mi456@GJ;bakM-)RCpr3&`4sH#%x)x;jl3bTW^^yU+IC||E=32Y zPYd+B31G-!Q`#>rlUEvp-C9*q1K<&Jkc*lL=ItNQ>SQ;j2Zc`cpqgA*Vl;GqarGvLS^ZvzMJg2I*|`9#Oeo_A2ehkjB6{GRP7qNDxsocWss7bxsr z_dlQ9TO53RD3M)zB_?QLDgAyL)~_g!j?HQC{@Z+_OS|`bnoD+k-{eS|D+4(FUK32N zNNNbsRDY1AKZDp7)G+qM^)$nDu$Ae8X^um&8*X*x&!ha-G!uT1`oTni|6GEKHnbug z+S`M2ky+1o%rc>b9pBxD`~}QiY~A#v8T2xVhUQqMhTX5p84}Fc9D>B( zw-`@ch@X8`Z^pOW6$CH}V{WZ(iYRB5fJBE)b#cYkiFg@?o{n>UhNNV&?{DDTvz3VG>i)D*7BFo99{aMN0w_?lHe zQ(dUgTe*v1wE^23KI(qHguPGA%ph0CVGW)vFDk-wBaV8{WYvWSt%uX;6uU!)GAXZ1 zOY}r+uE7rul=?BUyQ4;uthxEz3Uru6%t?$G&S(0qcDKbV_n`p+GMw1i`O|j>8$PSv z7#K|rY}?3`l+%Nt2#f5yC)qfO)X}PSaJSB+>RC;g=nlVv1Lbl;%XV?ZByLDdeF0CA zd0>?T-dvD_8PAPVmK4CxP#2OMx)ckz145<@CdpmlxkB&fDL{5#@OoB51X_u%#m*@$))O z5^A!#OB8n@(7Lt^6YslAj;q9N7OkYh{DHLRL`K;_vrsAE_Xa-3);QNa0!#U+AcUHjie*$-&N z#x5-YGelD}=~a7Hgo?o+dbrjDe*qO#?|fptKr|f~p0{bvc}4N%b};(K(ySram| zLY2tN;B)n5*C0p+DUynjcQK6ljvfM5vx=Qn|3dVV%>^d9(jl`iPgW!{9&#P|gDUk4 z=SwRJc#75ILMsqcO=Ve24Dn>=o+-G*B@Gi%G{DE|Bd9CabDqP zR@i(bJxZMO+H5`(dvj=kovCT6QWuhS7M&6O!oOnP!%oF-8g@-P1y+}t^@^ryxGh#^ zV_SNhccR~1((#jFndEmaE`sTCW4wy}N=vB~1D6FUh{#BDTE9GPFByC=5b|Z{2=Kv_ z?2{f4h_&E#+FtC`f9Hm7|AJ|6%0KZzlfx2EkHIp+kvr~Vs=&@{@1Lm=p>|@d#90|x zwrScaNv&$Hze)mqY9By8=7VY(17Wj6|BX`AjteIW9^0>Nwh6<)u#i0=WX z;%x{buR&ikh?>+86y;6opZqA5vD=(fXTNRgQKQNX2F`MkaOf7AZHN{bii4@(Q)6u3 zyLeVj!9HC&!jA>45>p-R$T-R&cmqmK_ zq#?4)p2w|J`M^C?yWWgRU-!UJh-CbX!1Ik~tv-;DFR$I*f(_Bo;jWFjchMtq zuJe|e0@GS+p`m~FiY}v?^P%5NAfq&GUuRCZ4LnPJqAF?-^9SEmw5Pe$vQYHA0Xzh} zd7FV5It)JGZvjBtAY)Fky3>JgHhhw1nzmWLl_T4yd?5A!Ek8a$sQpC&muZ!AgJm-{ zbN00=WwH4kCh1~PK9m}N%|#*-o{k z3o1#1gF6}^QXV2xVr!i^@HP8-?MwSNZ!5Fbto#;4Zi=v>uI3rdyCETQjI^RAV_Q>= z4<9#S5)#R>NC=2Bq)+>JWQPdIF7A!oM2T~-4N?@wX^pp4yW=S-L=ktArV_GtJU|(2 z^VU$jOJbo&qnmcke?ykub3_}2xe9IATMtisav^P3PBPEW5^<6Kf-UqA%c1qlOSWhZVnnhixa4%9 zFND$uJ?sr1hZOsZQAy@-?eqHhF+Nfco;d`}!xf4NLrNhJ2C#W*yA(e=CC}(m%!i`q&Nk{m{DAR*m5LotM%p_b-3pF zLR*!FR=8n+-l(9M)#5WATuD6e@-|fIIMg>4Zxcw7T6m1ifaINKI-ypMZ8Cg%g-0dm zOIr+Qp!&#<5z9YUc7@7t*Rr`(S_btDiht%%+i zknHyrSr!gGFJrsm>gc^>)mqN&{ULGp5g5Iw-DJLT4nerb(4fWt6_lcIC1V7*4}Eo? zRU`WGh(CnxJ_ou&i=(HK6fX!r8zBP8aS_5mwDFR207_`u>O}Ab0Emx!9`$;^^id-;4%z5B6-Ueo_pbOZt;uYHgvGeP znMl4KQtK_28xCzkCjEu|@;2~Fg^%I(59o|Y;M*j`mTq%$^OK>8U(e(+8rEqm=hj{hR%dJ$ z0W*Okkoyc+sutPyVHUbvro^!J*}bPa1z8YO@X6dI;T;KAD3U>A3GW>6*3_jfe@lyN z4akDOeyp?A4*Bue@%($3fP)AlOt?ZSAVdO& z&Hx2xCfAY-YxpJMcz$qm`4oz0XxYU_E6ZYEby;h*Lm-LP`J^J`x5`UPyPb+HOc#0X zDD`P`M;C_p_dCiX{i7>zH; z&h!)rJjI*rNh@s=;UR04ywMq2=jb%iAz(_Fnc_kY|3!grIJ5_2rC(>?CbQ^Lbg>Me z$i5uZL&9z8)rcKI*W=Yq7Pw(0IcBO+GVQsqEm*4#W7MrXiW!S9_T+Obls_SB@T z!(iFql|Px6IBGL5t|H#flLEi#pE(6;)L`KpCylHbm>=;Tn~bQS>N+Y#>mA=&r<;Tt z6I9VDk6#rt$X^PP7~nDl6~`=JI!?W4!w`w0m>q}4rW9!t8}&1X^1~Wc{wbH zs5Fy=(7TuucHCGPzxpr=C{M9u$F!vKFk}#E`GO(Z{ynZF&6?qttZxEAlyKDJTdo=%e;qFRa5!;PK{qU68h%6t$HT?f|4*Cw{}*lHA1u2OCH+Z8!l_J;F4Mw z@*BxOQR(SvP~Ac5bT^FLYoYvgu4mOwqwwnRIt!GupeL2sTOTt#RUC~3u}F`n`i?Fv z=Ot5r#A;;J9BHF0`%Khui9rfDl`Q3l4qJ9k!Y5ounD!H5gLtGCqtyXY?YC8l@e$boK&c0V!lvva_I0n z%|fno+n^atmW?{SY_PS1{Fi{Ykchl{ji?8zCbB~woN#LOgII!yd!pS)xyt}G42tl{ z_CWaqu2~`Wn|K`$f-F!D4I~2w&(hc_YBFruReW&~X*_NH3qo_RLjO;yn1TNgUxNki zKsBZijQ#y`MNBE6#y58>y1T`+DalN56;Voxt4FH~Ob)d5?qK+Z^m!7Kf_SC0FV=y#T=f1HTmYi2wiq 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 06243af79934f26555d3f87be3cd8195f9a9bf39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15062 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 diff --git a/docs/docs/features/img/me.webp b/docs/docs/features/img/me.webp deleted file mode 100644 index a177086ec297c8be7ef409469d8077bba9a0fe8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15884 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≶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 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 a5d36ea2d9ec2d4d13f709719170ba4eca72f57e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4802 zcma)6Wmp_amTg>vI|TQH-~oa)PT--9H8kEpa1HJjBm{SNmyjSqg9Z=5H8>58yVJwl zdEb1qJF~lUe^lM7ud41nbkd4G?f?|Ut@#|f+ zMj0zJV}24g1Aq$4%3;mD?kL^-{``J-DcMzIrFP zp%3pb0rvwJj%}smeu0PrMD&HpW9Q}M&r+E2-a`-~Bfx7fm?v{hk{LG?$JZy?mu)jB zF32&~*)jA!j*ozAnnO_**%TnD_rM5{*WDV_j?#=RRUQtE5EV~z>{jj&@9Q8w1r7k4 zel$0A`zumnl3i1}3@(zQR=#gR9&+9s*0touMr9kXmMSs@W+_p{6TsM(_A5N5LM#XS zdYEcAC+13vBdd>d6VRp6{(9}l@v#t#2SLj4UCTP-PMrK*x`_zWMCwZita>j^rBtq0 z86|07OtFXR!K^@n7JeN$yG?q7jU|JB0f`r5|{36%m3?j_dMyBe+G4O$n|GH ziB*UIA@BacJ_(8gMZ;b@oe{^E%LK)f_1brjVT_F~1YCa|{6}U3q5(@^reNTPu0Hv)Tj%e8JVuhj-o7?4+J*H^G^=%IhlTJ($8&TWW5zTx!RB_;{0 z08mv2V&mo=nvhjc-!d@rzgRkZ(SlRVM9;e1`tHu)H2WREiyo!I)VMBp+9?0=1T1ca z&nrYP-ln4l?io=Tz;{H_DUHUMqEN8EN>3rB^YPAdQxh)h_vKC8dcSCX#srPM$nG1N z>ghY0zYwwD&`eSvezXw?u`A}(jG_z}m5;MeDpt~v;l3&Rx$Q6evM6NG!?D7dm57Hs za{wCO7XFs{U#BS328-PLa)YxQG>PsiE#`0~pmJ^nUMwdTy$vow=srXi=^H&=`xWp= zF|*Q5dt|Fjab=M`$UZKu1)FmhITTA(jr$hkRLLYaAX`1Y%hPAmJ7BT0(Y3Ie2K=Il z8rTHl3_V8!e|<5c!$~}b%Q9IdMY-|pmF8s~YO^S2g2IY3u?;Pw8mA|;*~W=D51&Ye zg;}!V5hJQ{nh#l#N4V*mbs--A=d-i7tk8Z#?oyV@dUWrjd+!DFyk)nU+SPk~qQeVA zo4|bD0%Vu^4N&0}bJ7-R@{GLYzZg_*OUuj|=pJKzub*|n9@VJK=VQ(u@<;AoSvAY( zFgQX0|97b?nN94+%9)Wk_Yc`D2EMroSQYSEKB7hWN)s645+3H}){8d+IlVs}G?WHn z-^yj+G5&{Sc;d(pmBfE1gw3GXuVC2L^--DC-BtK!4{Yw;e-Q7#X+E%zfK{NxDsP7L zjq{RiFKU2l-z4bYh~`NPZ{F!-<(F3^UP4AddH+Lre{~O6&jd1k0N@dkPdE+$0O(hq zH-A{;@8^-t&1W7T+cc}?jx{Y3%FkGeUC!aG@T$jGM!{_m4K7u;^CS}XI|{)4=wt@0 zLzn(_^5K8hYnv?>!o^H=H=E`}5IjXj3qH zZI5lY7y|aYDD(n8m~r~RyU{N+Pv_~d#zyiO_c^&LZ_b-_PDj79^{8Vk#wg_b&5LHh zlbpOx~u65!)P)(iO(5+zG?$f-^Lac03MX?z;kWwO@eX{fkD6&#z3-7 z7EwbiB{d1eGQR+=+|V_aSaU}NGx@O2h`#weRWOs7*&U{Mk1|U6ENFgqeW^@xE(g1I zeJFi5@K=&NrJLzqj|mN|nn=ZG2k{7eZA^96t}(5^@j~x+^geL6%bZBQ!9r6~P)xOr zYX;$blw8tcpY~gebJ$C414XULIZ2REHa$+bNesoI|M*oFJ^11d^q_*+bn8 zX$^Rrq^x{uR|VMok+BjPF1%_G_EZHVi>Q_Q+7;d`*Q8sEA32}K1vBbBH#UAZ6u22j z_;QaH{y|quH^R~X-e6nMnl&eYjkR;jGVn_`0;rg--^~ar+Xy*KTlM}nfYe1H?OvS{ zIVL>*73Wj(p+T*7??Z<7sj8p$2vW+g)jRfY(!3;@Xa4oG3(6!XpbVBol*1gemKMWq z7oVR9D!5ydQ4@!cqPs$-fw_eh*70V0upz;HG@JDC3idNzF%2U+?h*}gqL1O0Uk~%I z!@5L=W>%I(S8$qv86j&r!m|4YGDSgx6)?%~hwKaMdn-b=a&k{Rl<1`jSnKmSQC= z9m^_LX&VSp4VP)=(y(=!Mu?iEX={f|4i&yQmV5@gLP9e@SFwBW3SJF{^eZA_?92b~$ zyLNbZ!jKGxQHt|n#O_Qp?J;NRl8QwTDfzP|A4##)>uxY~*oEA{#xM5J4Fl`3r6g<& zIrwCba8t=K{Iysd+pZJgTa$%UVZSHJ40*0f`$t(LTznUnDS(ZZYN8At+iw{kc;7v- z1l9Btl>KxDj$G9MQRA1_=eSQ+`4APyP&ok?UfmHe-DdviiSz?1fmug%xJn^Oe(P5& zGw&zlmPIwmNSlh;ZcGNxCNUQ<{(f`n$l=AW4DC{HcG4kkJyjNScD%+0tpQ`2=3OPy zJeL`N19YA%wSGEDYA!&L3&1*#Yz=e!c2eZ1PGiqO()e&pUtBPbBEE5sbGq#=c+HR7 z+Ugz(RV~^iZM>Fy#Vq_uE~^Fhmmc?H4;w{YBh6WfN8Ui-#(KHC(!MF;hTch-Xqxojzcf)W8)etk?ok`GbB220+P`-Pk^ zkbMg{YeFo{efT;TdH86cyIf3p8a*6}pQ^_!)Q!vX`9zm<>3KX~zHP5?^7^m6c40Ao zarP1`>gt0`KYLR17Eh7rr55_L7D{qd;q1Npef%OVs{oF9Pm^Dj^!4rU2UKYurkjsa z&K8BrpmcdtsPxgi_GEFdd};_V`;-`x#UX{yH-+@SRkC+60CcsP?(AN~GR8}v$G zhBLAF&kmZC5FTt<9n+^PD4jtMYBb}ODldr9hWRFvwl|I?O71x0zBUGUwA0B0hVU`x6nnCEhGh6)yW?maf=%4@d5I{6W}BNykk7bbWRROxqlLzk2IiJ=yby14LmM|hVT@v z2ZpqL9ltCr>TlYs$TXwZy8VvJ>8qYZI4DsTnH)ll0gxWF$-k8(S=fQ2>|3;gfFusl zN)_~b#_=w6x64CsEb&)nDPOtN%&|-!QTh2rj^Rg{=CCcLjYci32b{!m;YxJ|6njq; zFEh2j5{XY`)}lM9tR(F3WLeR$VE*N_D*ptfqjPgwu+Wd+a6AATBa-pWk^x&cdv4GFuMd0#5oig4H}DzpEEbgsJ* z5mmWN4$nMePR!*@0(#de?mE|(Y=L0$wfhm0-n)u6Qbt7Of14PwsC zyEbz=XuDN)T@h;wXO?0Q7XuZ zD7^dK?!n87b)SWD7t=<4kkm>8l{zEx`uBu8^w^~C%q`sWII+J*9N+s5V6}aI#zTB< z4l@h03Vg2b>CgDHl{SzyQ+m)qAt-gF5?3t#(1~FCw~@-dJP&>v6ejw04$s_}=B{xu zA8}50gabPn46sNKU}MC+%=6W41CGSbXU_WAZp(@hwU=&hk?^)G3u*zY%3y(r{k3ZXmo8Xt|jn>c(g!0N0_Eh9-Nb^H5c(?mPbQ)CR#00#`0I6LA_;z-Gjd(LlVvQ`qQx*xtQRhegsh2`AFbR@o>%R6;&H^JX9)40P#c z%)b;Y9j*-Wsu^g~%tKeOovTOWFjZQ-qlA9nL-PrSWRAQ+C z&P%$`xuELf!d2HcqrF^|`>aQc-wo!)D%_%Gd30K!Zw|K~gGP2H=HH+I>0aSP*Y!Sy mBt55jkkA14w_eFlMtv`kb7}>JMsREyjhn@7M?diVh4F9JtUet8 diff --git a/docs/docs/features/img/user-popup.webp b/docs/docs/features/img/user-popup.webp deleted file mode 100644 index f3d3c08e5fbfae44038c66c0fdbdd2690767cb1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3164 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 C?-gwT diff --git a/docs/docs/features/img/user-profile.webp b/docs/docs/features/img/user-profile.webp deleted file mode 100644 index bba9499557da128c8524f4649c84d062585e6cef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6894 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 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 934c8c792fee721a1cecd3fd1770ba043c3ad123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39500 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 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 014999069fe205906230b08d83d4dd71263fb577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1462 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 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 70cc1cf7cf49970f74463abb4ede7c1c1b3dcd60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2928 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 diff --git a/docs/docs/guides/img/path-save.webp b/docs/docs/guides/img/path-save.webp deleted file mode 100644 index df0256a3dfffdea2b5b86f487935f95c6e25e98d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3302 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 Gz~2CVh)2-? diff --git a/docs/docs/guides/img/user-avatar.webp b/docs/docs/guides/img/user-avatar.webp deleted file mode 100644 index 78a8fd92704251ae6a98e674d908fc8797d7a6fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1798 zcmV+h2l@C?Nk&Hg1^@t8MM6+kP&gp+1^@uCCjgxRD&PQg06x)TsZb~-qoSr$s(An! z31e>YAOXsJJe53jED!Mqqs_bCU_9sdUHw=(Fa2V_&E%`~y3yS5A4|jR(e6$C8~x9P zuCU$R*H4eHL!A%(Q|u5+^mG8`$+O#h>}hLt+dpZ+C)IkeONpFs?M(m1dCAxT|B zxr42zCURk6nbAB6aYiq^VJ$M8I4CH~x0)xCP_cbqzNr zu-auo{m)Qy)mf+CvB9sa^^SilVxLQv{PQ-Sx>1B&*5^V1=X*h@0092?d4LQjZER3C zFUpjr8E!cx!Wm041XcGp0E~8$iA*+5hvPWkJYW!(AhF~3$RR>UtZ2=*?9P>?Uu-?~ zEYtb{I0(=vKeEunSM#?Yow#U5eecb%DNwshr?7jSBm-s7&c*(mu_-Y#p{ER|2*`o? zdr-Ty);o?Xj_4K@rAG$DsTbj^712DG9Z&qyf#wrO!fDtX#To-^t39Vp?8lvB_&gK( z8^{qqAwh1c{#?JOgUv$O)KOOv?K#eBZGpmL+tjWEp(I+tuqQ&%&;45K&r|PqCzc-U z(_k%4VA1PdSM6ZYDEau?Nb8&|(#2_$+Pd#nCTc5y&YrZaUj24;Zw|$tFM;ML%p{1% z83)Q~#}zd$+3x9lq`l(BLw;u4Dx-@BT=BKrw`?TJ%In+ohdjT}Om8%}68U&iCnHsq zY(wlO{ilmR`F4g$)V@DsWhX)vSqKPeQM7EoVhQjbUxvH8g+7}V5;}%x<5E>J7gTAz zf(`aziJ3*0;U$FG4kZqo@KjY*1=PBm0KHh#GC1S7JV@a(9eG@fj`MHFV-{aoe8^}|AERbo>Fx>E9-M@C&=!YdW_uZ)Y|Dx@eZ#3 zH!y^iJQ;-$dTV`%HeSH+yn+&Y4lBBRx&K>_(JG%;@^)y)=z4eR*Q~$NsuLdVHL1q? z;-?YNv{ZQPWO`}n<;rFqSoWO$=czC)WIh=V^LeKQf+loOz&j#4vEzyLoNRHuQ~N*Y z=Kb(2(Fl$ChCkpZQ?rx(ptLpMLF-r~**<%oz(oejCTywVOZ6W(2V%Du@V0nS$y?RY zIF<38aa>!$RxTiFym-P7X={U+o}J@5t^Yb)*bGoH0e{)L$iet&Q7AeC{9cAesx}RU zPYmcUEYSHieSb`aKnXARdxl!>Hk=Q^o$G4j!kQsOsCvIX?=3_RE7PKctk%nGfC!^> z)X+xufw<@9-jne>e0Y@R}Q{|`y{5p9KT#yZj`6bFC?dMd-Es9i|@N?R9C0&3YZ zs%(>E7cl3Rs*p|kjX)(8i$G3UJqIUf7Z#z>M;(6$4xyZ+(vBJEPg~8xTp|LH;PM~< z{JfGp*JFcgpWw4kiAW(o8QSWjkQwpxWKXNyIDq9<759rSg$X+Ki@yO@Y%zT*>lpHxp2o7=b;n)5|JwGP$KU-ZpzWg0 zM?T)7)E-sc;2<^P(v!fXKR?wGb*c|#UD;W+IZ{{g$pC0wAu8jPs1yjLC)==UVJ_H@psQ>7Cxs4mwT+XBqTt=#jnp=xMv3P+cc z@gBlCG{%B-MAt92?1691EVlJ&e*l=##8t_-6s6p{^5YG;-3#%L4fX1F%DXGH;OQ@WJ<%)fB1vL=840EoYN)c^nh 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 0000000000000000000000000000000000000000..4cd5ec5026a92f32bc55c194ce6becdb40b3fac7 GIT binary patch literal 21128 zcmbrkbChSzmMxmLZQHhOJ1cG5wkqwcG%9V|wlgbj+x*?H`JE+W^z-W~UVbAV}%L6*P->^L%{i%ANJiB+)r z0^y^q>^}wC_cV_Y#zs93dTjj{KYEJ|$e*`vHp@JE*K=(@_a2BJR6jY(1s8Ms0;=)J zx<v0B-i@J0JPdqdc~v)OCoFToOV+Pm`B`WbOWc?@U+L;_OplArUQ3AY6u zKIh*;zBM;3#uyLsCIG_$E&%B7-cN_olX-VZJA-S%OYh+Kk0-|Gojt&8!1?#vS=6`1 zE23(EGJqOjvkCe(`V4r>Z2`>QI(&M3&KeRP^=|ZD1;l<%yc>U)0u0_6pYqxW76SwT z+<@LM#6HCb!b`wQz_5=20PuYCkplp1o;(Wz03UsW@$_>G5`5-K%m-|V@z}*bJ*UY` zMyyB)Sf#P4+2AVmL#@RPI(9`9TIO6 z&DMu_{>*9=IA9^j3t3#sNBMz2yZpEUsTAOjcT_eK`&<@Wgkb0DTK$H5I7oRU)W8cC zx-2o)xQWM3ZZgj(k<$$W-n9kp?z^u5nH>V%g5sZQy}pnIP207S`~lwiu;;vp&|E%s zCj+6l0?blkB$Iw{kPn3)NpK4iUOg2J&@SK#a4 zXxgNqj%tlwScjI#P3jX<^8UsyZvI zq|d)n9dIh>=Iwnwpqt8j58V$uW;t9BsjZ~-JWrOW9;^Q?ijuO?)>g;&VU2S~@|0gI zrpM+#gqDJz2;hLy~&V#G3ZX*VG-5OCCMA&c{Ut&3~j( zl8>lcuk#lCe>0E%kvGf?BhLAIm?~0EGX>MPZe$U7=Xg7ifBU@ZE&;@0i@ds*`YAca zl#_9tC>_7@B#FkkAvlDTgM|^K_VBfe{#R4?A4~qXlm7pHq-)oGg?43j7nN8YSz_o; zgyIZb`*N$HYu-_Gya^+UlN5W2HA|KM6BFP6#;Kpc!vcOm&x-Zb#sfY-OY~DJDMl3< zLC+j~5FtcAJGUCZf$W2NfA=Vf+p&9C!0cgy0%xt2)@WLB3E*zR#tPq*mbUfyL78?k zj(GfYm}qXeWA0!$@(R}0jwB*>teEHs(a=N{ARXVSu2+_A89>M;CzF28HhtiIv#b1E zb1nKLW%}{!wN0sAu%9G_;r?IYE?oWR`Txh|<$n-qNu#mhu;oYe`r<+};qcpIL&2VD z=M0(pXybBF2JB6{!_eVVW3Ku_zOMp=i`a#~)g3-_BmLc(6AhWpt)BhH(TpZ=Z;xte zEpRZFy5^+}k&TZ#(CJ=^MUO=C-x8r7p>mL0_NkAPr2HdLl4LCpE4&sf=o}~3q(>tZ zuS)|b6z21WCEWdg@Xx4o#XGjz zw||T&&aP~@?xr08A4@=G{97rGE^&~5l&~Ev*OfyerNBiU7;RBSG6=(K?)H1=qs8Ud z1kL7UbJ+n(DTeZASLuSMT7*Nl%3s5=e-gih5NHJlPzElprbJjUy+H3ZCK4EM8QygA z=*6#a)(z85&oQBiisaD*@WSNty^5QBb{tN>c`{Myrjun-J` zN7yCCp}=R}FGQ|^V5m1sc`}7gK0IAM0cZ^8v15#7l=WGYaSj_&4|2`t#F+C4SVh)4G_|A80Hu^7(_Ip7Q2B)X_zP|yvrI@{@Chc$_naGk z2o=@79R0=MrzDQDj{Qi*A41aT-m1mF5nR!FDq9zY`9MV-Mpk7HY|(0-yuB&W>HDv$ zYZk5N@#Fu+IIvm{hk`GCB9k!5nPvv-#DQ^p6crBM|0}4tyc~=CaKr!5oB#A9*7UCb zAJ&Ar;Iy>*Uwuk+zPP!A-9>{xMLB9$u`SAA>NwI=V0aUcUFYFak$~+ro-C19zus=7 zgKt2I!+$y;mZvDw+)uhv76_sl)k|5-;w1ejb~6A$vW*A~*B@!8#>8dF{E#lZb@qO} z4xK+G2E1MP#3NFIDC;WeC|4?GAAd1$!Z70y?X?|T8mA{W^&TOL1Bo%pa*v0>_ciA~ z%*S83XIy~7MH69-JM>A~KJMmf17uIyA7!1(;M9qtH>X zjn=zi;@YK@z~Z6nIe#;LV^8e=?r7aq!qDLyn^+EcIt_<@yHVTF=eeNRVo6%$S|2 z`#Qh6Q+v<_Q9;f?$`I0rZhHJsGH_(fBJpuMy5o%XD_`wqo~E5D|B<{7rB$u8B$VOg z;24R~r|e`-nN!tjk+rJ-H`e^Wj?w>4TpD~QWaFvzv9vgYdDD7a zM3TrjHcT11EhPBkdN=U6#t|lS_M1W6Fw7gU)3)oqqkUD+`1o>Whc07+D?KL?o zYn5yX&T_2oRFUtT>N#*vxtkh+>)?svlcLG56wmHbP>(fqGucq(tIKsJ6S@QrjNWoP zV@Z?iTP8lEmEYeaG2O4z5S$)ENt!|eejbBa2T71g>ze;?DLgMu%Qty>CPyy83iHvn z<>*D?HAKKR0qs7XM_uevM_58?bo<^jCwJ zc};+$ID|8lUA=4%kMWusfEW{MEi?GCuKL=ToMQ_egfan^bm&DV3&3szd`vhZ+ z;h19Aqg#uB7&BA+1xSUL0hm~gj*eqpJTN7kSV0NE3kwT6z=2J>bDH4KN=smtW z4^mWR8}c~Ko!nV&9~;0IiVzFh+U&^|_g>K>hAuYrU>Enz7g5-FK9UVf@e2PysiUyL z3umRF^XGDGs^_j1zJ4o|*SM2fw!2^U<9*^@@t0L4fW<;>_T}hT%hp>+cH}B$zO;}s zo85l+_(W|(rNC{_(jDqI0=2G<$9f8X!I_P8{t+qch0R;KuO5uqP5p$xn^Fo2gu6SP zpAn&p(=gQ|UG+l#s|xtLe52GL1)YS@q7t&}+EyxQKv(aYXOw5~Og5?i9C?3cN z&}+n0V~1Y)$S8M5_rBkti3HmB(mS!fCZ_h9t0;?>x3^`~!<|Q>KJ^FPOFW$s6G=!t zoO_T&_PHvJ^{irvSa|9aFi6kWry=Wc5F@iXHrz*OstNAcjOw9T?MwVJUJnXakcdeJ zgt>D^EAv11XuukKcdJ5AE2G7Mo~TDkuLXfv8;=PuqJLa+-YUwufP0(b2drYA{*aP$ z(vAqe#RjJ!>>cXVqb>Y1ZCDrreDqQLqwZ&ucBCCI}x~-^HXrL%qib#SvhT)*>DZIpBAs;=z2|Fr(s-(cq}h%CQK+QiBV=rF}!6gZxqZ=%|3=w~5-w8*=hp$f5*tp2k&h@GW7J(N7H2zR`0jWEg z)2bSL$pz3=?vT$U(@xlHvE(;BDy=iwRH_j^xj^V%@a52h8PO`7|B9Mw*BW)|_U2{w zY^B?A&j|N$g};pkRR$MTVlIj4_?hjP6~{lhKlY+}zH^gus91+)S8 zm*>;?_1Ucl=~4?1J1#6rmtWhTrJ@=_KV7Ot2A6-%hJZAPN2;{(#18_4M*D-Pt$EmJ z3P|L#@5IFX6v}&&bS4ef%CPnd8K}|TPn(Zn`y9yob}An`i3e;TZ?X$cx=( z0l2e@1iqD}NlWOa6f>NwAJ2eat40Z^R}#73d%?uo4IwBkYV^VEb&&&)iFo9<)3065 z>}!cYw1qUbD;iL9FY+L2sw%OVglBoNd;s*3QJ0fJGbUt)+{l45^rPO zTe6X>$p92^^5Xpw&rt;PSi;(g>kC=eucj74ol5LETkQl?;PII6xcxmOxa+a-3|yEC z?N`kB7qXZysquw8&v4S)qh}z7;uKnDVKM67LVk!0OSR}ne~r?cf`gSZ&yJ2S$(x=& z5YV0)U)tXx-xY>)8_VsA<<5;DTT;lyyg(y!e)1X6L@2E5%OZxjm?$55 zpT+v!wx4K;x8&UCQ-T{%kgr$q&>a9JX57^qJGo?1&pbeF3zDPwV%=U9xBJl{$L7i# z+TDh`f;je`IdgdsSa;)Ss|Vqj^G(F@#sK#Z^+I1AUaC?<$0d?@(Yq7MMf`A{py(E{ zG2QGW8wsIeO<4(RDgozu@!d|d{px|Vvt5w)~-Y*oLGK(eeeUATjxGP)s9%<4&jR?)SN@^m3_1G|ThM#^u4YW0$)+htvh}31lxLMwE0-A!YzCKKT$08tc9ujo3Woc*pJHSC?u^ zM5g4)9MFbK2-1&8y8e#b$WLOk|;?Mp>Pj+%}=A8 z%rmA4*Iq-EMsD3f#-{v*@Yz-vFQjMW{&f14^~B1dz3sMS^?m=Z}BYr{?kW zP1ZDRtO>D!Ihn1zcj_kn62ub4+y_dkMU7JDh4LKFm~yUEOCHL<^&ydH5E1uX)-YmA z2jjv&{ME(Mc8rEvC{bV6*(k5Y+;rW9^W}oOK>WhNh9>{DnM!c?=J?~8I6UWhc11L- zT>Y|@(_}HS%bg*pU>n<9$M>cN01NIMAWK;axZc?p$tb74LnzA4HT9`1%r1QeIA zVbA)}cui!PUKZix2ACh!QyXFlPUJ{4Lj#NX74E11ls$;w)I@DC>qMt62IiNMB$43F zrA`AVTr>PwgKVp`b)MD3)q!#$NqMmloQcUnm!{n^r3^v!TF`?WJ~4K&M$}blUy5GK z$>}Ke`*dldx6RHckCJ8&B~1o7+F*QQ1_tk_7;)1FrfYGEV&&y9oJf|33b4siKD1vas z1aZH`LDyVZXRyCg8*j-+Pw%%l#QIh0*^PUl3w2=@j<0!`Mi&hB&MRL4MuwK@wfaQ% z(}T<IU}4*l5vC3A#{3Y@@u|{Kjx1XAIt-ZH1{UG^JcH*nTyr6H zGxFM&7}Z1Xe|kO56ex>z*b4$~pv)i4PHCK~Chfv0)Qc?_T`@;VAtOJzn;v<3JYiM{iA( zA;j0GWp8eJAYfoG=AhUjg@FHx)+9fz>Zjm<72Dh6*D{!Hpz#>hRq9z&WCZ)p&lvHM zY#-7%>7lnk>}DNOWH4aH^pAd&uPQY3uZE}BlTbsdTrcETI6cfRQaT$ z;y@XXVnQ>hyl+o^Zm}A>pM#f|oq2s^tKhB|+qD$8K-$h867E{ecXhTxC-pTQ1Uq&r zvoT^Bu^Rle=!?;~sJ}n27ETp0UKfF}A8UnFVMqa&h{Mlg zor7$m1Zd1Ng{J^?(3A{C+&N{w>tfiPnAc!!v1jA`WFRa zZ@>m<_Vua&?~s0Eb9P|lygxXxLw?{Gj$H+RGMGUB^m)p((tB#KdDRr$rtDAT85a|j z@r2H+*&64C;XYheY#lIbYK)z;c-f2KbMG-kYC*LP1C23nQqpywN*z`1L>?Meh;;6V zYW0#5n%|Zd>6`KQP@trbC4N>!9t!iHb@hY2q<=JE+e7;YfDk7jIhm4k$G#UXZeTM- zXvCU40eaK|2`9G1F~>dP#*F0YZzc5P#wFoW1P zREm6%v6@?XFpdy2;}4nn9}ZD?EtH4A_oFr4Kg8hB5W*Fwzb{!1f7$Jgz~34|x%S+d ztx8Wnd-EM7*P?|J-p9U~f02L1cl#<9QFaI>e11asY=%_#<|TzJg$@pa2MGQO<^SbN z0&ZXitGZhQU1V4j`9R!zAo!!dyCmpB?9a8AmIl9{yE`wS^vT%V5d;ABA-YKGwG+!u zCDWAmW`^I^qe&M|M3QMg&U-l$blvHl7PCfTsJ)X$d@pUygE;4v9r!enCM)#c zP8|N;Fd&3TmTFl+A@F%_t?yhNj`9K_(#qLuiEJe#;QaJ zE012vVq!IM#bBl-O;iFqr)$+Di92B?qoiYl7+S<}nOSsd&Y`Fikl@4#ywF8&<}s(x z<>ZS_u1{>4SMO3P`{B+GOvDLQf6S=CVzSyAEFux%1EjrrEU z1OZ%yGLhM|Ae-2jR>CxanRWie-X_b7<*C2qw@y_ zr-s)>dU7UhhV-%e{ppn_p~)cYR$QkKB;Ww#+JN`<3Baq@TGq$Tqpal2S7m?e>X|p) zO^pe^5NoQ8@ByuaXMK>!{=&UDrwSfn?qX8xLeqfk(`tNMVVK})RTJ0^+wx&tYw23q z2H{Yprh=QZTUI4Xug8#y=b&WQC!CadX5fKqk3Qg3nF>j9?;H_0YaXY_>yiW|Mmq(X zNPEz-NvGcN9tZ2W;j5LB``g&5%@7Xjj|Nu5jTrY2E$?7CUYmObPAlUETp$Cg%X5gpv(Cn&n~)k{ZD`B>x+ z4L|n1y7iud@8pT&C~g}|A4?PmUr`c#%zClyV340KQMQg6bMII!G{B_b)R%l+Eb4X1@ z_+?e~esdXB|BPcTopAdlG22T_bL_TpP3KO(4s$9;lhUnKra7)UY~#UQi%~vPtrDs3 zXKDXKre+1oHr;8d1vKI*W1q%Ght9!|uuLnsi8Y%vZl=W0*SxqH!Qt&BOK|8I5TiXxe)#79I^i z;4e6_Ns|4WgQTyJvJkKF@tSh$4WYj>O{?CPH)#*!ToNfo%6wGaKgfcWg2u>*$1Z3_ zEQn?D_f|)>qSq&ETtYG3QEWTQ%B40{TX^*3WPswR8xFnEbfPk<1Efl>s&#hf+^Tqt zx`mj_U$bCznedf4Ub(&j)&Z9`=d_SUM%(EzbXgXJzwJqY}gtOoAQU z+QM0X6O>Xd<)K)DO0O>PB~caLGP6OPcn@n(W^W*1lqx1+hRTT3G7QgJrHB{S&}6bn zC|$s%M7|-PE6rND znJ+m3T)i&)_a6`^O7eRp`PZ%|Ptz&4>{%)2(lrP)@~(Z3 ziVnpR#hxtj37*|5EK8VnyY#j(TOrEoky3fdP`nJkl#M^RUVzfuMvZC2 zC+=Hb83G?orxwTG-4x!};kA(4Zax`Hol7F0gnFNHLb%2lAg7RZmf1DMRxVj+BL#ZP zwL8zFXvs?)L13|4N~>-20G?S8-7cm(4N>X{1;|GsUIUv?$BFrq5Dpb@&*glF#sOLD z+6N9!@fk~1oG_318cZsxT0xUu!O^V>zbEw3Hz)@?k@i77=Y)2la*_ehCk^{l6vqo3 z_L*kUa9OC>gSxAc7paTwLrt7K(C<)Lku$hUDcrE)tQ2v8ezjppj;G)PQ96cA!Ld48 zrhX1^wlU%F7laSkkn#q|G34D2=b6J|utjQDLFf!VQ1GtQk$$73T(4YX`4ue!i>f#zkH8Xy*DN> z;w<*r>a+l#jWW%XZ~o(zU)sPfW$#f?!AQKNyyy6!+E~7Z52J?~GUIJ&JfrOP*>>Qg z@{#a6 zo5Oh-scDJZ{>qZ;9y6c|B~!Zh3^SS)&x2H`Qs$RH*e z0i5yZ((!^k`ZM=!#-;H=&#Cwh=jwrhVO_OT9lt-`@>K1Takzi(O8y!*XFpy)}G$i)(M%I_f$ z)vGJnk!JVymGSKZ^52$LoLm+8dLU_et{B9DN-}j-`q)$PxvS@d5-4P7zU_%O*b#l& znzpl7H5KZ&`QbMZ1X9R?#HCZ*YFAe{6WAu zp6b27;E+()mG6S!ThL`9q93FET)x9Nw02NE5F2w0#`K%$x zJUmR(hubE{)KdOg{x-!`gRAW`!g&8wbs42d^5a~%3qWs!tp6JZ>gW1dRv4z3WrP%l z2hI-&3^e0~qMxs*HHHxC!b`zdn-2IICsEUB*s%$AU_#frSJ6hA=U7W1sKCX3`)EW6 zy^_6=t2}WA?`tJl{O}l3ZEABMpcyUeUOo;BD&< zH3VcVVu5NulMFS@iL?pWqxY~GZJ0P-c)Wm@#3O&7?=)H8hX+!WcI*+Rg--?1rzeaC zUw!t>a~R`R{CLmz^2$0$)>l*4c*%<4s0*rMj*k$4@5o(V zktq0KtV32?yz+y6ak#K`TNV z2Bg3XRET|&1Onf1O0(XEuB?cCrkna?_p)l&AVQj;`14LM4^a=O+m~;8JEz03z3}jPa}FpK8GNJE2gi<%{|vzAhhMfndxMQLj>Mu`x3`4 zr`W?q*il0t5Ga{;HX@1o(Kt@=>fSGYlW1$Yp5%`-P!0h-Nny12Z1qg=0$v^j987RH{?TPkGY2BcO_FXO^Q4 z={3ltI*E9t{RC+v4a_LPEc%K4x7NbN(Aq>LU~LxCRs`GY-*UBe!o5GoV9B@=6qfos zBFzp|X@Kex0!6azmCge6c=r8rchG||xEn^4gy1!)oPnd0`n-qm=Z?~*94}I(iXk9L z>b)saZEI^{o>YeFSQLC@I=kz1VZYf%H1r*5D$VB-W*H=9$sf>1l(DiTuXvkF5rdBq zljeVU`7IgS8=p_ijgH$ar??=!k>{y-Epux9BxId=_kvei^+5e37^LHy*(H zD2yq=<4Y-6g+MN*y*td0N71KXoG1Il_rgoYcYxk%2*-t%8tTsJ-uNdX)I|gbI2w(80G!uH)WF z9Nt#xB&bblAO69Kib`ZLXv+gCgKoan=u`~#9FMKiLR+-R_z4o!V;M8s+IEns{yms= z2tS4pVFh*tLqEKiZ$4Pp+%Z9M4J3t+gV`!a)55W%zTuw)q92wS~A{%+R4vs(=Wh*q_|LNpkx5f|5-X~gS?Q`$5EgV3d z@=TvxDRXjtG}LvY{$iZWnn1If#$vb&Fed7k*$2mS^@xXV?QThmhebI=~Jr zK#;hX*B1~Z0}6hl-9e_Qy)Upj`^vr!+YmI?x5|%OGLLAwjSlObhVED_3_&zvJF?Ct zE&+r+t`HiU&%q*1kzgFhW%FVVS{4RpSjz^QG?M5cWx`1xuh1o<^nOCFR}!@#lnYL? zU4RQrx7u9kX+y)Y-p&rhgqp=fP#C<8YWktApY;2oEY!K}TRIk&wXnf2LV%eyzgBv2(LX<&e9mes5hQ~DrWNxITM&Zm{ChR zFVf~el{uDMgMrt=!g#wG(JrlCIEjK?UChU7fsER#j#`Z;EQJRm?_ek1$h|7_emCW1QuhFCE~y`0dj>`3v9^gm0| z;6ggn_8=>&L7M=&{5el8*dBG|KX$QI)?Jn$g3(GMs}Lp#6Qf*H!S5xbmxO;!w_!7* z(f#P_e>b_9>kyZ2WGU`B%O)MV#TPkN*eskDkJ# zMGfq|kR)qnbd+JH2BdGxcr7j2Pi4vWuH3uVYAx#@@u6=}OJH0(z^f+&pp@3}E42NN zhm+sM>kk>KO><#Jb zyH}kwu59Dpal9}p5p0$Rf|Nn)5;I0%!cz5K(R@#W0)MV;`2@)QlMNu|h{QRGNh$Vc zRfK8iL1!*#*Kdh$TYtL4P*tsVp7m6CcV-6_6*gK>t|iP(@+^6_*<|lL$dbo{&M1pM zy4aL`xPtF!Z2wBX9$F4;& z0rRqSYV6i(Erh-{6WfNC2@X7^YS+ufjo4=xe@IlmEDACT>?m=RGTdHh$7>=yfZ+e+ zn8Z|#88CAgWDlJ9{lSl~3W()C`qX}C!7(OGvI_AmW||MILS^_uy_^f`R1u4@xClM4 zq?O0kF^2Eq<~QO-OE}*yo7M`On;&KJ51q*K;zKd#dtthT$NLr*9UTsi7C~pGJ|02O zRE?C$9xx5d5N~SoG5_<7ZDV7IfdQynVZ(9{?Hu^?@`}sV^o#$T`}Ad~IuO73v*fq( zV_6TEsCg(-@8v#xv;Qx9xh8H$?H*h{ogSubLsL=GSr^|Yyp>^^aRB6fBVf7p5#L$4l?gx74O^G_)B*4RG?=n ztz(aOq`14>OG1-gC%pU93mbMrf3c0u25d;b} z;0J{_uhq}*)fDmz$ZgNk?9Nf&=@PaRzdNwnw8AF<#Xi(waD-4z_%{kP4#(-0 zuVed~E8eZru}4=$dhz%U8G?nEw$*lhE^^2jo@tZi1udV+uGun&*^WEECp+^X)lpu) z!-dRKJ_cW>6y@!!lJ&sI$>w$XSS}iwBaaXxJ3TdPRvAu?;=n5M5-_22g5i^+GAy5q zxZzR1>C-jz)y#+7wd5xm#!&NIdfcLRd&^f#i9RNx`*@T{A=&Jg0$hCr9ocpu0vMq< z^}S|Aej;1;(Mp?Je0kr4I(Z5eRPunJ52(SM33y+y?K#gY3&(<_Qtpis2engq$vx3j zbF;;S6kj*M-*hpYTrjR}UwE?m1_t%+odMmXHw8=7a@A3TGwdb4xHo^s`YOQsEAb`M zYWEXmBAuaXvZi~IhM#6Xa>V<06{s&}f*kJ1%<@%K2{;H=i&N;BkR;@ef}B%@yTyh& znd%3Y3CS2pc}jmCv^`MXFr|$j7fH;ohuo+dG|0kJ%iaG-$H%bV`|gMkI~ zT#*md7T`kT-XJ>Gxm&w$g5@l-UO;EgCdK3AIzxp76l^A-?VeYKAt*5JOCx-`!m62_ z`jl|H<*lYVHUrQChtw-tnR^#zZ--C#TC6!u+MG7fJ@%=JZxfqAkB>y@_oK}k>MF>H z;rVSetjHM%!kPAhE_81e_hPV4|JX95>D=-kyR!UlEJ{dI{icj{mb%?DP}=BqWvy*B zN-N5o6IzKvA+2&^ii6)ov0H zCTpt{^9tbYPl z^62#2X0T9^?Lqtq`c9x83E_HUWLgLIogk>+{P`y8WBbxB#Gf#ePXN>H5NU2K?&Tid za*hxp`U3rq^T%t%*hfOYb>?KHmB4iSjP7pAGRlRO@)YVn zznS5FBc^X6rU{&3ygL!#kQCs*8YH>T`kC6sjM2az- zN&XGu4d!AAt0=k^itSJt#?iWrWlr6II}&nqfL_84w)v0?>j~%VT%E`*mWp_76OL(S zWW*1$0Dqd6cn~4#JQXkwqdY_(r=w%vQAXaZj6kNazAK)!@mveFPHsJhQVsCN9R<{u zyEU@I8qN>H^zOsXvb?0g4KVlXQmPB}x5>^S2Z^^sQWP4lMl@%rw%U(S`cf!@7N8yZ znrr!m8k3ZF`2INLCDahf}5EuoEp?LQtL8U$8L52U$Q(t~JHM1~3RKl6;La{mzL zK5#tI^U-by*)wSBwL}%zH>2!|Y|zFR-Y9Y6i~Oc(r59MNQ^O8qX|HF;;&>22GVM31 zd||#zP|ycnwZ$_UDRa&@D%G>A!QEa=&6Xrx6GpFqBWAbI@=45wySqdT*Nh`pd-Wncj*-Sfqmj<=Q|21-Pia*921o{aj+Qz4zG!OUH5pMq z))SsuPM#%y*o(vTwhiS~Yge5N@mE@@q%+ixs3#lCq}6s zPTtb&8a0xMu{G(1mEcsExDg&p2hL+=0`c%#^$b>mQUZA5a+vi|hW#Zn06%Am6Q$kF zl-dLwmFBD?S~rKW-XTEgTIZ2rUJG9tV0EvLj{G7h8LRK$YUk#kdVcfDCAojmtVDHw zzbPVV(fN#M;}*(l5PO67V11mhvv`?}{&g#br)9}dc5%p4CpwtW)X$U@QWm{;2MMDU z?Lc7ITe`T=b-Ij6!jJ06>nj1+dMg!V$5YS?L~LWHvPge8*nf$#b8DaATH(1dQwJIG zFw60$*w5YlAG%xYr#RKYC{{B$Ou887kt;6kFt3;$Pg2OG6*8!^@*wuu=ioDM>o9hs zpo}Dd_W8#?VH?Sm$V~6mUy&cBIr-B=GC8{$BX3#`5Nxu9P`Cla>QBHMdF0` z;K!X0|9LMzRI7D#lt*PNxG=s5DieJgxGf4QFO#8~dHYzYLAPc_zGQQ)-Gk5jke~bu zZR73@{T_}p_J?Dy_tt&$n})BpMvy=UWwrvlXK5L`K%Z*$NByRHotSN#X~7ZoGgU0N zXh;oRZwXp4kkm1=zhhSP4k+&HK-MK`9kI^u&t6h%z<89>B7jLMmTjq}U?PMC6)mh} z_7rks@N}V_ry__4Q2WY@YrPw{MWJyd|}Q*HhpwogJk? zJdpJ1FLO33QPCc+jf#LPcrRl8`M)15=2ApWAsG zF00-hnwn06vHK>rz5R_2wi8usv5@1E!@gX*XEhr++<+i7Xq!OLhXRNe##X~Iqj`hw z0-1~8>b?DXBkP{Z^OcXGfu`e%5*ZxC*fdciQnd!=AR#*t|&uhn} zgFsqE-G)OF?#hOzmW8sP2gN#H35E(I6v4-AndruV@@LJFAz1ekD@Cuu_5x;u@&+%re1{!O$LJ4Cp>wR~9FW$rSV1DipARFU`gBcoX_Z+*V^36}Sk9n1)rM zdW{r!TLe#e+IJ+keju$Acy!Tv1~xlf{EC}O5;xNu=#Px@mkSsGIS5c$Z;9MAKFq)T z8hOGtL^36-0q*Ao@L0gtA{*RwsO3S-&d0d~zSH3c{m@u5RLP6VKd2KDr>A&XUja1S5dj zv6mZ>EM&x%W}4ga?z#5^357YDl&_c)!Rks^w>NWC?+?8q2I*-KzzIFl=`pGr$clNL zr>9;6-G`O>G}#|-J|PD*XH}g$V7L(z>diI~uO)9!_+jArVd^7^(yKRjjov}ZbWwPA zCmW1WBoVTlUl_%Q6E^^`RVxt}WJ8qf-ex-eZ$Jvu~p&e>f37lIgFjk}vr60w0H@+KvT_zrhZ+ib_M&UGwO{(e<#&45k7+7p~s8-YA+4of_dC1%o+n z$hf`QF6k8>dZe)10AN?=@Q?_VE=oGu9fvW`fak4ItG+Lq;8rtqdYY`ra5W4IeQ=QJ z6(IcD1Io*o(a-Ejmi-Pt9%hh9JjR^*;jD1wGCWNwX{=IiSC+DRJ08s9<$fD58AC9Dn)PPVEQ-sTJ-WEJ3x zn{(LAp~C&Zma2t7i}GM&$scSru!EFFT#mu^1Qo#JhIF_NQq zO2P6KlUuyuZ+vr1!e)?knJLa}(|()yMN0JJ&Q!~@A&o>pL8L%dwo z|G+X4NZ}-3e+BU(DH$>D-bF#Lb<^sG8U>3lUiHZ*Pq0EEyc?Uhvyck&2#^gUH@MTNx~c4aT%O~=`ZO3>P{*@9w#raJa@n)!!Cn5 zOhv$k*h^#nmn|mJn5!yY;0)x?(+k_sK^E|(;bf$`I|0~xJn?)zMg#I4r!u?+{P?KC zQf!I`p{6s$=1}li;TD0gJ7*~hbS03-(!XmVDbFbgTx>W*ZpYfa03Wa%oBUx~B+Ld2 zMwT_G4=-=dhmz5e!b)zUfR>UgE|9i-nk{9-ksx6TW8{lDw0jE)Xv9Hy{HA}>^&nnk z$sRE`=9c&Wz!KD)8?&>lpU6GJE5GlDF!5e$bII!}oQ$m0a!jVrRB)zR&+7FE+G%;U zh+7nU_7#dKx_I6%lL>>1#OS+yy<53yMFldv_UrM%7AqoKy z@ngPaKO4l%p<^|v(@J?(b3kUco9fsaq(Qf`I)Jc&%os8o?aI@|~DcXdaOf3S? z2M$CojcM4&kVTH~B@LQHWjhj*t~R7;R+v0!P#FTJ9thhsaeR`&=j*k|9!82R>L)c} zas7$ULQ&J?uN`Mi(58FV$AxEG)E}nl6fZHHS5tH*;a?*TP@R9563HTz#;_qC0AYN| zpzP150qof>C0+PFlA8MqPT|rga4x6(1y|@vC8(6--;)lkTUnS<-f+!Lx71NSrI)db z=Qk$o{#N3c2vIn2GnzE*vpb&&dpBInq?U=rzklCEh#h3tB(I_g(XNAj7_69WfOn2wC^ za4an8HfEV|nObN$;D{FTvNYOcxpnZdL*nrcU#k z4+;-&qY~n^&JSQ!D4D36o;2$@u;8kxuf+~w+vyOajzckiedqttWxtRq%N2^cW%M$B zHHl5?CG%EeLKt829Fi{-j9D}fPCq#_8jm)^9#R-A000000000000AceqWDiCb@{O^ z2`2C3PDDluO5Dw9F;pKHYU;$8c!pwHKu&2Gkd97n^jL?t*t`4YC@ghRNNGgI>jVIa z*xFzKIU#nAZG71-jGV#wj)Y(oBdjq42^`dmc0nMw{V(kSG#FbN=K7NW+8WtMO9P%k zt6icUGBxub+rTQ9=%ZZQ5t@IJ9BaiM$1PmGvv9;ZYQFR)sBsio{;XafIN`P|onHh< zN*4LUW5YvJ>*1^Y$b zx&ylbbFg8|X@J}i8B+d$QoFDb_9tro1bEa>TRb1&cgi1m0ycZ3e%-H_guQ6xz%}3Xz od$;q+A#E zBz}ukZtslk2v8VQ>hk>X|KO(kwPp_3|AA#ZtAOQWYr7P9D_@qan51l%TD9-)hS4ZR zxT!tJ&{H;KURbrrv3PkJ_$D&|pe(e*S3?I8h;fUnM`B9g(eN$!Xid2w`ZJNkc5QtQ zBUEMCBXxaa3(N)dhGSWbE4XI#Vw`+#gC)_;;oU~=>HED=R|( zxHxd1<(e?t-qS770pWE!E?;MgNaW>Ed*$R(?7~sH2L4xsXUe$gwJ z$^z!F8|fBFxYQfE_psJ1W<1+}xITHMlm>f(jRKc9Y^FT^UK_v>n1=xpa0x_!`SN-* z<0KdKqLOUze-hbRA($$kN&2@vxHd>2n@^_is#$53Ta;SckBiW z=(hs?ayQy_W*{xcpo4g)S+>#6`*$sbc#Lbad$|;sW+eiH5u!gVtW&8CSD3rHu8B@io zQdPter^E@qKW~I}4SX^VCNiXB^*L^MerPeV(d4)Eb|tAVIktlR&q_AWgS5Bh zU8^&8i~-7zG367G9;Kf7gmuyM6H)LX?q9>0>(n zxYbICKe9zfWPZQ!qSv>3*aHO_DBvaVsayD*WIei8}Ji!#)qc?dR=Zio{F4|Ns-7_D5< z)M|Kdh-I{Ppm`3De`@{og!>UnADYgE+eO+Gz*CxEtw$ui230#7P7SdmjBZ%XpW zfk~8|w^>ikCXf@FMkFBJq?XDk;~hSz$;=YyKDb=;mekD>#W*ebl{nWlYcBbGHGx#^ zL!f5c0EvHM9j_HH8Yte|<9$!E3>YM&7JPy~+#{g3puVB*D!Q&D24j7=z1zRnFdE8) zxph+W96)C94g0QVn;i5_mgzNIhUxfzlCcM5&_yQ>iV>?CSmtTjolkvKQ{%H6_u++8 zL?~cJR|+Y8qfWrS^YuMQ`?0#ojUK{4Q=_hrUvNvQa67U`;=J5vaE*}?RIzTvMm9&d zE?QL3-g4?b`tnY#ESZQSL!c}t58FMB-ay(%koVx@0+Tm0zhh=!hd4eArB5kQ>%{1r~sI9<#-?ZSLAd-F<@*Pz~psG@^{uvCxHj;Q%s%Gv}oCF7;>qB3%lLcsO9zpr0*dnW!NUR;1$_8hzpQ=u@1Fcl?u z#ytXGfRRTVaCP=jDTyR8*ySc?W!<#2pLkV#A~Pg-_4HXy4Dx?pZ%CZYCzneTY9&R? zl#gm#pBF~)$=`;rDyC`hdA|ALth^Q55C)6EQKYAG^>$Kd2K}^Mm+J6ACF=kH0000000000 E046oqx&QzG literal 0 HcmV?d00001 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 c99523a987a0e9ae169b2e271fd37b10cc532a3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20900 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�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 JY!Uzf0046fLD2vJ diff --git a/docs/docs/overview/img/feature-panel.webp b/docs/docs/overview/img/feature-panel.webp deleted file mode 100644 index 5f10198ed3155e89e8f97109cf2c2f021073c2b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52680 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 HOaK4?MbgNp 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 0000000000000000000000000000000000000000..1a05ef05843efaf2be527ac5bd145887879e990f GIT binary patch literal 27772 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

+ 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}

}~W_nKoe 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 @@ -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 ( + +