Установка Drupal 9 с помощью Composer на VDS с Ubuntu 16.4

Главные вкладки

Аватар пользователя karmike karmike 15 апреля 2021 в 23:33

Теоретически Composer должен установить Друпал "в два счета", практически уже не первый раз вожусь с этим делом три дня. Да, я не "кодер", я просто юзер, который лезет не в свое дело, но за свой счет. Однако я не один такой; национальная болезнь, начиная с ремонта велосипедов, а потом "Жигулей".
Хотелось бы собрать все проблемы и пути их решения в одном блоге.

Есть много деталей, о которых в инструкциях не пишут. Например, нельзя работать с композером от рута. Нужно создать другого пользователя. А какого? Можно из-под него другие работы на сайте делать? Тогда, наверно, нужно ему sudo дать?
При глобальной установке композера в /usr/local/bin нужно этот путь всем пользователям дать, или только тому, который с композером работает?
Пока создал пользователя для работы с одним из сайтов, дал ему sudo, сделал путь для этого пользователя к дир. /usr/local/bin/composer (где composer.phar лежит). Однако просто composer почему-то не вызывается, только через php composer.phar.

Один из камней преткновения (часто встречается в вопросах) это my_site_name_dir : в случае VDS, на которые можно ставить несколько сайтов, это довольно длинные пути типа /var/www/mysite/data/www/mysite.ru плюс, нужно ли писать в конце /web, в который реально устанавливается Друпал 9?
Хорошо, изучив вопрос можно понять, что web не надо писать; но тут возникают проблемы с конфигом web-сервера.
При прошлой установке Друпал начал работать (экран инсталляции), когда я в конфиге Апача дописал /web в конце DocumentRoot в начале файла, и второй раз в секции VirtualHost.

У меня при всех установках, если все установилось нормально и установка Друпал запускается, почему-то вечно не были созданы дир. files и translations (пришлось их создать и изменить права на 555, потом обратно), не был создан settings.php (ему тоже нужно дать права на запись).

Сейчас (через полгода) при полном обновлении сайта Друпал запускается по ссылке mysite.ru/web/ , все бы хорошо, но misite.ru тоже открывается, показывая все файлы и дир. внутри.

В общем и целом, буду сюда писать о всех проблемах и их исправлении по ходу дела.

Комментарии

Аватар пользователя vlucas vlucas 15 апреля 2021 в 23:53
1

Скачайте файл https://getcomposer.org/download/2.0.12/composer.phar
Положите в /usr/local/bin
Удалите расширение, т.е. чтобы файл назывался composer
выставьте права 755
Всё

Далее запускаете безо всякого sudo из папки где у вас лежит файл composer.json

P.S: https://github.com/drupal/recommended-project

Аватар пользователя bsyomov bsyomov 16 апреля 2021 в 11:52

Вам не надо делать всё из под одного пользователя. Настройки и установку системного софта надо делать от рута, или пользователя, который может им стать, а работы по сайту от другого пользователя, который может не иметь такой возможности. Мало того, если сайтов более одного, хорошо бы, чтобы и пользователи были разные (если мы говорим не о локальной машине для разработки не доступной из извне, там это не обязательно и только создаёт дополнительные сложности).

Далее, чтобы сайт работал правильно, надо чтобы у пользователя от которого запускаются скрипты были права записи в нужные папки. Это можно делать очень разными путями.
Один из простейших вариантов, когда скрипты запускаются от того же пользователя, под которым мы работаем с сайтом. Менять пользователя можно, например, средствами apache-mpm-itk или создавать пуллы php-fpm запускаемые от соответствующего пользователя.
Также вам надо почитать о владельце и правах на файлы в linux, и хорошенько с этим вопросом разобраться. Это необходимая для разработчика информация.

Кстати, Вам не обязательно класть сайты в /var/www/mysite/data/www/mysite.ru, как это делается в некоторых панельках. Часто удобнее работать в домашней папке пользователя /home/user/mysite.ru.

Последняя ваша проблема от неправильной конфигурации webroot, и не понимания разницы между web root и project root. И того, что в стандартной заготовке drupal8|9 это две разных папки.
Web root, в данном случае, лежит уровнем ниже. Это папка web. Она указывается в конфиге веб сервера(например, DocumentRoot в конфиге apache). Для него это корень сайта. А проект начинается папкой выше.

P.S. Ubuntu 16.04 как-то уже сейчас странно разворачивать. Стоит использовать 18.04+.

Аватар пользователя karmike karmike 16 апреля 2021 в 12:50

bsyomov, спасибо.
О пользователях: так и остался непроясненным вопрос, может ли пользователь, работающий с Композером, меть права sudo?
usermod -aG sudo user123?
Подозреваю, что может, потому что Композер у меня на такого пользователя не ругается.

О директориях: структуры типа /var/www/mysite/data/www/mysite.ru создает панель ispmanager у моего хостинга, не знаю, зачем это нужно, но пусть, особо не мешает.

О webroot, это важный вопрос. Он устанавливается, как я понимаю, в трех местах:
- при создании проекта Композером
$ composer create-project drupal/recommended-project /var/www/mysite/data/www/mysite.ru
- в строках DocumentRoot конфигурации Apache для порта 80 и порта 443
Так вот, конфиг Апач создается Композером при создании проекта?

Аватар пользователя bsyomov bsyomov 16 апреля 2021 в 13:03

Я уже писал про sudo, можно, но не нужно, а в продакшене вредно. Есть принцип - всегда надо оставлять минимально необходимый минимум прав и возможностей, необходимый и достаточный для работы. Пользователю который работает с сайтом, просто вообще не нужен sudo. Значит и давать его не надо.

karmike wrote: О директориях: структуры типа /var/www/mysite/data/www/mysite.ru создает панель ispmanager у моего хостинга, не знаю, зачем это нужно, но пусть, особо не мешает.

Если вы пользуетесь панелькой, то ваши конфиги создаёт она, и решает куда класть файлы пользователя. В ней надо создавать собственно пользователей, она умеет работать с itk если настроена правильно. Но теряется гибкость настроек - панелька создаёт свои "компромиссные конфиги на все случаи жизни" которые вам не то, чтобы подходят, придётся менять шаблоны конфигов, или переделывать созданные конфиги. И если у вас своя виртуалка, то вам она не нужна, скорее, и на самом деле - будет больше мешать.

karmike wrote: О webroot, это важный вопрос. Он устанавливается, как я понимаю, в трех местах:
- при создании проекта Композером

Нет, тут указывается как раз project root.

karmike wrote: - в строках DocumentRoot конфигурации Apache для порта 80 и порта 443

А вот тут web root, и т.к. по умолчанию в панели вашей подразумевается, что web root и папка с сайтом это одно и то же, у вас возникает проблема.

karmike wrote: Так вот, конфиг Апач создается Композером при создании проекта?

Нет, композер ничего не знает о вашем веб сервере. Он просто создаёт структуру папок, и кладёт в неё нужное. Конфиг создаётся панелькой, в вашем случае, и он не подходит для Drupal в таком виде без изменений...

Аватар пользователя karmike karmike 16 апреля 2021 в 12:12

Спасибо, продолжу уточнять до победного конца. Потом систематизирую в краткое, но полное, описание процесса.

Итак, Композер устанавливал по инструкции отсюда: getcomposer.org/download/

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

То есть, не с помощью механизма Линукс, а через PHP. Обращаю внимание: проверка хэша там уже вставлена для актуальной версии Композера на тот момент времени; надеюсь, они будут обновлять ее с выпуском новых версий, но из данного сообщения брать ее не стоит.

Этот скрипт (?) установил мне Composer 2.0.12 (проверено Composer -V).
Точно не помню, как я его засунул в usr/local/bin/composer, скорее всего, скопировал SSH клиентом от Bitvise (очень удобная штука, совмещенная с файл-менеджером типа Тотал Коммандера).
Права на файл 755 после установки, без моих действий.
Ошибка, видимо, в том, что в usr/local/bin я создал дир. composer, кроме того, думал, что файлы .phar исполняются только через php интерпретатор.

Итак: перенес composer.phar в usr/local/bin, переименовал в composer, теперь запускается из различных директорий, но только для пользователей, у которых этот путь установлен в $PATH.

