MAATRIX / Блог / Как установить и настроить Piwigo на VPS

Как установить и настроить Piwigo на VPS

MAATRIX

Если нужна не облачная фотопомойка, а управляемая галерея — с альбомами, категориями и тем, кому можно смотреть приватные снимки, а кому нет, — Piwigo закрывает эту задачу проще, чем Nextcloud, и предсказуемее, чем связка «ИИ-теги плюс надежда, что сервер потянет индексацию». Ниже — рабочая установка на VPS с нуля: nginx, PHP-FPM, MariaDB, реальные конфиги и грабли, на которые наступают в первый день.

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

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

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

Что такое Piwigo и когда он лучше альтернатив

Piwigo — классический self-hosted фотодвижок на PHP, который живёт с 2002 года (тогда он назывался PhpWebGallery). Никакого TensorFlow внутри, никакого распознавания лиц из коробки — зато зрелая система прав: можно выдать группе пользователей доступ к конкретному альбому, скрыть категорию от гостей, включить водяные знаки на превью, настроить несколько уровней приватности одновременно.

Если вы уже смотрели в сторону Nextcloud или PhotoPrism — разница простая. Nextcloud — это диск с папкой «Фото» и базовым просмотрщиком, у него нет полноценных альбомных прав. PhotoPrism силён ИИ-поиском по содержимому фото, но требователен к CPU при индексации и часть функций закрыта платной подпиской. Piwigo — про структуру и контроль доступа: если у вас архив на несколько тысяч альбомов для клиентов, семьи или проекта, где важно, кто что видит, — это его профиль. Из минусов честно: интерфейс визуально устарел по сравнению с конкурентами, а массовая загрузка удобнее через FTP-синк или плагин, чем через веб-форму.

Ресурсы Piwigo требует скромные: движок работает даже на 1 ГБ RAM, узкое место — не CPU, а дисковое пространство под оригиналы фото и место под превью, которые Piwigo генерирует и кеширует сам.

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

Для стабильной работы понадобится:

  • Ubuntu 24.04 LTS (подойдёт и Debian 12 — команды почти идентичны);
  • 1-2 ГБ RAM минимум, для активной галереи с несколькими пользователями лучше 2-4 ГБ;
  • диск с запасом — считайте объём оригиналов фото плюс 20-30% под превью разных размеров;
  • PHP 8.1 или новее (Piwigo 13.x официально поддерживает до 8.3);
  • MariaDB или MySQL для базы данных;
  • домен, направленный на IP сервера, если планируете HTTPS (а его стоит планировать).

Если веб-сервер ещё не поднят, сначала пройдите базовую настройку по статье про установку LEMP на Ubuntu 24.04 — там разобраны установка nginx и первичная настройка firewall. Здесь пойдём тем же путём, но с акцентом на пакеты и конфиги, специфичные для Piwigo.

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

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

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

Установка веб-сервера, PHP-FPM и MariaDB

Обновляем систему и ставим весь стек одной командой:

apt update && apt upgrade -y
apt install -y nginx mariadb-server php8.3-fpm php8.3-mysql \
  php8.3-gd php8.3-mbstring php8.3-curl php8.3-zip \
  php8.3-xml php8.3-exif unzip curl

Модуль gd обязателен — без него Piwigo не сможет генерировать превью и thumbnails. exif нужен для чтения метаданных фото (дата съёмки, камера), mbstring — для корректной работы с не-ASCII именами файлов и кириллицей в подписях.

Проверьте, что PHP-FPM запущен и слушает сокет:

systemctl status php8.3-fpm
ls -la /run/php/php8.3-fpm.sock

Закрепите MariaDB базовой безопасностью:

mysql_secure_installation

Ответьте Y на все вопросы об удалении анонимных пользователей и тестовой базы — для боевого сервера это не опционально.

База данных и загрузка Piwigo

Создаём базу и отдельного пользователя — не запускайте Piwigo под root MySQL:

CREATE DATABASE piwigo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'piwigo_user'@'localhost' IDENTIFIED BY 'СЛОЖНЫЙ_ПАРОЛЬ';
GRANT ALL PRIVILEGES ON piwigo.* TO 'piwigo_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Скачивать конкретную версию вручную — плохая идея (она меняется чаще, чем статьи в блогах), поэтому берём актуальный релиз через GitHub API:

mkdir -p /var/www/piwigo
cd /tmp
PIWIGO_URL=$(curl -s https://api.github.com/repos/Piwigo/Piwigo/releases/latest \
  | grep "browser_download_url.*zip" | cut -d '"' -f 4)
