Piwigo в Docker Compose: готовый файл
Семейный архив фотографий разросся до десятков тысяч файлов, Google Фото намекает на лимит бесплатного хранилища, а делиться альбомом с бабушкой через облако без аккаунта и приложения не получается. Piwigo решает именно эту задачу: это не «умная» галерея с распознаванием лиц, а классический движок с альбомами, тегами и гибкими правами доступа — то, что нужно, когда важно не «магическое» ранжирование фото нейросетью, а предсказуемая структура и контроль, кто что видит. Ниже — рабочий docker-compose.yml, который поднимает Piwigo с MariaDB за один запуск.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое Piwigo и зачем он нужен
Piwigo — открытый PHP-движок для фотогалерей, живущий с середины 2000-х и до сих пор активно развивающийся. В отличие от Immich или PhotoPrism, которые делают ставку на автоматическую сортировку по лицам и объектам через ML-модели, Piwigo — это ручная кураторская галерея:
- альбомы и подальбомы с произвольной вложенностью;
- теги и умные альбомы (сохранённые фильтры по тегам, датам, авторам);
- права доступа на уровне групп пользователей и отдельных альбомов — можно дать доступ к «Отпуск 2026» только конкретным трём людям, не открывая остальной архив;
- экосистема плагинов и тем — от водяных знаков до синхронизации с Lightroom;
- собственные мобильные приложения и поддержка WebDAV для загрузки файлов без веб-интерфейса.
Если вам нужна семейная или клубная галерея с понятной структурой папок и явным управлением доступом — Piwigo обычно проще в администрировании, чем связка Immich + группы. Если хочется автоматической разборки тысяч фото с телефона по лицам — почитайте про Immich в Docker Compose или PhotoPrism — это разные инструменты для разных сценариев, и держать оба на одном сервере вполне нормально.
Ресурсы Piwigo просит скромные: 1 vCPU и 1-2 ГБ RAM хватает на галерею в несколько десятков тысяч фото, узкое место — обычно дисковое место под оригиналы и генерируемые превью.
Готовый docker-compose.yml
Используем образ linuxserver/piwigo (собран поверх официального PHP-FPM + nginx, с удобными переменными PUID/PGID) и mariadb в качестве базы данных.
version: "3.8"
services:
piwigo-db:
image: mariadb:11
container_name: piwigo-db
restart: unless-stopped
environment:
MARIADB_DATABASE: piwigo
MARIADB_USER: piwigo
MARIADB_PASSWORD: change_me_strong_password
MARIADB_ROOT_PASSWORD: change_me_root_password
volumes:
- ./piwigo-db-data:/var/lib/mysql
networks:
- piwigo-net
piwigo:
image: lscr.io/linuxserver/piwigo:latest
container_name: piwigo
restart: unless-stopped
depends_on:
- piwigo-db
environment:
PUID: 1000
PGID: 1000
TZ: Europe/Moscow
volumes:
- ./piwigo-config:/config
- ./piwigo-gallery:/gallery
ports:
- "127.0.0.1:8080:80"
networks:
- piwigo-net
networks:
piwigo-net:
driver: bridge
Пояснения по файлу:
- порт публикуется только на
127.0.0.1— снаружи Piwigo будет доступен через reverse proxy с HTTPS (раздел ниже), напрямую по HTTP наружу его лучше не открывать; ./piwigo-gallery— папка для оригиналов фотографий,/gallery— путь внутри контейнера, который вы укажете при установке как каталог для загрузок;./piwigo-configхранит конфиг PHP, кэш и, для linuxserver-образа, саму установку Piwigo (/config/www) — именно этот том нужно бэкапить вместе с базой;- пароли в
MARIADB_PASSWORD/MARIADB_ROOT_PASSWORDзамените на реальные перед первым запуском — после инициализации базы менять их через переменные окружения уже не получится, потребуется делать это черезALTER USERвнутри MariaDB.
Создайте директории и запустите:
mkdir -p piwigo-db-data piwigo-config piwigo-gallery
docker compose up -d
docker compose logs -f piwigo
Первый запуск занимает 20-40 секунд — образ разворачивает PHP-FPM и nginx внутри контейнера, дождитесь строки вида [ls.io-init] done.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверПервый запуск и мастер установки
Откройте http://ваш-сервер:8080 (или домен, если уже настроен proxy) — попадёте на мастер установки Piwigo. Он попросит:
- Параметры базы данных — хост
piwigo-db, порт3306, имя базыpiwigo, пользователь и пароль — те же, что вMARIADB_USER/MARIADB_PASSWORDиз compose-файла. - Данные администратора — логин, пароль и email первого пользователя с правами webmaster.
- Название галереи — можно поменять позже в настройках.
После завершения мастера удалите файл install.php — Piwigo сам предупредит об этом на главной странице админки, если файл ещё существует:
docker compose exec piwigo rm -f /config/www/install.php
Дальше зайдите в Администрирование → Конфигурация → Основные настройки и укажите директорию для загрузок — это должно указывать на смонтированный /gallery, а не на путь внутри /config, иначе при пересоздании контейнера фото не потеряются, но окажутся не там, где вы их бэкапите.
Права доступа, группы и приватные альбомы
Ключевая причина выбрать Piwigo вместо более простых галерей — гибкая модель доступа:
- Группы пользователей создаются в Администрирование → Пользователи → Группы. Можно сделать группу «Семья», «Клуб фотографов», «Гости».
- Приватность альбома настраивается на странице альбома: «Кто угодно», «Все зарегистрированные», «Выбранные группы/пользователи» — доступ можно дать точечно, без создания отдельного аккаунта на каждого зрителя.
- Публичные ссылки без регистрации делаются через плагин или встроенный механизм "гостевых" ссылок (в зависимости от версии) — удобно для разового доступа родственникам без создания учётки.
- Загрузка от лица пользователей — если хотите, чтобы члены семьи сами добавляли фото в общий альбом, дайте им права "Добавление" на конкретный альбом, не открывая административную панель целиком.
Практический совет: заведите структуру альбомов по годам верхнего уровня (2024, 2025, 2026), внутри — по событиям. Права удобнее ставить на альбом верхнего уровня, если вся семья видит всё, и точечно — на вложенные, если часть архива приватная (например, рабочие фото или личный дневник).
Reverse proxy и HTTPS
Публиковать Piwigo напрямую по HTTP не стоит — логин администратора идёт в открытом виде. Проще всего — Traefik или nginx с Let's Encrypt перед контейнером. Если вы уже используете Traefik для других сервисов на сервере, смотрите Traefik как reverse proxy для докера — добавление Piwigo в стек сведётся к паре меток на сервисе:
piwigo:
# ...
labels:
- "traefik.enable=true"
- "traefik.http.routers.piwigo.rule=Host(`gallery.example.com`)"
- "traefik.http.routers.piwigo.entrypoints=websecure"
- "traefik.http.routers.piwigo.tls.certresolver=le"
- "traefik.http.services.piwigo.loadbalancer.server.port=80"
networks:
- piwigo-net
- traefik-net
Без Traefik — стандартный nginx как обратный прокси с сертификатом от Let's Encrypt, процесс выпуска сертификата описан в статье про установку Let's Encrypt SSL на VPS.
Отдельный момент — лимит на размер загружаемого файла. По умолчанию PHP внутри образа режет загрузку на нескольких мегабайтах, а RAW-файлы с зеркалок весят десятки мегабайт. Проверьте и при необходимости увеличьте лимиты:
docker compose exec piwigo find /etc -iname "php.ini"
# отредактируйте upload_max_filesize и post_max_size в найденном файле
docker compose restart piwigo
После правки не забудьте синхронизировать значение post_max_size — оно должно быть не меньше upload_max_filesize, иначе загрузка молча обрежется на более строгом лимите.
Резервное копирование
У Piwigo два места, которые нужно бэкапить синхронно — иначе восстановление даст рассинхрон между базой (метаданные, альбомы, права) и файлами (сами фото):
#!/bin/bash
# piwigo-backup.sh
BACKUP_DIR="/backup/piwigo/$(date +%Y-%m-%d)"
mkdir -p "$BACKUP_DIR"
# дамп базы
docker compose exec -T piwigo-db \
mariadb-dump -u piwigo -pchange_me_strong_password piwigo \
> "$BACKUP_DIR/piwigo-db.sql"
# конфигурация и сама галерея
tar czf "$BACKUP_DIR/piwigo-config.tar.gz" piwigo-config
tar czf "$BACKUP_DIR/piwigo-gallery.tar.gz" piwigo-gallery
Для галереи на десятки гигабайт архивирование tar каждый раз избыточно — разумнее раз в неделю снимать полный архив, а между этим гонять rsync в отдельное хранилище. Общий подход к бэкапу томов Docker (в том числе для сценариев с большим объёмом данных) разобран в статье про бэкап Docker volume на VPS — принципы применимы и к Piwigo.
Восстановление — в обратном порядке: поднимаете пустые контейнеры, останавливаете piwigo (чтобы не писал в базу во время восстановления), заливаете дамп в MariaDB, распаковываете архивы поверх piwigo-config и piwigo-gallery, запускаете контейнеры заново.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Piwigo поддерживает RAW-файлы?
Хранить и скачивать — да, но превью и просмотр в браузере строятся из встроенного JPEG-превью RAW-файла или требуют плагина конвертации. Для полноценной RAW-обработки Piwigo не замена Lightroom, это архив и способ поделиться готовыми фото.
Можно ли перенести существующую галерею с другого сервера?
Да — переносите папку с оригиналами в /gallery, дамп базы данных импортируете в новую MariaDB, а конфиг из /config копируете целиком, включая установленные плагины и темы.
Как обновить Piwigo без потери данных?
Для linuxserver-образа обновление — это docker compose pull && docker compose up -d, файлы сайта и база лежат в томах и не пересоздаются. Перед крупным обновлением версии Piwigo (например, мажорным) всё равно снимите бэкап — в changelog иногда встречаются миграции схемы базы, которые лучше проходить с возможностью отката.
Нужна ли отдельная база MariaDB или подойдёт MySQL?
Подойдёт и MySQL — Piwigo одинаково хорошо работает с обоими. Если на сервере уже крутится MySQL для других сервисов, можно переиспользовать его вместо отдельного контейнера, сравнение вариантов — в статье MariaDB или MySQL: что выбрать для сервера.
Как ограничить размер галереи, чтобы не забить весь диск?
Piwigo сам не следит за квотами — контролируйте место на уровне сервера (df -h) и настройте мониторинг диска отдельно, либо выносите piwigo-gallery на отдельный примонтированный диск с известным лимитом.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →