Immich в Docker: приватная замена Google Photos
Распознавание лиц и объектов без облака, автобэкап с телефона и честный разбор того, сколько ресурсов NAS это реально стоит.
- Зачем свой Immich вместо Google Photos
- Архитектура: почему это четыре контейнера, а не один
- Системные требования — и почему это не Vaultwarden по весу
- Что понадобится перед стартом
- Шаг 1 — подготовка окружения
- Шаг 2 — docker-compose.yml по сервисам
- Шаг 3 — ускорение машинного обучения через OpenVINO
- Мобильное приложение и автобэкап
- Внешние библиотеки: без дублирования старого архива
- Реверс-прокси для больших загрузок
- Бэкапы: база отдельно, файлы отдельно
- Безопасность
- Частые проблемы
Зачем свой Immich вместо Google Photos
Immich — открытый self-hosted аналог Google Photos: автоматический бэкап с телефона, распознавание лиц и дублей, поиск по содержимому фото ("собака на пляже" находит нужный кадр без единого тега), общие альбомы. Разница — фотографии не индексируются рекламной системой и не упираются в лимит бесплатного тарифа, который у крупных провайдеров имеет обыкновение сжиматься со временем.
Обратная сторона — Immich устроен сложнее, чем большинство сервисов на этом сайте: это не один контейнер, а согласованная работа четырёх, и требования к железу заметно выше, чем у Vaultwarden или Nginx Proxy Manager.
Архитектура: почему это четыре контейнера, а не один
Каждый сервис отвечает за своё: immich-server — API и приём файлов, PostgreSQL с расширением pgvector — не только обычные метаданные, но и векторные эмбеддинги для поиска по смыслу изображения, Redis — очередь фоновых задач (генерация превью, распознавание, транскодирование видео), immich-machine-learning — собственно распознавание лиц, объектов и построение векторов для поиска. Разделение на отдельный ML-сервис — не архитектурная прихоть: тяжёлые вычисления не должны блокировать обычную загрузку фотографий с телефона.
Системные требования — и почему это не Vaultwarden по весу
Официально заявленный минимум — 2 ядра CPU и 6 ГБ RAM, комфортный уровень — 4 ядра и 8 ГБ. Если сравнивать с моделями из статьи про выбор NAS: младшие DS225+/DS725+ с их 2–4 ГБ базовой памяти для Immich с активным распознаванием лиц — тесно, а вот DS925+ и старше с ECC-памятью от 8 ГБ — уже комфортный вариант.
| Сценарий | RAM | Замечание |
|---|---|---|
| Только загрузка и просмотр, без ML | от 4 ГБ | распознавание лиц/объектов отключено |
| Стандартное использование с ML | 6–8 ГБ | официальный рекомендованный минимум |
| Большая библиотека (100 000+ фото) | 8+ ГБ, желательно SSD под базу | том базы данных критичен к скорости диска |
Что понадобится перед стартом
- NAS с 4+ ГБ свободной RAM после остальных сервисов — Immich не стоит запускать "впритык" на модели с 2 ГБ.
- Отдельный том для базы данных, желательно на SSD/NVMe, если такой есть в NAS.
- Достаточно места под саму библиотеку фото — Immich хранит оригиналы без сжатия.
Шаг 1 — подготовка окружения
mkdir -p /volume1/docker/immich mkdir -p /volume1/photos/immich-library cd /volume1/docker/immich
/volume1/docker/immich/postgres подходит: для DSM это локальное хранилище, а не примонтированная извне сеть.
UPLOAD_LOCATION=/volume1/photos/immich-library DB_DATA_LOCATION=/volume1/docker/immich/postgres IMMICH_VERSION=release DB_PASSWORD=сгенерируйте-длинный-пароль TZ=Europe/Moscow
Шаг 2 — docker-compose.yml по сервисам
Актуальный compose-файл официально распространяется вместе с релизом и обновляется с каждой версией — надёжнее скачать его напрямую, чем копировать вручную:
wget -O docker-compose.yml \ https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml wget -O example.env \ https://github.com/immich-app/immich/releases/latest/download/example.env mv example.env .env # после этого впишите свои значения из шага 1 в .env
Внутри — четыре сервиса, описанные в разделе про архитектуру: immich-server, immich-machine-learning, redis, database. Менять их логику не нужно — почти вся кастомизация под NAS сводится к путям в .env и, при наличии Intel-графики, к тегу образа ML-сервиса из следующего шага.
docker compose up -d docker compose ps
Первый запуск дольше обычного — подтягиваются образы всех четырёх сервисов и модели машинного обучения. После старта интерфейс открывается на http://IP_NAS:2283, первый зарегистрированный пользователь автоматически становится администратором.
Шаг 3 — ускорение машинного обучения через OpenVINO
На NAS с Intel CPU (см. таблицу из статьи про выбор NAS) распознавание лиц и объектов можно частично переложить на встроенное видеоядро через OpenVINO — по аналогии с проброс /dev/dri в статье про Jellyfin, только здесь ускоряется не транскодирование видео, а инференс модели:
immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-openvino
devices:
- /dev/dri:/dev/dri
На AMD-моделях линейки такого ускорения нет — ML-сервис будет работать на CPU, что для одной семьи с несколькими тысячами фото всё ещё приемлемо по скорости, просто фоновая индексация после массовой загрузки архива займёт часы, а не минуты.
Мобильное приложение и автобэкап
Приложение для iOS и Android подключается по адресу сервера и начинает фоновый бэкап камеры сразу после разрешения на доступ к фото. Ключевая настройка, которую стоит проверить сразу — фоновая синхронизация без открытия приложения (Background App Refresh на iOS должен быть включён для Immich в системных настройках телефона, иначе бэкап идёт только при открытом приложении).
Внешние библиотеки: без дублирования старого архива
Если у вас уже есть архив фотографий за 15 лет на NAS — не обязательно заливать его повторно через приложение. Функция External Libraries подключает существующую папку на чтение, и Immich проиндексирует её содержимое на месте, без копирования файлов внутрь UPLOAD_LOCATION:
immich-server:
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /volume1/old-photo-archive:/mnt/external-library:ro
После этого путь /mnt/external-library добавляется как External Library в настройках администратора — библиотека остаётся физически там же, где лежала годами, но становится доступна для поиска и распознавания наравне с новыми фото.
Реверс-прокси для больших загрузок
Как и для Nextcloud, главная деталь при проксировании через Nginx Proxy Manager — лимит на размер тела запроса. Оригиналы с современных телефонов (особенно ProRAW и 4K-видео) легко превышают дефолтный лимит nginx:
client_max_body_size 50G; proxy_read_timeout 600;
Бэкапы: база отдельно, файлы отдельно
Как и в случае с Nextcloud, для консистентного состояния нужен дамп базы отдельно от файлов, а не поверхностное копирование тома:
#!/bin/bash STAMP=$(date +%Y%m%d-%H%M) DEST=/volume1/docker/immich/backups mkdir -p "$DEST" docker exec immich_postgres pg_dumpall -U postgres | gzip > "$DEST/db-$STAMP.sql.gz" find "$DEST" -name "db-*.sql.gz" -mtime +14 -delete # сама библиотека фото бэкапится отдельно через Hyper Backup по расписанию
Восстановление после потери базы без дампа теоретически возможно через повторное сканирование библиотеки, но безвозвратно теряются альбомы, лица, отметки "избранное" и метаданные, которые Immich сам насчитал — то есть именно то, ради чего сервис вообще запускался.
Безопасность
- Двухфакторная аутентификация для основной учётной записи, доступна из коробки в настройках профиля.
- Срок жизни у публичных ссылок на альбомы — не оставляйте расшаренные ссылки бессрочными, если делитесь фото с людьми вне семьи.
- Отдельные учётные записи для каждого члена семьи вместо одной общей — так у каждого свой автобэкап и права, а не общий пароль от всей библиотеки.
Частые проблемы
| Симптом | Вероятная причина |
|---|---|
| immich-server падает сразу после старта | CPU не поддерживает x86-64-v2 — редко, но встречается на старых NAS |
| Распознавание лиц идёт очень медленно | ML-сервис работает на CPU без OpenVINO/GPU-ускорения |
| Контейнеры валятся по нехватке памяти | суммарный RAM NAS меньше рекомендованных 6–8 ГБ с учётом остальных сервисов |
| Большие видео не загружаются с телефона | не увеличен client_max_body_size на реверс-прокси |
| Мобильный бэкап останавливается при закрытой программе | отключено фоновое обновление приложения в настройках телефона |
| После сбоя базы пропали альбомы и лица | не было отдельного дампа pg_dumpall — только копия тома с фото |
После того как ML-сервис получил ускорение (или честно работает на CPU в фоне), реверс-прокси пропускает файлы нужного размера, а бэкап базы идёт отдельно от библиотеки — Immich на домашнем NAS справляется с ролью личного облака фото ничуть не хуже коммерческих сервисов, которые он заменяет.