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

Мульти-сайт стек для разработки

Дата: 2025-11-16
Проект: Drupal Shop Template
Вопрос: Можно ли вести разработку нескольких сайтов в одном стеке?


✅ ДА! Один docker-compose для всех сайтов

Преимущества

✅ Одна команда запускает ВСЁ:
   docker compose up -d

✅ Общий vendor (экономия места):
   300 MB вместо N × 300 MB

✅ Единый стек (все версии совместимы):
   PHP 8.3, PostgreSQL 16, Drupal 11

✅ Легко переключаться между сайтами:
   http://localhost:8811  → pim-dev
   http://localhost:8812  → shop-test
   http://localhost:8813  → shop-1
   http://localhost:8814  → shop-2

✅ Adminer для всех БД сразу:
   http://localhost:8080

✅ Независимые перезапуски:
   docker compose restart pim-dev-drupal
   (другие продолжают работать)

🏗️ Структура проекта

/opt/claude-workspace/
│
├── shared/                          ← ОБЩИЕ ресурсы
│   ├── vendor/              300 MB
│   ├── drupal-core/          50 MB
│   └── modules-contrib/     100 MB
│
├── projects/
│   ├── drupal-shop-template/        ← Главный проект
│   │   ├── docker-compose.yml       ← ОДИН файл для ВСЕХ сайтов
│   │   ├── dockerfiles/
│   │   │   └── drupal/Dockerfile
│   │   └── docs/
│   │
│   ├── pim-dev/                     ← Сайт 1: PIM Development
│   │   ├── web/
│   │   │   ├── sites/default/       70 MB (уникальное)
│   │   │   └── modules/custom/
│   │   ├── config/
│   │   └── data/postgres/          158 MB
│   │
│   ├── shop-test/                   ← Сайт 2: Shop Testing
│   │   ├── web/sites/               70 MB
│   │   ├── config/
│   │   └── data/postgres/          158 MB
│   │
│   ├── shop-1/                      ← Сайт 3: Магазин 1
│   │   ├── web/sites/               70 MB
│   │   └── data/postgres/          158 MB
│   │
│   └── shop-2/                      ← Сайт 4: Магазин 2
│       ├── web/sites/               70 MB
│       └── data/postgres/          158 MB

Размер 4 сайтов:

Shared:          450 MB  (один раз)
4 × уникальное: 1120 MB
────────────────────────
ИТОГО:          1.6 GB

Вместо 4 × 1.6 GB = 6.4 GB
ЭКОНОМИЯ: 4.8 GB (75%)

🚀 Использование

Запуск всех сайтов

cd /opt/claude-workspace/projects/drupal-shop-template

# Запустить ВСЁ
docker compose up -d

# Проверить статус
docker compose ps

Результат:

NAME              STATUS    PORTS
pim-dev-drupal    Up        0.0.0.0:8811->80/tcp
pim-dev-db        Up        (healthy)
shop-test-drupal  Up        0.0.0.0:8812->80/tcp
shop-test-db      Up        (healthy)
shop-1-drupal     Up        0.0.0.0:8813->80/tcp
shop-1-db         Up        (healthy)
shop-2-drupal     Up        0.0.0.0:8814->80/tcp
shop-2-db         Up        (healthy)
adminer           Up        0.0.0.0:8080->8080/tcp

Запуск только одного сайта

# Запустить только pim-dev
docker compose up -d pim-dev-drupal pim-dev-db

# Запустить только shop-test
docker compose up -d shop-test-drupal shop-test-db

Перезапуск одного сайта

# Перезапустить только pim-dev
docker compose restart pim-dev-drupal

# Другие сайты продолжают работать!

Остановка одного сайта

# Остановить shop-1 (экономия ресурсов)
docker compose stop shop-1-drupal shop-1-db

# Запустить обратно когда нужно
docker compose start shop-1-drupal shop-1-db

Логи конкретного сайта

# Логи pim-dev
docker compose logs -f pim-dev-drupal

# Логи всех сайтов
docker compose logs -f

