Immich на VPS: свой Google Photos через Docker Compose

Установка Immich официальным Docker Compose, администратор, поиск по содержимому и лица, закрытие порта 2283, резервные копии с проверкой восстановления и обновление. Debian 12 и Ubuntu 24.04.

13 октября 2026 г.·7 мин чтения·immich, docker, self-hosted

Immich — открытая замена Google Фото на своём сервере. Снимки собираются в ленту по датам, ищутся по смыслу («beach», «cat»), группируются по лицам, открываются в браузере и в мобильном приложении, которое умеет автоматически копировать фото с телефона. Отличие одно: все файлы лежат на вашем VPS.

Как устроен Immich

Один файл Docker Compose поднимает четыре контейнера:

Контейнер Что делает
immich_server веб-интерфейс, загрузки, фоновые задания
immich_postgres даты, альбомы, имена людей, настройки — но не сами фото
immich_redis (Valkey) очередь заданий
immich_machine_learning нейросети: поиск по содержимому и распознавание лиц

Оригиналы фотографий остаются обычными файлами в папке UPLOAD_LOCATION. Поэтому резервная копия Immich всегда состоит из двух частей — базы и папки с файлами — и по одной из них библиотеку не вернуть.

Нейросети считаются на процессоре, видеокарта не нужна, но ресурсов они просят заметно. Документация называет минимумом 6 ГБ памяти и 2 ядра, рекомендует 8 ГБ и 4 ядра; на 4 ГБ можно работать с отключённым машинным обучением. В покое весь стек занимает около 1 ГБ, при обработке — до 2,8 ГБ. Модели скачиваются при первом использовании и занимают ещё около 2 ГБ на диске.

Что нужно

  • Сервер на tanaka.host с Debian 12 или Ubuntu 24.04 и от 6 ГБ памяти. Диск — под размер библиотеки плюс 10–20 % на миниатюры и перекодированные видео, плюс около 7 ГБ на образы и модели.
  • Docker с плагином Compose — см. установку Docker. Старая docker-compose через дефис не поддерживается.
  • Домен для первого запуска не нужен.

1. Проверьте Docker

docker --version
docker compose version

Обе команды должны вернуть версии. Если стоит старый пакет docker.io из репозиториев дистрибутива — переустановите по инструкции выше.

2. Скачайте файлы Immich

mkdir -p /opt/immich-app && cd /opt/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

Берите файлы из последнего релиза, а не из основной ветки — они могут не совпадать. Править docker-compose.yml не нужно, все настройки в .env.

3. Заполните .env

Сгенерируйте пароль базы — Immich разрешает в нём только символы A-Za-z0-9:

openssl rand -hex 16

Откройте файл:

nano .env

Замените postgres в строке DB_PASSWORD=postgres на сгенерированный пароль. Найдите # TZ=Etc/UTC, уберите решётку и при желании поставьте свой пояс, например Europe/Moscow. Сохраните (Ctrl+O, Enter, Ctrl+X) и закройте файл от посторонних:

chmod 600 .env

Проверка без комментариев:

grep -vE '^(#|$)' .env

Остальные параметры можно не трогать: UPLOAD_LOCATION=./library — папка под фото (окажется в /opt/immich-app/library), DB_DATA_LOCATION=./postgres — файлы базы (только локальный диск, сетевые запрещены), IMMICH_VERSION=v3 — «текущая третья версия», свежие выпуски внутри неё придут обновлением.

Пароль задаётся до первого запуска. PostgreSQL запоминает его при создании базы. Если поменять DB_PASSWORD потом, сервер будет перезапускаться с ошибкой password authentication failed for user "postgres".

4. Запустите

docker compose up -d

Образы весят около 4,7 ГБ. Через минуту проверьте:

docker compose ps

Когда у всех четырёх контейнеров в колонке STATUS появится healthy, Immich готов.

Порт 2283 открыт всему интернету. Docker публикует его в обход UFW — даже ufw deny 2283/tcp не поможет. Пока администратор не создан, первым зарегистрироваться может кто угодно. Сразу переходите к шагу 5, а в шаге 8 порт закроем.

5. Создайте администратора

Откройте http://IP-адрес-сервера:2283, нажмите Старт. Введите почту (она станет логином), надёжный пароль и имя, нажмите Зарегистрироваться и войдите.

Дальше короткий мастер. Два экрана стоит прочитать внимательно:

  • Конфиденциальность сервера — карта берёт плитки с tiles.immich.cloud, проверка версии ходит на version.immich.cloud. Если не хотите внешних обращений, выключите оба переключателя.
  • Шаблон хранилища — по умолчанию оригиналы раскладываются по пользователь/год/месяц/день.

6. Загрузите фото и попробуйте поиск

Загрузить в правом верхнем углу или перетащите файлы в окно. Дата в ленте берётся из метаданных снимка, без них — из даты изменения файла. Дубликаты Immich отсекает сам. После загрузки сервер ещё около минуты делает миниатюры и отдаёт снимки нейросетям; очереди видны в Управление сервером → Задачи.

Поиск работает по смыслу, а не по имени файла. Модель по умолчанию ViT-B-32__openai с русскими запросами работает непредсказуемо — пишите по-английски: cat, beach, mountain lake. Для других языков документация советует многоязычные модели (с xlm, siglip2 или nllb в названии), но им нужно около 3 ГБ памяти и больше. Сменить модель: Управление сервером → Настройки → Настройки машинного обучения → Интеллектуальный поиск, затем в Задачах запустить «Интеллектуальный поиск» для всех снимков.

Лица. Страница «Люди» показывает только названные группы. Откройте снимок, нажмите значок i, в блоке Люди кликните лицо → Добавить имя. Если лиц мало, уменьшите Минимум распознанных лиц (по умолчанию 3) в настройках распознавания и сбросьте задачу «Распознавание лиц».

