Медиа · :2283

Immich в Docker: приватная замена Google Photos

Распознавание лиц и объектов без облака, автобэкап с телефона и честный разбор того, сколько ресурсов NAS это реально стоит.

Зачем свой Immich вместо Google Photos

Immich — открытый self-hosted аналог Google Photos: автоматический бэкап с телефона, распознавание лиц и дублей, поиск по содержимому фото ("собака на пляже" находит нужный кадр без единого тега), общие альбомы. Разница — фотографии не индексируются рекламной системой и не упираются в лимит бесплатного тарифа, который у крупных провайдеров имеет обыкновение сжиматься со временем.

Обратная сторона — Immich устроен сложнее, чем большинство сервисов на этом сайте: это не один контейнер, а согласованная работа четырёх, и требования к железу заметно выше, чем у Vaultwarden или Nginx Proxy Manager.

Архитектура: почему это четыре контейнера, а не один

клиент / моб. приложение immich-server api · очереди задач postgresql + pgvector redis · очередь задач machine-learning лица, объекты и векторный поиск считаются отдельным сервисом, чтобы не блокировать api во время тяжёлых вычислений

Каждый сервис отвечает за своё: 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 ГБ — уже комфортный вариант.

⚠ менее очевидное требование
Immich официально требует процессор с поддержкой набора инструкций x86-64-v2 (SSE4.2 и новее) — это касается совсем старых или бюджетных Atom-платформ. Актуальные модели Plus-серии 2025–2026 годов (и Intel, и AMD) этому требованию соответствуют, но если у вас NAS пятилетней давности — стоит свериться перед установкой, иначе контейнер immich-server будет падать с ошибкой уровня "illegal instruction" сразу после старта.
СценарийRAMЗамечание
Только загрузка и просмотр, без MLот 4 ГБраспознавание лиц/объектов отключено
Стандартное использование с ML6–8 ГБофициальный рекомендованный минимум
Большая библиотека (100 000+ фото)8+ ГБ, желательно SSD под базутом базы данных критичен к скорости диска

Что понадобится перед стартом

Шаг 1 — подготовка окружения

ssh · admin@nas
mkdir -p /volume1/docker/immich
mkdir -p /volume1/photos/immich-library
cd /volume1/docker/immich
⚠ важное ограничение официальной документации
Каталог базы данных PostgreSQL не должен находиться на сетевой шаре (NFS/SMB-mount) — только на локальном томе NAS. Обычный путь вида /volume1/docker/immich/postgres подходит: для DSM это локальное хранилище, а не примонтированная извне сеть.
.env
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-файл официально распространяется вместе с релизом и обновляется с каждой версией — надёжнее скачать его напрямую, чем копировать вручную:

ssh · admin@nas
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-сервиса из следующего шага.

ssh · admin@nas
docker compose up -d
docker compose ps

Первый запуск дольше обычного — подтягиваются образы всех четырёх сервисов и модели машинного обучения. После старта интерфейс открывается на http://IP_NAS:2283, первый зарегистрированный пользователь автоматически становится администратором.

Шаг 3 — ускорение машинного обучения через OpenVINO

На NAS с Intel CPU (см. таблицу из статьи про выбор NAS) распознавание лиц и объектов можно частично переложить на встроенное видеоядро через OpenVINO — по аналогии с проброс /dev/dri в статье про Jellyfin, только здесь ускоряется не транскодирование видео, а инференс модели:

docker-compose.yml · immich-machine-learning
  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:

docker-compose.yml · immich-server
  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:

advanced · custom nginx configuration
client_max_body_size 50G;
proxy_read_timeout 600;

Бэкапы: база отдельно, файлы отдельно

Как и в случае с Nextcloud, для консистентного состояния нужен дамп базы отдельно от файлов, а не поверхностное копирование тома:

immich-backup.sh
#!/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 справляется с ролью личного облака фото ничуть не хуже коммерческих сервисов, которые он заменяет.