Гид по технологиям

Установка Drupal с помощью Docker на Ubuntu 22.04

• 11 min read • DevOps • Обновлено 25 Nov 2025
Установка Drupal в Docker на Ubuntu 22.04
Установка Drupal в Docker на Ubuntu 22.04

  • Пошаговое руководство по развёртыванию Drupal 10 с PHP-FPM, MySQL и Nginx в контейнерах Docker на Ubuntu 22.04. Используем Docker Compose и Certbot для автоматической выдачи и обновления SSL. Включены рекомендации по безопасности, резервному копированию и обновлению.

Логотип Drupal и архитектура развёртывания

Drupal — это система управления контентом (CMS) с открытым исходным кодом, написанная на PHP. Её используют для блогов, государственных порталов, корпоративных сайтов и других проектов. Drupal гибкий: набор модулей и тем позволяет создать практически любой сайт.

В этом руководстве вы научитесь устанавливать Drupal в Docker на сервере Ubuntu 22.04. Мы будем использовать PHP 8.2 совместимый образ Drupal, базу данных MySQL и Nginx в качестве веб-сервера. Для HTTPS выдачи сертификатов применим Certbot (Let’s Encrypt). Docker Compose объединит сервисы в единый стек.

Важные термины в одну строку

  • Docker: платформа для контейнеризации приложений.
  • Docker Compose: инструмент для определения и запуска многоконтейнерных Docker-приложений.
  • Certbot: клиент для автоматического получения сертификатов Let’s Encrypt.
  • PHP-FPM: реализация FastCGI для PHP для обработки PHP-запросов.

Для кого это руководство

Для системных администраторов и разработчиков, у которых есть доступ к Ubuntu 22.04 серверу и базовые навыки работы в терминале. Подойдёт для небольших и средних проектов. Если вы готовите production для большого трафика, разделите роли (балансировка, кластеризация БД и т.д.).

Основные шаги в одном предложении

  1. Настроить базовую систему и ufw, 2. установить Docker и Docker Compose, 3. создать docker-compose.yml, 4. настроить Nginx для ACME, 5. получить тестовый (staging) сертификат, 6. получить боевой сертификат, 7. запустить Drupal web-установщик, 8. настроить параметры БД и trusted hosts, 9. настроить резервное копирование, 10. обновлять образы при необходимости.

Содержание

  • Предварительные требования
  • Шаг 1 — Настройка брандмауэра
  • Шаг 2 — Установка Docker и Docker Compose
  • Шаг 3 — Файл Docker Compose для Drupal
  • Шаг 4 — Конфигурация Nginx
  • Шаг 5 — Получение SSL сертификатов
  • Шаг 6 — Конфигурация Nginx для SSL
  • Шаг 7 — Запуск веб-инсталлятора Drupal
  • Шаг 8 — Базовая настройка Drupal (оптимизация и безопасность)
  • Шаг 9 — Резервное копирование
  • Шаг 10 — Обновление Drupal
  • Частые ошибки и отладка
  • Контрольные списки, тест-кейсы, SOP и рекомендации
  • Краткое резюме

Предварительные требования

  • Сервер с Ubuntu 22.04, минимум 1 ГБ оперативной памяти для небольших сайтов; для среднего проекта пригодится 2 ГБ и больше.
  • Нераутовый пользователь с правами sudo.
  • Полностью настроенное доменное имя (FQDN), указывающее на ваш сервер. В примерах используется example.com и drupal.example.com — замените их на ваш домен.
  • Система обновлена и установлены утилиты:
$ sudo apt update
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y

Примечание: набор пакетов обеспечивает работу добавления репозиториев, GPG-ключей и базовых утилит.

Шаг 1 — Настройка брандмауэра

Ubuntu по умолчанию поставляется с ufw (Uncomplicated Firewall). Проверим статус и откроем нужные порты.

Проверить статус:

$ sudo ufw status

Если статус inactive, откройте SSH, HTTP и HTTPS, чтобы не потерять доступ:

$ sudo ufw allow OpenSSH
$ sudo ufw allow http
$ sudo ufw allow https

Включите брандмауэр:

$ sudo ufw enable

Проверка статуса после включения:

$ sudo ufw status

Ожидаемый вывод: OpenSSH, 80/tcp и 443/tcp разрешены для IPv4 и IPv6 (если включены). Важно: при управлении удалённым сервером сначала убедитесь, что правило для SSH применено, иначе вы можете потерять доступ.

Важно

  • На серверах в облаке дополнительно проверьте правила сетевого уровня (например, security groups в AWS или правила брандмауэра в GCP/OVH), чтобы порты 80/443 были открыты.

Шаг 2 — Установка Docker и Docker Compose

Ubuntu 22.04 может содержать старую версию Docker. Установим официальную последнюю стабильную версию.

Импорт GPG-ключа Docker:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Создаём файл репозитория Docker:

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Обновляем список пакетов и устанавливаем Docker Engine и плагин docker-compose:

$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Проверяем статус Docker:

$ sudo systemctl status docker

Чтобы запускать docker без sudo, добавьте пользователя в группу docker:

$ sudo usermod -aG docker $(whoami)

Перезайдите в сессию или выполните:

$ su - ${USER}

Проверка групп:

$ groups

Если в выводе есть docker — всё готово.

Совет по безопасности

  • В продакшне стоит ограничивать доступ к группе docker, так как членство в ней даёт привилегии, схожие с root.

Шаг 3 — Создание docker-compose.yml для Drupal

Создадим директорию и файл docker-compose.yml.

$ mkdir ~/drupal
$ cd ~/drupal
$ nano docker-compose.yml

Вставьте следующий манифест (сохраните файл после вставки):

services:
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: unless-stopped
    env_file: .env
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - internal
  
  drupal:
    image: drupal:10-fpm-alpine
    container_name: drupal
    depends_on:
      - mysql
    restart: unless-stopped
    networks:
      - internal
      - external
    volumes:
      - drupal-data:/var/www/html
  
  webserver:
    image: nginx:1.22.1-alpine
    container_name: webserver
    depends_on:
      - drupal
    restart: unless-stopped
    ports:
      - 80:80
    volumes:
      - drupal-data:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
      - certbot-etc:/etc/letsencrypt
    networks:
      - external
  
  certbot:
    depends_on:
      - webserver
    image: certbot/certbot
    container_name: certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - drupal-data:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d example.com -d www.example.com

networks:
  external:
    driver: bridge
  internal:
    driver: bridge

volumes:
  drupal-data:
  db-data:
  certbot-etc:

Разбор сервисов

  • MySQL: используем образ mysql:8.0, данные монтируются в named volume db-data. Переменные окружения задаются в файле .env, который мы создадим отдельно (пользователь, пароль, имя БД).
  • Drupal: образ drupal:10-fpm-alpine содержит PHP-FPM. Код сайта монтируется в drupal-data.
  • webserver (Nginx): отдаёт порт 80 и использует директорию с конфигурациями nginx-conf. Сертификаты certbot хранятся в certbot-etc.
  • certbot: получает сертификаты через webroot. В примере используется –staging для тестовой выдачи.

Файл .env (пример)

Создайте файл .env в той же папке и добавьте туда переменные для MySQL:

MYSQL_ROOT_PASSWORD=changeme_root_password
MYSQL_DATABASE=drupal
MYSQL_USER=drupal
MYSQL_PASSWORD=changeme_db_password

Замените пароли на безопасные значения и храните .env с ограниченными правами доступа.

Шаг 4 — Конфигурация Nginx

Создайте директорию для конфигураций Nginx и файл drupal.conf:

$ mkdir nginx-conf
$ nano nginx-conf/drupal.conf

Вставьте конфигурацию, которая позволит Certbot проверять веб-рут и отдавать PHP-контент через PHP-FPM:

server {
    listen 80;
    listen [::]:80;

    server_name drupal.example.com;

    index index.php index.html index.htm;

    root /var/www/html;

    location ~ /.well-known/acme-challenge {
        allow all;
        root /var/www/html;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass drupal:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\.ht {
        deny all;
    }

    location = /favicon.ico { 
        log_not_found off; access_log off; 
    }
    location = /robots.txt { 
        log_not_found off; access_log off; allow all; 
    }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
}

Пояснение

  • Блок для /.well-known/acme-challenge разрешает Certbot размещать проверочные файлы.
  • PHP-файлы проксируются на drupal:9000 — это контейнер с PHP-FPM.
  • Для статических файлов включён кэш через expires.

Шаг 5 — Генерация SSL сертификатов (staging → production)

Сначала запустим контейнеры и получим тестовый (staging) сертификат, чтобы проверить процесс выдачи и не исчерпать лимиты Let’s Encrypt в период тестирования.

Запуск стекa:

$ docker compose up -d

Проверка статуса:

$ docker compose ps

В примере вы увидите, что certbot может завершиться с кодом 1 при использовании –staging в команде (в этом случае это ожидаемо для некоторых конфигураций) или завершиться успешно при корректном домене. Сертификаты размещаются в /etc/letsencrypt/live внутри контейнера webserver (через общий том certbot-etc).

Проверка файлов сертификата:

$ docker compose exec webserver ls -la /etc/letsencrypt/live

Если тестовый сертификат создан, можно заменить флаг –staging на –force-renewal (и убрать test endpoint) в секции certbot docker-compose для реальной выдачи.

Обновление команды certbot в docker-compose.yml (примеры в файле):

  certbot:
    depends_on:
      - webserver
    image: certbot/certbot
    container_name: certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - drupal-data:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email [email protected] --agree-tos --no-eff-email --staple-ocsp --force-renewal -d drupal.example.com

Пересоздаём контейнер certbot без пересоздания зависимостей:

$ docker compose up --force-recreate --no-deps certbot

При успешной выдаче вы увидите сообщения о сохранении fullchain.pem и privkey.pem в соответствующей папке.

Совет

  • Для массовых выдач сертификатов и автоматического обновления используйте cron/логику внутри контейнера или планировщик на хосте. Certbot поддерживает автоматическое продление через certbot renew.

Шаг 6 — Конфигурация Nginx для SSL

После того как сертификаты получены, нужно настроить Nginx так, чтобы он слушал 443 и перенаправлял HTTP → HTTPS.

  1. Остановите webserver контейнер:
$ docker stop webserver
  1. Создайте новый файл nginx-conf/drupal-ssl.conf:
$ nano nginx-conf/drupal-ssl.conf

Вставьте конфигурацию:

server {
    listen 80;
    listen [::]:80;

    server_name drupal.example.com;

    location ~ /.well-known/acme-challenge {
        allow all;
        root /var/www/html;
    }

    location / {
        rewrite ^ https://$host$request_uri? permanent;
    }
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name drupal.example.com;

    index index.php index.html index.htm;

    root /var/www/html;

    server_tokens off;

    ssl_certificate /etc/letsencrypt/live/drupal.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/drupal.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/drupal.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_ecdh_curve secp384r1;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass drupal:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\.ht {
        deny all;
    }

    location = /favicon.ico {
        log_not_found off; access_log off;
    }
    location = /robots.txt {
        log_not_found off; access_log off; allow all;
    }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
}
  1. Обновите docker-compose.yml, чтобы Nginx слушал порт 443 и подключал dhparam:
  webserver:
    image: nginx:1.22.1-alpine
    container_name: webserver
    depends_on:
      - drupal
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
    volumes:
      - drupal-data:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
      - certbot-etc:/etc/letsencrypt
      - /etc/ssl/certs/dhparam.pem:/etc/ssl/certs/dhparam.pem
    networks:
      - external
  1. Удалите старый HTTP-конфиг, если он не нужен:
$ rm nginx-conf/drupal.conf
  1. Сгенерируйте Diffie-Hellman параметры (dhparam.pem):
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Процесс может занять пару минут.

  1. Пересоздайте webserver контейнер:
$ docker compose up -d --force-recreate --no-deps webserver

Проверка статуса контейнеров:

$ docker compose ps

Если вебсервер запущен и порты 80/443 проброшены, открывайте https://drupal.example.com (замените на ваш домен).

Шаг 7 — Запуск веб-инсталлятора Drupal

Откройте в браузере https://drupal.example.com. Вы увидите экран инсталляции Drupal.

Экран установки Drupal — начальная страница

Выберите профиль (обычно Standard) и следуйте мастеру установки. На этапе настройки БД укажите данные из .env и в качестве хоста укажите mysql (имя сервиса в docker-compose). Это говорит Drupal подключаться по внутренней сети Docker к MySQL.

Выбор профиля установки Drupal

При успешной установке вы увидите прогресс установки модулей и тем.

Установка модулей и тем Drupal

Далее заполните основные параметры сайта: имя, учётные данные администратора, региональные настройки.

Конфигурация сайта Drupal

После завершения вы попадёте на панель управления Drupal.

Панель управления Drupal

Шаг 8 — Настройка Drupal: оптимизация и безопасность

  1. Transaction Isolation Level (уровень изоляции транзакций MySQL)

По умолчанию MySQL использует REPEATABLE READ. Для Drupal рекомендуется использовать READ COMMITTED, чтобы снизить вероятность взаимных блокировок (deadlocks).

Подключитесь к контейнеру MySQL:

$ docker exec -it mysql bash
bash-4.4# mysql -u root -p
Enter password:

В MySQL выполните:

mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

Учтите, что команда меняет глобальную настройку для текущего сеанса MySQL. Для постоянного эффекта добавьте соответствующую настройку в my.cnf при необходимости.

  1. Trusted hosts (доверенные хосты) — защита от Host header атак

Отредактируйте settings.php и добавьте ваш домен в trusted_host_patterns. Рекомендуется производить правку файла на хосте и затем копировать обратно в контейнер.

Копирование файла на хост:

$ docker cp drupal:/var/www/html/sites/default/settings.php settings.php
$ chmod +w settings.php
$ nano settings.php

Найдите и замените секцию:

#$settings['trusted_host_patterns'] = [
#  '^www\.example\.com$',
#];

На:

$settings['trusted_host_patterns'] = [
  '^drupal\.example\.com$',
];

Сделайте файл снова только для чтения и скопируйте в контейнер:

$ chmod -w settings.php
$ docker cp settings.php drupal:/var/www/html/sites/default
  1. Права на файлы и безопасность
  • Директория sites/default/files должна быть доступна для записи веб-процессом (PHP-FPM внутри контейнера).
  • Не храните чувствительные данные в репозитории.
  • Ограничьте доступ к .env и файлам конфигурации на хосте.

Шаг 9 — Резервное копирование

Резервные копии — обязательный элемент эксплуатации. Здесь показан пример бэкапа базы данных через mysqldump и сохранение SQL-файла на хосте.

Создаём папку для бэкапов и выполняем дамп:

$ cd ~/drupal
$ mkdir backup-data
$ docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null
Enter password: root_password

Файл окажется в ~/drupal/backup-data.

Восстановление:

$ docker compose exec mysql sh -c "exec mysql -uroot -p" < backup-data/data_19-01-2023_13_36_58.sql

Автоматизация резервного копирования (ежедневный cron)

Создайте скрипт в /etc/cron.daily:

$ sudo nano /etc/cron.daily/drupalbackup.sh

Пример содержимого скрипта:

#!/bin/bash
cd /home/navjot/drupal/
/usr/bin/docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null

Сделайте его исполняемым:

$ sudo chmod +x /etc/cron.daily/drupalbackup.sh

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

  • Копии базы и файлов храните вне сервера (например, в объектном хранилище S3, Backblaze B2 или на другом хосте).
  • Шифруйте резервные копии и контролируйте доступ.

Шаг 10 — Обновление Drupal и компонентов

  1. Перед обновлением обязательно выполните резервную копию базы данных и файлов.
  2. Остановите контейнеры:
$ docker compose down
  1. Обновите образы (пример для Drupal):
$ docker compose pull drupal:10-fpm-alpine

Если нужен переход на другой мажорный релиз, проверьте релиз-ноуты Drupal и требования модулей.

  1. Включите изменения и перезапустите стек:
$ docker compose up -d

Совет

  • Тестируйте обновление на staging-окружении перед выводом в production. Для больших сайтов используйте blue/green или rolling обновления.

Частые ошибки и способы их устранения

  1. Certbot не смог подтвердить домен (HTTP-01 challenge).
  • Проверьте, что DNS A/AAAA записи указывают на IP сервера.
  • Убедитесь, что порт 80 публично доступен (проверить через curl http://yourdomain/.well-known/acme-challenge/).
  • Убедитесь, что Nginx отдаёт папку /var/www/html и что в контейнере webroot содержит проверочный файл.
  1. Drupal не подключается к MySQL.
  • Проверьте переменные в .env и соответствие имени БД, пользователя и пароля.
  • Хост должен быть mysql (имя сервиса). Проверьте сеть internal.
  • Убедитесь, что контейнер mysql запущен и слушает 3306 внутри сети Docker (docker compose ps).
  1. Права на файлы/директории (500 / 403 ошибки).
  • Проверьте права на sites/default/files и права owner; в контейнере PHP-FPM процесс должен иметь возможность записи в эти директории.
  1. Низкая производительность.
  • Включите кеширование на уровне Drupal (Render cache, Page cache).
  • Используйте OPcache (обычно включён в образах PHP) и внешние кэши (Redis, Varnish) для больших проектов.

Контрольные списки и SOP

Контрольный список перед запуском в production

  • DNS для домена настроен и проверен.
  • Порты 80 и 443 открыты на уровне сети и OS.
  • SSL сертификаты получены и корректно смонтированы в контейнер.
  • Приватные ключи и .env защищены на хосте.
  • Резервное копирование настроено и протестировано.
  • Логи и метрики собираются (journald, syslog, Prometheus/ELK по желанию).

SOP: Быстрый откат к предыдущей версии (rollback)

  1. Остановить контейнеры:
$ docker compose down
  1. Восстановить базу данных из последней рабочей резервной копии (см. Шаг 9).
  2. Вернуть предыдущий тег образа в docker-compose.yml (например, drupal:10-fpm-alpine@sha256:… или конкретную версию).
  3. Запустить стек заново:
$ docker compose up -d
  1. Проверить работоспособность сайта и проверить логи webserver и drupal.

Тест-кейсы и критерии приёмки

Критерии приёмки

  • Сайт доступен по HTTPS и валидный сертификат выдан Let’s Encrypt.
  • Веб-инсталлятор Drupal завершил установку без ошибок.
  • Drupal подключился к MySQL и создал таблицы.
  • Файлы (uploads) доступны и корректно сохраняются в sites/default/files.
  • Резервная копия базы создаётся и может быть восстановлена на тестовом инсталляторе.

Минимальные тест-кейсы

  • Открыть https://drupal.example.com — получить HTTP 200 и рабочую страницу администратора.
  • Попробовать создать запись/узел и проверить её отображение.
  • Загрузить файл в медиа-библиотеку и проверить доступность файла.
  • Выполнить mysqldump и убедиться, что файл SQL можно импортировать локально.

Когда этот подход с Docker не подойдёт

  • Если у вас высокие требования к доступности и нагрузке: требуется кластерная база данных, репликация, балансировка нагрузки и отдельный CDN. Одного Docker Compose для этого недостаточно.
  • Если организация требует управляемые сервисы (PaaS) или специализированный хостинг с поддержкой Drupal — рассмотрите облачные решения.
  • Если необходимо тонко настраивать ядро ОС и оптимизировать сетевые стеки — возможно, контейнеры усложнят задачу.

Альтернативы

  • Использовать готовые Managed Drupal хостинги (Platform.sh, Pantheon).
  • Разворачивать Drupal на виртуальной машине без контейнеризации.
  • Применять Kubernetes для масштабируемых архитектур.

Ментальные модели и рекомендации

  • Изоляция: сервисы разделены по контейнерам — база, приложение, вебсервер, агент TLS. Это упрощает обновления и отладку.
  • Идем сверху вниз: сначала сеть и порты (ufw, облачный firewall), затем Docker Engine, потом Compose, затем приложения и TLS.
  • Минимум прав: используйте минимально необходимые права доступа к файлам и группам.

Быстрые шпаргалки (cheat sheet)

  • Запустить стек:
$ docker compose up -d
  • Остановить стек:
$ docker compose down
  • Просмотреть логи контейнера:
$ docker compose logs -f webserver
  • Выполнить команду в контейнере:
$ docker compose exec drupal bash
  • Обновление образов и перезапуск:
$ docker compose pull
$ docker compose up -d

Decision flowchart (Mermaid)

flowchart TD
  A[Начало: DNS и сервер готовы?] -->|Да| B[Установить Docker]
  B --> C[Создать docker-compose]
  C --> D[Настроить Nginx и webroot]
  D --> E[Запустить стек и получить staging-cert]
  E --> F{staging OK?}
  F -->|Да| G[Получить production-cert и включить 443]
  F -->|Нет| H[Диагностика: DNS/управление портами]
  G --> I[Запустить Drupal Installer]
  I --> J[Настроить trusted hosts, бэкап]
  J --> K[Мониторинг и обновления]

Риски и рекомендации по их снижению

  • Потеря доступа через SSH при неверных правилах ufw: проверьте правило для OpenSSH заранее.
  • Истечение сертификата: организуйте автоматическое обновление (certbot renew) и мониторинг срока действия.
  • Потеря данных: регулярные резервные копии и тесты восстановления.
  • Уязвимости в контейнерах: своевременно обновляйте образы и применяйте security patches.

Социальная карточка (предпросмотр для соцсетей)

OG Title: Установка Drupal в Docker на Ubuntu 22.04

OG Description: Пошаговое руководство: Docker Compose, Nginx, MySQL и Certbot для безопасного развёртывания Drupal 10.

(Поле og_image оставлено пустым — используйте логотип сайта или скриншот.)

Краткое объявление (100–200 слов)

Это пошаговое руководство по развёртыванию Drupal 10 на Ubuntu 22.04 с помощью Docker Compose. Вы узнаете, как настроить MySQL, PHP-FPM, Nginx и Certbot для HTTPS, как правильно настроить права и параметры MySQL для производительности, как настроить автоматическое резервное копирование и как безопасно обновлять образы. Руководство подходит для небольших и средних проектов и содержит практичные чек-листы для запуска в production.

Заключение

В этом руководстве показано, как быстро и воспроизводимо развернуть современный стек для Drupal с Docker Compose. Главные шаги — подготовка сервера, установка Docker, создание docker-compose.yml, настройка Nginx и получение SSL сертификата, запуск веб-инсталлятора и включение резервного копирования. Для production-окружений дополнительно рассмотрите мониторинг, автоматическое обновление и масштабирование сервисов.

Ключевые действия сейчас

  1. Подготовьте .env с безопасными паролями.
  2. Настройте DNS и откройте порты 80/443.
  3. Следуйте шагам из этого руководства и протестируйте весь процесс на staging перед production.

Если у вас возникли вопросы по конкретным шагам (docker-compose.yml, Nginx-конфиги, Certificate renewal), опишите ваш сценарий — я помогу с диагностикой и предложу конфигурацию.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро