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

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.