🔧 Работа с сайтами

Доступ к сайтам

# PIM DEV
https://pim.dev.0kt.ru/
http://localhost:8811/

# SHOP TEST
https://shop.test.0kt.ru/
http://localhost:8812/

# SHOP 1
https://shop1.0kt.ru/
http://localhost:8813/

# SHOP 2
https://shop2.0kt.ru/
http://localhost:8814/

# Adminer (все БД)
http://localhost:8080/

Drush на каждом сайте

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

# SHOP TEST
docker compose exec shop-test-drupal bash -c "cd /var/www/html && bin/drush cr"

# SHOP 1
docker compose exec shop-1-drupal bash -c "cd /var/www/html && bin/drush uli"

Composer (обновление модулей)

# Обновить shared vendor (влияет на ВСЕ сайты!)
cd /opt/claude-workspace/shared
composer update

# Проверить на одном сайте
docker compose exec pim-dev-drupal bash -c "cd /var/www/html && bin/drush updatedb -y"

# Если OK → применить на всех
docker compose exec shop-test-drupal bash -c "cd /var/www/html && bin/drush updatedb -y"
docker compose exec shop-1-drupal bash -c "cd /var/www/html && bin/drush updatedb -y"
docker compose exec shop-2-drupal bash -c "cd /var/www/html && bin/drush updatedb -y"

📊 Управление ресурсами

Сколько ресурсов нужно?

4 сайта одновременно:
  CPU:    4 × 0.5 = 2 cores
  RAM:    4 × 512MB = 2 GB
  Disk:   1.6 GB (с shared)

Можно работать на:
   4 CPU, 4 GB RAM (комфортно)
   2 CPU, 3 GB RAM (приемлемо)
   1 CPU, 2 GB RAM (медленно)

Экономия ресурсов

# Работаю над PIM → остановить магазины
docker compose stop shop-1-drupal shop-1-db shop-2-drupal shop-2-db

# Работаю над магазином → остановить PIM
docker compose stop pim-dev-drupal pim-dev-db

# Освобождается:
  - 1 GB RAM
  - 1 CPU core

🎯 Сценарии использования

Сценарий 1: Разработка PIM

# Запустить только PIM DEV
docker compose up -d pim-dev-drupal pim-dev-db adminer

# Открыть
https://pim.dev.0kt.ru/

# Работать...

# Остановить когда закончил
docker compose stop pim-dev-drupal pim-dev-db

Сценарий 2: Разработка магазина

# Запустить SHOP TEST для разработки
docker compose up -d shop-test-drupal shop-test-db adminer

# Установить модуль
docker compose exec shop-test-drupal bash -c "
  cd /opt/claude-workspace/shared &&
  composer require 'drupal/commerce_tinkoff:^1.0'
"

# Включить модуль
docker compose exec shop-test-drupal bash -c "
  cd /var/www/html &&
  bin/drush en commerce_tinkoff -y &&
  bin/drush cr
"

# Настроить через UI
# https://shop.test.0kt.ru/admin/commerce/config/payment-gateways

# Экспортировать конфигурацию
docker compose exec shop-test-drupal bash -c "
  cd /var/www/html &&
  bin/drush config:export -y
"

# Теперь конфигурация в ../shop-test/config/
# Можно применить на shop-1, shop-2

Сценарий 3: Тестирование перед продакшн

