Plot: Install drupal 10 website, using composer, to a server, which has incompatible php & mariadb versions. Start value: Centos 7; MariaDB (mysql) v5.#.#; PHP 5.6. We need to enable php 8.2, to begin with. (Automatic method – REMI repository) Code: yum-config-manager –disable ‘remi-php*’ yum-config-manager –enable remi-safe yum -y install php82 yum install php82-php-{cli,fpm,mysqlnd,zip,devel,gd,mbstring,curl,xml,pear,bcmath,json,soap,intl,opcache,pcntl,sockets,sysvsem,sysvshm,mbregex,gd,openssl,Kerberos,zlib,calendar,bz2,webp,jpeg,enchant,freetype,exif,ftp,gettext,mhash,imap,imap-ssl,pcntl,mysqli} php82 -version PHP 8.2.4 (cli) (built: Mar 14 2023 16:11:05) (NTS gcc x86_64) Copyright (c) The PHP Group Zend Engine v4.2.4, Copyright (c) Zend Technologies with Zend OPcache v8.2.4, Copyright (c), by Zend Technologies php82 -modules - to list all enabled modules. systemctl enable php82-php-fpm systemctl start php82-php-fpm Enabling some useful extensions. 1) compiling it Expand: ImageMagick yum install ImageMagick-devel cd /usr/local/src/ mkdir php82-build cd php82-build wget https://pecl.php.net/get/imagick-3.7.0.tgz tar xzvf imagick-3.7.0.tgz cd imagick-3.7.0 /opt/remi/php82/root/usr/bin/phpize ./configure --with-php-config=/opt/remi/php82/root/usr/bin/php-config make make test make install /opt/remi/php82/root/usr/bin/php -i | grep "magick" 2) automatically Expand: Memcached yum install php82-php-pear /opt/remi/php82/root/usr/bin/pecl -C /etc/opt/remi/php82/pear.conf update-channels /opt/remi/php82/root/usr/bin/pecl -C /etc/opt/remi/php82/pear.conf install igbinary yum install php82-php-pecl-libmemcached yum install php82-php-pecl-msgpack /opt/remi/php82/root/usr/bin/pecl -C /etc/opt/remi/php82/pear.conf install memcached Code: yum install php82-php-{apcu,uploadprogress} Hope, you read ISP Config 3 handbook and know, how to assign a multiple php record from the dashboard. Update MariaDB to the version 10.3 - https://forum.howtoforge.com/thread...te-of-mariadb-from-5-to-10.90349/#post-444673 Install Composer for php 8.2 Code: cd /tmp php82 -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php82 -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php82 composer-setup.php --2.5 --install-dir=/usr/local/bin --filename=composer82 composer82 - Composer (version 2.5.4) successfully installed to: /usr/local/bin/composer82 with php 8.2 There is also possible to add alias through .bashrc: But be careful to not break a configuration! Next step - to run composer properly! Generally, i am writing these tips, because the Composer is a real headache. When we created a namespace for future website (domain#1 for client#0), new linux user was also added: Code: web1:x:5004:5005::/var/www/websites/client0/domain1:/bin/false But we are unable to switch for the user web1. To achieve this, from the control panel of ISP Config new shell-user should be created. https://forum.howtoforge.com/threads/understanding-permisions.90371/#post-444831 A new record will be looking like: For developers (@Th0m ) - i wish it would be named not as default###, but some more decent way [CLIENTNAME] -> better equivalent. Then we are ready to install drupal 10 website via composer. Code: cd /var/www/websites/client0/domain1/{subdomain_folder} Code: ls -a Code: rm -rf standard_index.html robots.txt favicon.ico su defaultdrupal Code: php82 /usr/local/bin/composer82 create-project drupal/recommended-project:10.0.5 ./ Unfortunately, composer doesn't handle non-empty directories. And if we remove error & stats, things are not smoothed down. Choose any folder, create project and look inside php82 /usr/local/bin/composer82 create-project drupal/recommended-project:10.0.5 ./d10 Inside of d10 directory we have the web folder. It means, the drupal system will be run from index.php, placed in d10/web. Let's remove interstitial d10-folder: Code: mv d10/* ./ ls composer.json composer.lock d10 error stats vendor web Code: ls -la d10 -rw-r--r--. 1 web1 client0 357 Mar 21 23:46 .editorconfig -rw-r--r--. 1 web1 client0 4034 Mar 21 23:46 .gitattributes cp d10/{.editorconfig,.gitattributes} ./ rm -rf d10 But still drupal-system is managed from web. For such an occasion, we must create redirect-ruleю Thanks to unbelievable free ISP Config 3 system and its' Makers, this is very easy to do: after setting up database... we can see on the page /admin/reports/status#error some issues: Trusted Host Settings - Not enabled; Database Isolation Level - REPEATABLE-READ. HOW TO FIX: Trusted Host Settings Database Isolation Level !!! very important to set READ-COMMITTED or mysql server will say bye-bye!!! Enabling Drush for Drupal 10 cd /var/www/websites/client0/domain1/{your_folder} php82 /usr/local/bin/composer82 require drush/drush Expand: php82 ./vendor/bin/drush status Drupal version : 10.0.5 Site URI : http://default DB driver : mysql DB hostname : localhost DB port : 3306 DB username : {db_user} DB name : {db_name} Database : Connected Drupal bootstrap : Successful Default theme : olivero Admin theme : claro PHP binary : /opt/remi/php82/root/usr/bin/php PHP config : /etc/opt/remi/php82/php.ini PHP OS : Linux PHP version : 8.2.4 Drush script : /var/www/websites/client0/domain1/{your_folder}/vendor/bin/drush Drush version : 11.5.1 Drush temp : /tmp Drush configs : /var/www/websites/client0/domain1/{your_folder}/vendor/drush/drush/drush.yml Install profile : standard Drupal root : /var/www/websites/client0/domain1/{your_folder}/web Site path : sites/default Files, Public : sites/default/files Files, Temp : /tmp Modules' setup In case, we want to install Mobile Detect module, then we visit page https://www.drupal.org/project/mobile_detect Look at the installation path: composer require 'drupal/mobile_detect:^3.0' Follow to drupal 10 folder: cd /var/www/websites/client0/domain1/{your_folder} Code: php82 /usr/local/bin/composer82 require 'drupal/mobile_detect:^3.0' But where was it installed? Code: find ./ -type d -name mobile_detect ./web/modules/contrib/mobile_detect Why did it happen, that directory was placed namely on there? It did happen due to several circumstances: Code: cd ./web/modules/contrib/mobile_detect && cat composer.json | grep type Type of the module is drupal-module. Definitely, it is a drupal module, what else? - let's make some steps backward and take a look what is written to $app_root . '/.composer.json' HTML: "type": "project", "type": "composer", "type:drupal-core" "type:drupal-library" "type:drupal-module" "type:drupal-profile" "type:drupal-theme" "type:drupal-drush" "type:drupal-custom-module" "type:drupal-custom-profile" "type:drupal-custom-theme" HTML: ... "web/modules/contrib/{$name}": [ "type:drupal-module" ], "web/modules/custom/{$name}": [ "type:drupal-custom-module" ], ... Upon enabling modules - /admin/modules - it responds with error: I have very poor programming skill. Can't fix it with code. To avoid, instead of [L] redirecting rule we need use [R,L] But /web/ intermediate path becomes visible. Okay, we are done..! P.S.: i believe, this tutorial page will be often visited.