pimenov.ai

Immich — self-hosted фото-библиотека вместо Google Photos

Обновлено

Immich — открытая система для хранения фотографий и видео на собственном сервере с веб-интерфейсом и мобильными приложениями. Она переносит на ваш сервер таймлайн, альбомы, распознавание лиц, поиск по содержимому и автоматическую загрузку снимков с телефона.

Проект распространяется под лицензией GNU AGPL v3 и обычно разворачивается через Docker Compose на сервере, мини-ПК или NAS. Установка сравнительно компактна, но первичная обработка большой библиотеки — создание превью, распознавание лиц и построение поискового индекса — может занять много времени.

Если Immich будет работать на Synology, сначала проверьте базовую настройку Synology DSM с нуля — хранилище, пользователей, общие папки, безопасность и резервное копирование.

📌
Для кого: для тех, кто хочет хранить фотоархив у себя и готов работать с Docker Compose. Глубокого администрирования не требуется, но нужно понимать тома, переменные окружения и резервное копирование.

Материал проверен по официальной документации и релизам Immich 8 сентября 2026 года.

На дату проверки стабильным релизом считался v3.1.0. Для v3.2.0 в официальном списке были релиз-кандидаты; последний показанный — v3.2.0-rc.3, стабильным он не является.

Проверка ниже основана на документации и релизах; запуск Immich и восстановление базы в рамках этой проверки не выполнялись.

Оглавление

  1. Что такое Immich — архитектура и отличие от облачной фототеки.
  2. Основные возможности — мобильный бэкап, поиск, лица и внешние библиотеки.
  3. Требования к серверу — память, процессор, файловая система и Docker.
  4. Установка через Docker Compose — файлы, переменные и запуск.
  5. Настройка после установки — структура хранения, поиск и ускорение.
  6. Полезные сценарии — телефон, существующий архив и семейный доступ.
  7. Бэкапы и восстановление — что копировать и в каком порядке.
  8. Проверка результата — признаки исправной установки.
  9. Антипаттерны — решения, которые повышают риск потери данных.

Что такое Immich

В типовой установке Immich использует отдельные сервисы для сервера и машинного обучения, а Postgres — как базу метаданных и контекстного поиска. Векторную часть поиска обслуживает расширение VectorChord.

ЗадачаGoogle PhotosImmich
Хранение оригиналовОбъём зависит от условий облачного сервисаФайлы находятся на вашем диске
СтоимостьПодписка за объёмЖелезо, диски и электричество
Распознавание лицОбрабатывается сервисом GoogleВыполняется локальным ML-контейнером
Поиск по содержимомуВстроенный поискВыбираемая CLIP-модель, включая многоязычные варианты
ПриватностьДанные хранятся у провайдераФайлы и индексы остаются на вашем сервере
ЭксплуатацияИнфраструктурой управляет GoogleОбновления, диски и бэкапы обслуживает владелец
🔴
Immich не должен быть единственным местом хранения фотографий. Официальная документация рекомендует стратегию 3-2-1: несколько копий, разные носители и одна копия вне основного сервера.

Основные возможности

ВозможностьПрактический результат
Мобильный автобэкапПриложение загружает выбранные альбомы с телефона
Таймлайн и альбомыХронологическая лента, избранное, архив и общие альбомы
Распознавание лицГруппировка снимков по людям и поиск по нескольким лицам
Контекстный поискСвободные запросы по содержимому фото и видео
Распознавание текста (OCR)Поиск текста на скриншотах, документах и вывесках
КартаПоиск по городам, регионам и странам из обратного геокодирования
Несколько пользователейИзолированные библиотеки и партнёрский доступ
Внешние библиотекиИндексация существующих папок без переноса оригиналов

Как устроен поиск

Immich использует Postgres для поиска по метаданным и контекстного поиска CLIP. Контекстный поиск работает через расширение VectorChord и позволяет формулировать запросы без точных ключевых слов в метаданных файла.

Фильтры охватывают людей, альбомы, имя и расширение файла, исходный путь, описание, распознанный текст, локацию, теги, камеру, объектив, период, тип медиа, архив, избранное и рейтинг.