wget "$PIWIGO_URL" -O piwigo.zip
unzip -q piwigo.zip -d /tmp/piwigo-extract
cp -r /tmp/piwigo-extract/*/. /var/www/piwigo/
chown -R www-data:www-data /var/www/piwigo

Проверьте, что архив действительно распаковался в подпапку с версией (ls /tmp/piwigo-extract) — структура релизов иногда меняется, и если команда cp отработала пустым результатом, скопируйте вручную из нужной вложенной директории.

Веб-установка и настройка nginx

Создайте конфиг виртуального хоста /etc/nginx/sites-available/piwigo:

server {
    listen 80;
    server_name gallery.example.com;
    root /var/www/piwigo;
    index index.php;

    client_max_body_size 64M;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    # запрет исполнения PHP в директориях с загруженными фото и кешем
    location ~* ^/(upload|_data)/.*\.php$ {
        deny all;
    }

    location ~ /\. {
        deny all;
    }
}

client_max_body_size 64M увеличивает лимит на загрузку — дефолтный 1 МБ у nginx слишком мал даже для одного фото с современной камеры. Если пользователи заливают RAW-файлы, поднимайте лимит дальше и синхронно правьте upload_max_filesize и post_max_size в /etc/php/8.3/fpm/php.ini.

Активируйте сайт и перезапустите nginx:

ln -s /etc/nginx/sites-available/piwigo /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

Откройте http://gallery.example.com/install.php в браузере — запустится мастер установки. Укажите хост базы (localhost), имя piwigo, пользователя piwigo_user и пароль, заданный ранее. На последнем шаге создайте логин и пароль администратора — их Piwigo больше нигде не покажет, сохраните сразу. После завершения установщик прямо на экране напомнит удалить или переименовать файл install.php — это не опция, а обязательный шаг: без этого кто угодно сможет пересоздать вашу базу заново.

rm /var/www/piwigo/install.php

Права доступа, приватные альбомы и категории

Структура Piwigo строится вокруг категорий (в интерфейсе они называются альбомами). Создавать их удобнее всего из админки: Администрирование → Альбомы → Добавить альбом. У каждого альбома есть переключатель приватности — публичный, доступен только авторизованным пользователям, или ограничен конкретной группой.

Группы создаются в разделе Администрирование → Пользователи → Группы. Рабочий сценарий: заводите группу «Клиенты-2026», добавляете туда нужных пользователей, а в настройках приватного альбома выбираете именно эту группу вместо «все авторизованные». Так соседние клиенты не увидят чужие фотосессии.

Отдельно стоит настроить права на файловой системе — Piwigo пишет кеш превью в _data/ и (в зависимости от способа загрузки) конфигурацию в upload/:

chown -R www-data:www-data /var/www/piwigo/_data /var/www/piwigo/upload
find /var/www/piwigo/_data -type d -exec chmod 755 {} \;

Для массовой загрузки фото веб-форма неудобна — она рассчитана на десятки файлов, не на тысячи. Для больших архивов используйте официальный плагин LocalFilesEditor (загрузка через FTP/SFTP-синк с последующей синхронизацией в админке через Инструменты → Синхронизировать) или мобильное приложение Piwigo для загрузки прямо с телефона.

HTTPS, безопасность и резервное копирование

Без HTTPS логин администратора и пароли пользователей уходят в открытом виде — для галереи с приватными альбомами это неприемлемо. Ставим сертификат Let's Encrypt:

apt install -y certbot python3-certbot-nginx
certbot --nginx -d gallery.example.com

Certbot сам допишет блок listen 443 ssl в конфиг и настроит редирект с 80 порта. Если хотите разобраться, чем certbot отличается от acme.sh и когда второй вариант выгоднее, — есть отдельный разбор клиентов ACME.

Из базовой защиты сервера имеет смысл поднять firewall и fail2ban — быстрее всего по шаблонной инструкции по UFW, она универсальна для любого веб-сервиса на VPS.

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

#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR=/root/piwigo-backup
mkdir -p "$BACKUP_DIR"

mysqldump -u piwigo_user -p'СЛОЖНЫЙ_ПАРОЛЬ' piwigo | gzip > "$BACKUP_DIR/piwigo-db-$DATE.sql.gz"
tar -czf "$BACKUP_DIR/piwigo-upload-$DATE.tar.gz" -C /var/www/piwigo upload

find "$BACKUP_DIR" -type f -mtime +14 -delete

Добавьте в crontab -e:

0 3 * * * /root/piwigo-backup.sh

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

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

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

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

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

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

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

Piwigo можно поставить в Docker, а не через LEMP вручную?

Да, официального Docker-образа от команды Piwigo нет, но есть стабильный сторонний образ linuxserver/piwigo. Логика та же: отдельный контейнер MariaDB, volume под upload/, переменные окружения для подключения к базе.

Сколько фото выдержит Piwigo без деградации производительности?

Прямых официальных лимитов нет, движок используется для архивов от тысяч до сотен тысяч файлов. Узкое место обычно не сам PHP-код, а скорость диска при генерации превью и объём RAM, выделенный MariaDB под кеш запросов — на больших галереях увеличивайте innodb_buffer_pool_size в конфиге MariaDB.

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

Снимаете дамп базы через mysqldump, архивируете папку upload/, на новом сервере разворачиваете тот же стек, восстанавливаете базу и файлы, прописываете новые данные подключения в config/database.inc.php (если хост базы изменился).

Нужен ли отдельный CDN для отдачи фото?

Для небольшой и средней галереи — нет, nginx на VPS справляется. Если аудитория растёт и трафик отдачи изображений становится заметной статьёй расходов, тогда есть смысл вынести upload/ за объектное хранилище с CDN перед ним, но это отдельная архитектурная задача, а не шаг базовой установки.

Что делать, если после установки showtimes/превью не генерируются?

В 9 случаях из 10 это права доступа на _data/ или отсутствующий модуль gd в PHP — проверьте php -m | grep gd и права из раздела выше.

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

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

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