Как установить и настроить PhotoPrism на VPS
Google Photos режет бесплатное хранилище, а выгружать личный фотоархив в чужое облако не хочется — там и приватность под вопросом, и цена растёт с каждым гигабайтом. PhotoPrism решает обе проблемы: это самостоятельный сервис с ИИ-тегированием, распознаванием лиц и удобным поиском по содержимому фото, который вы держите на своём сервере и полностью контролируете. Ниже — рабочая установка на VPS через Docker, от требований к железу до бэкапа готовой библиотеки.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое PhotoPrism и чем он отличается от Immich
PhotoPrism — это self-hosted приложение для хранения, каталогизации и поиска фотографий. Внутри работает распознавание объектов и сцен на основе TensorFlow: фото автоматически получают теги вроде «пляж», «собака», «закат» без вашего участия, плюс есть кластеризация лиц (не путать с точным ФИО-распознаванием — это скорее группировка «похожих лиц» с ручной разметкой).
Главный конкурент в этой нише — Immich, и разница принципиальная:
| Критерий | PhotoPrism | Immich |
|---|---|---|
| Зрелость проекта | старше, стабильнее API | активнее развивается, чаще breaking changes |
| Мобильное приложение | ограниченное, веб-интерфейс основной | полноценные iOS/Android с автозагрузкой |
| ИИ-теги | встроены давно, работают стабильно | распознавание лиц мощнее, но требует больше ресурсов |
| Хранение | плоская структура originals + БД метаданных | своя структура с упором на мобильную синхронизацию |
| Нагрузка на CPU при импорте | умеренная | выше, особенно на face recognition |
Если вам важнее веб-интерфейс, стабильность и не критична автозагрузка с телефона в реальном времени — PhotoPrism удобнее. Если основной сценарий — замена Google Photos с моментальной синхронизацией с мобильного, присмотритесь и к Immich отдельно; здесь разберём именно PhotoPrism.
Требования к серверу и подготовка
PhotoPrism сам по себе не прожорлив, но индексация с ИИ-классификацией нагружает CPU всплесками при импорте новых фото. Ориентир для старта:
- CPU: 2 vCPU достаточно для личного архива на несколько тысяч фото; при импорте больших пачек обработка просто идёт дольше, ошибок из-за нехватки ядер не будет.
- RAM: минимум 2 ГБ для самого PhotoPrism, но с базой MariaDB и запасом под TensorFlow комфортнее закладывать 4 ГБ.
- Диск: главный фактор — размер вашей библиотеки. Считайте оригиналы + 15-20% на кэш превью и миниатюры. Если фотоархив растёт, лучше сразу брать тариф с NVMe и запасом, чем потом переносить данные вручную.
Для установки нужен Docker и Docker Compose — если на сервере их ещё нет, разверните по шагам из установки Docker на Ubuntu 24.04. Дальше создайте рабочую директорию:
mkdir -p ~/photoprism/{storage,database,originals}
cd ~/photoprism
Папка originals — это ваша фотобиблиотека в исходном виде (RAW, JPEG, видео), storage — служебные данные PhotoPrism (кэш, превью, sidecar-файлы), database — данные MariaDB.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверDocker Compose: конфигурация и запуск
Создайте docker-compose.yml:
services:
photoprism:
image: photoprism/photoprism:latest
restart: unless-stopped
depends_on:
- mariadb
ports:
- "2342:2342"
environment:
PHOTOPRISM_ADMIN_USER: "admin"
PHOTOPRISM_ADMIN_PASSWORD: "смените-этот-пароль"
PHOTOPRISM_AUTH_MODE: "password"
PHOTOPRISM_SITE_URL: "https://photo.ваш-домен.ru/"
PHOTOPRISM_DISABLE_TLS: "true"
PHOTOPRISM_ORIGINALS_LIMIT: 5000
PHOTOPRISM_HTTP_COMPRESSION: "gzip"
PHOTOPRISM_LOG_LEVEL: "info"
PHOTOPRISM_READONLY: "false"
PHOTOPRISM_DISABLE_FACES: "false"
PHOTOPRISM_DISABLE_CLASSIFICATION: "false"
PHOTOPRISM_DEFAULT_LOCALE: "ru"
PHOTOPRISM_DATABASE_DRIVER: "mysql"
PHOTOPRISM_DATABASE_SERVER: "mariadb:3306"
PHOTOPRISM_DATABASE_NAME: "photoprism"
PHOTOPRISM_DATABASE_USER: "photoprism"
PHOTOPRISM_DATABASE_PASSWORD: "другой-надёжный-пароль"
PHOTOPRISM_SITE_CAPTION: "Домашний фотоархив"
PHOTOPRISM_UID: 1000
PHOTOPRISM_GID: 1000
working_dir: "/photoprism"
volumes:
- "./storage:/photoprism/storage"
- "./originals:/photoprism/originals"
user: "1000:1000"
mariadb:
image: mariadb:10.11
restart: unless-stopped
command: mariadbd --innodb-buffer-pool-size=512M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MARIADB_AUTO_UPGRADE: "1"
MARIADB_INITDB_SKIP_TZINFO: "1"
MARIADB_DATABASE: "photoprism"
MARIADB_USER: "photoprism"
MARIADB_PASSWORD: "другой-надёжный-пароль"
MARIADB_ROOT_PASSWORD: "ещё-один-пароль"
volumes:
- "./database:/var/lib/mysql"
Пароли обязательно замените на свои — значения в примере учебные. Проверьте актуальный список переменных окружения в официальной документации PhotoPrism перед продакшен-запуском: проект развивается, и часть флагов между релизами переименовывают.
Запуск:
docker compose up -d
docker compose logs -f photoprism
Первый старт занимает время — контейнер инициализирует базу и служебные каталоги. Когда в логах появится строка про запущенный веб-сервер на порту 2342, откройте http://IP-сервера:2342 в браузере (на этом этапе — без домена, HTTPS настроим позже).
Первая настройка: импорт, ИИ-теги, приватность
Зайдите под логином admin и паролем из PHOTOPRISM_ADMIN_PASSWORD, сразу смените пароль в настройках профиля.
Загрузить фото можно двумя способами:
- Через веб-интерфейс — кнопка Upload, подходит для небольших партий.
- Просто скопировать файлы в
originalsна сервере (по SFTP, rsync или прямо в примонтированную папку) — надёжнее для больших архивов:
rsync -avz --progress /путь/к/локальным/фото/ user@server:~/photoprism/originals/
После загрузки запустите индексацию — либо кнопкой Index в интерфейсе, либо командой:
docker compose exec photoprism photoprism index
Индексация читает EXIF, строит превью и прогоняет ИИ-классификацию — присваивает теги по содержимому кадра и группирует похожие лица в разделе People (там же можно вручную подписать группу именем, после чего PhotoPrism будет предлагать это имя для похожих лиц). Точность распознавания зависит от качества и разнообразия фото в архиве — на смешанной домашней коллекции ждите, что часть лиц придётся разгруппировывать вручную, это нормально для локального ИИ без облачных мощностей.
Отдельно стоит сразу настроить:
- Часовой пояс и локаль — в Settings → General, иначе даты на фото могут отображаться некорректно.
- Приватный режим для чувствительных альбомов — PhotoPrism поддерживает пометку фото как приватных, они скрываются из общей ленты и шеринга.
- NSFW-детекцию, если архив общий с семьёй — включается через
PHOTOPRISM_DETECT_NSFW.
Домен, HTTPS и безопасный доступ
Отдавать фотоархив наружу по голому HTTP и порту 2342 — плохая идея, даже с паролем. Проще всего поставить reverse proxy с автоматическим SSL. Если ещё не определились с прокси, сравнение вариантов — в статье Caddy или Nginx: что выбрать для сервера, а пошаговая установка Caddy — в Caddy с авто-SSL на Ubuntu 24.04.
Минимальный Caddyfile для PhotoPrism:
photo.ваш-домен.ru {
reverse_proxy localhost:2342
}
После этого закройте порт 2342 наружу в файрволе, оставив доступ только с localhost:
ufw deny 2342
Дополнительно стоит:
- Включить двухфакторную аутентификацию в настройках профиля PhotoPrism (поддерживается TOTP).
- Использовать длинный уникальный
PHOTOPRISM_ADMIN_PASSWORD, не пароль из другого сервиса. - Если доступ нужен только вам и семье — рассмотреть VPN или ограничение по IP в конфиге прокси вместо публичного домена вообще.
Бэкап библиотеки, обновление и мониторинг диска
Оригиналы фото — самое ценное, что есть на сервере, поэтому бэкап не опционален. Резервировать нужно три вещи: папку originals, папку storage (там превью и служебные данные, восстановление без них возможно, но потребует полной переиндексации) и базу MariaDB.
# дамп базы
docker compose exec mariadb mariadb-dump -u photoprism -p photoprism > photoprism_db_$(date +%F).sql
# архив оригиналов (для больших библиотек лучше rsync на отдельное хранилище, а не tar)
tar -czf originals_$(date +%F).tar.gz originals/
Для регулярного автоматического бэкапа удобнее взять готовый инструмент — обзор вариантов и частые ошибки разобраны в статье про бэкап Docker volume на сервере. Если архив большой, держите отдельный мониторинг свободного места — как настроить, описано в мониторинге диска на VPS, чтобы не оказаться в ситуации закончилось место на диске посреди импорта новой партии фото.
Обновление PhotoPrism через Docker Compose простое:
docker compose pull photoprism
docker compose up -d photoprism
Перед крупным обновлением (смена мажорной версии) сделайте свежий дамп базы — PhotoPrism активно развивается, и структура БД между релизами иногда меняется с автоматической миграцией, которая в редких случаях может пойти не по плану на нестандартных конфигурациях.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Сколько RAM реально нужно для большого архива в десятки тысяч фото?
Жёсткого порога нет — индексация идёт партиями, а не загружает всю библиотеку в память разом. 4 ГБ обычно достаточно; если параллельно крутите и другие сервисы на том же VPS, закладывайте запас.
Можно ли перенести существующий архив с Google Photos?
Да, но напрямую PhotoPrism их не импортирует — сначала выгрузите архив через Google Takeout, затем скопируйте файлы в папку originals и запустите индексацию. EXIF-даты из Takeout обычно сохраняются в JSON-файлах рядом с фото, их нужно смёржить отдельным скриптом или инструментом вроде google-photos-exif перед импортом.
PhotoPrism бесплатный?
Да, есть открытый исходный код и бесплатная Community Edition, которой достаточно для личного использования. Платная подписка даёт дополнительные функции для команд и коммерческого использования — для домашнего архива не обязательна.
Что будет, если удалить фото из веб-интерфейса — оно удалится с диска?
Да, удаление в интерфейсе по умолчанию удаляет и оригинальный файл. Если нужен «мягкий» режим без реального удаления файлов, используйте PHOTOPRISM_READONLY: "true" — тогда PhotoPrism только индексирует, но не может менять файлы в originals.
Чем PhotoPrism отличается от простого файлового хранилища вроде Nextcloud?
Nextcloud — универсальное облачное хранилище с синхронизацией файлов любого типа; для фото у него нет сравнимой ИИ-классификации и поиска по содержимому. Если нужен и файловый диск, и фотоархив, их можно развернуть рядом на одном сервере — см. установку Nextcloud на VPS.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →