Дата: 2025-11-16
Проект: Drupal Shop Template
Задача: Размножение многих сайтов с минимальным использованием места
Без оптимизации:
- 1 сайт = 520 MB
- 10 сайтов = 5.2 GB
- 100 сайтов = 52 GB ❌
Что занимает место:
vendor/ → 300 MB (модули Composer)
web/core/ → 50 MB (Drupal core)
web/modules/contrib/ → 100 MB (модули)
web/themes/ → 20 MB (темы)
files/ → 50 MB (изображения)
────────────────────────────────
Итого: 520 MB
80% места - это vendor и модули, которые ОДИНАКОВЫЕ!
/opt/claude-workspace/
│
├── shared/ ← ОБЩИЕ ресурсы
│ ├── vendor/ ← 300 MB (composer packages)
│ ├── drupal-core/ ← 50 MB (Drupal core)
│ └── modules-contrib/ ← 100 MB (contrib modules)
│
├── templates/ ← ШАБЛОНЫ
│ └── shop-kickstart-5/
│ ├── docker-compose.yml
│ ├── Dockerfile
│ ├── config/
│ └── scripts/
│
└── projects/ ← ПРОЕКТЫ (сайты)
├── drupal-shop-template/ ← Эталонная сборка
│ ├── web/
│ │ ├── vendor → symlink ../../shared/vendor
│ │ ├── core → symlink ../../shared/drupal-core
│ │ ├── modules/contrib → symlink ../../shared/modules-contrib
│ │ ├── sites/default/
│ │ └── files/ ← 50 MB (уникальные для сайта)
│ ├── config/
│ └── docker-compose.yml
│
├── pim-drupal/ ← PIM Production
│ ├── web/
│ │ ├── vendor → symlink ../../shared/vendor
│ │ └── files/ ← 50 MB
│ └── data/postgres/ ← БД
│
├── pim-dev/ ← PIM Development
│ └── ... ← 70 MB
│
├── shop-pyro-1/ ← Сайт магазина 1
│ └── ... ← 70 MB
│
└── shop-pyro-2/ ← Сайт магазина 2
└── ... ← 70 MB
Shared (общие ресурсы): 450 MB
+ Каждый сайт (уникальное): 70 MB
10 сайтов:
Без shared: 520 MB × 10 = 5200 MB (5.2 GB)
С shared: 450 MB + (70 MB × 10) = 1150 MB (1.1 GB)
ЭКОНОМИЯ: 4 GB (78%)
100 сайтов:
Без shared: 52 GB
С shared: 7.5 GB
ЭКОНОМИЯ: 44.5 GB (85%)
mkdir -p /opt/claude-workspace/shared/{vendor,drupal-core,modules-contrib}
# Из эталонного pim-dev
mv /opt/claude-workspace/projects/pim-dev/web/vendor/* \
/opt/claude-workspace/shared/vendor/
mv /opt/claude-workspace/projects/pim-dev/web/web/core/* \
/opt/claude-workspace/shared/drupal-core/
mv /opt/claude-workspace/projects/pim-dev/web/web/modules/contrib/* \
/opt/claude-workspace/shared/modules-contrib/
cd /opt/claude-workspace/projects/pim-dev/web/
# Удалить старые
rm -rf vendor
# Создать symlinks
ln -s ../../shared/vendor vendor
ln -s ../../shared/drupal-core web/core
ln -s ../../shared/modules-contrib web/modules/contrib
docker exec pim-dev-drupal bash -c "cd /var/www/html && bin/drush status"
# Должно работать!
# docker-compose.yml
services:
shop-drupal:
volumes:
# Shared (read-only)
- /opt/claude-workspace/shared/vendor:/var/www/html/vendor:ro
- /opt/claude-workspace/shared/drupal-core:/var/www/html/web/core:ro
- /opt/claude-workspace/shared/modules-contrib:/var/www/html/web/modules/contrib:ro
# Site-specific (read-write)
- ./web/sites:/var/www/html/web/sites
- ./web/modules/custom:/var/www/html/web/modules/custom
- ./config:/var/www/html/config
Преимущества:
- ✅ Read-only защита от изменений
- ✅ Один vendor на все контейнеры
- ✅ Быстрое развёртывание новых сайтов
- ✅ Централизованные обновления
shop-site-1/ 70 MB
├── web/
│ ├── sites/default/
│ │ ├── settings.php 1 KB
│ │ └── files/ 50 MB (изображения товаров)
│ └── modules/custom/ 5 MB (кастомные модули)
├── config/sync/ 2 MB (экспорт конфигурации)
├── data/postgres/ 10 MB (БД)
└── docker-compose.yml 1 KB
Уникальное для каждого сайта:
- Settings.php (credentials)
- Files (изображения)
- Custom modules (если есть)
- Configuration (настройки)
- Database (данные)
Общее (shared):
- vendor/ (Composer packages)
- core/ (Drupal core)
- modules/contrib/ (модули)
- themes/contrib/ (темы)
# 1. Копировать шаблон
cp -r /opt/claude-workspace/templates/shop-kickstart-5 \
/opt/claude-workspace/projects/shop-new-site
# 2. Создать symlinks
cd /opt/claude-workspace/projects/shop-new-site
ln -s ../../shared/vendor web/vendor
ln -s ../../shared/drupal-core web/web/core
ln -s ../../shared/modules-contrib web/web/modules/contrib
# 3. Настроить docker-compose.yml (порты, домен)
# 4. Настроить settings.php (credentials)
# 5. Запустить контейнеры
docker compose up -d
# 6. Импортировать конфигурацию
docker exec shop-new-site-drupal bash -c "cd /var/www/html && \
bin/drush config:import -y && \
bin/drush cr"
# Готово! Сайт развёрнут за 2 минуты, занимает 70 MB
# 1. Экспортировать конфигурацию с эталонного сайта
docker exec pim-dev-drupal bash -c "cd /var/www/html && \
bin/drush config:export -y"
# 2. Создать дамп БД
docker exec pim-dev-db pg_dump -U drupal_pim_dev drupal_pim_dev > \
/opt/claude-workspace/templates/shop-kickstart-5/backups/clean-install.sql
# 3. Упаковать config
tar -czf /opt/claude-workspace/templates/shop-kickstart-5/config.tar.gz \
-C /opt/claude-workspace/projects/pim-dev config/
# 4. Использовать для новых сайтов
# Общий размер shared
du -sh /opt/claude-workspace/shared/
# Ожидается: 450-500 MB
# Размер каждого сайта
du -sh /opt/claude-workspace/projects/*/
# Ожидается: 70-100 MB каждый
# Итого для 10 сайтов
du -sh /opt/claude-workspace/projects/
# Ожидается: ~1.2 GB (вместо 5.2 GB)
# Обновить в shared
cd /opt/claude-workspace/shared
composer update
# Все сайты автоматически получат обновления!
# Проверить на тестовом сайте
docker exec pim-dev-drupal bash -c "cd /var/www/html && \
bin/drush updatedb -y && \
bin/drush cr"
# Если ОК → применить на всех сайтах
for site in /opt/claude-workspace/projects/*/; do
docker exec $(basename $site)-drupal bash -c "cd /var/www/html && \
bin/drush updatedb -y && \
bin/drush cr"
done
Риски:
- ✅ Все сайты используют одни модули
- ❌ Обновление затрагивает все сайты
- ❌ Уязвимость в модуле = уязвимость везде
Защита:
volumes:
- /opt/shared/vendor:/var/www/html/vendor:ro # :ro = read-only
# Обновлять сначала на dev
# Проверять на stage
# Потом на production
/opt/claude-workspace/shared/
├── vendor-v1/ ← Стабильная версия (production)
├── vendor-v2/ ← Новая версия (testing)
└── vendor-latest/ ← Разработка
Для 1-5 сайтов:
- Можно без shared vendor
- Проще в управлении
Для 5-20 сайтов:
- ✅ Обязательно использовать shared vendor
- Экономия: 3-10 GB
Для 20+ сайтов:
- ✅ Shared vendor
- ✅ Версионирование vendor
- ✅ CDN для файлов
- ✅ Централизованная БД (опционально)
Время: ~5 минут
Место: ~70 MB
Создано: 2025-11-16
Автор: Claude Code
Статус: Архитектура для продакшн использования