Хотя есть возможность установить путь для пользователя user123 следующим образом:
Чтобы пути и alias были постоянные для user123 , в файл /home/user123/.bashrc добавляем строку:

export PATH="$usr/local/bin:$PATH"

Можно также установить там алиасы:

alias composer='/usr/local/bin/Composer/composer.phar'

Аватар пользователя bsyomov bsyomov 16 апреля 2021 в 12:46

Вам просто надо было переименовать composer.phar в composer.

В линуксе(да *nix вообще) исполнение файлов, и выбор интерпретатора, если это скрипт, никак не связано с расширением файла. Ну и расширение и тип файла, это вообще говоря разные вещи. Почитайте вот тут, например, как это работает: https://ru.wikipedia.org/wiki/%D0%A8%D0%B5%D0%B1%D0%B0%D0%BD%D0%B3_(Unix)

Конечно, никакой папки composer не нужно было создавать.

export PATH="$usr/local/bin:$PATH"
Тут явная опечатка. Должно быть /usr/local/bin И обычно, этот путь уже есть в path. Ну и alias не нужен, если файл переименован.

Аватар пользователя karmike karmike 16 апреля 2021 в 13:02

Еще один важный вопрос.
В инструкции www.drupal.org/docs/develop/using-composer/using-composer-to-install-dru... написано:
For Drupal 8 and Drupal 9, use the composer template at drupal/recommended-project. This template ensures Drupal Core dependencies are the exact same version as the official drupal release.
Это ссылка на ГитХаб, где лежат файлы composer.json и composer.lock (наверху есть кнопка выбора версий Друпал).
Видимо, я должен заменить ими те файлы composer.json и composer.lock, которые создает Композер. Или я должен заранее положить их в папку проекта?

Аватар пользователя bsyomov bsyomov 16 апреля 2021 в 13:13

Нет, это делает сам composer как раз, когда в зависимости от того, что ему указано в параметрах create-project. Там же можно указать конкретную версию, если нужно.

Аватар пользователя karmike karmike 16 апреля 2021 в 13:51

bsyomov wrote: Конфиг создаётся панелькой, в вашем случае, и он не подходит для Drupal в таком виде без изменений...

Дык вот, каких изменений? Вряд ли фундаментальных. В первый раз Композером ставил Друпал 8.8, и оказалось достаточно дописать /web к путям DocmentRoot конфига Апач, после чего все работало более полугода.
Сейчас почему-то не работает.

Аватар пользователя karmike karmike 29 апреля 2021 в 0:14

Итак, не знаю, почему, но Друпал установить удалось. Может быть, слишком радикальным путем: перешел на более новую версию Ubuntu (20.04). Возможно, более новый PHP 7.4 который любит Друпал.

Лучшую инструкцию по установке нашел здесь:

В частности, Композеру нужны git и curl, которых в у меня не было. То есть,

sudo apt install php-cli unzip
sudo apt install curl

Далее, создать пользователя (от root работать с Композером настоятельно не рекомендуется)

adduser newuser
usermod -aG sudo newuser # предоставить права su

su newuser # устанавливать Композер не от root

cd ~

curl -sS https://getcomposer.org/installer -o composer-setup.php #загрузит установщик Композера composer-setup.php в дир. пользователя

HASH=`curl -sS https://composer.github.io/installer.sig` # проверить хэш

echo $HASH

php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Installer Checksum (SHA-384) https://composer.github.io/pubkeys.html
756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3
756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3
Вторая строка результат команд:
HASH=`curl -sS https://composer.github.io/installer.sig`
echo $HASH

Устанавливаем Композер с помощью php:

sudo php composer-setup.phar --install-dir=/usr/local/bin --filename=composer
composer create-project drupal/recommended-project /var/www/example/data/www/example.ru

(такая структура директорий на firstvds, чтобы размещать несколько сайтов и служебные файлы в дир. data на одном сервере)
Затем нужно создать базу данных для Друпал и пользователя этой базы с паролем.

Ну, и наконец, можно зайти на свой сайт example.ru для настройки Друпал.

Да, проблемы с тем, что новый Друпал засунут в дир. web относительно корня, решаются автоматически. См. файл конфигурации Апач, DocumentRoot там уже прописан правильно.

Может, что-то забыл, еще посмотрю.

Аватар пользователя karmike karmike 3 ноября 2022 в 14:58
1

Обновлял Друпал с 8.8 до 9.4 с помощью Композера. Сначала Композер написал мне кучу ошибок, потом оказалось, что все просто. Использовал composer check-platform-req , обнаружил кучу недостающих компонент.
ext-dom ext-filter ext-gd ext-mbstring ext-simplexml ext-xml
Установил недостающее:

sudo apt install ext-dom ext-mbstring
sudo apt install php7.4-xml php7.4-gd php7.4-mbstring

и Композер заработал, установил Друпал 9.4.8
(на разных системах может не хватать разного)
Так что просто проверяйте все ли на месте.

Аватар пользователя karmike karmike 16 февраля 2023 в 19:04

Решил перейти на Друпал 10. Много в нем лесов, полей и рек всяких плюшек.
Но нужно ему PHP > 8. Решил сразу поставить 8.2. Получил проблем Beee
Во избежание недоразумений: Друпал ставился на виртуальном сервере хостинга, OS Ubuntu 20.04, Апач 2.4.52, рабочий PHP 7.4.

Подключим альтернативный репозиторий (если еще не подключен):
add-apt-repository ppa:ondrej/php

Обновить приложения:
# apt update -y

Получить лист обновлений:
# apt list --upgradable

Обновить:
# sudo apt upgrade

Установить ПХП:
# sudo apt install php8.2-fpm

Разрешить новый ПХП:
# sudo a2enmod php8.2

Перезагрузить сервер:
# systemctl restart apache2

Активировать ПХП:
# update-alternatives --set php /usr/bin/php8.2
Проверить, что получилось:
# php -ver

Должны увидеть что-то типа (и т.д):
PHP 8.2.1 (cli) (built: Jan 13 2023 10:43:08) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.1, Copyright (c) Zend Technologies
with Zend OPcache v8.2.1, Copyright (c), by Zend Technologies
# systemctl status php8.2-fpm

После чего перестал работать Апач Sad

Поиски в и-нет показали, что это (скорее всего) результат конфликта версий PHP, что и подтвердилось.
Вот где собака порылась:

Делаем:

# cd /etc/apache2/ (не обязательно, если путь прописан)

# l mods-*/php*

Видим состояние установленных ПХП:

mods-available/php7.4.conf mods-available/php8.1.load mods-enabled/php7.4.load@
mods-available/php7.4.load mods-available/php8.2.conf mods-enabled/php8.1.conf@
mods-available/php70.load mods-available/php8.2.load mods-enabled/php8.1.load@
mods-available/php74.load mods-available/php80.load mods-enabled/php8.2.conf@
mods-available/php8.1.conf mods-available/php82.load mods-enabled/php8.2.load@
mods-available/php8.1.conf.dpkg-old mods-enabled/php7.4.conf@

Запрещаем лишние PHP (может, кому-то они нужны, но это уже другой вопрос):
# sudo a2dismod php7.4
Ответ
Module php7.4 disabled.

# sudo a2dismod php8.1
Ответ
Module php8.1 disabled.

Рестарт Апач
# systemctl restart apache2
(не ругается/)

Проверяем Апач:
# sudo systemctl status apache2

После чего Друпал установился с помощю Композера
composer create-project drupal/recommended-project /var/www/www-root/data/www/mysite.ru (это у хостера такая структура директорий).

Но сайт создается в поддир. web, так что пришлось дописать это в конфиге Апач.

Может, Композеру нужно указывать mysite/web ?

P.S. На том же сервере поставлена новая МедиаВики 1.39.1. Вроде, работает. Причем до этого стояла 1.34, почему-то никак не хотел работать WYSWYG редактор, а тут работает.

Аватар пользователя bsyomov bsyomov 19 февраля 2023 в 12:46

Поиски в и-нет показали, что это (скорее всего) результат конфликта версий PHP, что и подтвердилось.

Ну конечно, apache умеет работать только с одной версией mod_php.
Да и вообще, зачем вам apache? Ну и панелька вам не нужна, а только мешает, раз вы ломаете её конфиги таким образом.

