Установка PhotoPrism на VPS: Docker, автоматическая индексация и доступ по домену
TL;DR
В этом подробном руководстве мы шаг за шагом настроим PhotoPrism – мощное, самохостимое приложение для управления фотографиями и видео – на вашем виртуальном или выделенном сервере (VPS/Dedicated) с использованием Docker. Вы узнаете, как установить PhotoPrism, настроить автоматическую индексацию медиафайлов и обеспечить безопасный доступ к вашей фотобиблиотеке через доменное имя с HTTPS, используя обратный прокси-сервер Caddy.
- Настройка PhotoPrism и его зависимостей (MariaDB) с помощью Docker Compose.
- Обеспечение безопасного доступа к PhotoPrism через доменное имя и HTTPS с использованием Caddy.
- Настройка автоматической индексации новых фотографий и видео.
- Рекомендации по выбору оптимального VPS-конфига и базовой защите сервера.
- Стратегии резервного копирования и обслуживания для вашей медиатеки.
Что мы настраиваем и зачем
В эпоху цифровых технологий каждый из нас накапливает гигабайты, а порой и терабайты фотографий и видео. Облачные сервисы, такие как Google Photos или iCloud, предлагают удобные решения, но часто вызывают вопросы о конфиденциальности, стоимости подписки и контроле над вашими данными. PhotoPrism – это элегантная альтернатива, позволяющая вам полностью владеть и управлять своей медиатекой на собственном сервере.
PhotoPrism – это приложение с открытым исходным кодом, которое использует передовые технологии для организации вашей фотоколлекции. Оно автоматически индексирует изображения, обнаруживает лица, распознает объекты и места, а также позволяет искать по этим критериям. Вы получаете удобный веб-интерфейс для просмотра, сортировки и обмена вашими воспоминаниями, при этом все данные остаются под вашим полным контролем.
В результате этого руководства вы получите полностью функциональный PhotoPrism, работающий на вашем VPS. Ваша медиатека будет доступна по собственному доменному имени (например, photos.yourdomain.com) с безопасным HTTPS-соединением, что обеспечит конфиденциальность и целостность данных. Мы настроим Docker Compose для легкого развертывания и управления PhotoPrism и его базой данных, а также автоматическую индексацию новых файлов, чтобы ваша библиотека всегда была актуальной.
Альтернативы: облачные сервисы против self-hosted на VPS
Когда речь идет об управлении фотографиями, существует два основных пути:
-
Облачные управляемые сервисы (Cloud-managed): Это такие решения, как Google Photos, Apple iCloud Photos, Dropbox Photos.
- Плюсы: Максимальное удобство, не нужно беспокоиться об инфраструктуре, автоматические бэкапы, часто есть бесплатный уровень (с ограничениями).
- Минусы: Зависимость от стороннего провайдера, вопросы конфиденциальности данных (кто имеет доступ к вашим фотографиям?), ограниченный контроль над функциями и хранилищем, растущие расходы по мере увеличения объема данных.
-
Самохостинг на VPS/Dedicated сервере (Self-hosted): Установка PhotoPrism (или аналогов, таких как Nextcloud с приложением Photos, Immich) на свой собственный сервер.
- Плюсы: Полный контроль над вашими данными и их конфиденциальностью, отсутствие абонентской платы за сервис (только за сервер), гибкость в настройке, возможность интеграции с другими вашими сервисами.
- Минусы: Требует технических знаний для установки и обслуживания, вы несете ответственность за бэкапы и безопасность сервера, первоначальные временные затраты на настройку.
Выбор self-hosted на VPS идеален для тех, кто ценит конфиденциальность, хочет иметь полный контроль над своей цифровой жизнью и готов инвестировать время в настройку. Это позволяет создать личное, мощное и надежное фотохранилище, независимое от корпоративных политик и ценовой политики облачных гигантов.
Какой VPS-конфиг нужен под эту задачу
Выбор подходящего VPS – ключевой шаг для стабильной и быстрой работы PhotoPrism. Требования к ресурсам зависят от размера вашей медиатеки, количества пользователей и интенсивности индексации.
Минимальные требования
- CPU: 2 ядра. PhotoPrism активно использует процессор для индексации, распознавания лиц и объектов, транскодирования видео. Чем больше ядер, тем быстрее будет проходить первоначальная индексация и обработка новых файлов.
- RAM: 4 ГБ. PhotoPrism, особенно при активной индексации и работе с большой базой данных (MariaDB), может потреблять значительное количество оперативной памяти. 4 ГБ – это комфортный минимум. Если у вас очень большая библиотека (сотни тысяч фотографий) или планируется много одновременных пользователей, рассмотрите 8 ГБ.
-
Диск:
- Тип: SSD или NVMe. Скорость диска критична для быстрой индексации и доступа к медиафайлам. NVMe предпочтительнее для больших библиотек.
- Объем: От 100 ГБ. Основной объем будет занимать ваша медиатека. Помимо этого, PhotoPrism создает кэш и миниатюры, которые также требуют места. Рассчитывайте объем диска с запасом, исходя из текущего размера вашей коллекции и планов по её расширению. Например, если у вас 500 ГБ фотографий, вам потребуется минимум 600-700 ГБ дискового пространства для системы, базы данных, кэша и самих файлов.
- Сеть: 100 Мбит/с или 1 Гбит/с. Хорошая пропускная способность сети важна для быстрой загрузки и скачивания фотографий, особенно если вы планируете делиться ими или работать с ними удаленно.
Конкретный VPS-план под задачу (на примере)
Для комфортной работы с медиатекой до 1-2 ТБ и несколькими активными пользователями, рекомендуем рассмотреть VPS-план со следующими характеристиками:
- CPU: 4 ядра
- RAM: 8 ГБ
- Диск: 1 ТБ NVMe SSD
- Сеть: 1 Гбит/с
Такой конфигурации будет достаточно для большинства домашних и небольших командных сценариев использования PhotoPrism. Для аренды VPS с указанными характеристиками можно рассмотреть VPS с такими характеристиками у надежного провайдера.
Когда нужен dedicated, а не VPS
Выделенный сервер (dedicated server) становится необходим, если:
- Ваша медиатека превышает 5-10 ТБ и продолжает активно расти.
- Вы планируете использовать PhotoPrism для большого количества пользователей (десятки и более) с интенсивной нагрузкой.
- Вам нужна максимальная производительность дисковой подсистемы (например, RAID-массивы с высокоскоростными HDD или NVMe).
- Вы хотите полный физический контроль над оборудованием и максимальную гибкость в настройке.
Для большинства индивидуальных пользователей и небольших команд VPS будет более чем достаточно и экономически выгоднее. Однако, если вы видите, что требования к ресурсам выходят за рамки стандартных VPS-предложений, рассмотрите подходящий dedicated сервер.
Локация: на что влияет
Выбор локации VPS-сервера влияет на несколько ключевых факторов:
- Скорость доступа (задержка/ping): Чем ближе сервер к вам и вашим основным пользователям, тем меньше задержка и быстрее загрузка страниц и медиафайлов. Выбирайте локацию, которая географически близка к большинству ваших пользователей.
- Законодательство: В разных странах действуют разные законы о хранении данных и конфиденциальности. Убедитесь, что выбранная вами локация соответствует вашим требованиям к правовому регулированию.
- Стоимость: Цены на VPS могут незначительно варьироваться в зависимости от локации из-за различий в стоимости электроэнергии, инфраструктуры и налогов.
В целом, для PhotoPrism приоритетом является скорость доступа, поэтому выбирайте дата-центр, расположенный в вашем регионе или регионе ваших основных пользователей.
Подготовка сервера
Перед установкой PhotoPrism необходимо выполнить базовую настройку и защиту вашего свежего VPS. Мы будем использовать Ubuntu Server 24.04 LTS как основу, поскольку это одна из самых популярных и хорошо поддерживаемых операционных систем для серверов.
1. Подключение по SSH и создание нового пользователя
Подключитесь к вашему серверу как пользователь root, используя IP-адрес, предоставленный вашим провайдером. Замените YOUR_SERVER_IP на фактический IP-адрес вашего VPS.
ssh root@YOUR_SERVER_IP
После подключения создайте нового пользователя с правами sudo. Это лучшая практика безопасности, так как работа под root может быть опасна.
adduser yourusername # Создаем нового пользователя, замените 'yourusername'
usermod -aG sudo yourusername # Добавляем его в группу sudo
Установите пароль для нового пользователя, когда система запросит.
2. Настройка SSH-ключей (рекомендуется)
Использование SSH-ключей вместо паролей значительно повышает безопасность. Если у вас еще нет SSH-ключа, сгенерируйте его на вашей локальной машине:
ssh-keygen -t rsa -b 4096 # Генерируем новый SSH-ключ
Затем скопируйте публичный ключ на сервер. Замените yourusername и YOUR_SERVER_IP на свои данные.
ssh-copy-id yourusername@YOUR_SERVER_IP # Копируем публичный ключ на сервер
Теперь выйдите из сессии root и войдите как новый пользователь:
exit
ssh yourusername@YOUR_SERVER_IP # Входим как новый пользователь
Отключите вход по паролю для root и, опционально, для всех пользователей в файле /etc/ssh/sshd_config, чтобы разрешить только вход по ключу. Откройте файл:
sudo nano /etc/ssh/sshd_config
Найдите и измените (или добавьте) следующие строки:
PermitRootLogin no
PasswordAuthentication no # Отключает вход по паролю для всех пользователей
ChallengeResponseAuthentication no
UsePAM no
Сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X). Перезапустите SSH-сервис:
sudo systemctl restart sshd
Важно: Перед тем как отключить вход по паролю, убедитесь, что вы можете войти с помощью SSH-ключа. Иначе вы можете потерять доступ к серверу.
3. Обновление системы
Всегда начинайте с обновления пакетной базы и установленных пакетов до актуальных версий.
sudo apt update # Обновление списка пакетов
sudo apt upgrade -y # Обновление установленных пакетов
sudo apt autoremove -y # Удаление ненужных зависимостей
4. Настройка брандмауэра (UFW)
Брандмауэр Uncomplicated Firewall (UFW) прост в настройке и является первой линией защиты. По умолчанию он блокирует все входящие соединения.
sudo apt install ufw -y # Установка UFW
sudo ufw allow OpenSSH # Разрешаем SSH-подключение (порт 22)
sudo ufw allow http # Разрешаем HTTP (порт 80)
sudo ufw allow https # Разрешаем HTTPS (порт 443)
sudo ufw enable # Включаем брандмауэр
sudo ufw status verbose # Проверяем статус UFW
Если вы используете другой порт для SSH, разрешите его вместо OpenSSH, например sudo ufw allow 2222/tcp.
5. Установка Fail2Ban
Fail2Ban защищает ваш сервер от атак методом подбора пароля (brute-force) путем временной блокировки IP-адресов, с которых поступают неудачные попытки входа.
sudo apt install fail2ban -y # Установка Fail2Ban
sudo systemctl enable fail2ban # Включение автоматического запуска Fail2Ban
sudo systemctl start fail2ban # Запуск Fail2Ban
По умолчанию Fail2Ban уже настроен для защиты SSH. Вы можете создать файл /etc/fail2ban/jail.local для кастомных настроек, но для начала стандартных будет достаточно.
Теперь ваш сервер готов к установке Docker и PhotoPrism.
Установка ПО — пошагово
Для установки PhotoPrism мы будем использовать Docker и Docker Compose, так как это наиболее рекомендуемый и удобный способ развертывания. Docker позволяет изолировать приложение со всеми его зависимостями в контейнеры, что упрощает управление и обновление.
1. Установка Docker Engine
Установим Docker Engine, актуальный для 2026 года (предполагаем версию 26.x+). Мы будем использовать официальный репозиторий Docker.
# Обновляем список пакетов и устанавливаем необходимые зависимости
sudo apt update
sudo apt install -y ca-certificates curl gnupg
# Добавляем официальный GPG-ключ Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Добавляем репозиторий Docker в APT
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Обновляем список пакетов с учетом нового репозитория Docker
sudo apt update
# Устанавливаем Docker Engine, Docker CLI и containerd
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Добавляем текущего пользователя в группу docker для запуска команд без sudo
sudo usermod -aG docker yourusername
После добавления пользователя в группу docker, вам нужно выйти и снова войти в SSH-сессию, чтобы изменения вступили в силу:
exit
ssh yourusername@YOUR_SERVER_IP
Проверим, что Docker установлен корректно, запустив тестовый контейнер:
docker run hello-world # Запускаем тестовый контейнер Docker
Если вы видите сообщение "Hello from Docker!", значит, Docker установлен и работает.
2. Установка Docker Compose
Docker Compose обычно устанавливается как плагин к Docker CLI. Мы уже установили его на предыдущем шаге (docker-compose-plugin). Проверим версию:
docker compose version # Проверяем версию Docker Compose (должно быть 2.x.x)
3. Подготовка структуры каталогов для PhotoPrism
Создадим каталоги для хранения конфигурации PhotoPrism, базы данных и ваших медиафайлов. Это важно для сохранения данных при обновлении контейнеров.
mkdir -p ~/photoprism/config # Каталог для конфигурации PhotoPrism
mkdir -p ~/photoprism/storage # Каталог для кэша и вспомогательных файлов PhotoPrism
mkdir -p ~/photoprism/database # Каталог для базы данных MariaDB
mkdir -p ~/photoprism/originals # Каталог, куда вы будете загружать оригиналы фотографий и видео
mkdir -p ~/photoprism/import # Каталог для автоматического импорта (опционально)
При необходимости, вы можете изменить пути к этим каталогам. Например, если у вас есть отдельный диск для данных, вы можете смонтировать его в /mnt/data и использовать пути вроде /mnt/data/photoprism/originals.
4. Создание файла Docker Compose для PhotoPrism
Создадим файл docker-compose.yml, который определит сервисы PhotoPrism и MariaDB.
cd ~/photoprism
nano docker-compose.yml # Создаем и открываем файл docker-compose.yml
Вставьте следующее содержимое. Убедитесь, что заменили YOUR_PHOTOPRISM_PASSWORD, YOUR_MARIADB_ROOT_PASSWORD и YOUR_MARIADB_PASSWORD на надежные пароли.
version: "3.8"
services:
photoprism:
image: photoprism/photoprism:24.x.x # Актуальная версия PhotoPrism на 2026 год
container_name: photoprism
restart: unless-stopped
ports:
- "2342:2342" # Порт для доступа к PhotoPrism напрямую (будет проксироваться Caddy)
environment:
PHOTOPRISM_ADMIN_USER: "admin" # Имя пользователя PhotoPrism
PHOTOPRISM_ADMIN_PASSWORD: "YOUR_PHOTOPRISM_PASSWORD" # Пароль пользователя PhotoPrism
PHOTOPRISM_DATABASE_DRIVER: "mariadb"
PHOTOPRISM_DATABASE_DSN: "mariadb://photoprism:YOUR_MARIADB_PASSWORD@mariadb:3306/photoprism?parseTime=true"
PHOTOPRISM_ORIGINALS_PATH: "/photoprism/originals"
PHOTOPRISM_IMPORT_PATH: "/photoprism/import" # Путь для автоматического импорта
PHOTOPRISM_STORAGE_PATH: "/photoprism/storage"
PHOTOPRISM_CONFIG_PATH: "/photoprism/config"
PHOTOPRISM_DETECT_NSFW: "false" # Можно включить "true" для детектирования неприемлемого контента
PHOTOPRISM_SIDECAR_YAML: "true" # Включить поддержку YAML-файлов для метаданных
PHOTOPRISM_LOG_LEVEL: "info"
volumes:
- ./originals:/photoprism/originals # Ваши оригиналы фото и видео
- ./import:/photoprism/import # Каталог для импорта
- ./storage:/photoprism/storage # Кэш, миниатюры, sidecar-файлы
- ./config:/photoprism/config # Конфигурация PhotoPrism
depends_on:
- mariadb
mariadb:
image: mariadb:11.x # Актуальная стабильная версия MariaDB на 2026 год
container_name: mariadb
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: "YOUR_MARIADB_ROOT_PASSWORD" # Пароль root для MariaDB
MARIADB_DATABASE: "photoprism" # Имя базы данных для PhotoPrism
MARIADB_USER: "photoprism" # Пользователь базы данных для PhotoPrism
MARIADB_PASSWORD: "YOUR_MARIADB_PASSWORD" # Пароль пользователя базы данных
volumes:
- ./database:/var/lib/mysql # Каталог для данных базы данных
# Если на сервере мало RAM, можно ограничить использование памяти для MariaDB
# command: ["--max-connections=200", "--innodb-buffer-pool-size=256M"]
Сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X).
5. Запуск PhotoPrism с Docker Compose
Теперь запустите контейнеры:
docker compose up -d # Запускаем контейнеры в фоновом режиме
Это может занять некоторое время, пока Docker скачает образы и запустит сервисы. Проверьте статус контейнеров:
docker compose ps # Проверяем статус запущенных контейнеров
Оба контейнера (photoprism и mariadb) должны быть в статусе running.
На этом этапе PhotoPrism уже работает и доступен по IP-адресу вашего VPS на порту 2342 (например, http://YOUR_SERVER_IP:2342). Однако мы хотим настроить доступ по доменному имени с HTTPS, что будет сделано на следующем шаге.
Конфигурация
Теперь, когда PhotoPrism запущен, необходимо настроить доступ к нему через доменное имя, обеспечить HTTPS-шифрование и, при необходимости, автоматизировать индексацию.
1. Настройка доменного имени
Прежде чем настраивать HTTPS, убедитесь, что ваш домен или поддомен указывает на IP-адрес вашего VPS. Например, если вы хотите получить доступ к PhotoPrism по адресу photos.yourdomain.com, вам нужно создать A-запись в DNS-настройках вашего домена, указывающую на IP-адрес вашего сервера:
- Тип: A
- Имя/Хост:
photos(или@, если это основной домен) - Значение:
YOUR_SERVER_IP
Подождите несколько минут (до нескольких часов), пока DNS-записи обновятся.
2. Настройка HTTPS с помощью Caddy (обратный прокси)
Caddy – это мощный, простой в использовании веб-сервер, который автоматически управляет HTTPS-сертификатами Let's Encrypt. Это идеальный выбор для self-hosted приложений.
Установка Caddy
Создадим отдельный каталог для Caddy и его конфигурации.
mkdir -p ~/caddy/Caddyfile # Каталог для конфигурации Caddy
mkdir -p ~/caddy/data # Каталог для данных Caddy (сертификаты)
mkdir -p ~/caddy/config # Каталог для конфигурации Caddy
cd ~/caddy
Создадим файл docker-compose.yml для Caddy в каталоге ~/caddy. Это позволит запускать Caddy как отдельный сервис, который будет проксировать запросы к PhotoPrism.
nano docker-compose.yml # Создаем и открываем файл docker-compose.yml для Caddy
Вставьте следующее содержимое:
version: "3.8"
services:
caddy:
image: caddy:2.7.x-alpine # Актуальная стабильная версия Caddy на 2026 год
container_name: caddy
restart: unless-stopped
ports:
- "80:80" # Для Let's Encrypt HTTP-01 challenge
- "443:443" # Для HTTPS-трафика
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile # Файл конфигурации Caddy
- ./data:/data # Место для хранения сертификатов и других данных Caddy
- ./config:/config # Место для конфигурации Caddy
network_mode: host # Используем host-сеть для прямого доступа к портам 80/443
# Или, если вы хотите использовать отдельную сеть Docker
# networks:
# - webproxy
# networks:
# webproxy:
# external: true # Используем существующую внешнюю сеть, если она есть
# name: webproxy_network # Имя сети, которое нужно создать или использовать
Важно: Если вы используете network_mode: host, Caddy будет напрямую использовать порты 80 и 443 вашей VPS. Это самый простой способ. Если у вас уже есть другие сервисы, использующие эти порты, или вы предпочитаете более изолированный подход, вам нужно будет создать общую Docker-сеть и подключить к ней как Caddy, так и PhotoPrism.
Для простоты в этом руководстве мы будем использовать network_mode: host для Caddy и предполагать, что PhotoPrism доступен по порту 2342 на localhost (или IP-адресу контейнера, если вы используете отдельную сеть).
Конфигурация Caddyfile
Создайте файл Caddyfile в каталоге ~/caddy. Замените photos.yourdomain.com на ваш фактический домен.
nano ~/caddy/Caddyfile # Создаем и открываем Caddyfile
Вставьте следующее содержимое:
photos.yourdomain.com {
# Включить сжатие данных
encode gzip zstd
# Настройки безопасности HTTP
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "no-referrer-when-downgrade"
Content-Security-Policy "default-src 'self' data: blob:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self'; connect-src 'self' ws: wss:"
}
# Проксирование запросов к PhotoPrism
reverse_proxy localhost:2342 {
# Дополнительные заголовки для корректной работы PhotoPrism через прокси
header_up Host {host}
header_up X-Real-IP {remote_ip}
header_up X-Forwarded-For {remote_ip}
header_up X-Forwarded-Proto {scheme}
}
# Включить логирование (опционально)
log {
output file /var/log/caddy/access.log
}
}
Сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X).
Создайте каталог для логов Caddy:
sudo mkdir -p /var/log/caddy
sudo chown -R yourusername:yourusername /var/log/caddy # Убедитесь, что пользователь имеет права на запись
Запуск Caddy
Запустите контейнер Caddy:
cd ~/caddy
docker compose up -d # Запускаем контейнер Caddy
Caddy автоматически получит SSL-сертификат от Let's Encrypt и настроит HTTPS для вашего домена. Теперь вы сможете получить доступ к PhotoPrism по адресу https://photos.yourdomain.com.
3. Проверка работоспособности
Откройте в браузере https://photos.yourdomain.com. Вы должны увидеть страницу входа PhotoPrism. Используйте логин admin и пароль, который вы указали в docker-compose.yml для PhotoPrism.
Вы также можете проверить доступность сервиса с помощью curl с сервера:
curl -I https://photos.yourdomain.com # Проверяем HTTP-заголовки
Если вы видите статус HTTP/2 200 и заголовки, указывающие на Caddy и PhotoPrism, значит все работает корректно.
4. Автоматическая индексация
PhotoPrism может автоматически индексировать новые файлы, помещенные в каталог originals или import. Для автоматического сканирования новых файлов можно использовать встроенную функцию PhotoPrism или настроить cron-задание.
Использование встроенной функции PhotoPrism
PhotoPrism имеет встроенный планировщик, который может периодически сканировать новые файлы. Вы можете настроить это через веб-интерфейс в разделе "Настройки" -> "Библиотека".
Использование Cron-задания (для более точного контроля)
Вы можете создать cron-задание на вашем VPS, которое будет вызывать команду индексации PhotoPrism.
sudo crontab -e # Открываем crontab для root-пользователя (или yourusername, если он в группе docker)
Добавьте следующую строку для запуска индексации, например, каждый час:
0 cd /home/yourusername/photoprism && docker compose exec photoprism photoprism index --cleanup --scan-originals --import
Эта команда переходит в каталог ~/photoprism, затем выполняет команду photoprism index внутри контейнера PhotoPrism.
--cleanup: Удаляет метаданные для файлов, которые больше не существуют.--scan-originals: Сканирует каталог оригиналов на предмет новых файлов.--import: Перемещает файлы из каталогаimportвoriginalsпосле обработки.
Замените /home/yourusername/photoprism на ваш фактический путь к файлу docker-compose.yml.
Сохраните и закройте файл. Теперь PhotoPrism будет автоматически индексировать новые медиафайлы.
Бэкапы и обслуживание
Резервное копирование – это критически важная часть любого самохостимого сервиса. Ваши фотографии и видео – это бесценные воспоминания, и их потеря может быть катастрофической. Обслуживание сервера также важно для его стабильной и безопасной работы.
Что бэкапить
Для PhotoPrism необходимо резервировать три основных компонента:
-
Оригиналы медиафайлов: Это самые важные данные. Каталог
~/photoprism/originals. -
База данных PhotoPrism (MariaDB): Содержит всю информацию об индексации, метаданные, лица, объекты, альбомы и т.д. Каталог
~/photoprism/database. -
Конфигурация PhotoPrism: Файлы конфигурации и кэш. Каталог
~/photoprism/configи~/photoprism/storage(хотяstorageможно восстановить, лучше иметь его бэкап). -
Конфигурация Caddy: Файл
~/caddy/Caddyfileи каталог~/caddy/data(для сертификатов).
Простой скрипт автобэкапа (cron + restic)
Restic – это современный, быстрый и безопасный инструмент для резервного копирования, который поддерживает дедупликацию, шифрование и множество бэкендов (S3, SFTP, MinIO и т.д.).
1. Установка Restic
sudo apt install restic -y # Устанавливаем Restic
2. Подготовка репозитория Restic
В качестве примера будем использовать SFTP-сервер (например, отдельный VPS или NAS). Замените sftp:[email protected]:/path/to/repo на ваш фактический путь. Также, создайте надежный пароль для репозитория и сохраните его в безопасном месте.
# Установите переменную окружения для пароля репозитория
export RESTIC_PASSWORD="your_restic_repository_password"
# Инициализируем репозиторий Restic
restic init --repo sftp:[email protected]:/path/to/repo
3. Создание скрипта бэкапа
Создайте файл скрипта, например, ~/backup_photoprism.sh:
nano ~/backup_photoprism.sh
Вставьте следующее содержимое. Замените /home/yourusername/photoprism, sftp:[email protected]:/path/to/repo и your_restic_repository_password на свои значения.
#!/bin/bash
# Каталог, где находится docker-compose.yml для PhotoPrism
PHOTOPRISM_DIR="/home/yourusername/photoprism"
CADDY_DIR="/home/yourusername/caddy"
# Переменные для Restic
RESTIC_REPO="sftp:[email protected]:/path/to/repo"
RESTIC_PASSWORD="your_restic_repository_password"
# Путь к лог-файлу
LOG_FILE="/var/log/photoprism_backup.log"
# Функция для вывода в лог
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | sudo tee -a "$LOG_FILE"
}
log "--- Запуск бэкапа PhotoPrism ---"
# 1. Бэкап базы данных MariaDB
log "Создание дампа базы данных MariaDB..."
docker compose -f "$PHOTOPRISM_DIR/docker-compose.yml" exec mariadb mariadb-dump -u photoprism -p"$MARIADB_PASSWORD" photoprism > "$PHOTOPRISM_DIR/database/photoprism_dump.sql"
if [ $? -eq 0 ]; then
log "Дамп базы данных успешно создан."
else
log "Ошибка при создании дампа базы данных."
exit 1
fi
# 2. Выполнение бэкапа с Restic
log "Запуск Restic бэкапа..."
export RESTIC_PASSWORD="$RESTIC_PASSWORD" # Устанавливаем пароль для текущей сессии
restic backup \
--repo "$RESTIC_REPO" \
"$PHOTOPRISM_DIR/originals" \
"$PHOTOPRISM_DIR/database" \
"$PHOTOPRISM_DIR/config" \
"$PHOTOPRISM_DIR/storage" \
"$CADDY_DIR/Caddyfile" \
"$CADDY_DIR/data" \
--exclude "$PHOTOPRISM_DIR/database/photoprism_dump.sql" \
--tag "photoprism-daily" \
--verbose \
>> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
log "Restic бэкап успешно завершен."
else
log "Ошибка при выполнении Restic бэкапа."
exit 1
fi
# 3. Удаление старых снапшотов (политика retention)
log "Очистка старых снапшотов Restic..."
restic forget \
--repo "$RESTIC_REPO" \
--tag "photoprism-daily" \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6 \
--prune \
>> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
log "Очистка снапшотов Restic успешно завершена."
else
log "Ошибка при очистке снапшотов Restic."
exit 1
fi
# 4. Удаление временного дампа БД
rm "$PHOTOPRISM_DIR/database/photoprism_dump.sql"
log "Временный дамп БД удален."
log "--- Бэкап PhotoPrism завершен ---"
Сделайте скрипт исполняемым:
chmod +x ~/backup_photoprism.sh
Создайте файл .env в каталоге ~/photoprism для хранения пароля MariaDB, чтобы не прописывать его в скрипте напрямую (лучше, чем прямо в скрипте):
nano ~/photoprism/.env
Добавьте:
MARIADB_PASSWORD="YOUR_MARIADB_PASSWORD"
Замените YOUR_MARIADB_PASSWORD на пароль, который вы использовали в docker-compose.yml. Затем измените строку дампа БД в скрипте на:
docker compose -f "$PHOTOPRISM_DIR/docker-compose.yml" exec mariadb mariadb-dump -u photoprism -p"${MARIADB_PASSWORD}" photoprism > "$PHOTOPRISM_DIR/database/photoprism_dump.sql"
Или используйте docker compose exec mariadb sh -c "exec mariadb-dump -u photoprism -p\"$MARIADB_PASSWORD\" photoprism" > "$PHOTOPRISM_DIR/database/photoprism_dump.sql".
4. Настройка Cron-задания для бэкапа
Добавьте скрипт в Cron для ежедневного выполнения:
sudo crontab -e
Добавьте строку (например, в 3:00 ночи каждый день):
0 3 * /home/yourusername/backup_photoprism.sh >> /var/log/photoprism_backup.log 2>&1
Убедитесь, что каталог /var/log/ существует и доступен для записи.
Куда складывать бэкапы
- Внешний S3-совместимый объектный сторадж: Наиболее надежный и масштабируемый вариант (AWS S3, Backblaze B2, DigitalOcean Spaces). Restic отлично работает с S3.
- Отдельный VPS: Небольшой, недорогой VPS в другом дата-центре для хранения бэкапов через SFTP.
- Сетевое хранилище (NAS): Если у вас есть домашний NAS, можно настроить SFTP-доступ к нему.
Никогда не храните бэкапы на том же сервере, что и оригиналы данных. Принцип 3-2-1 бэкапа (3 копии данных, на 2 разных носителях, 1 из которых находится вне площадки) – это золотой стандарт.
Обновления: rolling vs maintenance window
Регулярные обновления важны для безопасности и получения новых функций.
-
ОС и Docker: Рекомендуется обновлять в рамках "окна обслуживания" (maintenance window), когда нагрузка на сервер минимальна.
sudo apt update && sudo apt upgrade -y sudo reboot # Перезагрузка после обновления ядра или критических компонентов -
PhotoPrism и Caddy (Docker-контейнеры): Для обновления Docker-контейнеров достаточно остановить их, скачать новые образы и запустить снова.
# Обновление PhotoPrism cd ~/photoprism docker compose pull photoprism mariadb # Скачать новые образы docker compose up -d # Пересоздать контейнеры с новыми образами # Обновление Caddy cd ~/caddy docker compose pull caddy # Скачать новый образ docker compose up -d # Пересоздать контейнер с новым образомЭто можно делать чаще, так как риски минимальны. Всегда проверяйте Release Notes PhotoPrism перед обновлением, чтобы убедиться в отсутствии критических изменений, требующих ручного вмешательства.
Troubleshooting + FAQ
В этом разделе собраны типичные проблемы и ответы на часто задаваемые вопросы, которые могут возникнуть при установке и использовании PhotoPrism на VPS.
Не могу получить доступ к PhotoPrism через домен (502 Bad Gateway / Connection Refused)
Что проверить:
- DNS-записи: Убедитесь, что ваша A-запись для домена (например,
photos.yourdomain.com) корректно указывает на IP-адрес вашего VPS. Используйтеdig photos.yourdomain.comна локальной машине. - Caddy: Проверьте, что контейнер Caddy запущен:
docker compose -f ~/caddy/docker-compose.yml ps. Убедитесь, что Caddyfile настроен правильно (домен, порт PhotoPrism). Просмотрите логи Caddy:docker compose -f ~/caddy/docker-compose.yml logs -f. Возможно, Caddy не смог получить SSL-сертификат (проверьте, что порты 80 и 443 открыты и не заняты другим сервисом). - PhotoPrism: Убедитесь, что контейнер PhotoPrism запущен:
docker compose -f ~/photoprism/docker-compose.yml ps. Проверьте логи PhotoPrism:docker compose -f ~/photoprism/docker-compose.yml logs -f. Убедитесь, что PhotoPrism слушает на порту 2342 внутри Docker-сети. - Брандмауэр (UFW): Убедитесь, что порты 80, 443 и 22 (SSH) открыты:
sudo ufw status.
PhotoPrism медленно индексирует фотографии или работает медленно
Что проверить:
- Ресурсы VPS: Проверьте использование CPU, RAM и I/O диска с помощью команд
htop,free -h,iostat -x 1. Если CPU постоянно загружен на 100%, RAM заполнена или I/O диска высок, возможно, ваш VPS не справляется с нагрузкой. - Тип диска: Убедитесь, что вы используете SSD или NVMe. HDD значительно замедлит индексацию.
- Настройки PhotoPrism: В веб-интерфейсе PhotoPrism в разделе "Настройки" -> "Библиотека" можно управлять настройками индексации, например, отключить некоторые ресурсоемкие функции (распознавание лиц, объектов), если они не критичны.
- База данных: Если MariaDB медленно отвечает, проверьте ее логи. Убедитесь, что она имеет достаточно RAM.
Не могу загрузить файлы в PhotoPrism
Что проверить:
- Права доступа: Убедитесь, что у пользователя Docker (или root, если запускаете без sudo) есть права на запись в каталоги
~/photoprism/originalsи~/photoprism/importна хост-системе. Можно попробоватьsudo chmod -R 777 ~/photoprism/originals ~/photoprism/import(хотя это не лучшая практика безопасности, но поможет диагностировать проблему). - Место на диске: Проверьте свободное место на диске:
df -h. Если диск заполнен, загрузка будет невозможна. - Размер файла: Проверьте, нет ли ограничений на размер файла в PhotoPrism или Caddy. По умолчанию PhotoPrism поддерживает большие файлы, но Caddy может иметь лимиты на размер запроса (обычно по умолчанию достаточно).
Какой VPS-конфиг минимально подойдёт?
Для запуска PhotoPrism с небольшой библиотекой (до 100-200 ГБ) и 1-2 пользователями минимально подойдёт VPS с 2 ядрами CPU, 4 ГБ RAM и 200-300 ГБ NVMe/SSD диска. Однако для комфортной работы, особенно с более крупными медиатеками и активной индексацией, рекомендуется увеличивать эти параметры, в первую очередь объем RAM и скорость диска.
Что выбрать — VPS или dedicated для этой задачи?
Для большинства пользователей, включая разработчиков, соло-фаундеров, игроков и криптоэнтузиастов, VPS будет оптимальным выбором. Он предлагает достаточную производительность, гибкость и экономичность. Выделенный сервер (dedicated) имеет смысл рассматривать только в случае очень больших медиатек (несколько терабайт и более), множества активных пользователей или специфических требований к производительности дисковой подсистемы, которые не может удовлетворить VPS (например, аппаратный RAID). VPS обеспечивает хороший баланс между стоимостью и производительностью для личного или небольшого командного использования PhotoPrism.
Как обновить PhotoPrism или Caddy?
Для обновления контейнеров PhotoPrism или Caddy достаточно выполнить следующие шаги в соответствующих каталогах (~/photoprism или ~/caddy):
docker compose pull # Скачать последнюю версию образа
docker compose up -d # Пересоздать контейнер, используя новый образ
Это скачает самую свежую версию образа, указанную в docker-compose.yml (например, photoprism/photoprism:24.x.x), и перезапустит контейнер с новым образом, сохраняя все ваши данные, так как они хранятся в постоянных томах.
Как восстановить PhotoPrism из бэкапа Restic?
Процесс восстановления включает:
- Установку нового VPS и настройку Docker/Docker Compose.
- Создание пустых каталогов для PhotoPrism и Caddy.
- Инициализацию Restic и восстановление данных из репозитория Restic в эти каталоги:
export RESTIC_PASSWORD="your_restic_repository_password" restic restore latest --repo sftp:[email protected]:/path/to/repo --target /home/yourusername/ # Восстановить в корневой каталог пользователя - Запуск контейнеров PhotoPrism и Caddy с восстановленными данными.
- Проверка и, возможно, повторная индексация в PhotoPrism, если база данных была сильно повреждена или не была восстановлена корректно.
Выводы и следующие шаги
Поздравляем! Вы успешно установили и настроили PhotoPrism на вашем VPS, обеспечив ему безопасный доступ по доменному имени с HTTPS и автоматическую индексацию. Теперь у вас есть мощное, конфиденциальное и полностью контролируемое решение для управления вашей цифровой медиатекой, которое не зависит от сторонних облачных сервисов.
Вы получили полный контроль над своими фотографиями и видео, разместив их на собственном сервере. Это позволяет вам не только сохранять конфиденциальность, но и настраивать функциональность под свои нужды, обеспечивая при этом высокую производительность и надежность.
Следующие шаги:
-
Масштабирование хранилища: Если ваша медиатека продолжит расти, рассмотрите возможность подключения к VPS дополнительных дисков или сетевого хранилища (NFS/SMB) для расширения каталога
originals. -
Оптимизация производительности: Для очень больших библиотек можно рассмотреть оптимизацию настроек MariaDB (например, увеличение
innodb_buffer_pool_size) или использование более мощной базы данных, такой как PostgreSQL, если PhotoPrism будет поддерживать ее в будущем как основную. - Интеграция с мобильными приложениями: Изучите возможности синхронизации фотографий с мобильных устройств напрямую в каталог импорта PhotoPrism, используя WebDAV или другие протоколы, поддерживаемые PhotoPrism или сторонними приложениями.