SSD Nodes Learn 🎉 VPS от $4.99/мес
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-08-07

Системные требования Immich: RAM и место на диске

Для работы Immich требуется минимум 6 ГБ ОЗУ. Узнайте распределение ресурсов между Postgres, Redis и ML, а также как запустить сервер на 4 ГБ памяти с помощью ограничений.

Сколько оперативной памяти требуется для Immich?

Для работы Immich требуется минимум 6 ГБ оперативной памяти (RAM), а рекомендуемый объем составляет 8 ГБ. При этом минимальное количество ядер процессора — 2, а для комфортной работы рекомендуется 4. Эти цифры относятся ко всему стеку целиком, так как Immich состоит из четырех контейнеров, а не из одного приложения. Просмотр уже импортированной библиотеки потребляет мало ресурсов. Основная нагрузка по памяти приходится на процесс импорта, причем большая часть расходуется одним контейнером, который при необходимости можно отключить.

ChartImmich documented hardware requirements, August 2026
The data behind this chart
[
  {
    "label": "Documented minimum",
    "ram_gb": 6,
    "cpu_cores": 2
  },
  {
    "label": "Documented recommended",
    "ram_gb": 8,
    "cpu_cores": 4
  }
]

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

Существует одно реальное жесткое ограничение. Immich версии 3 и выше требует наличия x86-64-v2 CPU на хостах amd64, что охватывает большинство процессоров, выпущенных примерно с 2012 года. На более старом оборудовании контейнер не запустится, а не просто будет работать медленно.

Если установка еще впереди, начните с полного руководства по установке Immich на VPS с использованием Docker Compose, а затем вернитесь сюда, чтобы подобрать подходящие параметры сервера.

Куда уходит память: четыре контейнера

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

immich-server обслуживает веб-интерфейс и API, а также запускает воркеры фоновых задач. Внутри этого контейнера работают два воркера. api отвечает на запросы из браузера и мобильного приложения. microservices управляет очередями, включая создание миниатюр и кодирование видео. Переменные IMMICH_WORKERS_INCLUDE и IMMICH_WORKERS_EXCLUDE разделяют эти две функции на отдельные контейнеры; так можно ограничить память для ресурсоемкой части, не затрагивая ту, что отвечает за отображение ваших фотографий.

database — это образ PostgreSQL 14 со встроенным расширением VectorChord. Он хранит все метаданные и по одному поисковому вектору на каждый объект. В документации Immich для этого сервиса указан единственный жесткий минимум: если вы устанавливаете лимиты ресурсов Docker, базе данных требуется не менее 2 GB. На той же странице сказано, что база данных должна располагаться на локальном SSD-накопителе, а не на сетевом диске любого типа. Поиск по векторам и индексам состоит из множества мелких случайных операций чтения, поэтому сетевой том превращает каждую из них в сетевой запрос с задержкой. Если выбор тарифа зависит от этого, разница между NVMe и SATA SSD на VPS здесь критичнее, чем в любой другой части стека.

redis запускает образ Valkey и хранит очереди задач. Это самый легкий из четырех контейнеров, так как он хранит записи о задачах, а не данные фотографий.

immich-machine-learning — это сервис, который определяет требования к размеру вашего плана. Он загружает модели для интеллектуального поиска, распознавания лиц и текста, при этом загруженная модель остается в оперативной памяти. Значение MACHINE_LEARNING_MODEL_TTL по умолчанию равно 300, поэтому модель выгружается через пять минут отсутствия запросов и считывается обратно с тома /cache при следующем обращении. Во время массового импорта пятиминутных пауз не бывает, поэтому модели остаются загруженными от первого до последнего объекта.

Что происходит во время импорта

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

Извлечение метаданных считывает заголовок файла и требует минимум ресурсов. Генерация миниатюр — более тяжелый процесс. Immich создает три варианта миниатюр для каждого ресурса: размытый заполнитель thumbhash, превью в формате WebP и миниатюру JPEG, а также дополнительную миниатюру для каждого распознанного лица. Каждая такая задача декодирует изображение, а параметр параллелизма (concurrency) определяет, сколько задач выполняется одновременно. Этот множитель превращает небольшую нагрузку от одной задачи в значительную нагрузку на весь сервер. Именно поэтому в FAQ Immich первым делом рекомендуют снизить этот параметр на ограниченных в ресурсах машинах. Установите значение параллелизма для тяжелых очередей равным 1 в разделе Administration, Settings, Job Settings.

Видеофайлы требуют транскодирования. Каждая задача транскодирования — это отдельный процесс FFmpeg с собственным потреблением памяти, который задействует все доступные потоки CPU, если не ограничить их использование.

Функция интеллектуального поиска (smart search) отправляет каждый новый ресурс в контейнер машинного обучения для вычисления вектора встраивания (embedding vector). Распознавание лиц запускает вторую модель для того же изображения. При первом импорте существующей фотобиблиотеки обе эти очереди обрабатывают каждый ваш файл в течение нескольких часов. Это самый критический момент для потребления оперативной памяти за все время работы системы, и он происходит только один раз.

Почему распознавание лиц и объектов требует больше всего оперативной памяти

Обработка лиц состоит из двух задач. Детекция лиц запускает модель в контейнере машинного обучения и находит ограничивающие рамки. Распознавание лиц затем группирует эти результаты по людям, и этот этап отправляет запросы к векторному индексу в Postgres. Таким образом, большая библиотека поочередно нагружает оба сервиса: контейнер с моделью во время детекции и базу данных во время группировки.

Четыре параметра определяют объем данных, удерживаемых в памяти контейнером машинного обучения.

  • Модель лиц. Immich по умолчанию поставляет buffalo_l, а в FAQ рекомендуется buffalo_s для небольших серверов. Это более компактная модель, поэтому она занимает меньше памяти и работает быстрее, но с меньшей точностью при распознавании мелких лиц или лиц в профиль.
  • Количество воркеров. MACHINE_LEARNING_WORKERS по умолчанию равно 1. Каждый воркер — это отдельный процесс, который загружает собственную копию моделей, поэтому увеличение этого значения до 2 примерно удваивает объем резидентной памяти, занимаемой моделями. Оставьте значение 1, если у вас нет избытка оперативной памяти.
  • Размер пакета. MACHINE_LEARNING_MAX_BATCH_SIZE__FACIAL_RECOGNITION ограничивает количество лиц, обрабатываемых одновременно. Пакет целиком удерживается в памяти, поэтому групповая фотография с сорока лицами требует больше ресурсов, чем портрет.
  • Типы используемых моделей. Умный поиск, детекция лиц и распознавание текста загружают собственные модели. Отключение неиспользуемых функций в разделе Administration, Settings, Machine Learning Settings позволяет полностью освободить занимаемую ими память, а не только в промежутках между импортами.

Также существует параметр MACHINE_LEARNING_MODEL_ARENA, который, согласно документации, выполняет предварительное выделение памяти CPU для предотвращения фрагментации и включен по умолчанию. Изменяйте его в последнюю очередь. Его влияние зависит от используемого аллокатора памяти, поэтому единственный надежный способ оценить его — отслеживать docker stats до и после внесения изменений.

Три рабочих профиля: 2 ГБ, 4 ГБ и 8 ГБ

ChartCompose memory limits that fit each server size, in MB
The data behind this chart
[
  {
    "label": "2 GB VPS",
    "server_limit_mb": 768,
    "db_limit_mb": 768,
    "ml_limit_mb": 0,
    "redis_limit_mb": 128,
    "notes": "machine learning container removed"
  },
  {
    "label": "4 GB VPS",
    "server_limit_mb": 1024,
    "db_limit_mb": 1280,
    "ml_limit_mb": 1024,
    "redis_limit_mb": 192,
    "notes": "machine learning on, job concurrency 1, buffalo_s"
  },
  {
    "label": "8 GB VPS",
    "server_limit_mb": 2048,
    "db_limit_mb": 2048,
    "ml_limit_mb": 2560,
    "redis_limit_mb": 256,
    "notes": "everything on at default settings"
  }
]

Воспринимайте эти значения как лимиты для ввода в Compose, а не как показатели фактического потребления ресурсов Immich. Лимит — это верхний предел. Он не резервирует память и не делает сервис «легче». Он определяет, какой процесс будет завершен ядром при нехватке памяти, и лучше вам принять это решение самостоятельно, чем полагаться на алгоритмы ядра.

Конфигурация на 2 ГБ: удаление контейнера машинного обучения

Объем 2 ГБ ниже официально заявленного минимума в 6 ГБ, поэтому данное решение является компромиссным. Закомментируйте весь сервис immich-machine-learning в файле docker-compose.yml или оставьте его запущенным, отключив все модели в разделе Administration, Settings, Machine Learning Settings. Удаление контейнера — более надежный вариант, так как даже при отключенных моделях Python-процесс остается в памяти.

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

Сумма четырех лимитов составляет около 1.7 ГБ, что оставляет хосту примерно 300 МБ. Обратите внимание, что 768 МБ для базы данных ниже минимального порога в 2 ГБ. Это неизбежный компромисс для конфигурации на 2 ГБ, и именно поэтому Postgres здесь чаще всего подвергается принудительному завершению.

Первым делом при нехватке ресурсов страдает импорт, а не просмотр библиотеки. Библиотека из нескольких десятков тысяч фотографий работает приемлемо, так как отображение страницы — это запрос метаданных и чтение файла. Массовый импорт видео на такой машине приведет к использованию swap, так как перекодирование и очередь создания миниатюр требуют много памяти одновременно. Установите параллелизм (concurrency) для всех тяжелых очередей в значение 1 и добавьте файл подкачки (swap).

Конфигурация на 4 ГБ: машинное обучение с ограничением параллелизма

4 ГБ — это минимальный объем, при котором имеет смысл включать распознавание лиц и объектов. Ограничьте контейнер машинного обучения значением 0 МБ, переключите распознавание лиц в режим buffalo_s и установите параллелизм задач (job concurrency) в значение 1 для генерации миниатюр, распознавания лиц и интеллектуального поиска.

Первичная обработка существующей библиотеки займет много часов, а для большой библиотеки — более суток. Это ограничение процессора, а не памяти, поэтому увеличение объема RAM не ускорит процесс.

В этой конфигурации первым делом при массовой обработке «падает» контейнер машинного обучения. Без лимитов он разрастается одновременно с процессом перекодирования, и ядро завершает тот процесс, который занимает больше памяти. Вы увидите Exited (137) в docker ps -a и перезапуск контейнера, при этом очередь обработки будет отставать еще сильнее, чем при последней проверке.

Конфигурация на 8 ГБ: рекомендуемые параметры

8 ГБ RAM и 4 ядер соответствуют рекомендациям Immich, что позволяет запускать всё с настройками по умолчанию: интеллектуальный поиск, распознавание лиц, распознавание текста и перекодирование с дефолтным уровнем параллелизма. Библиотеки объемом более ста тысяч объектов работают стабильно, и основная нагрузка смещается с памяти на скорость диска, так как база данных постоянно работает с векторным индексом и запросами метаданных.

В любом случае установите лимиты. На сервере с запасом ресурсов лимиты не позволят одной «зависшей» очереди потянуть за собой базу данных. Если вы сравниваете стоимость с более дешевыми вариантами, реальная стоимость VPS в зависимости от объема памяти обычно делает тариф на 8 ГБ самым выгодным способом избежать необходимости в тонкой настройке.