7. Где лежат файлы

Всё в /opt/immich-app/library: library — оригиналы по шаблону, upload — ещё одно место оригиналов, profile — аватарки, thumbs — миниатюры, encoded-video — перекодированные видео, backups — автоматические дампы базы. Модели лежат в томе Docker immich_model-cache.

Не правьте эти папки руками. Загружайте, удаляйте и переименовывайте только через интерфейс или приложение, иначе база разойдётся с файлами.

8. Закройте порт

Документация прямо запрещает выставлять 2283 в интернет без защиты — пароли пойдут по HTTP. Создайте рядом с официальным файлом override, его Compose подхватит сам, а при обновлении вы его не перезапишете:

nano docker-compose.override.yml
# Порт 2283 слушает только внутри сервера
services:
  immich-server:
    ports: !override
      - "127.0.0.1:2283:2283"

Метка !override заменяет список портов, а не добавляет второй. Примените:

docker compose up -d

Дальше два способа открывать Immich:

  • SSH-туннель для себя — на своём компьютере выполните и откройте http://127.0.0.1:2283:
ssh -L 2283:127.0.0.1:2283 root@IP-адрес-сервера
  • Домен с HTTPS для телефона и доступа отовсюду — nginx с сертификатом Let’s Encrypt, проксирующий на http://127.0.0.1:2283. Прокси должен передавать Host, X-Real-IP, X-Forwarded-For, X-Forwarded-Proto, поддерживать WebSocket и большие загрузки (client_max_body_size 50000M, таймауты 600 с). Immich работает только в корне домена, путь вида /immich не поддерживается. Проверенный пример — на странице Immich про reverse proxy.

9. Мобильное приложение

Приложение есть в App Store, Google Play и как APK на GitHub. Введите адрес своего домена (https://photos.example.com), войдите с почтой и паролем, нажмите значок облака, выберите альбомы телефона и включите резервное копирование.

Обновляйте приложение раньше сервера. Сервер работает только с приложениями своей мажорной версии.

10. Резервные копии

Immich сам делает дампы базы каждую ночь в 2:00 и хранит 14 последних (Настройки → Настройки резервного копирования базы данных), файлы ложатся в library/backups. Но они на том же диске, что и фото. Скрипт ниже собирает и базу, и файлы в одну папку, откуда их удобно забирать. Сначала база, потом файлы — так в худшем случае получится файл без записи, а не запись без файла.

nano /opt/immich-app/backup.sh
#!/bin/sh
# Резервная копия Immich: сначала дамп базы, потом архив с фотографиями
BACKUP_DIR=/root/immich-backups
STAMP=$(date +%F-%H%M)
mkdir -p "$BACKUP_DIR"

# База данных (метаданные, альбомы, люди, настройки)
docker exec immich_postgres pg_dump --clean --if-exists --dbname=immich --username=postgres | gzip > "$BACKUP_DIR/db-$STAMP.sql.gz"

# Оригиналы фотографий и видео, загрузки и аватарки
tar -czf "$BACKUP_DIR/files-$STAMP.tar.gz" -C /opt/immich-app/library library upload profile

# Хранить 7 последних копий каждого вида
ls -1t "$BACKUP_DIR"/db-*.sql.gz | tail -n +8 | xargs -r rm --
ls -1t "$BACKUP_DIR"/files-*.tar.gz | tail -n +8 | xargs -r rm --

Миниатюры в архив не входят — Immich пересоздаст их сам.

chmod +x /opt/immich-app/backup.sh
/opt/immich-app/backup.sh
ls -lh /root/immich-backups

В crontab -e добавьте ночной запуск:

0 3 * * * /opt/immich-app/backup.sh

Папку /root/immich-backups регулярно забирайте на другой сервер — проще всего через restic в S3.

Восстановление

На новом сервере выполните шаги 1–4, администратора не создавайте. Верните файлы:

tar -xzf files-2026-10-21-1604.tar.gz -C /opt/immich-app/library

Дамп положите в library/backups. В браузере вместо регистрации нажмите Восстановить из резервной копии — сервер перейдёт в режим обслуживания. Ссылку для входа в него возьмите из журнала:

docker logs immich_server 2>&1 | grep -A1 "log in using"

Ссылка вида https://my.immich.app/maintenance?token=... — замените https://my.immich.app на адрес вашего Immich (например http://127.0.0.1:2283 при туннеле), токен никому не показывайте. Далее проверка папок → Далее → выбор дампа → Восстановить. Через полминуты сервер сам выйдет из режима обслуживания.

Обновление

Сначала копия, затем примечания к релизу, затем:

cd /opt/immich-app
docker compose pull && docker compose up -d

Откат на старую версию не поддерживается, даже внутри одной минорной — поэтому копия перед обновлением обязательна.

Полезные команды

docker compose ps                      # состояние контейнеров
docker compose logs -f immich-server   # журнал сервера, выход по Ctrl+C
docker compose stop                    # остановить Immich, данные остаются
docker compose start                   # запустить снова
docker compose down                    # удалить контейнеры, папки с данными остаются
docker stats --no-stream               # сколько памяти занимает каждый контейнер
docker exec -it immich_server immich-admin version   # версия Immich

Не добавляйте к docker compose down флаг -v — удалится том с моделями, и Immich скачает их заново.

Забыли пароль администратора:

docker exec -it immich_server immich-admin reset-admin-password

Если сервер тормозит на 4 ГБ, выключите Включить машинное обучение в настройках — останется хранилище с лентой и альбомами, без поиска и лиц. Для полноценного облака с документами и календарём посмотрите Nextcloud AIO.