Дата: 2025-11-16
Проект: Drupal Shop Template
Вопрос: Можно ли вести разработку нескольких сайтов в одном стеке?
✅ Одна команда запускает ВСЁ:
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/
# 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"
# Обновить 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
# Запустить только 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
# Запустить 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
# Скопировать конфигурацию из 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
# Утром: запустить всё
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
mkdir -p /opt/claude-workspace/projects/shop-3/{web/sites/default,config,data/postgres}
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
docker compose up -d shop-3-drupal shop-3-db
# Скопировать 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 минут.
docker compose up -d (запустить нужные сайты)docker compose ps (все ли запустилось)docker compose execdrush config:exportdocker compose down или оставить работать/opt/claude-workspace/shareddrush updatedb на всехСтруктура: Один docker-compose.yml
Shared vendor: Опционально
Управление: Простое
Структура: Один docker-compose.yml
Shared vendor: ОБЯЗАТЕЛЬНО
Управление: Остановка неиспользуемых
Структура: Разделить на группы
- 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:
- Не дублировать пароли
- Формат: drupal_{sitename}_pass_2025
:ro)Уникальные имена:
- 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
Статус: Готовая архитектура для разработки