Привет друзья!
Время от времени приходится кардинально обновлять софт сервера чтобы пользоваться современными плюшками.
Каждое такое обновление вызывает вопросы (мягко говорря)))
Вот и у меня настал период, когда пора бы обновиться, серьезно так))
На моём сервере под управлением Ubuntu 20.4 крутиться умный дом MajorDoMo, семейное облако NextCloud и веб сервер на Drupal.
Первые два всегда обновляются, а вот последний крайне редко, так как держится ради "чтобы-был".
После последнего обновления NextCloud на версию 25.х.х появилось сообщение что я редиска и не дорожу всем тем, что сообщество
приготовило для меня и моей семьи и вообще... Словом, мне срочно нужно обновить php с 7.4 на 8.х и тогда меня простят
и будет всем счастье))) ![]()
Дело конечно хорошее, но...
Ох уж это НО. ))
на форуме где-то, когда-то, проскальзывало что возникают у ребят проблемы как с переходом на ubuntu 22, так и с переходом на php8
Проблемка может возникнуть. У меня всё стоит на реальном компе который выделен для сервера и в случае неприятного update может лечь всё.
Но руки чешутся, а глаза горят ))) 
Ох уж это длинное пустословие называемое вступлением )))
И так, приступим.
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/majordom2. Забираем все созданные бакапы (у меня их 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

открываем файл проверки versioncheck.php и редактируем условия для php8.2 исправляя на 8.3
nano /var/www/nextclod/lib/versioncheck.phpБыло

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

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

Данная ошибка не позволяет обновить nextloud.
Для устранения делаем следующее:
Запускаем сканирование файловой системы
sudo -u www-data php /var/www/nextclod/occ integrity:check-coreПоявятся ошибки указывающие в каких файлах изменился хэш.

Открываем второй терминал, для удобства, в нем вызываем файл в котором хранятся эталонные хэш и заменяем на новые.
nano /var/www/nextclod/core/signature.jsonПерезапускаем Апач (www сервер)
service apache2 restartПроверяем на ошибки
sudo -u www-data php /var/www/nextclod/occ integrity:check-coreОшибок нет.
Обновляем nextcloud.
Заходим в настройки, смотрим какие есть ошибки.

Ошибка "Разрешённое максимальное значение использования памяти PHP ниже рекомендуемого значения в 512 МБ."
исправляется просто, увеличением лимита до 512 в переменной memory_limit
sudo nano /etc/php/8.2/fpm/php.ini
перезапускаем сервис
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]
Ошибка "Буфер интернированных строк 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
- Войдите, чтобы оставлять комментарии