MAATRIX / Блог / PhotoPrism на Ubuntu 24.04: пошаговая установка

PhotoPrism на Ubuntu 24.04: пошаговая установка

MAATRIX

Тысячи фото с телефона копятся в облаке, которое вы не контролируете, а найти нужный снимок среди них — отдельный квест. PhotoPrism решает обе проблемы: он держит весь архив на вашем сервере и сам распознаёт, что на фото — лица, места, объекты, — так что искать можно словами вроде «пляж 2024» или «собака». Ниже — рабочая установка с нуля на Ubuntu 24.04 через Docker Compose, с реальными конфигами и типичными граблями.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое PhotoPrism и чем он отличается от Immich

PhotoPrism — self-hosted фотоархив на Go с TensorFlow-моделью внутри для автоматического тегирования: она размечает объекты, сцены и лица без отправки данных куда-либо наружу. Это принципиально: вся ИИ-обработка происходит локально на вашем сервере, никаких API-ключей OpenAI или Google Vision не требуется.

Из плюсов: зрелый проект (разработка с 2018 года), стабильный веб-интерфейс, поддержка RAW-форматов и видео, встроенный конвертер в превью через ffmpeg. Из минусов, о которых стоит сказать честно: часть функций (продвинутый поиск по лицам, WebDAV) доступна только в платной Plus-подписке, а сама индексация большого архива (десятки тысяч файлов) заметно грузит CPU в первые часы после импорта.

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

Требования к серверу

PhotoPrism не capricious к CPU в состоянии покоя, но индексация — это TensorFlow-инференс на каждое фото, и она заметно ест ресурсы первые часы после загрузки архива.

Размер архиваRAMCPUДиск
до 5 000 фото4 GB2 vCPU40 GB SSD + место под фото
5 000–30 000 фото8 GB4 vCPU100 GB SSD + место под фото
30 000+ фото16 GB4-6 vCPU200+ GB SSD (лучше NVMe)

Ориентир по месту: RAW-архив с зеркалки легко весит 30-50 ГБ на 5000 кадров, JPEG с телефона — в разы меньше. Плюс сама PhotoPrism хранит превью (thumbnails) — закладывайте ещё 15-20% сверху от объёма оригиналов. Для домашнего архива в разумных пределах хватит VPS с 4-8 GB RAM и SSD; если фотоархив растёт годами и переваливает за сотню гигабайт — присмотритесь к выделенному серверу с большим диском.

Учитывайте также, что при первом запуске импорта CPU может быть занят на 100% продолжительное время — это нормально, индексация идёт в фоне и не блокирует просмотр уже обработанных фото.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка Docker и подготовка окружения

Если Docker ещё не стоит — ставим его официальным скриптом:

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version

Создаём рабочую директорию и структуру для данных:

mkdir -p ~/photoprism/{originals,storage,import}
cd ~/photoprism
  • originals — сюда кладутся сами фото и видео, это основной архив;
  • storage — база SQLite/индекс, кэш, превью, логи;
  • import — временная папка для загрузки новых файлов, которые PhotoPrism потом переносит (или копирует) в originals.

Если у вас уже есть архив фото на другом сервере или в облаке — перенесите его в ~/photoprism/originals заранее через rsync или scp, чтобы не гонять гигабайты через веб-интерфейс.

docker-compose.yml: рабочий конфиг

Вот проверенный минимальный конфиг с MariaDB в качестве базы (SQLite из коробки тоже работает, но на архиве от нескольких тысяч фото MariaDB даёт заметно более стабильную скорость поиска):

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://photos.вашдомен.ру/"
      PHOTOPRISM_DISABLE_TLS: "false"
      PHOTOPRISM_DEFAULT_TLS: "false"
      PHOTOPRISM_DATABASE_DRIVER: "mysql"
      PHOTOPRISM_DATABASE_SERVER: "mariadb:3306"
      PHOTOPRISM_DATABASE_NAME: "photoprism"
      PHOTOPRISM_DATABASE_USER: "photoprism"
      PHOTOPRISM_DATABASE_PASSWORD: "СЮДА_ПАРОЛЬ_БД"
      PHOTOPRISM_UPLOAD_NSFW: "true"
      PHOTOPRISM_DETECT_NSFW: "false"
      UID: "1000"
      GID: "1000"
    volumes:
      - "./originals:/photoprism/originals"
      - "./import:/photoprism/import"
      - "./storage:/photoprism/storage"

  mariadb:
    image: mariadb:11
    restart: unless-stopped
    command: --innodb-buffer-pool-size=256M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - "./mariadb-data:/var/lib/mysql"
    environment:
      MARIADB_AUTO_UPGRADE: "1"
      MARIADB_INITDB_SKIP_TZINFO: "1"
      MARIADB_DATABASE: "photoprism"
      MARIADB_USER: "photoprism"
      MARIADB_PASSWORD: "СЮДА_ПАРОЛЬ_БД"
      MARIADB_ROOT_PASSWORD: "СЮДА_ROOT_ПАРОЛЬ"

Обязательно замените все три пароля на свои — оставленные примерные значения в проде через какое-то время находят сканеры. UID/GID 1000 — это обычно первый созданный пользователь Ubuntu; проверить свой можно командой id -u и id -g.

Поднимаем:

docker compose up -d
docker compose logs -f photoprism

Первый запуск создаёт схему базы и может занять минуту-две — дождитесь в логах строки о том, что сервер слушает порт 2342.

Первый вход и импорт фото

Открываем http://IP-сервера:2342, логинимся под admin и паролем из PHOTOPRISM_ADMIN_PASSWORD.

Дальше два пути загрузки фото:

  1. Через файловую систему — копируете файлы напрямую в ~/photoprism/originals/ (можно по подпапкам, например originals/2024/отпуск), затем в интерфейсе жмёте Library → Index — PhotoPrism просканирует и заиндексирует новые файлы.
  2. Через веб-загрузку — кнопка Upload в интерфейсе, удобно для отдельных файлов, но для тысяч фото медленнее, чем прямое копирование по SSH/rsync.

Для переноса большого архива с домашнего компьютера удобнее rsync:

rsync -avz --progress ~/Фото/ user@ваш-сервер:~/photoprism/originals/

После копирования запустите индексацию из интерфейса или командой:

docker compose exec photoprism photoprism index

Распознавание объектов и лиц (Convert + Classify) запускается отдельно и идёт в фоне — можно продолжать пользоваться галереей, пока обработка выполняется. На архиве в несколько тысяч фото на CPU без GPU-ускорения это может занять от пары часов до суток в зависимости от мощности сервера — конкретное время сильно зависит от количества файлов и их разрешения, точных цифр без замера на вашем железе не дам.

Настройка HTTPS через Caddy

Открывать фотоархив с логином и паролем по голому HTTP — плохая идея, особенно если будете заходить с телефона вне дома. Проще всего поднять Caddy как reverse proxy — он сам получает и продлевает сертификат Let's Encrypt.

Если Caddy ещё не стоит, у нас есть отдельный разбор его установки: Caddy с авто-SSL на Ubuntu 24.04: пошаговая установка. Домен нужно предварительно направить A-записью на IP сервера — как это сделать с нуля, описано в статье Ubuntu 24.04: настройка домена и DNS с нуля.

Конфиг /etc/caddy/Caddyfile для PhotoPrism:

photos.вашдомен.ру {
    reverse_proxy localhost:2342
    encode gzip

    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
        X-Content-Type-Options "nosniff"
        -Server
    }
}

Перезапускаем Caddy:

sudo systemctl reload caddy

После этого не забудьте поменять PHOTOPRISM_SITE_URL в docker-compose.yml на реальный HTTPS-адрес и PHOTOPRISM_DISABLE_TLS оставить true, поскольку TLS теперь терминирует Caddy, а не сам PhotoPrism — иначе будут проблемы с генерацией правильных ссылок на превью внутри интерфейса. После правки — docker compose up -d для применения.

Бэкап архива

Фотоархив — это то, что жалко терять безвозвратно, поэтому бэкап нужен на двух уровнях: сами файлы (originals) и база данных с метаданными, тегами и альбомами.

Дамп базы MariaDB:

docker compose exec mariadb mariadb-dump -u photoprism -p photoprism > photoprism-backup-$(date +%F).sql

Простой скрипт для регулярного бэкапа обеих частей на внешний диск или в другое хранилище:

#!/bin/bash
BACKUP_DIR="/mnt/backup/photoprism"
DATE=$(date +%F)
mkdir -p "$BACKUP_DIR"

docker compose -f ~/photoprism/docker-compose.yml exec -T mariadb \
  mariadb-dump -u photoprism -pСЮДА_ПАРОЛЬ_БД photoprism > "$BACKUP_DIR/db-$DATE.sql"

rsync -a --delete ~/photoprism/originals/ "$BACKUP_DIR/originals/"

find "$BACKUP_DIR" -name "db-*.sql" -mtime +14 -delete

Добавьте в cron (crontab -e) на ежедневный запуск ночью, например 0 3 * * * /home/user/backup-photoprism.sh. Оригиналы можно не дублировать локально, если само хранилище сервера уже отказоустойчиво (RAID/снапшоты у провайдера), но дамп базы — это буквально несколько мегабайт, и хранить его в двух местах не накладно.

Важно: storage/ (кэш и превью) бэкапить не обязательно — PhotoPrism перестроит его из оригиналов и базы при необходимости, это просто ускоряет работу, а не хранит уникальные данные.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

PhotoPrism бесплатный?

Основной функционал (импорт, поиск, ИИ-теги, альбомы, share-ссылки) доступен в open-source Community Edition бесплатно. Часть функций — расширенный поиск по лицам, WebDAV-доступ, некоторые виджеты — только в платной Plus-подписке.

Можно ли автоматически загружать фото с телефона?

Нативного мобильного приложения с автобэкапом у PhotoPrism нет — для этого сценария больше подходит Immich. С PhotoPrism можно организовать загрузку через WebDAV (Plus-подписка) или сторонние приложения синхронизации папок, но «из коробки» это не так гладко.

Что делать, если индексация зависла или падает по памяти?

Уменьшите число параллельных воркеров переменной PHOTOPRISM_WORKERS (например, до 2 на слабом сервере) и проверьте docker stats — если контейнер упирается в лимит RAM, увеличьте память сервера или подрежьте --innodb-buffer-pool-size у MariaDB.

Как перенести PhotoPrism на другой сервер?

Скопируйте директории originals, storage, mariadb-data целиком (rsync или tar) на новый сервер, разверните тот же docker-compose.yml и запустите docker compose up -d — данные подхватятся автоматически.

Нужен ли GPU для распознавания объектов?

Нет, TensorFlow-модель в PhotoPrism по умолчанию работает на CPU и справляется с этим без проблем, GPU-ускорение — опциональная надстройка для тех, у кого очень большие архивы и есть свободная видеокарта на сервере.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →