Обновляем PHP, drupal, nextcloud

Привет друзья!

Время от времени приходится кардинально обновлять софт сервера чтобы пользоваться современными плюшками.
Каждое такое обновление вызывает вопросы (мягко говорря)))

Вот и у меня настал период, когда пора бы обновиться, серьезно так))

На моём сервере под управлением Ubuntu 20.4 крутиться умный дом MajorDoMo, семейное облако NextCloud и веб сервер на Drupal.
Первые два всегда обновляются, а вот последний крайне редко, так как держится ради "чтобы-был".
После последнего обновления NextCloud на версию 25.х.х появилось сообщение что я редиска и не дорожу всем тем, что сообщество
приготовило для меня и моей семьи и вообще... Словом, мне срочно нужно обновить php с 7.4 на 8.х и тогда меня простят
и будет всем счастье))) yes
Дело конечно хорошее, но...
Ох уж это НО. ))
на форуме где-то, когда-то, проскальзывало что возникают у ребят проблемы как с переходом на ubuntu 22, так и с переходом на php8
Проблемка может возникнуть. У меня всё стоит на реальном компе который выделен для сервера и в случае неприятного update может лечь всё.
Но руки чешутся, а глаза горят ))) devil

Ох уж это длинное пустословие называемое вступлением )))

И так, приступим.

1. Делаем бакапы всех www и их баз.
Я делаю бакап сразу в свою домашнюю папку, чтобы можно было сразу забрать по sftp на рабочий комп. На сервере я не храню бакапы.
Сливаю базы от имени супера, так как один пароль запомнить легче, чем кучу.

 mysqldump --opt -uroot -p drupal > /home/rediska/drupal_backup_`date +%Y.%m.%d_%H_%M`.sql
 mysqldump --opt -uroot -p nextclud > /home/rediska/nextclud_backup_`date +%Y.%m.%d_%H_%M`.sql
 mysqldump --opt -uroot -p majordom > /home/rediska/majordom_backup_`date +%Y.%m.%d_%H_%M`.sql

Бакапим папки каждого www по отдельности. Можно один общий архив сделать, но тогда если потребуется восстановить один из www, ждать пока архив откроется, придется в разы дольше.

 tar -czf /home/rediska//drupal_backup_`date +%Y.%m.%d_%H_%M`.tar.gz /var/www/drupal
 tar -czf /home/rediska//nextclud_backup_`date +%Y.%m.%d_%H_%M`.tar.gz /var/www/nextclud
 tar -czf /home/rediska//majordom_backup_`date +%Y.%m.%d_%H_%M`.tar.gz /var/www/majordom

2. Забираем все созданные бакапы (у меня их 6) на свой рабочий компьютер.

У кого сервер крутиться на виртуалке, этого делать не обязательно, проще сделать бакап самой виртуальной машины. Снапшоты делать не желательно
Чем больше снапшотов, тем хуже работает.

 

3. Обновляем NextCloud до последней версий или до версий которые поддерживают php8.2. На момент обновления это 25.0.3
    На ошибки в настройках сервера не обращаем внимание, после устраним.

4. Обновление всех модулей и тем Drupal. Без этого будут ошибки. 
    У меня стоит Drupal 8.18. Последняя версия 10.0.2. Сразу перейти на неё нельзя, надо через 9х. Возьмем крайнюю, 9.5.2

Пример ошибок если не обновить все модули и темы
Пример ошибок если не обновить все модули и темы

 

5. Обновляем php7.4 до 8.2

Добавляем репозиторий

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

Устанавливаем php8.2 и необходимые компоненты

sudo apt install php8.2-common -y
sudo apt install php8.2-cli -y
sudo apt install -y php8.2-{imap,intl,ldap,mbstring,mysql,opcache,pspell,readline,soap,xml}
sudo apt install -y php8.2-{apcu,redis,cgi,curl,gd,zip}
sudo apt-get install -y php8.2-pcov php8.2-xdebug 
sudo apt install php8.2-fpm -y
sudo apt install libapache2-mod-php8.2 -y

Подготавливаем apache2 к работе с php8.2

a2dismod php7.4
a2enmod php8.2
a2enconf php8.2-fpm
a2enmod proxy_fcgi setenvif
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime
a2enmod setenvif
a2enmod ssl

