СейчасЧто такое Immich
- Что такое Immich
- Основные возможности
- Как устроен поиск
- Требования к железу
- Установка через Docker Compose
- Шаг 1. Заготовка каталога
- Шаг 2. Переменные окружения
- Шаг 3. Запуск
- После установки
- Структура хранения файлов
- Аппаратное ускорение
- Практические сценарии
- Перенос архива с телефона
- Индексация существующего архива на диске
- Совместный доступ
- Обновление
- Бэкапы и восстановление
- Что копировать
- Порядок снятия копии
- Восстановление
- Проверка результата
- Антипаттерны
- Чеклист
- Подготовка
- Установка
- Настройка
- Эксплуатация
- Полезные ссылки
Google Photos удобен до того момента, когда упирается в тариф, сжатие оригиналов и чужие правила хранения. Immich делает примерно то же самое на вашем железе: таймлайн, распознавание лиц, поиск по содержимому кадра, общие альбомы и автоматический бэкап с телефона.
Проект открытый, распространяется под лицензией GNU AGPL v3 и ставится через Docker Compose на VPS, мини-ПК или NAS. Сама установка занимает минут пятнадцать, а вот первичная обработка большой библиотеки — превью, распознавание лиц, векторы поиска — идёт часами. Это руководство покрывает полный цикл: требования к железу, установка, настройка поиска, рабочие сценарии и проверка результата.
Что такое Immich
Immich — сервер для фото и видео с веб-интерфейсом и мобильными приложениями для iOS и Android. Внутри это несколько контейнеров: сервер, машинное обучение, кэш-сервис (Redis/Valkey) и Postgres с векторным расширением VectorChord, на котором работает контекстный поиск.
| Задача | Google Photos | Immich |
| Хранение оригиналов | Квота тарифа, сжатие при экономии места | Оригиналы на своём диске, объём ограничен железом |
| Стоимость | Подписка за объём | Стоимость железа и электричества |
| Распознавание лиц | Есть, на серверах Google | Есть, локально в ML-контейнере |
| Поиск по содержимому | Есть | CLIP-модель на выбор, включая многоязычные |
| Приватность | Данные и метаданные у провайдера | Данные и индексы остаются на вашем сервере |
| Зрелость | Промышленный сервис | Активная разработка, ломающие изменения случаются |
Основные возможности
| Возможность | Что даёт на практике |
| Мобильный автобэкап | Приложение загружает новые снимки с телефона в фоне, включая выбранные альбомы |
| Таймлайн и альбомы | Хронологическая лента, альбомы, избранное, архив |
| Распознавание лиц | Кластеры людей с именами, поиск по одному или нескольким лицам сразу |
| Контекстный поиск | Свободные запросы по содержимому кадра без ключевых слов в метаданных |
| Распознавание текста | OCR по изображениям: находит скриншоты, документы и вывески по тексту |
| Карта и геопоиск | Города, регионы и страны из обратного геокодирования |
| Многопользовательский режим | Отдельные библиотеки, общие альбомы, доступ для партнёра |
| Внешние библиотеки | Индексация существующих папок на диске без переноса файлов внутрь Immich |
Как устроен поиск
Поиск живёт в Postgres: метаданные и векторы CLIP лежат в одной базе, векторную часть обслуживает расширение VectorChord. Кроме свободных запросов доступны фильтры: люди, альбом, имя файла или расширение, папка исходного пути, описание, текст на изображении, локация, теги, камера и объектив, период, тип медиа, рейтинг.
Модель поиска выбирается в Administration → Settings → Machine Learning Settings → Smart Search. Модель по умолчанию быстрая, но качество ранжирования у более крупных моделей выше.
| Сценарий | Какие модели смотреть |
| Запросы только на английском | ViT-B-16-SigLIP2__webli — разумный дефолт: около 3 ГБ памяти, ~5,8 мс на запрос, 84,86% recall в тестах документации |
| Слабое железо | ViT-B-32-SigLIP2-256__webli — быстрее (~3,3 мс) при recall около 82% |
| Запросы в основном на русском | Модели nllb, например nllb-clip-base-siglip__v1 — тяжелее (~4,7 ГБ, ~15 мс), язык запроса берётся из настроек пользователя |
| Смешанные языки у одного человека | Модели xlm и siglip2 — понимают запрос независимо от текущего языка интерфейса |
Требования к железу
| Параметр | Минимум | Рекомендация |
| ОС | Linux или другая Unix-подобная система | Linux на bare metal или в VM |
| RAM | 6 ГБ (4 ГБ только с отключённым ML) | 8 ГБ |
| CPU | 2 ядра | 4 ядра |
| Архитектура | amd64 или arm64 | Для amd64 нужен уровень x86-64-v2 и выше |
| Файловая система | Unix-совместимая: EXT4, ZFS, APFS | Локальный SSD под данные Postgres |
| Docker | Docker Engine и плагин Compose | Команда docker compose, старый docker-compose не поддерживается |
Под превью и транскоды закладывайте дополнительно 10–20% к размеру библиотеки. Файлы базы обычно занимают 1–3 ГБ.
DB_DATA_LOCATION должен указывать на локальный SSD. Сетевая шара, NTFS, exFAT или bind-mount из /mnt в WSL приведут к повреждению базы. В Windows и WSL используйте именованный том Docker: DB_DATA_LOCATION=pgdata плюс запись pgdata: в секции volumes:.Запуск Docker внутри LXC-контейнера проект не рекомендует. Для amd64 последняя версия с поддержкой старых процессоров уровня x86-64-v1 — v2.7.5, и она больше не поддерживается.
Установка через Docker Compose
Шаг 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. Переменные окружения
| Переменная | Значение по умолчанию | Что учитывать |
UPLOAD_LOCATION | ./library | Медиатека. Можно вынести на большой диск или массив |
DB_DATA_LOCATION | ./postgres | Только локальный SSD, никогда не сетевое хранилище |
TZ | закомментирована | Раскомментируйте и выставьте свой часовой пояс |
IMMICH_VERSION | v3 | Для предсказуемых обновлений закрепите конкретную версию |
DB_PASSWORD | postgres | Смените. Используйте только латиницу и цифры |
DB_USERNAME, DB_DATABASE_NAME | postgres, immich | Менять не обязательно |
Шаг 3. Запуск
docker compose up -dВеб-интерфейс поднимется на порту 2283, первый вошедший пользователь становится администратором.
unknown shorthand flag: 'd' in -d — установлен старый docker-compose вместо плагина Compose.
permission denied при чтении .env — не хватает прав на файл или каталог.
'name' does not match any of the regexes: '^x-' — устаревшая версия Compose.
can't set healthcheck.start_interval — нужен Docker Engine 25 и выше либо закомментируйте start_interval в секции database.После установки
Структура хранения файлов
Storage template определяет, как сервер раскладывает оригиналы по папкам на диске. Шаблон по умолчанию — Year/Year-Month-Day/Filename.Extension, меняется в Administration → Settings → Storage Template. Настраивайте его до массовой загрузки: после смены шаблона существующие файлы перекладывает отдельная задача Storage Template Migration, и на большой библиотеке это надолго.
Аппаратное ускорение
На мини-ПК и NAS процессор упирается в двух местах: перекодирование видео и машинное обучение. Транскодинг ускоряется через NVENC (NVIDIA), Quick Sync (Intel), VAAPI (AMD, Intel, NVIDIA) и RKMPP (Rockchip). Включается это не галочкой: рядом с docker-compose.yml кладётся файл hwaccel.transcoding.yml из релиза, в сервисе immich-server раскомментируется секция extends, значение cpu меняется на нужный бэкенд, и только потом ускорение выбирается в настройках транскодинга. Для машинного обучения в документации есть отдельный раздел Hardware-Accelerated Machine Learning.
Практические сценарии
Перенос архива с телефона
- Установите мобильное приложение и укажите адрес сервера
- Войдите под своей учётной записью
- Включите бэкап и выберите альбомы устройства
- Оставьте телефон на зарядке в Wi-Fi до окончания первой загрузки
- Проверьте счётчик оставшихся файлов в разделе бэкапа
Индексация существующего архива на диске
Если фото уже лежат в структуре папок на NAS, не копируйте их внутрь медиатеки. Подключите каталог в docker-compose.yml и добавьте его как внешнюю библиотеку в Administration → External Libraries: Immich проиндексирует файлы и оставит их на месте.
Что важно знать заранее:
- Монтируйте каталоги с флагом
:ro. Без него Immich сможет удалить ваши исходники из веб-интерфейса. - В настройках библиотеки указывается путь, который видит контейнер, а не путь на хосте.
- Библиотека принадлежит одному пользователю, и владельца нельзя сменить после создания.
- Ненужное отсекайте exclusion patterns:
**/Raw/**для сырых кадров,**/\@eaDir/**для служебных папок Synology. - Метаданные, добавленные внутри Immich (альбомы, описания), в файлы не записываются и теряются при перемещении файла в другое место библиотеки.
- Удалённый с диска файл при пересканировании уходит в корзину и окончательно исчезает через 30 дней.
- Автослежение за файловой системой помечено как экспериментальное и на сетевых дисках обычно не работает — полагайтесь на ночное пересканирование.
- Просмотр по папкам включается отдельно:
Account Settings → Features → Folders.
Совместный доступ
Общие альбомы подходят для событий, партнёрский доступ — для постоянного обмена библиотекой внутри семьи. Отдельные пользователи получают изолированные библиотеки на том же сервере.
Обновление
Закрепите версию в IMMICH_VERSION, читайте примечания к релизу и обновляйте контейнеры после свежего бэкапа базы. Проект развивается быстро, ломающие изменения встречаются.
Бэкапы и восстановление
Начиная с версии 2.5.0 Immich делает дампы базы сам: они складываются в UPLOAD_LOCATION/backups, по умолчанию создаются ежедневно в 2:00 и хранятся последние 14 штук. Расписание и глубину хранения меняют в Administration → Settings → Backup, разовый дамп запускают через Administration → Job Queues → Create job → Create Database Dump.
Что копировать
| Папка | Насколько критично | Что внутри |
UPLOAD_LOCATION/upload | Обязательно | Оригиналы, загруженные из браузера, приложения и CLI |
UPLOAD_LOCATION/library | Обязательно | Оригиналы при включённом storage template |
UPLOAD_LOCATION/profile | Обязательно | Аватары пользователей |
UPLOAD_LOCATION/backups | Обязательно | Автоматические дампы базы |
thumbs, encoded-video | Желательно | Превью и перекодированные видео. Восстанавливаются задачами, но на большой библиотеке это часы работы |
Порядок снятия копии
Лучший вариант — остановить контейнер immich-server на время бэкапа: тогда база и файлы гарантированно согласованы. Если останавливать нельзя, снимайте сначала базу, потом файлы. В худшем случае на диске окажутся файлы, о которых база не знает, — их можно дозалить руками. В обратном порядке база будет ссылаться на файлы, которых в копии нет, и вы получите битые ассеты.
Восстановление
Штатный путь — через интерфейс: Administration → Maintenance → Restore database backup, выбрать дамп из списка или загрузить .sql.gz. Перед восстановлением Immich создаёт точку отката и при неудаче возвращается к ней. На чистой установке тот же сценарий доступен на экране приветствия по кнопке «Restore from backup» — предварительно верните папки данных в новый UPLOAD_LOCATION.
Ручное восстановление через psql требует установки, в которой сервер ещё ни разу не запускался, либо переменной DB_SKIP_MIGRATIONS=true. Дампы, снятые до версии 2.5.0, восстанавливаются по инструкции для соответствующей версии документации.
Проверка результата
| Что проверить | Как |
| Контейнеры живы | docker compose ps — все сервисы в состоянии running или healthy |
| Задачи обработки | Страница очередей в администрировании: миниатюры, метаданные, Smart Search дошли до нуля |
| Машинное обучение | В логах ML-контейнера нет ошибок, лица сгруппировались, свободный запрос выдаёт релевантные кадры |
| Мобильный бэкап | Счётчик несинхронизированных файлов равен нулю, новые снимки появляются в таймлайне |
| Восстановление | Дамп из UPLOAD_LOCATION/backups и копия файлов разворачиваются на чистой установке, где сервер ещё не запускался |
DB_DATA_LOCATION на работающем сервере бэкапом не считается. Рабочая копия — это дамп из UPLOAD_LOCATION/backups плюс файлы медиатеки.Антипаттерны
| Антипаттерн | Почему плохо | Что делать вместо |
| Удалить фото из облака сразу после загрузки | Проект прямо предупреждает не использовать себя как единственное хранилище | Дождаться проверенного восстановления и держать вторую копию |
| База Postgres на сетевом диске | Повреждение данных и падения сервера | Локальный SSD или именованный том Docker |
| Тег latest вместо версии | Обновление приезжает без вашего решения | Закреплённый IMMICH_VERSION и чтение релиз-нотов |
| Сервер, открытый в интернет напрямую | Личный архив на неподготовленном хосте становится целью | VPN или обратный прокси с HTTPS и аутентификацией |
| Пароль базы из примера | Дефолтные значения известны всем | Свой пароль из латиницы и цифр в .env |
| Тяжёлая CLIP-модель на слабом железе | Очереди обработки не заканчиваются, поиск тормозит | Модель поменьше, оценка памяти и времени по таблицам документации |
Чеклист
Подготовка
Установка
docker-compose.yml и .env из последнего релизаUPLOAD_LOCATION, DB_DATA_LOCATION, TZDB_PASSWORDIMMICH_VERSION2283, создан администраторНастройка
:ro и exclusion patterns, если архив уже лежит на дискеЭксплуатация
Administration → Settings → Backupupload, library, profile и backups копируются вне сервераimmich-server либо в порядке «сначала база, потом файлы»Полезные ссылки
- Immich: официальный сайт — обзор возможностей и демо
- Immich: документация — установка, настройка, администрирование
- Immich: требования — железо, ОС, файловые системы
- Immich: установка через Docker Compose — пошаговая инструкция и типичные ошибки
- Immich: переменные окружения — полный справочник настроек
- Immich: поиск — фильтры и сравнение CLIP-моделей по языкам
- Immich: бэкап и восстановление — автоматические дампы, порядок копирования, восстановление
- Immich: внешние библиотеки — монтирование, шаблоны исключений, ограничения
- Immich: аппаратное транскодирование — NVENC, Quick Sync, VAAPI, RKMPP
- Immich: шаги после установки — администратор, storage template, мобильные приложения
- GitHub: immich-app/immich — исходники, релизы, лицензия AGPL v3
- Immich: демо-стенд — интерфейс и фильтры поиска без установки
По теме
Собрать фото-архив у себя проще, чем кажется, а вот эксплуатация и бэкапы требуют дисциплины. Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov
Если хотите разобрать свою задачу — напишите мне Если хотите разобрать свою задачу — напишите мне.
Можно прийти с идеей, черновым контекстом или уже живой задачей. Помогу быстро понять, где реальный следующий шаг, а где лишний шум.
Обычно хватает 2–3 сообщений, чтобы понять, могу ли я здесь реально помочь и в каком формате лучше двигаться дальше.