Перейти к содержимому

Обновление продукта - подготовка, порядок, откат

Готовим сайт к обновлению платформы, обновляем в правильном порядке и понимаем, что делать при сбое.

Решение

Смотрим текущие версии модулей до обновления:

use Bitrix\Main\ModuleManager;
foreach (ModuleManager::getInstalledModules() as $module) {
printf("%-24s %s\n", $module['ID'], ModuleManager::getVersion($module['ID']));
// версии модулей расходятся: обновление идёт по каждому отдельно
}
// версия ядра main показывает, насколько давно сайт обновлялся
// сторонние решения в этом списке видно по точке в имени модуля

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

Делаем резервную копию и проверяем систему:

Окно терминала
# копия до обновления - единственный путь отката: штатной кнопки нет
/opt/webdir/bin/bx-sites -a backup -s default 2>/dev/null || echo 'копия из админки'
df -h /home/bitrix # место под копию и под распаковку обновлений

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

Обновляем продукт до нужной версии:

// обновления ставятся порциями: система обновлений сама делит их на шаги
// после долгого перерыва порядок такой: ядро, затем остальные модули
printf("текущая версия ядра: %s\n", ModuleManager::getVersion('main'));

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

Проверяем сайт после каждого шага:

Окно терминала
tail -50 /var/log/php-fpm/error.log | grep -iE 'fatal|undefined'
# «Call to undefined method» после обновления - признак старого своего кода
# отвалившийся после установки функционал ищут по этим же строкам журнала

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

Порядок шагов имеет значение. Сначала продукт доводят до версии, поддерживающей нужную ветку PHP, и только потом переключают саму ветку. Обратный порядок оставляет сайт на несовместимой связке, и админка перестаёт открываться раньше, чем удаётся что-либо обновить.

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

Решения из маркетплейса обновляются отдельно от платформы. Обновлённое ядро с устаревшим решением - обычная причина сбоя после обновления, и проверять совместимость нужно до, а не после.

Типичные проблемы

После обновления сайт падает с ошибкой о неизвестном методе.

Свой код или стороннее решение зовёт метод, удалённый в новой версии. Правят код, а не платформу.

Обновление обрывается на середине.

Не хватает места или времени выполнения. Система обновлений продолжит с того же шага после устранения причины.

Сайт не открывается после смены ветки PHP.

Продукт обновлён недостаточно для этой ветки. Сначала доводят версию платформы, потом переключают PHP.

Модули обновились, ядро осталось старым.

Обновление прерывали. Разброс версий модулей виден в списке установленных.

Откатиться не получается.

Резервной копии перед обновлением нет. Штатного отката у системы обновлений не существует.

Частые вопросы

Можно ли обновляться на боевом сайте?

Можно, но лучше сначала на копии: она показывает, какие решения и свой код не переживут обновление. На боевом остаётся повторить уже проверенный путь.

Что делать с сайтом, который не обновлялся пять лет?

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

Нужна ли активная лицензия для обновлений?

Да, обновления приходят по активной подписке на техподдержку. Без неё сайт продолжает работать, но новых версий не получает.

Как понять, что решение из маркетплейса переживёт обновление?

По его странице в каталоге решений: там указаны поддерживаемые версии платформы. При сомнениях проверяют на копии сайта.

Смежное

Первоисточник