service apache2 restart

Мы обновили php до последней версии, на момент написания статьи это 8.2.1 Для проверки версии и установленных модулей можно воспользоваться командами:

php -v
php -m

 

6. Drupal. Удаляем каталоги (папки) core, vendor и все файлы в корне кроме web.config

 // предположим что Drupal установлен в
 // /var/www/drupal/

 // удаляем каталоги core и vendor
rm -r /var/www/drupal/core
rm -r /var/www/drupal/vendor
 // копируем config-и в папку ./root, они нам понадобится
cp -p /var/www/drupal/web.config ~/
cp -p /var/www/drupal/sites/default/settings.php ~/
 // удаляем все файлы в корневой папке drupal
rm -f /var/www/drupal/*

 

7. Скачиваем последнюю редакцию 9 версии Drupal. На день выхода статьи это 9.5.2 и копируем в корневую папку где у нас Drupal

 // переходим в папку ./root, будем использовать её как временную (temp)
cd ~ root
 // скачиваем последний релиз drupal из ветки 9.х
wget https://ftp.drupal.org/files/projects/drupal-9.5.2.tar.gz
 // распаковываем
tar xvf drupal-9.5.2.tar.gz
 // удаляем скаченный архив
rm -f drupal*.tar.gz
 // переносим распакованный drupal в /var/www/drupal
sudo mv drupal-*/ /var/www/drupal
 // возвращаем один файл на место
cp -p ~/web.config /var/www/drupal/
 // удаляем его в папке ./root он нам больше не нужен
rm -f ~/web.config

 

8. Подготовка к запуску обновления Drupal
открываем конфигурационный файл нового Drupal и приводим к соответствию со старым, который мы скопировали в ./root/settings.php

nano /var/www/drupal/sites/default/settings.php

Основные параметры без которых drupal не запустится:

 // В этой переменной указан хэш (ключ) к доступу содержимого старого drupal.
 // без него все старые материалы сайта будут утрачены

$settings['hash_salt'] = '8ptMky5rQ4saMAie7nMw0qU_nX2ADfxBd58h1_MnnWG6-2zB0-HdyAED-wzRl4Xsp8wgnhR8z1';

 // Доступ и тип БД старого Drupal

$databases['default']['default'] = array (
  'database' => 'drupal',
  'username' => 'userdrupal',
  'password' => 'passworddrupal',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
);
$settings['config_sync_directory'] = 'sites/default/files/config_Uev69eEU6-BTQZskfULeJ_dG-CS8umqZrHmxkqRWOiHYLUUJ27

 // Разрешение, с каких хостов можно производить подключение
$settings['trusted_host_patterns'] = [
'^localhost$',
'^127\.0\.0\.1$',
'^www.v-elite\.ru$',
];

 

9. Запуск Drupal

Запускаем обновление.

https://ваш домен/update.php

По завершению наш drupal готов к работе. Не забудьте перевести его из режима обслуживания в рабочий. Проверьте и при необходимости обновите модули, темы. 

10. Исправление возможных ошибок после обновления NextCloud

На сайте nextloud написано что версия php8.2 поддерживается. После обновления php стала 8.2.1 Не знаю кто из ребят кушал на клавиатуре,
но мы получим сообщение о том что наш комп не достоин внимания nextloud

next02
открываем файл проверки versioncheck.php и редактируем условия для php8.2 исправляя на 8.3

nano /var/www/nextclod/lib/versioncheck.php

Было 

next03
стало после редактирования

next04
Обновляем страницу и получаем доступ ))

 

В процессе написания статьи, я несколько раз возвращала систему к исходному началу и в какой-то момент после внесенных изменений у меня слетела версия 25.0.3, став неожиданно 25.0.2 и вылезли ошибки контроля целостности файлов 

next05
Данная ошибка не позволяет обновить nextloud.
Для устранения делаем следующее:
Запускаем сканирование файловой системы

sudo -u www-data php /var/www/nextclod/occ integrity:check-core

Появятся ошибки указывающие в каких файлах изменился хэш.
next06
Открываем второй терминал, для удобства, в нем вызываем файл в котором хранятся эталонные хэш и заменяем на новые.

nano /var/www/nextclod/core/signature.json

Перезапускаем Апач (www сервер)

service apache2 restart

Проверяем на ошибки

sudo -u www-data php /var/www/nextclod/occ integrity:check-core

Ошибок нет.
Обновляем nextcloud.
Заходим в настройки, смотрим какие есть ошибки.
next07

Ошибка "Разрешённое максимальное значение использования памяти PHP ниже рекомендуемого значения в 512 МБ."
исправляется просто, увеличением лимита до 512 в переменной memory_limit

sudo nano /etc/php/8.2/fpm/php.ini

next08
перезапускаем сервис

sudo systemctl restart php8.2-fpm

 

Ошибка "Для создания значка favicon приложением «Оформления» необходимо установить и активировать модуль «imagic» подсистемы PHP."

sudo apt-get install -y php8.2-imagic
sudo systemctl restart php8.2-fpm

 

Ошибка "Модули «gmp» и / или «bcmath» подсистемы PHP не активированы. Эти модули необходимы при использовании аутентификации без пароля WebAuth."
Ставим оба модуля

sudo apt-get install -y php8.2-gmp
sudo apt-get install -y php8.2-bcmath
sudo systemctl restart php8.2-fpm

 

Ошибка "Веб-сервер не настроен должным образом для разрешения «/.well-known/webfinger»"

nano /var/www/nextcloud/.htaccess

 В раздел <IfModule mod_rewrite.c>
добавляем 2 строки

  RewriteRule ^\.well-known/webfinger /nextcloud/index.php/.well-known/webfinger [R=301,L]
  RewriteRule ^\.well-known/nodeinfo /nextcloud/index.php/.well-known/nodeinfo [R=301,L]

next09

Ошибка "Буфер интернированных строк OPcache почти заполнен. Чтобы гарантировать, что повторяющиеся строки могут быть эффективно кэшированы, рекомендуется применить opcache.interned_strings_bufferк вашей конфигурации PHP значение выше 8."

nano /etc/php/8.2/mods-available/opcache.ini

Добавляем

opcache.memory_consumption=256
opcache.interned_strings_buffer=128

Закрываем файл, перезапускаем сервис fpm

sudo systemctl restart php8.2-fpm

На этом всё. Мы обновили php с версии 7 на версию 8. Обновили Drupal до крайней версии 9ой ветки. Десятую ставить не стала, мне кажется сырая она еще, да и не все модули которыми я пользуюсь есть в 10ой. Так же немного разобрались как бороться с некоторыми ошибками в NextCloud.

В самом начале я сказала что на одном компьютере под управлением одной системы (ubuntu 20.4) на одном веб сервере apache2 у меня работают три разных веб сервера. Мы разобрали два из них и ни слова не было сказано про третий - умный дом MajorDoMo. Говорить нечего, сервер прекрасно работает на php8.2 

Всем хорошего настроения и до встреч!

Бонус. Возврат на php7.4 и Drupal который стоял до обновления.

 // Удаляем php8.2 и все его модули
sudo apt purge '^php8.2.*'

 // Устанавливаем php7.4
sudo apt install php7.4-common -y
sudo apt install php7.4-cli -y
sudo apt install php7.4-apcu php7.4-redis php7.4-cgi php7.4-curl php7.4-gd php7.4-imap php7.4-intl php7.4-json php7.4-ldap php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-pspell php7.4-readline php7.4-soap php7.4-xml
sudo apt install php7.4-pcov php7.4-xdebug
sudo apt install php7.4-fpm -y
sudo apt install libapache2-mod-php8.2 -y

// Настраиваем apache2 для работы с php7.4
a2dismod php8.2
a2enmod php7.4
a2enconf php7.4-fpm
a2enmod proxy_fcgi setenvif
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime
a2enmod setenvif
 // перезапускаем apache2
service apache2 restart

 // Обновляем ДБ drupal из созданного бакапа перед обновлением
 // drupal - имя БД вашего drupal
 // drupal8.sql - имя созданного бакапа
mysql -uroot -p drupal <  drupal8.sql
 // перезапускаем apache2
service apache2 restart

 // открываем ранее созданный бакап drupal_backup_`date +%Y.%m.%d_%H_%M`.tar.gz
 // например через mc и копируем всё содержимое поверх того что есть с сохранением привилегий
 // проверяем https:// ваш домен
 // должно работать)
sudo shutdown -r now

 

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer