Поиск по сайту:

Как установить Drupal с Docker на Ubuntu 22.04


На этой странице

  1. Предпосылки
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите Docker и Docker Compose
  4. Шаг 3. Создание файла Docker Compose для Drupal
    1. Докер-сервис MySQL
    2. Служба Drupal
    3. Служба Nginx
    4. Служба Certbot

    Drupal — это система управления контентом (CMS) с открытым исходным кодом, написанная на PHP. Многие организации по всему миру используют его для создания блогов, правительственных сайтов, корпоративных сайтов и многого другого. Он поставляется с растущим набором функций и модулей для расширения его функциональности, что позволяет вам создавать любой веб-сайт, который вы хотите.

    В этом руководстве вы узнаете, как установить Drupal с помощью Docker на сервер Ubuntu 22.04. Drupal работает с PHP 8.2 и MySQL. Он также поддерживает PostgreSQL, начиная с версии 9, но есть некоторые ошибки. Поэтому в нашем руководстве мы будем использовать MySQL. Мы будем использовать Docker Compose для интеграции Drupal с Nginx и инструментом Certbot для сервера сайта Drupal по защищенному протоколу HTTPS.

    Предпосылки

    • A server running Ubuntu 22.04 with a minimum of 1GB of RAM for smaller communities. To host larger communities, you should get a server with a minimum of 2GB of RAM or more.

    • A non-root user with sudo privileges.

    • A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will use example.com as the domain name.

    • Make sure everything is updated.

      $ sudo apt update
      
    • Install basic utility packages. Some of them may already be installed.

      $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
      

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

    Первым шагом является настройка брандмауэра. Ubuntu по умолчанию поставляется с ufw (простой брандмауэр).

    Проверьте, работает ли брандмауэр.

    $ sudo ufw status
    

    Вы должны получить следующий вывод.

    Status: inactive
    

    Разрешить порт SSH, чтобы брандмауэр не разорвал текущее соединение при его включении.

    $ sudo ufw allow OpenSSH
    

    Разрешить также порты HTTP и HTTPS.

    $ sudo ufw allow http
    $ sudo ufw allow https
    

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

    $ sudo ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    Firewall is active and enabled on system startup
    

    Еще раз проверьте состояние брандмауэра.

    $ sudo ufw status
    

    Вы должны увидеть аналогичный вывод.

    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    80/tcp                     ALLOW       Anywhere
    443                        ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    80/tcp (v6)                ALLOW       Anywhere (v6)
    443 (v6)                   ALLOW       Anywhere (v6)
    

    Шаг 2. Установите Docker и Docker Compose

    Ubuntu 22.04 поставляется с более старой версией Docker. Чтобы установить последнюю версию, сначала импортируйте ключ Docker GPG.

    $ 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
    

    Обновите список системных репозиториев.

    $ sudo apt update
    

    Установите последнюю версию Docker.

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

    Убедитесь, что он запущен.

    $ sudo systemctl status docker
    ? docker.service - Docker Application Container Engine
         Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
         Active: active (running) since Sat 2023-01-14 10:41:35 UTC; 2min 1s ago
    TriggeredBy: ? docker.socket
           Docs: https://docs.docker.com
       Main PID: 2054 (dockerd)
          Tasks: 52
         Memory: 22.5M
            CPU: 248ms
         CGroup: /system.slice/docker.service
                 ??  2054 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    

    По умолчанию Docker требует привилегий root. Если вы хотите избежать использования sudo при каждом запуске команды docker, добавьте свое имя пользователя в docker группа.

    $ sudo usermod -aG docker $(whoami)
    

    Вам нужно будет выйти из сервера и снова войти в систему под тем же пользователем, чтобы включить это изменение, или использовать следующую команду.

    $ su - ${USER}
    

    Подтвердите, что ваш пользователь добавлен в группу Docker.

    $ groups
    navjot wheel docker
    

    Шаг 3 — Создайте файл Docker Compose для Drupal

    Создайте каталог для Drupal.

    $ mkdir ~/drupal
    

    Перейдите в каталог.

    $ cd ~/drupal
    

    Создайте и откройте файл docker-compose.yml для редактирования.

    $ 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 _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:
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Давайте пройдемся по каждой службе, определенной в приведенном выше файле.

    Докер-сервис MySQL

    Здесь мы загружаем последний образ mysql: 8.0 из концентратора Docker. Мы используем версию 8.x вместо последнего тега. Таким образом, мы можем придерживаться стабильной и протестированной версии MySQL, которая работает с Drupal. Мы установили имя для контейнера, которое можно использовать с командами Docker для остановки, запуска и просмотра журналов. Контейнер продолжит работу, если его не остановить вручную. Мы определили файл .env, который мы будем заполнять учетными данными MySQL. Мы также смонтировали именованный том db-data в каталог /var/lib/mysql в контейнере. Служба MySQL будет использовать внутреннюю сеть для подключения к drupal.

    Друпал Сервис

    Мы используем образ Drupal 10 Alpine. Образы докеров Alpine меньше по размеру. Этот образ также содержит PHP-FPM для обработки PHP. Это будет работать вместе с Nginx для обслуживания сайта. Параметр depends_on сообщает Drupal о необходимости подключения к службе MySQL. Это также гарантирует, что контейнер Drupal всегда будет запускаться после контейнера MySQL. Drupal использует внутреннюю сеть для подключения к MySQL и внешнюю сеть для доступа к другим контейнерам. Мы также создали именованный том для Drupal, чтобы он указывал на каталог /var/www/html в контейнере.

    Сервис Nginx

    Мы используем образ Alpine для Nginx. Он предоставляет хосту порт 80. Мы используем два именованных тома, один для общего каталога Drupals, а другой для хранения SSL-сертификатов Lets Encrypt. Третий том — это привязка к каталогу конфигурации Nginx на хосте, который мы определим позже. Nginx также подключается к внешней сети Docker для работы сайта Drupal.

    Сервис Certbot

    И, наконец, мы загружаем образ Certbot для установки SSL-сертификатов. Он делится своими томами со службой Nginx для сертификатов и определения веб-рута. Мы также включили команду, которая будет выполняться при создании контейнера. Здесь команда использует флаг --staging, чтобы получить тестовый сервер в первый раз. Нам нужен nginx для проверки сертификатов, но Nginx не запустится, если сертификаты отсутствуют. Вот почему мы создадим промежуточный сертификат, используем его для запуска Nginx, а затем создадим настоящие сертификаты.

    Шаг 4 — Создайте конфигурацию Nginx

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

    $ mkdir nginx-conf
    

    Создайте и откройте файл для Nginx.

    $ nano nginx-conf/drupal.conf
    

    Вставьте в него следующий код.

    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;
        }
    }
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    В этот файл мы добавим блок сервера с директивами для имени нашего сервера и корня документа, а также блоки местоположения, чтобы направить запрос клиента Certbot на сертификаты, обработку PHP и запросы статических ресурсов. На данный момент Nginx будет прослушивать только порт 80, чтобы Certbot мог запросить промежуточный сертификат, поместив временный файл в /var/www/html/.well-known/acme-challenge для проверки DNS. Это позволяет нам использовать Certbot с плагином webroot.

    Шаг 5 — Сгенерируйте SSL-сертификаты

    Для генерации SSL-сертификатов мы запустим наши контейнеры. Правильные промежуточные сертификаты будут доступны в папке /etc/letsencrypt/live в контейнере Nginx.

    $ docker compose up -d
    

    Проверьте статус услуг.

    $ docker compose ps
    NAME                IMAGE                  COMMAND                  SERVICE             CREATED             STATUS                     PORTS
    certbot             certbot/certbot        "certbot certonly --…"   certbot             6 minutes ago       Exited (1) 5 minutes ago
    drupal              drupal:10-fpm-alpine   "docker-php-entrypoi…"   drupal              6 minutes ago       Up 6 minutes               9000/tcp
    mysql               mysql:8.0              "docker-entrypoint.s…"   mysql               6 minutes ago       Up 6 minutes               3306/tcp, 33060/tcp
    webserver           nginx:1.22.1-alpine    "/docker-entrypoint.…"   webserver           6 minutes ago       Up 6 minutes               0.0.0.0:80->80/tcp, :::80->80/tcp
    

    Контейнер Certbot успешно завершает работу после создания сертификата. Проверьте расположение сертификатов в контейнере Nginx.

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

    Вы получите следующий вывод.

    total 16
    drwx------    3 root     root          4096 Jan 17 09:15 .
    drwxr-xr-x    9 root     root          4096 Jan 17 09:15 ..
    -rw-r--r--    1 root     root           740 Jan 17 09:15 README
    drwxr-xr-x    2 root     root          4096 Jan 17 09:15 drupal.example.com
    

    Это подтверждает, что все успешно. Следующим шагом является создание фактических сертификатов.

    Откройте файл docker-compose.yml для редактирования.

    $ nano docker-compose.yml
    

    Замените флаг --staging в разделе службы Certbot на флаг --force-renewal. Это говорит Certbot запросить новые сертификаты для вашего домена. Флаг обновления используется, потому что с этого момента он будет использоваться для обновления сертификатов.

      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  --agree-tos --no-eff-email --staple-ocsp --force-renewal -d drupal.example.com
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Запустите команду docker compose up еще раз, чтобы заново создать контейнер Certbot. Флаг --no-deps указывает Certbot пропустить запуск контейнера webserver, поскольку он уже запущен.

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

    Вы получите следующий вывод.

    [+] Running 1/0
     ? Container certbot  Recreated                                                                                                                                                                             0.1s
    Attaching to certbot
    certbot  | Saving debug log to /var/log/letsencrypt/letsencrypt.log
    certbot  | Account registered.
    certbot  | Renewing an existing certificate for drupal.example.com
    certbot  |
    certbot  | Successfully received certificate.
    certbot  | Certificate is saved at: /etc/letsencrypt/live/drupal.example.com/fullchain.pem
    certbot  | Key is saved at:         /etc/letsencrypt/live/drupal.example.com/privkey.pem
    certbot  | This certificate expires on 2023-04-17.
    certbot  | These files will be updated when the certificate renews.
    certbot  | NEXT STEPS:
    certbot  | - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
    certbot  |
    certbot  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    certbot  | If you like Certbot, please consider supporting our work by:
    certbot  |  * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
    certbot  |  * Donating to EFF:                    https://eff.org/donate-le
    certbot  | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    certbot exited with code 0
    

    Шаг 6. Настройте Nginx для SSL

    Теперь, когда наши сертификаты активны, нам нужно настроить Nginx для их обслуживания и перенаправления HTTP-запросов на HTTPS.

    Остановите сервер Nginx.

    $ docker stop webserver
    

    Создайте новый файл Nginx для конфигурации SSL и откройте его для редактирования.

    $ 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;
    
        # OCSP stapling
        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;
        }
    }
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Блок HTTP указывает расположение подключаемого модуля Certbots webroot и перенаправляет любой HTTP-запрос на HTTPS.

    Следующий шаг — убедиться, что контейнер Nginx прослушивает порт 443. Откройте файл docker-compose.yml для редактирования.

    $ nano docker-compose.yml
    

    В разделе файла Nginx внесите изменения, чтобы открыть 443 и включить SSL, как показано ниже.

      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
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Теперь, когда мы включили и добавили конфигурацию SSL для Nginx, вы можете удалить старый файл конфигурации HTTP.

    $ rm nginx-conf/drupal.conf
    

    Перед перезапуском Nginx нам нужно сгенерировать групповой сертификат Diffie-Hellman, который мы уже настроили выше.

    $ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
    

    Пересоздайте контейнер Nginx.

    $ docker compose up -d --force-recreate --no-deps webserver
    

    Проверьте состояние контейнеров.

    $ docker compose ps
    NAME                IMAGE                  COMMAND                  SERVICE             CREATED             STATUS                   PORTS
    certbot             certbot/certbot        "certbot certonly --…"   certbot             3 hours ago         Exited (0) 3 hours ago
    drupal              drupal:10-fpm-alpine   "docker-php-entrypoi…"   drupal              3 hours ago         Up 3 hours               9000/tcp
    mysql               mysql:8.0              "docker-entrypoint.s…"   mysql               3 hours ago         Up 3 hours               3306/tcp, 33060/tcp
    webserver           nginx:1.22.1-alpine    "/docker-entrypoint.…"   webserver           15 seconds ago      Up 13 seconds            0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp
    

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

    Пришло время запустить веб-установщик Drupal. Откройте URL-адрес https://drupal.example.com в своем браузере, и вы увидите следующий экран.

    Нажмите кнопку Сохранить и продолжить, чтобы перейти на страницу профиля установки.

    Мы будем придерживаться стандартного профиля. Нажмите кнопку Сохранить и продолжить, чтобы перейти на страницу конфигурации базы данных.

    Введите учетные данные базы данных, которые мы использовали в файле среды, разверните раздел «Дополнительные параметры» и введите mysql в качестве хоста базы данных. Это соответствует имени службы MySQL в нашем файле компоновки Docker, с которым Drupal должен будет соединиться.

    Нажмите кнопку Сохранить и продолжить, чтобы продолжить. Drupal начнет установку модулей и тем по умолчанию.

    Далее вы попадете на страницу конфигурации Drupal. Заполните имя сайта, адрес электронной почты, имя пользователя, пароль и региональные настройки. Нажмите кнопку Сохранить и продолжить, когда закончите.

    Наконец, вы попадете в панель инструментов Drupal. Вы можете начать использовать Drupal для создания своего веб-сайта.

    Шаг 8 - Настройте Drupal

    Этот шаг необязателен, но помогает повысить производительность Drupal. Первым шагом является установка уровня изоляции транзакций MySQL. Уровень изоляции транзакций по умолчанию для MySQL, MariaDB и эквивалентных баз данных — «ПОВТОРЯЕМОЕ ЧТЕНИЕ». Этот параметр в Drupal может привести к взаимоблокировкам таблиц, что приведет к тому, что сайт станет очень медленным или вообще не будет отвечать. Рекомендуемый уровень изоляции транзакций для сайтов Drupal — READ COMMITTED.

    Войдите в оболочку SSH контейнера MySQL.

    $ docker exec -it mysql bash
    

    Откройте оболочку MySQL, используя пользователя root.

    bash-4.4# mysql -u root -p
    Enter password:
    

    Выполните следующую команду, чтобы глобально изменить уровень транзакции.

    mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
    

    Выйдите из оболочки MySQL и контейнера, дважды набрав exit.

    Следующим шагом будет указание вашего домена в качестве доверенного хоста для защиты от атак HTTP HOST Header. Для этого нам нужно отредактировать файл /var/www/html/sites/default/settings.php внутри контейнера Drupal. Поскольку мы используем именованный том для файлов Drupal, рекомендуемый способ внесения любых изменений — скопировать файл из контейнера на хост, внести изменения и скопировать его обратно в контейнер. Вы можете сделать это с любым файлом, который вам нужно изменить внутри установки Drupal.

    Скопируйте файл настроек из контейнера на хост.

    $ 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$',
    #];
    

    Раскомментируйте его, удалив знак решетки и добавив свой домен Drupal, как показано ниже.

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

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Снова удалите права на запись.

    $ chmod -w settings.php
    

    Скопируйте файл обратно в контейнер.

    $ docker cp settings.php drupal:/var/www/html/sites/default
    

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

    Мы будем использовать командную строку для резервного копирования базы данных Drupal. Перейдите в каталог Drupal.

    $ cd ~/drupal
    

    Создайте каталог для резервных копий.

    $ mkdir backup-data
    

    Используйте следующую команду для резервного копирования базы данных Drupal. Вас попросят ввести корневой пароль MySQL.

    $ 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
    

    Приведенная выше команда создаст резервную копию SQL в каталоге ~/drupal/backup-data.

    Проверьте содержимое каталога.

    $ ls -al backup-data
    total 6716
    drwxrwxr-x 2 navjot navjot    4096 Jan 19 13:59 .
    drwxrwxr-x 4 navjot navjot    4096 Jan 19 13:35 ..
    -rw-rw-r-- 1 navjot navjot 6868325 Jan 19 13:37 data_19-01-2023_13_36_58.sql
    

    Вы можете увидеть резервную копию базы данных в каталоге. Вы можете восстановить эту базу данных с помощью инструмента phpMyAdmin или с помощью следующей команды.

    $ 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
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Сделайте скрипт исполняемым.

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

    Теперь ваша база данных будет копироваться ежедневно.

    Шаг 10 - Обновите Drupal

    Первым шагом в обновлении Drupal является резервное копирование базы данных Drupal с помощью команды из шага 9.

    Затем переключитесь в каталог.

    $ cd ~/drupal
    

    Остановить контейнеры.

    $ docker compose down
    

    Извлеките последние образы контейнеров.

    $ docker compose pull drupal:10-fpm-alpine
    

    Если вы хотите перейти на следующую основную версию, вам нужно будет соответствующим образом изменить имя образа и просмотреть примечания к выпуску Drupals, чтобы проверить наличие проблем.

    Внесите необходимые изменения в docker-compose.yml, если хотите. Остальные образы можно обновить, изменив их определение в файле компоновки Docker.

    Перезапустите контейнеры Drupal. При этом также будут извлечены последние образы для минорных версий других пакетов.

    $ docker compose up -d
    

    Заключение

    На этом мы завершаем наше руководство по установке Drupal с помощью Docker на сервере Ubuntu 22.04. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.