version: 1.0.0
date: 2026-04-08
status: active
Правила работы с Drupal в Docker-контейнерах на платформе.
Официальный образ drupal:11.3-php8.3-apache основан на drupal/recommended-project.
/opt/drupal/ ← PROJECT ROOT (composer, vendor, drush)
├── composer.json ← drupal/recommended-project scaffold
├── composer.lock
├── vendor/ ← все зависимости, drush БД ЗДЕСЬ
│ └── bin/
│ └── drush ← правильный путь к drush
├── config/
│ └── sync/ ← config_sync_directory
└── web/ ← WEB ROOT (Apache DocumentRoot)
├── core/
├── modules/
└── sites/
└── default/
├── settings.php
└── files/ ← uploads, cache
/var/www/html → /opt/drupal/web (симлинк)
Критично: /var/www/html — это симлинк на web root, не project root.
# ПРАВИЛЬНО — устанавливать в project root
cd /opt/drupal && composer require drush/drush
# НЕПРАВИЛЬНО — устанавливает в web root (не работает)
cd /var/www/html && composer require drush/drush
# ПРАВИЛЬНО
/opt/drupal/vendor/bin/drush --root=/opt/drupal/web status
# НЕПРАВИЛЬНО
/var/www/html/vendor/bin/drush status
FROM drupal:11.3-php8.3-apache
RUN cd /opt/drupal && composer require drush/drush --no-interaction 2>&1 | tail -3
RUN chown -R www-data:www-data /opt/drupal/vendor
При монтировании volumes Docker создаёт папки от имени root. Нужно исправить.
# Обязательно при первом запуске или после пересоздания volumes
chown -R www-data:www-data /opt/drupal/web/sites/default/files
chown www-data:www-data /opt/drupal/web/sites/default/settings.php
chown -R www-data:www-data /opt/drupal/web/modules/custom
chown -R www-data:www-data /opt/drupal/web/themes/custom
volumes:
# rw — обязательно, Drupal пишет hash_salt и config_sync_directory при установке
- ./drupal/settings.php:/var/www/html/sites/default/settings.php:rw
Никогда :ro — Drupal не сможет завершить установку.
<?php
// Пустой — entrypoint создаст полный после drush site:install
После drush site:install файл будет заполнен автоматически:
- $databases — credentials
- $settings['hash_salt'] — случайная строка
- $settings['config_sync_directory'] — путь к sync
// Разрешить доступ с любого хоста (dev)
$settings['trusted_host_patterns'] = ['^.*$'];
// Или для конкретных доменов (prod)
$settings['trusted_host_patterns'] = [
'^lideravto\.aipd\.ru$',
'^new\.lideravto\.ru$',
];
Settings.php ссылается на config_sync_directory. Она должна существовать.
# В docker-compose не монтируется — создаётся автоматически drush
# Но если нужна персистентность — mount volume:
volumes:
- ./config/sync:/opt/drupal/config/sync
services:
app:
build: . # Dockerfile с drush
volumes:
- drupal-files:/var/www/html/sites/default/files
- ./drupal/settings.php:/var/www/html/sites/default/settings.php:rw
- ./drupal/modules:/var/www/html/modules/custom:rw
- ./drupal/themes:/var/www/html/themes/custom:rw
environment:
DRUPAL_DATABASE_HOST: db
DRUPAL_DATABASE_NAME: ${MYSQL_DATABASE}
DRUPAL_DATABASE_USERNAME: ${MYSQL_USER}
DRUPAL_DATABASE_PASSWORD: ${MYSQL_PASSWORD}
DRUPAL_SITE_NAME: "Мой сайт"
DRUPAL_ADMIN_PASS: ${DRUPAL_ADMIN_PASS}
depends_on:
db:
condition: service_healthy
db:
image: mysql:8.4
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 10
FROM drupal:11.3-php8.3-apache
# Drush в project root (не web root)
RUN cd /opt/drupal && composer require drush/drush --no-interaction 2>&1 | tail -3
RUN chown -R www-data:www-data /opt/drupal/vendor
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-foreground"]
#!/bin/bash
set -e
DRUSH=/opt/drupal/vendor/bin/drush
ROOT=/opt/drupal/web
# Проверить установлен ли Drupal (bootstrap успешен = БД с таблицами)
if ! $DRUSH --root=$ROOT status --field=bootstrap 2>/dev/null | grep -q "Successful"; then
echo "[entrypoint] Installing Drupal..."
$DRUSH --root=$ROOT site:install standard \
--db-url="mysql://${DRUPAL_DATABASE_USERNAME}:${DRUPAL_DATABASE_PASSWORD}@${DRUPAL_DATABASE_HOST}:3306/${DRUPAL_DATABASE_NAME}" \
--site-name="${DRUPAL_SITE_NAME:-Drupal}" \
--account-name=admin \
--account-pass="${DRUPAL_ADMIN_PASS:-Admin2026!}" \
--locale=ru \
--yes
echo "[entrypoint] Drupal installed successfully"
fi
exec "$@"
# Статус
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web status
# Сбросить кеш
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web cr
# Включить модуль
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web en module_name -y
# Сменить пароль admin
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web user:password admin "NewPass123"
# Логин-ссылка
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web uli
# Запустить обновления БД
docker exec -u www-data app-container /opt/drupal/vendor/bin/drush --root=/opt/drupal/web updb -y
# Установить модуль через composer
docker exec app-container bash -c "cd /opt/drupal && composer require drupal/module_name"
| Симптом | Причина | Решение |
|---|---|---|
| Сайт показывает install.php | БД пустая | Запустить entrypoint / drush site:install |
sites/default/files не writable |
root:root вместо www-data | chown -R www-data:www-data /opt/drupal/web/sites/default/files |
| settings.php не пишется | mount :ro |
Изменить на :rw в docker-compose, пересоздать контейнер |
drush: command not found |
Drush установлен в web root | cd /opt/drupal && composer require drush/drush |
Package drupal/core is not installed |
Drush в неправильном месте | То же — project root, не web root |
Globally installed Drush not supported |
То же | То же |
trusted_host_patterns error |
Домен не в белом списке | Добавить в settings.php |
| Документ | Путь |
|---|---|
| Установка на Beget | library/artifacts/cms/drupal2/INSTALL.md |
| Шаблоны стеков | infra/templates/drupal/ |
| Проект lideravto-new | projects/org/lideravto-new/CLAUDE.md |
| Деплой сервисов | architect/standards/operation/operation-services-deployment.md |