Модель выбирается в Administration → Settings → Machine Learning Settings → Smart Search. Более крупная модель обычно требует больше памяти и времени, поэтому показатели из документации следует использовать для сравнения, а не как гарантию производительности на конкретном сервере.

СценарийПодходящий вариант
Запросы только на английскомViT-B-16-SigLIP2__webli: около 3038 МиБ памяти, 5,81 мс и 84,86% полноты поиска (recall) в официальном тесте
Приоритет скоростиViT-B-32-SigLIP2-256__webli: около 3061 МиБ, 3,31 мс и 82,28% полноты поиска
Запросы преимущественно на русскомМодели nllb; запрос должен быть на языке, указанном в настройках пользователя
Смешанные языки одного пользователяМодели xlm и siglip2, которые понимают текст независимо от выбранного языка интерфейса
💡
После смены модели откройте страницу состояния задач и нажмите All рядом со Smart Search. Это заново обработает библиотеку новой моделью. Если в базе остались несовместимые данные прежней модели и в логах появились ошибки, официальная документация советует временно вернуть старую модель, сохранить настройку и повторить смену.

Требования к серверу

ПараметрМинимумРекомендация
ОС64-битная Unix-подобная системаLinux или другая поддерживаемая Unix-подобная ОС; для виртуализации — полноценная VM
RAM6 ГБ; 4 ГБ только при отключённом машинном обучении8 ГБ
CPU2 ядра4 ядра
Архитектураamd64 или arm64Для контейнера машинного обучения (ML) v3 на amd64 требуется x86-64-v2 или новее
Файловая системаС поддержкой Unix-прав и владельцевEXT4, ZFS, APFS, BTRFS или XFS; локальный SSD для Postgres
DockerDocker и плагин ComposeКоманда docker compose; старый docker-compose не поддерживается

Превью и перекодированные видео в среднем добавляют 10–20% к размеру библиотеки. Файлы Postgres обычно занимают 1–3 ГБ. При использовании ограничений ресурсов базе нужно выделить не менее 2 ГБ RAM.

⚠️
DB_DATA_LOCATION нельзя размещать на сетевой шаре. В Windows база должна находиться на файловой системе с поддержкой Unix-прав и владельцев: NTFS и exFAT для этого не подходят. В WSL не используйте каталог хоста, смонтированный через /mnt. Если это невозможно, примените именованный том Docker.

Начиная с v3 контейнер машинного обучения на amd64 требует x86-64-v2. Последняя версия с поддержкой x86-64-v1v2.7.5; этот релиз больше не поддерживается, и сервер должен использовать соответствующую версию Immich. Docker внутри LXC-контейнера официальный проект не рекомендует; при виртуализации предпочтительна полноценная VM.


Установка через Docker Compose

Docker Compose остаётся рекомендуемым способом производственного развёртывания Immich.

1. Скачайте файлы релиза

mkdir ./immich-app
cd ./immich-app
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

2. Настройте .env

ПеременнаяЗначение в примереЧто изменить
UPLOAD_LOCATION./libraryУкажите каталог данных медиатеки с достаточным запасом места
DB_DATA_LOCATION./postgresРазместите на локальном совместимом хранилище, не на сетевой шаре
TZЗакомментированаРаскомментируйте и укажите часовой пояс
IMMICH_VERSIONv3Для контролируемых обновлений закрепите конкретный стабильный релиз
DB_PASSWORDpostgresЗамените случайным паролем из символов A-Za-z0-9
DB_USERNAME, DB_DATABASE_NAMEpostgres, immichОбычно менять не требуется

Для Windows и WSL можно заменить DB_DATA_LOCATION=./postgres на DB_DATA_LOCATION=pgdata и добавить том в конец docker-compose.yml:

volumes:
  model-cache:
  pgdata: # именованный том для базы

3. Запустите контейнеры

docker compose up -d

Веб-интерфейс стандартной установки обычно доступен на порту 2283. Первый зарегистрированный пользователь получает права администратора.

⚠️
Ошибки запуска: unknown shorthand flag: 'd' in -d и open: permission denied часто указывают на неподходящую установку Docker. Ошибка про поле name возникает со старым docker-compose. Для healthcheck.start_interval нужен Docker Engine 25 или новее; официальный обходной путь — закомментировать start_interval в секции базы.

Настройка после установки

Структура хранения

Шаблон хранения (Storage template) задаёт расположение оригиналов на диске. При его включении файлы могут оказаться в UPLOAD_LOCATION/library, поэтому ожидаемую структуру лучше выбрать до массового импорта. Перенос уже существующей большой библиотеки выполняется отдельной задачей и может занять много времени.

Аппаратное ускорение

Транскодирование видео можно вынести на поддерживаемый графический ускоритель. Конфигурация зависит от оборудования и версии Immich: перед изменением docker-compose.yml сверяйтесь с актуальным разделом аппаратного транскодирования. Машинное обучение настраивается отдельно.


Полезные сценарии

Автоматическая загрузка снимков с телефона

Задача: сохранить новые фотографии телефона на собственном сервере.

  1. Установите мобильное приложение Immich.
  2. Укажите адрес сервера и войдите в свою учётную запись.
  3. Включите резервную загрузку и выберите альбомы устройства.
  4. Для первой большой загрузки оставьте телефон на зарядке и в Wi-Fi.
  5. Проверьте, что счётчик оставшихся файлов дошёл до нуля, а снимки появились в таймлайне.

Ограничение: синхронизация с Immich не заменяет независимый бэкап. Не удаляйте облачную или локальную копию до проверенного восстановления.

Индексация существующего архива

Задача: показать в Immich фотографии, которые уже разложены по папкам на NAS.

Подключите каталог к контейнеру и создайте внешнюю библиотеку в Administration → External Libraries. Путь библиотеки должен соответствовать пути внутри контейнера. Если исходный архив не должен изменяться, используйте режим только для чтения на уровне монтирования, например :ro. Шаблоны исключений и параметры пересканирования зависят от версии, поэтому перед рабочим запуском сверяйтесь с актуальной документацией.

Наблюдаемый результат: после сканирования файлы отображаются в библиотеке, а оригиналы остаются в исходных папках. Перед подключением большой коллекции проверьте сценарий на небольшой тестовой папке.

Семейная библиотека

Задача: разделить личные архивы и совместно просматривать выбранные фотографии.

Создайте отдельные учётные записи. Для событий используйте общие альбомы, а для постоянного обмена библиотекой — партнёрский доступ. Проверьте результат из второй учётной записи: пользователь должен видеть только явно доступные ему материалы.

Контролируемое обновление

Закрепите стабильный релиз в IMMICH_VERSION, прочитайте примечания к выпуску (release notes), создайте свежий дамп базы и копию файлов. Затем обновите контейнеры. Не устанавливайте релиз-кандидат на основной фотоархив без осознанной готовности к ошибкам и возможным ломающим изменениям.


Бэкапы и восстановление

Immich автоматически создаёт дампы базы для аварийного восстановления. Они хранятся в UPLOAD_LOCATION/backups; по умолчанию дамп создаётся ежедневно в 2:00, а система сохраняет последние 14 копий. Расписание и глубина хранения настраиваются в Administration → Settings → Backup.

Разовый дамп запускается через Administration → Job Queues → Create job → Create Database Dump.

🔴
Дамп базы не содержит фотографии и видео. Полная резервная копия должна включать базу и файлы из UPLOAD_LOCATION.

Что копировать

Официальная документация рекомендует сохранять весь UPLOAD_LOCATION. Для оригиналов критичны:

  • UPLOAD_LOCATION/upload — загруженные оригиналы;
  • UPLOAD_LOCATION/library — оригиналы при включённом шаблоне хранения;
  • UPLOAD_LOCATION/profile — аватары пользователей.

Папка UPLOAD_LOCATION/backups содержит автоматические дампы базы и должна копироваться вместе с файлами либо в другой независимый контур резервного копирования.

Каталоги thumbs и encoded-video содержат производные файлы. Их можно пересоздать задачами после восстановления, но на большой библиотеке это потребует времени и ресурсов.

Безопасный порядок копирования

Лучший вариант — остановить immich-server на время резервного копирования. Если остановка невозможна, сначала сохраните базу, затем файловую систему. В этом случае возможны лишние файлы, которые база ещё не знает. Обратный порядок опаснее: восстановленная база может ссылаться на отсутствующие файлы.

