Дата: 2025-11-16
Задача: Параллельная разработка 4 разных магазинов на dev сервере
Ограничение: Shared vendor НЕ подходит (разные модули)
✅ 4 независимых магазина
✅ Разные модули в каждом
✅ Параллельная разработка
✅ Экономия ресурсов
❌ БЕЗ shared vendor (не подходит)
shop-1/
├─ vendor/ 300 MB
├─ web/core/ 50 MB
├─ web/modules/contrib/ 100 MB
├─ web/sites/ 70 MB
├─ data/postgres/ 158 MB
└─ Docker container 123 MB
────────────────────────────────
ИТОГО: 801 MB
4 × 801 MB = 3.2 GB (код + БД + контейнеры)
+ Docker images: 897 MB (но shared!)
────────────────────────────────
ИТОГО БЕЗ оптимизации: 4.1 GB
Было бы:
shop-1-db: 275 MB
shop-2-db: 275 MB
shop-3-db: 275 MB
shop-4-db: 275 MB
────────────────
Итого: 1100 MB
Стало:
shared-db: 275 MB ✅
────────────────
Экономия: 825 MB
Было бы (наивно):
4 × Drupal image = 2488 MB
Реально (Docker CoW):
Base layers shared = 622 MB ✅
────────────────
Экономия: 1866 MB
ОБЩИЕ ресурсы (shared автоматически):
├─ Docker base images 622 MB
└─ PostgreSQL container 275 MB
────────────────────────────────────
Subtotal shared: 897 MB ← Один раз!
УНИКАЛЬНОЕ для каждого магазина:
├─ vendor/ 300 MB
├─ web/core/ 50 MB
├─ web/modules/contrib/ 100 MB
├─ web/sites/ (config, custom) 70 MB
├─ data/postgres/ (только БД) 158 MB
└─ container layer 123 MB
────────────────────────────────────
Per shop: 801 MB
4 магазина:
Shared (Docker + PostgreSQL): 897 MB
4 × unique code + DB: 3.204 GB
────────────────────────────────────
ИТОГО С оптимизацией: 4.1 GB
────────────────────────────────────
ЭКОНОМИЯ vs раздельные DB:
Без shared DB: 4.9 GB
С shared DB: 4.1 GB
────────────────────────────────────
Сэкономлено: 825 MB (17%)
/opt/claude-workspace/projects/
├── shop-1/ ← Магазин 1 (полный код)
│ ├── vendor/ 300 MB ← Свои зависимости
│ ├── web/
│ │ ├── core/ 50 MB ← Свой Drupal
│ │ ├── modules/
│ │ │ ├── contrib/ 100 MB ← Свои модули
│ │ │ └── custom/ ← Уникальный функционал
│ │ └── sites/ 70 MB ← Своя конфигурация
│ └── data/postgres/ 158 MB ← Своя база (в shared-db)
│
├── shop-2/ ← Магазин 2 (полный код)
│ ├── vendor/ 300 MB ← РАЗНЫЕ модули!
│ ├── web/
│ │ ├── modules/
│ │ │ ├── contrib/ 100 MB ← ДРУГИЕ модули!
│ │ │ └── custom/ ← Другой функционал
│ └── data/postgres/ 158 MB
│
├── shop-3/ ← Магазин 3
│ └── ... 801 MB
│
└── shop-4/ ← Магазин 4
└── ... 801 MB
version: '3.8'
services:
# ──────────────────────────────────────────────
# SHARED DATABASE - Одна PostgreSQL для всех
# ──────────────────────────────────────────────
shared-db:
image: postgres:16-alpine
container_name: shared-postgres
environment:
- POSTGRES_PASSWORD=master_postgres_password_2025
volumes:
- shared-db-data:/var/lib/postgresql/data
- ./scripts/init-databases.sql:/docker-entrypoint-initdb.d/init.sql
# ──────────────────────────────────────────────
# SHOP 1 - Полный независимый стек
# ──────────────────────────────────────────────
shop-1-drupal:
build: ./dockerfiles/drupal
container_name: shop-1-drupal
ports:
- "8813:80"
volumes:
# Полный код (НЕ shared!)
- ../shop-1/vendor:/var/www/html/vendor
- ../shop-1/web/core:/var/www/html/web/core
- ../shop-1/web/modules:/var/www/html/web/modules
- ../shop-1/web/sites:/var/www/html/web/sites
environment:
- POSTGRES_HOST=shared-db # ← Shared DB
- POSTGRES_DB=drupal_shop_1 # ← Своя база
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=master_postgres_password_2025
# ──────────────────────────────────────────────
# SHOP 2 - Полный независимый стек
# ──────────────────────────────────────────────
shop-2-drupal:
build: ./dockerfiles/drupal
container_name: shop-2-drupal
ports:
- "8814:80"
volumes:
# Полный СВОЙ код
- ../shop-2/vendor:/var/www/html/vendor
- ../shop-2/web/core:/var/www/html/web/core
- ../shop-2/web/modules:/var/www/html/web/modules
- ../shop-2/web/sites:/var/www/html/web/sites
environment:
- POSTGRES_HOST=shared-db # ← Shared DB
- POSTGRES_DB=drupal_shop_2 # ← Своя база
# ... shop-3, shop-4 аналогично
volumes:
shared-db-data:
driver: local
driver_opts:
type: none
o: bind
device: /opt/claude-workspace/shared/postgres-data
# Было бы 4 контейнера:
docker run -d postgres:16 # 275 MB × 4 = 1100 MB
# Стало 1 контейнер:
docker run -d postgres:16 # 275 MB
# + databases внутри (не занимают места в образе)
Сэкономлено: 825 MB
Docker автоматически переиспользует базовые слои:
# Проверить shared layers:
docker images
docker history drupal-shop-template-drupal
# Каждый контейнер переиспользует:
# - Layer: PHP 8.3 (200 MB)
# - Layer: Apache (50 MB)
# - Layer: Extensions (100 MB)
# - Layer: Composer (72 MB)
Сэкономлено: 1866 MB автоматически
# Работаю над shop-1
docker compose up -d shop-1-drupal shared-db adminer
# shop-2, shop-3, shop-4 остановлены
docker compose stop shop-2-drupal shop-3-drupal shop-4-drupal
Освобождено: 1.5 GB RAM, 1.5 CPU cores
Преимущества:
✅ Экономия места (дополнительно 1.2 GB)
Недостатки:
❌ Все магазины на ОДИНАКОВЫХ модулях
❌ Нельзя обновить модуль в одном магазине
❌ Read-only vendor (нельзя разрабатывать)
❌ Конфликты версий
Вывод: НЕ подходит для 4 разных магазинов
Преимущества:
✅ Полная независимость кода
✅ Разные модули в каждом магазине
✅ Независимые обновления
✅ Экономия 825 MB на PostgreSQL
✅ Экономия 1866 MB на Docker layers (автоматически)
✅ Легко start/stop неиспользуемых
Недостатки:
⚠️ Больше места чем с shared vendor (но это OK)
Вывод: ИДЕАЛЬНО для 4 разных магазинов
# Запустить только shop-1
cd /opt/claude-workspace/projects/drupal-shop-template
docker compose up -d shop-1-drupal shared-db adminer
# Установить УНИКАЛЬНЫЕ модули только для shop-1
docker compose exec shop-1-drupal bash
cd /var/www/html
composer require 'drupal/commerce_cdek:^1.0'
composer require 'drupal/custom_delivery_module:dev-main'
# shop-2, shop-3, shop-4 НЕ затронуты!
# Запустить shop-1 и shop-2
docker compose up -d shop-1-drupal shop-2-drupal shared-db adminer
# Разные модули в каждом:
docker compose exec shop-1-drupal bash -c "cd /var/www/html && composer require 'drupal/module_a:^1.0'"
docker compose exec shop-2-drupal bash -c "cd /var/www/html && composer require 'drupal/module_b:^2.0'"
# shop-3, shop-4 остановлены (экономия RAM)
# Обновить commerce в shop-3
docker compose exec shop-3-drupal bash
cd /var/www/html
composer update drupal/commerce --with-dependencies
# shop-1, shop-2, shop-4 остались на старой версии!
# У каждого магазина своя база в shared-db
docker compose exec shared-db psql -U postgres
# Список баз:
\l
# drupal_shop_1 158 MB
# drupal_shop_2 158 MB
# drupal_shop_3 158 MB
# drupal_shop_4 158 MB
# Можно мигрировать shop-1 не трогая остальные
pg_dump drupal_shop_1 > /backups/shop-1-before-migration.sql
# ... миграция ...
# Если сломалось → откат только shop-1
# Все сразу
docker compose up -d
# Только нужные
docker compose up -d shop-1-drupal shop-2-drupal shared-db adminer
# Один магазин
docker compose up -d shop-3-drupal shared-db adminer
# Остановить неиспользуемые
docker compose stop shop-3-drupal shop-4-drupal
# Остановить всё
docker compose down
# Освобождается:
# RAM: ~1.5 GB
# CPU: ~1.5 cores
# Логи одного магазина
docker compose logs -f shop-1-drupal
# Логи нескольких
docker compose logs -f shop-1-drupal shop-2-drupal
# Логи базы данных
docker compose logs -f shared-db
# Установить модуль в shop-1
docker compose exec shop-1-drupal bash -c "
cd /var/www/html &&
composer require 'drupal/commerce_tinkoff:^1.0' &&
bin/drush en commerce_tinkoff -y
"
# Установить ДРУГОЙ модуль в shop-2
docker compose exec shop-2-drupal bash -c "
cd /var/www/html &&
composer require 'drupal/commerce_yookassa:^1.0' &&
bin/drush en commerce_yookassa -y
"
| Компонент | Без оптимизации | С shared DB + Docker | Экономия |
|---|---|---|---|
| PostgreSQL | 1100 MB | 275 MB | 825 MB |
| Docker images | 2488 MB | 622 MB | 1866 MB |
| Код (4 магазина) | 1800 MB | 1800 MB | 0 MB |
| БД данные | 632 MB | 632 MB | 0 MB |
| Container layers | 492 MB | 492 MB | 0 MB |
| ИТОГО | 6512 MB | 3821 MB | 2691 MB |
| 6.4 GB | 3.7 GB | 41% |
Экономия: 2.7 GB (41%) БЕЗ shared vendor!
Архитектура:
✅ Shared PostgreSQL (один контейнер, 4 базы)
✅ Отдельный код для каждого магазина
✅ Docker layer sharing (автоматически)
✅ Start/stop неиспользуемых контейнеров
❌ БЕЗ shared vendor (конфликты версий)
Экономия:
- Место: 2.7 GB (41%)
- RAM: 1-2 GB (при использовании start/stop)
- Управление: Простое (composer в каждом магазине независимо)
Независимость:
- ✅ Разные модули в каждом магазине
- ✅ Разные версии Drupal/Commerce
- ✅ Независимые обновления
- ✅ Изолированное тестирование
Для 4 РАЗНЫХ магазинов лучшая архитектура:
✅ Shared PostgreSQL: 825 MB экономии
✅ Docker layer sharing: 1866 MB экономии (автоматически)
✅ Start/stop workflow: 1-2 GB RAM экономии
✅ Отдельный код: Полная независимость
❌ БЕЗ shared vendor: Избегаем конфликтов
ИТОГО:
Место: 3.7 GB (вместо 6.4 GB)
RAM: 2-3 GB (работа над 2 магазинами)
Управление: Простое и гибкое
Создано: 2025-11-16
Автор: Claude Code
Статус: Рекомендуемая архитектура для параллельной разработки 4 разных магазинов