Семейный фотоархив редко живёт по правилам: снимки приходят с двух телефонов, старой камеры и папки, переписанной с ноутбука. Облачные сервисы решают проблему хранения, но требуют подписки и доверия к чужому диску. Immich предлагает другой вариант: открытый сервер, который вы ставите сами, и мобильные приложения, которые автоматически загружают новые кадры. Ниже — установка через Docker Compose, настройка библиотеки, аппаратного ускорения и резервного копирования.
Как устроен Immich
Проект состоит из четырёх контейнеров: сервер с API и веб-интерфейсом, PostgreSQL, Redis и контейнер машинного обучения. Оригиналы лежат обычными файлами в каталоге библиотеки, а в базе хранятся метаданные, миниатюры и результаты распознавания. Файлы можно забрать без выгрузки, но база и библиотека резервируются вместе.
Это не двусторонняя синхронизация папок. Основной сценарий — загрузка с телефона или через веб-интерфейс, а существующий архив подключается как внешняя библиотека только для чтения. Проект развивается быстро и часто меняет интерфейс, поэтому обновляться лучше по release notes.
Требования и подготовка
Официально поддерживается только Docker: зависимости и миграции базы уже собраны в образе. Понадобится 64-битный сервер, Docker Engine с плагином Compose, 4 ГБ памяти без машинного обучения и 8 ГБ с ним, место под библиотеку и домен, если нужен доступ из интернета.
- Дистрибутив с ядром не старше двух лет: Mint, Ubuntu, Debian или Fedora.
- Отдельный диск под оригиналы: видео занимает гигабайты, а база растёт вместе с миниатюрами.
- HTTPS: мобильные клиенты не работают с самоподписанным сертификатом без дополнительных настроек.
- Часовой пояс в переменной TZ, иначе даты съёмки и уведомления будут расходиться.
Установка через Docker Compose
Создайте каталог, скачайте официальный compose-файл и пример окружения. Сам compose не редактируйте: при обновлении его проще заменить, а параметры держать в .env.
mkdir -p /srv/immich
cd /srv/immich
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
nano .env
docker compose up -d
В .env задайте путь к библиотеке, каталог данных PostgreSQL, пароль базы и часовой пояс. Значение release подходит для первого запуска, но для домашнего сервера полезнее закрепить конкретный тег: миграции базы назад не откатываются.
UPLOAD_LOCATION=/srv/immich/library
DB_DATA_LOCATION=/srv/immich/postgres
DB_PASSWORD=длинный-пароль-без-кавычек
TZ=Europe/Moscow
IMMICH_VERSION=release
Образ PostgreSQL у Immich нестандартный: в него добавлено расширение для векторного поиска. Не заменяйте его обычным postgres и не подключайте внешнюю базу без проверки совместимости, иначе поиск по смыслу и распознавание лиц перестанут работать.
Первый вход
После старта откройте http://адрес-сервера:2283 и создайте администратора. Порт 2283 слушает все интерфейсы: на публичном сервере закройте его файрволом и поставьте HTTPS-прокси.
docker compose ps
curl -s http://127.0.0.1:2283/api/server/ping
docker compose logs -f immich-server
ss -tlnp | grep 2283
Убедитесь, что контейнеры запущены, а в логах нет ошибок подключения к базе. Затем включите шаблон хранения {{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}} и запустите задание переноса: оно разложит существующие файлы по папкам года и даты.
Мобильные приложения и автозагрузка
Клиенты для Android и iOS ставятся из официальных магазинов. Укажите адрес сервера с HTTPS, войдите под своей учётной записью и включите backup. Ограничьте загрузку Wi-Fi, исключите скриншоты и служебные папки.
На Android автозагрузка работает как foreground service, поэтому системе нужно разрешить работу в фоне и снять ограничение расхода батареи. Если снимки не появляются, проверьте очередь в приложении и задания на сервере: причина бывает в диске или сертификате.
Библиотека и поиск
Веб-интерфейс умеет альбомы, общие ссылки с паролем и сроком действия, избранное и архив. Людей нужно подписать вручную, после чего поиск по имени начинает находить снимки. Умный поиск по описанию опирается на модель CLIP и лучше понимает английские запросы.
Внешние библиотеки подключаются как тома в compose-файле, доступные только на чтение; сканирование запускается вручную. Immich не переименовывает и не удаляет файлы внешней библиотеки, что важно, если рядом работает другая программа.
Аппаратное ускорение
Перекодирование видео и генерация превью на CPU работают, но на слабом сервере занимают часы. Intel и AMD ускоряются через VA-API, для этого контейнеру пробрасывают /dev/dri. NVIDIA требует nvidia-container-toolkit и отдельного compose-файла с аппаратным ускорением.
sudo apt install vainfo
vainfo --display drm --device /dev/dri/renderD128
docker compose -f docker-compose.yml -f hwaccel.transcoding.yml up -d
docker compose logs --tail=50 immich-server | grep -iE 'vaapi|qsv|nvenc'
Машинное обучение считает на CPU: лица и CLIP индексируются фоном и не блокируют загрузку. Если контейнер обучения занимает всю память, ограничьте его или отключите, пожертвовав умным поиском.
Резервное копирование
Копировать каталог работающей PostgreSQL нельзя: получится повреждённая база. Снимите логический дамп, остановите стек, синхронизируйте библиотеку и запустите контейнеры снова. В набор входят дамп, каталог library, файлы .env и docker-compose.yml.
cd /srv/immich
docker compose exec -T database pg_dumpall -U postgres > /backup/immich-$(date +%F).sql
docker compose stop
rsync -a /srv/immich/library/ /backup/immich-library/
cp .env docker-compose.yml /backup/
docker compose start
Дамп проверяйте на тестовом сервере: загрузите копию и убедитесь, что фотографии открываются. Храните копию на другом носителе и в другом месте. Для архива в сотни гигабайт удобны инкрементальные инструменты вроде restic, но дамп базы всё равно нужен отдельно.
Обновление и типичные проблемы
Перед обновлением прочитайте release notes, сделайте копию и скачайте новые образы. Если контейнер не поднимается, смотрите логи сервера и базы, а не перезапускайте всё подряд.
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 immich-server database
Частые причины сбоев: мало места, чужие права на каталог, пароль базы не совпадает с .env, маленький лимит загрузки на прокси. Для nginx нужны client_max_body_size 50000M, proxy_request_buffering off и заголовок X-Forwarded-Proto, иначе большие видео обрываются, а приложение строит неправильные ссылки.
Чек-лист
- Библиотека и база лежат на диске с запасом, а не на системном разделе.
- HTTPS и домен настроены до подключения телефонов.
- Копия включает дамп базы, library, .env и compose-файл.
- Шаблон хранения включён, задание переноса выполнено.
- Аппаратное ускорение проверено на одном тестовом видео.
- Обновления ставятся после чтения release notes и снятия копии.
Итог
Immich закрывает главную боль домашнего архива: новые снимки сами приезжают на ваш сервер, а поиск по людям и содержимому работает без облачной подписки. Основные усилия уходят не на установку, а на дисциплину эксплуатации: место на диске, HTTPS, резервные копии и аккуратные обновления. Если эти четыре вещи в порядке, сервер спокойно живёт годами.