Но сайт создается в поддир. web, так что пришлось дописать это в конфиге Апач.

Так и предусмотрено в recommended-project. Ядро и библиотеки выше уровнем, а то, что доступно из браузера в web/.

Может, Композеру нужно указывать mysite/web ?

Тогда корень проекта будет в web/, а webroot будет в web/web, зачем? Smile

Аватар пользователя karmike karmike 14 марта 2023 в 21:18

Вообще-то панель ISP штука довольно удобная для чайников вроде меня; намного проще дописать дир. /web в конфиг, чем делать конфиг ручками, при этом чайник наделает ошибок и будет их двадцать раз исправлять. Через нее можно много чего делать, например, почтовые ящики, сервер останавливать, SSL прикручивать...

Аватар пользователя bsyomov bsyomov 17 марта 2023 в 2:45

Тогда стоит воспользоваться https://docs.ispmanager.com/ispmanager6-lite/template-engine-for-configu..., и создать шаблон конфига для nginx + php-fpm. Заготовку конфига можно взять на сайте nginx: https://www.nginx.com/resources/wiki/start/topics/recipes/drupal/
В общем, немного чтения документации, и можно сделать это правильным образом.

Ну и конфиги, которые делают разные панели, совсем не самые удачные в принципе...

Аватар пользователя gun_dose gun_dose 17 марта 2023 в 10:01

Вообще-то, это легко делается при создании сайта ещё в самом ISPManager. Там есть окошко с папкой, где лежит сайт, просто надо дописать в конце web. И тогда не надо вручную править никакие конфиги.

Аватар пользователя karmike karmike 17 марта 2023 в 13:27

Хотел попробовать, и ваша схема была бы лучше, т.к. я заметил, что после каких-то исправлений (например, изменения объема памяти для APCu, на днях делал) с помощью ISP и перезапуска сервера, он удаляет web в первой записи DocumentRoot конфига Апач. Наверно, где-то помнит исходную установку.
Но вот беда, нету в панели ISP такого окошка.
Там есть:
Основные настройки
Доменное имя* mysite.ru (изменить нельзя, определено в DNS)
Псевдонимы сайта www.mysite.ru (может, сюда можно записать? т.е. mysite.ru/web ? хотя сомневаюсь)
Обработчик PHP
SSL-сертификат mysite.ru_le2 (mysite.ru www.mysite.ru)
IP-адрес* 80.87.xxx.xxx (По умолчанию)

Может быть, указать индексную страницу /web/index.php ?

Аватар пользователя gun_dose gun_dose 17 марта 2023 в 13:31

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

Аватар пользователя bsyomov bsyomov 17 марта 2023 в 17:31

karmike wrote: Наверно, где-то помнит исходную установку.

Нет, просто генерирует заново по своему шаблону конфиг.

karmike wrote: Псевдонимы сайта www.mysite.ru (может, сюда можно записать? т.е. mysite.ru/web ? хотя сомневаюсь)

Нет, конечно.

Ещё раз: Всё неправильно делается.
Либо панелька и жить с её конфигом, ну или свои шаблоны конфигов, делать, если нужно.
Либо без панельки и редактировать уже как угодно конфиги... И это лучшее решение.

Панелька и свободное редактирование конфигов не работает. Точнее, работает до первого же изменения конфига со стороны панели, когда они перестраиваются. Что и произошло.

karmike wrote: Может быть, указать индексную страницу /web/index.php ?

И это тоже не то.

Аватар пользователя karmike karmike 19 марта 2023 в 23:45

В принципе, так. Просто я пробовал дописать web с помощью кнопки "изменить" существующий сайт.
Но там были еще проблемы с базой данных, с какими-то правами (блоки правлю, а они не видны), сайт был почти пустой, я его снес и поставил заново.
Так вот, "изменить" в ISP панели не дает приписывать пути, а вот при создании сайта можно писать mysite.ru/web (или что захотите).
Но композеру нужно писать без web, а то еще раз web пропишет...
После этого все (вроде) работает, как положено, и конфиги не нужно править.

Аватар пользователя gun_dose gun_dose 20 марта 2023 в 7:29

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