# Скопировать конфигурацию из test → shop-1
cp -r ../shop-test/config/* ../shop-1/config/

# Импортировать на SHOP 1
docker compose exec shop-1-drupal bash -c "
  cd /var/www/html &&
  bin/drush config:import -y &&
  bin/drush cr
"

# Проверить
https://shop1.0kt.ru/

# Если OK → выкатить на SHOP 2

Сценарий 4: Запуск всех сайтов

# Утром: запустить всё
docker compose up -d

# Переключаться между проектами:
# http://localhost:8811  → PIM DEV
# http://localhost:8812  → SHOP TEST
# http://localhost:8813  → SHOP 1
# http://localhost:8814  → SHOP 2

# Вечером: остановить всё
docker compose down

🔄 Добавление нового сайта

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

mkdir -p /opt/claude-workspace/projects/shop-3/{web/sites/default,config,data/postgres}

Шаг 2: Добавить в docker-compose.yml

shop-3-drupal:
  build: ./dockerfiles/drupal
  container_name: shop-3-drupal
  ports:
    - "8815:80"  # Новый порт!
  volumes:
    - shared-vendor:/var/www/html/vendor:ro
    - shared-core:/var/www/html/web/core:ro
    - shared-modules:/var/www/html/web/modules/contrib:ro
    - ../shop-3/web/sites:/var/www/html/web/sites
    - ../shop-3/config:/var/www/html/config
  environment:
    - POSTGRES_HOST=shop-3-db
    - POSTGRES_DB=drupal_shop_3
    - POSTGRES_USER=drupal_shop_3
    - POSTGRES_PASSWORD=drupal_shop_3_pass_2025
  depends_on:
    - shop-3-db
  networks:
    - dev-network

shop-3-db:
  image: postgres:16-alpine
  container_name: shop-3-db
  environment:
    - POSTGRES_DB=drupal_shop_3
    - POSTGRES_USER=drupal_shop_3
    - POSTGRES_PASSWORD=drupal_shop_3_pass_2025
  volumes:
    - ../shop-3/data/postgres:/var/lib/postgresql/data
  networks:
    - dev-network

Шаг 3: Запустить

docker compose up -d shop-3-drupal shop-3-db

Шаг 4: Установить Drupal

# Скопировать vendor
cp -r ../shop-test/web/sites/default/settings.php ../shop-3/web/sites/default/

# Обновить credentials в settings.php

# Импортировать конфигурацию
docker compose exec shop-3-drupal bash -c "
  cd /var/www/html &&
  bin/drush site:install commerce_kickstart \
    --db-url='pgsql://drupal_shop_3:drupal_shop_3_pass_2025@shop-3-db:5432/drupal_shop_3' \
    --site-name='Shop 3' \
    --account-mail=admin@0kt.ru \
    -y
"

Готово! Новый сайт за 5 минут.


📋 Чек-лист работы со стеком

Утро (начало работы)

Работа

Вечер (конец работы)

Обновление модулей


🎓 Рекомендации

Для 1-3 сайтов

Структура: Один docker-compose.yml
Shared vendor: Опционально
Управление: Простое

Для 4-10 сайтов

Структура: Один docker-compose.yml
Shared vendor: ОБЯЗАТЕЛЬНО
Управление: Остановка неиспользуемых

Для 10+ сайтов

Структура: Разделить на группы
  - docker-compose-dev.yml (dev сайты)
  - docker-compose-prod.yml (prod сайты)
Shared vendor: ОБЯЗАТЕЛЬНО
Управление: Автоматизация (scripts)

⚠️ Важные моменты

Порты

Каждый сайт на своём порту:
- 8811 → pim-dev
- 8812 → shop-test
- 8813 → shop-1
- 8814 → shop-2
- 8815 → shop-3
- ...

Credentials

Каждая БД со своими credentials:
- Не дублировать пароли
- Формат: drupal_{sitename}_pass_2025

Shared vendor

Имена контейнеров

Уникальные имена:
- pim-dev-drupal, pim-dev-db
- shop-1-drupal, shop-1-db
- НЕ drupal-1, drupal-2 (непонятно)


🚀 Итого

Можно и нужно вести разработку нескольких сайтов в одном стеке!

Преимущества:
- ✅ Экономия места (75%)
- ✅ Единая команда запуска
- ✅ Общий vendor
- ✅ Легко переключаться
- ✅ Независимые перезапуски
- ✅ Adminer для всех БД

Один файл управляет всем:

docker compose up -d    # Всё запустить
docker compose ps       # Статус всех
docker compose logs -f  # Логи всех
docker compose down     # Всё остановить

Создано: 2025-11-16
Автор: Claude Code
Статус: Готовая архитектура для разработки