architect/_archive/2025-11-26-cleanup/drupal-shop-template/docs/ARCHITECTURE.md

Архитектура магазина с экономией места

Дата: 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 и модули, которые ОДИНАКОВЫЕ!


✅ Решение: Shared Vendor Architecture

Структура workspace

/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%)

🔧 Реализация

Шаг 1: Создать shared директории

mkdir -p /opt/claude-workspace/shared/{vendor,drupal-core,modules-contrib}

Шаг 2: Переместить общие ресурсы

# Из эталонного 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

Шаг 4: Проверить работу

docker exec pim-dev-drupal bash -c "cd /var/www/html && bin/drush status"

# Должно работать!

🐳 Docker оптимизация

Docker volumes для shared vendor

# 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 на все контейнеры
- ✅ Быстрое развёртывание новых сайтов
- ✅ Централизованные обновления


📦 Структура сайта (70 MB)

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

Вариант Б: Clone существующего сайта

# 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

🔒 Безопасность shared vendor

Риски:
- ✅ Все сайты используют одни модули
- ❌ Обновление затрагивает все сайты
- ❌ Уязвимость в модуле = уязвимость везде

Защита:

  1. Read-only монтирование:
volumes:
  - /opt/shared/vendor:/var/www/html/vendor:ro  # :ro = read-only
  1. Staging обновлений:
# Обновлять сначала на dev
# Проверять на stage
# Потом на production
  1. Версионирование:
/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
Статус: Архитектура для продакшн использования