Ограничение потребления памяти для сервиса в Compose

Не редактируйте docker-compose.yml для этой цели. Этот файл перезаписывается при каждом обновлении с помощью wget. Разместите ограничения в docker-compose.override.yml рядом с ним, который docker compose объединяет автоматически.

services:
  immich-server:
    deploy:
      resources:
        limits:
          memory: 1024M
  immich-machine-learning:
    deploy:
      resources:
        limits:
          memory: 1024M
          cpus: '1.5'
  database:
    deploy:
      resources:
        limits:
          memory: 1280M
  redis:
    deploy:
      resources:
        limits:
          memory: 192M
docker compose up -d
docker stats --no-stream

docker stats теперь должен показывать ваш лимит в столбце MEM USAGE / LIMIT вместо общего объема памяти хоста. Если в столбце лимита по-прежнему отображается полный объем памяти хоста, значит, файл переопределения не был применен: проверьте имя файла и выполните docker compose config, чтобы увидеть итоговую конфигурацию.

Слишком низкий лимит превращает медленный сервис в нерабочий, поэтому увеличьте его, если контейнер начинает циклически перезапускаться. Подробнее о механизмах работы можно узнать в настройке лимитов памяти для сервиса в Docker Compose, включая информацию о том, почему deploy работает вне Swarm с Compose v2.

Как отключить или перенести контейнер машинного обучения

На сервере с ограниченными ресурсами перенос этого контейнера на другую машину — самое эффективное решение. Immich поддерживает запуск этого компонента на отдельном узле. Создайте следующий файл на втором хосте, который может быть даже обычным рабочим компьютером, включаемым только по вечерам:

name: immich_remote_ml
services:
  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
    restart: always
    ports:
      - 3003:3003
volumes:
  model-cache:
docker compose up -d
curl -s http://localhost:3003/ping

Затем перейдите в раздел Administration, Settings, Machine Learning Settings в веб-интерфейсе, нажмите Add URL и введите http://<host>:3003. Версии Immich на обоих хостах должны совпадать, так как документация предупреждает, что несовпадение версий приводит к ошибкам и нестабильной работе.

Этот порт передает данные ваших фотографий на другую машину в незашифрованном виде, поэтому используйте только частную сеть или туннель WireGuard между двумя хостами. Никогда не открывайте порт 3003 в интернет.

Если проблема заключается в самом факте постоянной работы контейнера с моделью, это весомый повод сравнить различия в работе PhotoPrism и Immich в фоновом режиме, прежде чем планировать ресурсы сервера.

Сколько дискового пространства требуется для библиотеки Immich?

Единого множителя не существует, так как четыре различных компонента растут с разной скоростью. Ниже приведен расчет для библиотеки из 50,000 фотографий и 500 коротких видео.

ChartWorked disk estimate: 50,000 photos and 500 videos
The data behind this chart
[
  {
    "label": "Originals: 50,000 photos at 4 MB",
    "gb": 200
  },
  {
    "label": "Originals: 500 videos at 120 MB",
    "gb": 60
  },
  {
    "label": "Thumbnails and encoded video at 15%",
    "gb": 39
  },
  {
    "label": "Postgres database",
    "gb": 3
  },
  {
    "label": "Machine learning model cache",
    "gb": 2
  }
]

Значения 200 ГБ для фотографий и 60 ГБ для видео являются оценочными. Замените их на свои средние показатели перед покупкой оборудования, так как именно видео определяет итоговый объем: одна минута видео с телефона занимает больше места, чем сотня фотографий.

find /srv/immich/upload -type f -printf '%s\n' \
  | awk '{n++; s+=$1} END {printf "%d files, %.1f MB average\n", n, s/n/1048576}'

Строка 39 ГБ — это единственное официальное соотношение, предоставляемое Immich: создаваемые миниатюры и перекодированные видео в среднем увеличивают размер библиотеки на 10–20 процентов. Этот диапазон зависит от того, какая доля ваших медиафайлов требует перекодирования для совместимости с браузерами. Библиотека, состоящая из JPEGs, будет ближе к нижней границе этого диапазона.

База данных занимает 3 ГБ, что является практически фиксированной величиной. В документации Immich указано, что файлы базы данных обычно занимают от 1 до 3 ГБ, так как они содержат метаданные и векторы поиска, а не сами пиксели изображений. Кэш моделей занимает 2 ГБ и увеличивается, если вы активируете несколько моделей или тестируете разные варианты. В FAQ этот объем отмечен как значимый потребитель пространства именно по этой причине.

Сумма пяти строк составляет чуть более 300 ГБ, поэтому том объемом 500 ГБ оставляет место для роста, а 250 ГБ — нет. Отслеживайте распределение с помощью:

grep UPLOAD_LOCATION .env
du -sh /srv/immich/*

Внутри UPLOAD_LOCATION находятся шесть папок. upload и library содержат оригиналы, thumbs — превью и миниатюры лиц, encoded-video — перекодированные копии, profile — аватары, а backups — автоматические дампы базы данных. Только upload, library и profile являются незаменимыми, так как всё остальное можно восстановить на их основе.

Две вещи часто становятся неожиданностью. Удаленные файлы сначала попадают в корзину и продолжают занимать место, пока она не будет очищена, поэтому масштабная очистка не освобождает пространство в день её проведения. Дамп базы данных содержит только метаданные, поэтому он бесполезен без самих файлов:

docker exec -t immich_postgres pg_dump --clean --if-exists \
  --dbname=immich --username=postgres | gzip > /srv/backups/immich-dump.sql.gz

Дополните это файловой копией оригиналов в хранилище вне сервера, для чего и предназначены резервные копии restic с VPS на внешнее хранилище.

Для транскодирования используется CPU, а не RAM

Увеличение объема RAM не ускорит транскодирование. Immich выполняет транскодирование с помощью FFmpeg, и на обычном VPS каждый кадр декодируется и кодируется силами CPU. Даже при наличии аппаратного ускорения, согласно документации Immich, ускоряется только кодирование, поэтому декодирование и тональное отображение (tone mapping) по-прежнему выполняются программно на CPU.

Для аппаратного ускорения требуется дополнительный файл hwaccel.transcoding.yml Compose, а также устройство для проброса с использованием NVENC, Quick Sync, RKMPP или VAAPI. Большинство тарифных планов VPS не предоставляют таких возможностей, поэтому рассчитывайте нагрузку на CPU.

Практически важным параметром является количество потоков. В разделе Administration, Settings, Video Transcoding Settings значение 0 означает использование всех ядер, из-за чего при обработке одного видео интерфейс на 2-ядерном тарифе может зависнуть. Установите значение 1 или 2, как рекомендуется в FAQ Immich, чтобы транскодирование стало медленным, но не мешало работе системы.

Почему свопинг (swap thrashing) выглядит как зависание

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

Без раздела подкачки (swap) ядро принудительно завершает процесс. Контейнер перезапускается в течение нескольких секунд, поэтому в браузере очередь задач просто останавливается, а затем возобновляется. Доказательства находятся в docker ps -a:

docker ps -a --filter name=immich
docker inspect immich_machine_learning | grep -i oomkilled
sudo dmesg -T | grep -i -E 'out of memory|oom-kill'

Exited (137) означает, что процесс был завершен сигналом 9. Значение 137 — это 128 плюс 9. Значение OOMKilled, равное true, подтверждает, что процесс был завершен из-за нехватки памяти, а не из-за программного сбоя.

При наличии swap ничего не завершается и ошибок не возникает. Ядро начинает перемещать страницы памяти на диск, скорость импорта падает на порядок, а веб-интерфейс перестает отвечать в рамках обычного тайм-аута. Все контейнеры запущены. Все проверки работоспособности (health checks) могут проходить успешно. Это выглядит как зависание, и в этот момент пользователи перезагружают сервер, что приводит к потере прогресса очереди и не решает проблему.

free -m
vmstat 1 5

Постоянные ненулевые значения в столбцах si и so утилиты vmstat означают, что система непрерывно читает и записывает данные в swap, что и является определением свопинга (thrashing). В это же время значение в строке free -m для Swap будет расти.

В любом случае добавьте swap на машину с 2 ГБ или 4 ГБ оперативной памяти, так как медленный импорт, который можно диагностировать, лучше, чем принудительно завершенный контейнер, который нельзя:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Затем устраните причину. Уменьшите параллелизм задач до 1, ограничьте ресурсы контейнера машинного обучения или перенесите его на другой хост. Swap дает вам время на выполнение этих действий. Сам по себе swap не является решением проблемы.

FAQ

Можно ли запустить Immich на VPS с 2 ГБ ОЗУ?

Да, если закомментировать сервис immich-machine-learning в файле docker-compose.yml и установить параллелизм задач (job concurrency) на 1. Это меньше официально заявленного минимума в 6 ГБ, поэтому рассматривайте такой вариант как осознанный компромисс. У вас останутся функции загрузки, альбомов, обмена, мобильного бэкапа и поиска по дате, месту и имени файла. Вы потеряете поиск по описанию, автоматическую группировку лиц и распознавание текста на изображениях. Добавьте swap-файл объемом 2 ГБ, чтобы при пиковой нагрузке во время импорта сервер замедлялся, а не принудительно завершал работу контейнеров.

Почему импорт в Immich останавливается без сообщений об ошибках?

Существуют две разные причины, которые выглядят в браузере одинаково. Либо контейнер был завершен из-за нехватки памяти (в этом случае docker ps -a показывает Exited (137), и контейнер уже перезапустился), либо хост использует swap (в этом случае все контейнеры работают, но система крайне медленна). Команда vmstat 1 5 поможет их различить: устойчивые ненулевые значения в столбцах si и so указывают на использование swap. В обоих случаях снизьте параллелизм задач для генерации миниатюр, распознавания лиц и интеллектуального поиска.

Что означает код завершения 137 в логах Immich?

137 — это 128 плюс сигнал 9, что означает принудительное завершение процесса через SIGKILL. На практике это указывает на достижение лимита памяти — либо собственного лимита контейнера, либо лимита всего хоста. Проверьте это с помощью docker inspect immich_machine_learning | grep -i oomkilled. Значение true подтверждает, что ядро завершило процесс из-за нехватки памяти, а free -m вместе с sudo dmesg -T | grep -i oom-kill покажут, был ли это лимит контейнера или всего хоста. Чаще всего страдает контейнер машинного обучения, так как он обычно потребляет больше всего ресурсов.

Сколько дискового пространства нужно для одной фотографии в Immich?

Закладывайте объем исходного файла плюс 10–20 процентов. Согласно документации Immich, сгенерированные миниатюры и перекодированное видео увеличивают размер библиотеки в среднем на 10–20 процентов, а сама база данных обычно занимает от 1 до 3 ГБ даже при большой библиотеке. Итоговый объем зависит в основном от видео, поэтому перед выбором тарифного плана измерьте средний размер ваших файлов, а не просто умножайте количество фотографий на коэффициент.

Нужен ли для Immich графический процессор (GPU)?

Нет. Все компоненты Immich работают на центральном процессоре (CPU). Видеокарта ускоряет работу моделей в контейнере машинного обучения и кодирование видео, но это не является обязательным требованием. Большинство VPS-планов не предоставляют GPU. На оборудовании только с CPU установите количество потоков перекодирования на 1 или 2, используйте модель распознавания лиц buffalo_s и оставьте первый массовый импорт на ночь.