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

Аватар пользователя karmike karmike 15 апреля в 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 апреля в 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 апреля в 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 апреля в 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 апреля в 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 апреля в 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 апреля в 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 апреля в 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 апреля в 13:13

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

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

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

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

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

Это и сейчас должно работать.
Но конфиг всё равно довольно кривой получается. Smile

Аватар пользователя karmike karmike 29 апреля в 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 там уже прописан правильно.

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