Простое копирование работающего DB_DATA_LOCATION не заменяет дамп базы и согласованную копию файлов.

Восстановление через интерфейс

На существующей установке откройте Administration → Maintenance → Restore database backup. Можно выбрать дамп из списка или загрузить .sql.gz. Перед заменой базы Immich создаёт точку восстановления, запускает миграции при необходимости и выполняет проверку состояния. При неудаче система пытается вернуться к созданной точке.

На новой установке сначала перенесите прежние каталоги backups, encoded-video, library, profile, thumbs и upload в новый UPLOAD_LOCATION. Затем запустите сервисы и нажмите Restore from backup на приветственном экране.

Дамп желательно восстанавливать в совместимую версию Immich. Процедура резервного копирования и восстановления изменилась в v2.5.0; для более старых дампов используйте документацию соответствующей версии.

Ручное восстановление через командную строку рассчитано на чистую базу, в которую сервер ещё не успел записать схему. Если сервисы трудно запустить без преждевременных миграций, временно задайте DB_SKIP_MIGRATIONS=true, а после восстановления уберите переменную и перезапустите сервисы.


Проверка результата

Что проверитьНаблюдаемый результат
Контейнерыdocker compose ps показывает сервисы в состоянии running или healthy
Очереди обработкиЗадачи миниатюр, метаданных и Smart Search завершились без повторяющихся ошибок
Машинное обучениеЛица группируются, а тестовый свободный запрос возвращает подходящие кадры
Мобильная загрузкаСчётчик несинхронизированных файлов равен нулю, новый снимок появляется в таймлайне
Резервная копияДамп базы и соответствующие файлы успешно разворачиваются на отдельной тестовой установке
⚖️
Согласованная резервная копия — это пара из дампа базы и файлов медиатеки. Наличие ежедневных дампов на том же сервере не защищает от отказа диска или потери всего хоста.

Антипаттерны

АнтипаттернРискБезопасный вариант
Удалить другие копии сразу после импортаImmich становится единственной точкой отказаСохранить независимые копии и проверить восстановление
Postgres на сетевой шареНестабильная работа и риск повреждения базыЛокальная совместимая файловая система или том Docker
Автоматически ставить любой новый релизЛомающие изменения приезжают без проверкиЗакрепить стабильную версию и читать примечания к выпуску
Открыть порт сервера напрямую в интернетЛичный архив становится доступной извне цельюVPN или корректно настроенный обратный прокси с HTTPS
Оставить пароль базы из примераИспользуется общеизвестное значениеСлучайный пароль из допустимых символов
Выбрать тяжёлую модель без оценки ресурсовОчереди выполняются медленно, возможна нехватка памятиСравнить память, скорость и качество моделей в документации

Чеклист

Подготовка

Сервер соответствует требованиям по RAM, CPU и архитектуре.
Для медиатеки есть запас на превью и перекодированные видео.
Postgres размещён на локальной совместимой файловой системе.
Установлен Docker с плагином Compose.

Установка

Файлы скачаны из последнего стабильного релиза.
Настроены UPLOAD_LOCATION, DB_DATA_LOCATION и TZ.
Заменён DB_PASSWORD.
В IMMICH_VERSION закреплён выбранный стабильный релиз.
Контейнеры запущены и веб-интерфейс доступен.

Настройка

Структура хранения выбрана до массового импорта.
Модель поиска соответствует языкам и ресурсам сервера.
После смены модели запущена повторная обработка Smart Search.
Внешние библиотеки подключены только для чтения, если удаление оригиналов не требуется.
Мобильная загрузка проверена на тестовом снимке.

Эксплуатация

Проверены расписание и глубина хранения автоматических дампов.
База и файлы копируются за пределы основного сервера.
Соблюдается порядок «сначала база, затем файлы», если сервер нельзя остановить.
Выполнено тестовое восстановление.
Перед обновлением прочитаны примечания к выпуску и создан свежий бэкап.

Полезные ссылки


Следующий шаг

Домашнее облако на Synology: Immich и резервная копия 3-2-1

Связанные материалы

Собственный фотоархив требует контроля над дисками, обновлениями и восстановлением. Обсуждение особенно полезно перед переносом большой семейной библиотеки или развёртыванием Immich на NAS.

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov