Встановлення 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 перед оновленням, щоб переконатися у відсутності критичних змін, що вимагають ручного втручання.