MAATRIX / Блог / Bagisto в Docker Compose: готовый файл

Bagisto в Docker Compose: готовый файл

MAATRIX

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

КомпонентМинимумКомфортно
CPU2 ядра4 ядра
RAM4 ГБ6-8 ГБ
Диск30 ГБ SSD60+ ГБ SSD
PHP8.1+8.2
MySQL8.08.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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

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