Bagisto в Docker Compose: готовый файл
Если Magento кажется вам избыточно тяжёлым и сложным для старта, а WooCommerce — слишком тесным для растущего каталога, Bagisto — разумная середина. Это open-source e-commerce платформа на Laravel: полноценный движок с мультимагазинами, мультивалютностью и API из коробки, но без магентовской боли с зависимостями и апдейтами. Ниже — рабочий docker-compose.yml, который поднимает Bagisto вместе с MySQL, Redis и Elasticsearch на собственном сервере, и пошаговая инструкция от первого запуска до продакшена.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое Bagisto и кому он подходит
Bagisto делает команда Webkul — та же, что давно пишет модули для Magento и OpenCart. Технически это обычное Laravel-приложение поверх Vue.js для админки и фронтенда, устанавливаемое через Composer как любой другой Laravel-проект.
Из коробки есть то, чего часто нет в лёгких решениях:
- мультимагазины (multi-channel) — один бэкенд, несколько витрин с разными доменами и валютами;
- гибкие атрибуты товаров и категории с неограниченной вложенностью;
- встроенный REST API и GraphQL — можно строить headless-витрину, если стандартная тема не устраивает;
- маркетплейс-модуль (продавцы, комиссии) как отдельное официальное расширение;
- готовая интеграция с Elasticsearch для быстрого поиска по каталогу.
Кому это подходит: небольшому и среднему интернет-магазину, которому нужна не витрина «на скорую руку», а платформа с запасом роста — но при этом нет ресурсов на команду Magento-разработчиков. Если у вас простой каталог до пары сотен товаров и не нужна гибкость — присмотритесь к PrestaShop, она проще в обслуживании. Если вы, наоборот, готовы строить кастомную витрину поверх API — вариант ближе к Bagisto по духу — Medusa.
Минус у Bagisto тот же, что у любого Laravel-проекта такого масштаба: тяжёлый стек зависимостей (Composer, Node.js для сборки фронтенда, очереди, кэш) — разворачивать «руками» на голом сервере долго и хрупко. Docker Compose здесь не роскошь, а способ сэкономить себе вечер.
Требования к серверу
Bagisto — это PHP 8.1+ приложение с MySQL, Redis для кэша и очередей, и опционально Elasticsearch для поиска. Все эти сервисы поднимаются в контейнерах на одном сервере, если речь о небольшом-среднем магазине.
| Компонент | Минимум | Комфортно |
|---|---|---|
| CPU | 2 ядра | 4 ядра |
| RAM | 4 ГБ | 6-8 ГБ |
| Диск | 30 ГБ SSD | 60+ ГБ SSD |
| PHP | 8.1+ | 8.2 |
| MySQL | 8.0 | 8.0 |
Основной пожиратель памяти здесь не PHP, а Elasticsearch — ему одному стоит закладывать от 1 ГБ heap, и если сервер совсем скромный, поиск можно временно отключить и оставить обычный поиск по MySQL (Bagisto так умеет). Для магазина с каталогом в пару тысяч товаров и умеренной посещаемостью 4 ГБ RAM хватает без Elasticsearch, с ним — комфортнее на 6-8 ГБ.
Понадобится домен, направленный на IP сервера, и открытые порты 80/443 для внешнего трафика — остальные сервисы (MySQL, Redis, Elasticsearch) наружу торчать не должны, только внутри docker-сети.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверГотовый docker-compose.yml
Официальный образ Bagisto под Docker Compose команда Webkul не публикует как готовый — вместо этого проект ставится через Composer поверх обычного PHP-образа. Ниже — рабочая связка: контейнер приложения собирает Bagisto из исходников при первом старте, отдельно — MySQL, Redis, Elasticsearch и nginx.
Структура каталога:
bagisto/
├── docker-compose.yml
├── .env
└── docker/
├── app/Dockerfile
└── nginx/default.conf
docker/app/Dockerfile:
FROM php:8.2-fpm
RUN apt-get update && apt-get install -y \
git curl zip unzip libpng-dev libonig-dev libxml2-dev \
libzip-dev libicu-dev nodejs npm \
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath \
gd zip intl opcache
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
EXPOSE 9000
CMD ["php-fpm"]
docker-compose.yml:
services:
app:
build:
context: .
dockerfile: docker/app/Dockerfile
container_name: bagisto_app
restart: unless-stopped
working_dir: /var/www/html
volumes:
- bagisto_data:/var/www/html
environment:
DB_HOST: db
DB_DATABASE: bagisto
DB_USERNAME: bagisto
DB_PASSWORD: ${DB_PASSWORD}
REDIS_HOST: redis
depends_on:
- db
- redis
networks:
- bagisto_net
webserver:
image: nginx:1.27-alpine
container_name: bagisto_nginx
restart: unless-stopped
ports:
- "8080:80"
volumes:
- bagisto_data:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- app
networks:
- bagisto_net
db:
image: mysql:8.0
container_name: bagisto_db
restart: unless-stopped
environment:
MYSQL_DATABASE: bagisto
MYSQL_USER: bagisto
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- bagisto_db:/var/lib/mysql
networks:
- bagisto_net
redis:
image: redis:7-alpine
container_name: bagisto_redis
restart: unless-stopped
volumes:
- bagisto_redis:/data
networks:
- bagisto_net
elasticsearch:
image: elasticsearch:8.14.3
container_name: bagisto_es
restart: unless-stopped
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- bagisto_es:/usr/share/elasticsearch/data
networks:
- bagisto_net
networks:
bagisto_net:
volumes:
bagisto_data:
bagisto_db:
bagisto_redis:
bagisto_es:
Сервис elasticsearch опционален — если ресурсов сервера мало, просто уберите его из compose-файла и из .env (Bagisto тогда будет искать по MySQL). Порт nginx проброшен на 8080, а не 80 — это сделано намеренно: 80/443 на сервере обычно занимает внешний reverse proxy с SSL, о котором ниже.
Файл .env рядом с compose-файлом:
DB_PASSWORD=замените_на_свой_пароль
DB_ROOT_PASSWORD=ещё_один_надёжный_пароль
Первый запуск и установка Bagisto
Контейнер app в этом Dockerfile — пустая PHP-FPM оболочка, сам код Bagisto нужно установить в него через Composer при первом запуске. Порядок такой:
docker compose up -d db redis
docker compose run --rm app composer create-project bagisto/bagisto . --no-interaction
docker compose up -d app webserver
Дальше заходим внутрь контейнера и запускаем установщик:
docker compose exec app php artisan bagisto:install
Мастер установки задаст стандартные вопросы: параметры подключения к БД (db, bagisto, bagisto, пароль из .env), данные администратора магазина, локаль и валюту по умолчанию. Он же прогонит миграции и сидеры — создаст структуру таблиц и демо-каталог, который потом можно почистить.
Если нужен доступ к очередям (Bagisto использует их для email-уведомлений, экспорта каталога, индексации в Elasticsearch), добавьте отдельный контейнер-воркер на том же образе app, но с другой командой:
queue:
build:
context: .
dockerfile: docker/app/Dockerfile
container_name: bagisto_queue
restart: unless-stopped
volumes:
- bagisto_data:/var/www/html
command: php artisan queue:work --sleep=3 --tries=3
depends_on:
- app
- redis
networks:
- bagisto_net
Без этого воркера письма и фоновые задачи будут копиться в очереди Redis и не выполнятся, пока вы не запустите queue:work вручную.
Проверить, что всё поднялось, можно так:
docker compose ps
curl -I http://127.0.0.1:8080
Ожидаемый ответ — 200 OK с заголовками Laravel/Bagisto. Если видите 502 — контейнер app ещё не готов или не установлен код, смотрите логи: docker compose logs app.
Домен, SSL и reverse proxy
Nginx внутри compose-файла обслуживает Bagisto только на внутреннем порту 8080 без SSL — терминацию HTTPS и работу с доменом лучше отдать отдельному reverse proxy на хосте, а не тащить сертификаты внутрь контейнера с приложением.
Если на сервере уже стоит nginx как системный сервис, добавьте location-блок, проксирующий на 8080:
server {
listen 80;
server_name shop.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Дальше — сертификат через Let's Encrypt и certbot, как описано в статье про настройку Let's Encrypt SSL. Если предпочитаете автоматический SSL без ручной возни с certbot, можно заменить системный nginx на Caddy — он получает и обновляет сертификаты сам.
Важный нюанс: после того как домен заработал через прокси, в .env внутри контейнера app поправьте APP_URL на реальный домен с https:// — иначе Bagisto будет генерировать ссылки на ассеты и в письмах со старым адресом, и часть картинок на витрине не подгрузится.
docker compose exec app php artisan config:cache
Выполняйте эту команду после любого изменения .env — Laravel кэширует конфиг, и без сброса кэша новые значения просто не подхватятся.
Бэкапы и типичные проблемы при запуске
Данные, которые нельзя терять, лежат в двух местах: том bagisto_db (сама база — товары, заказы, клиенты) и том bagisto_data, где среди прочего каталог storage/app/public с изображениями товаров. Резервируйте оба, а не только базу — типичная ошибка новичков: настроили бэкап MySQL, а картинки товаров потеряли при переезде на новый сервер, потому что они лежали в volume, о котором забыли.
Дамп базы:
docker compose exec db mysqldump -u bagisto -p bagisto > backup_$(date +%F).sql
Про автоматизацию и подводные камни регулярных бэкапов MySQL в контейнерах — отдельная статья: бэкап MySQL на сервере. Для volume с файлами подойдёт обычный tar по крону или инструмент вроде restic.
Из проблем на первом запуске:
- Белый экран или 500-я ошибка сразу после установки. Почти всегда — права на каталоги
storageиbootstrap/cacheвнутри контейнера. Зайдите вappи выполнитеchown -R www-data:www-data storage bootstrap/cache. - Установщик виснет на шаге миграций. Проверьте, что контейнер
dbуспел полностью подняться до запускаbagisto:install— MySQL стартует не мгновенно, добавьтеdepends_onс условиемservice_healthyили просто подождите 10-15 секунд перед установкой. - Elasticsearch не запускается, контейнер падает. Часто дело в
vm.max_map_countна хосте — Elasticsearch требует значение не ниже 262144. Поднимите его на хост-системе:sysctl -w vm.max_map_count=262144и закрепите в/etc/sysctl.conf. - Письма не уходят, статусы заказов не обновляются автоматически. Проверьте, что контейнер
queueдействительно работает —docker compose ps queue— и что в.envуказанQUEUE_CONNECTION=redis, а неsync.
Отдельно: демо-данные, которые ставит инсталлятор, стоит удалить перед реальным запуском — тестовые товары и категории лучше не индексировать в Elasticsearch вместе с настоящим каталогом, это путает и поиск, и аналитику.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Bagisto бесплатен?
Да, ядро полностью open-source под MIT-лицензией. Платными могут быть отдельные премиум-модули от Webkul и сторонних разработчиков (маркетплейс, продвинутые интеграции с платёжками), но базового функционала магазину среднего размера обычно хватает без них.
Можно ли обойтись без Elasticsearch?
Можно — Bagisto по умолчанию умеет искать по MySQL, и для каталога в несколько сотен-тысяч товаров этого достаточно. Elasticsearch подключают, когда каталог большой и нужен быстрый поиск с фильтрами по атрибутам, синонимами и опечатками.
Чем Bagisto отличается от Magento по требованиям к серверу?
Заметно легче: Magento даже в минимальной конфигурации обычно просит от 8 ГБ RAM и OPcache/Varnish для приемлемой скорости, Bagisto стартует на 4 ГБ. Платите за это меньшим набором enterprise-фич — сложные B2B-сценарии и глубокая кастомизация checkout у Magento развиты сильнее.
Как обновить Bagisto до новой версии?
Через Composer, как обычный Laravel-проект: composer update bagisto/bagisto внутри контейнера app, затем php artisan migrate и сброс кэша конфигурации. Перед обновлением обязательно снимите бэкап базы и volume — мажорные обновления иногда меняют структуру таблиц.
Нужен ли отдельный сервер под Node.js?
Нет, Node.js нужен только на этапе сборки фронтенд-ассетов (npm run build для Vue-компонентов админки и темы) — это делается один раз при установке или обновлении, отдельного постоянно работающего Node-процесса Bagisto не требует.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →