Сайт упал после обновления CMS: что делать
АйТи Фреш
Серверы и инфраструктура

Как восстановить сайт после неудачного обновления CMS

Автор: , директор ООО «АйТи-Фреш» · · ~13 мин чтения
Схема безопасного восстановления сайта после обновления CMS
Сначала найдите безопасную точку возврата

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

1. Зафиксируйте симптом и остановите изменения

Я начинаю не с перезапуска и не с команды из случайной инструкции. Фиксирую точное время обновления, адрес страницы, текст ошибки, кто и что запускал, менялись ли в тот же момент PHP, плагины, тема, конфигурация или база. Проверяю сайт снаружи и изнутри: открывается ли главная, доступна ли административная часть, одинаков ли сбой для разных страниц. Ответ 500 говорит о внутренней ошибке обработки, 502 обычно означает проблему связи прокси с приложением, но один код не называет виновника. Он задаёт направление поиска, а не диагноз. Скриншот и строка журнала в минуту сбоя полезнее, чем фраза «всё сломалось после обновления».

До выяснения причин я ставлю новые обновления и автоматические задания на паузу, если они продолжают менять файлы или данные. Не делаю повторный запуск установщика «на удачу»: некоторые обновления повторно применяют миграции, а некоторые инструменты при неудаче оставляют систему в промежуточном состоянии. Записываю, какие действия уже выполнены, и сохраняю доступные логи и текущий снимок состояния. Это не бюрократия, а способ не потерять след. Если у сайта есть заказы, заявки или редакторские правки, отдельно выясняю, продолжают ли они поступать и где хранятся. При необходимости показываю посетителям согласованное сообщение о временных работах, используя штатный режим именно этой CMS или настройки хостинга.

В студии «Терра-Плюс» для разбора беру ровно те данные, которые есть: отметку времени, адрес ошибки и историю релиза. Это условная иллюстрация метода, не отчёт о реальном клиентском инциденте. Если журналы не показывают причину, я не объявляю обновление виновным только потому, что оно было последним действием. Причиной может оказаться несовместимость расширения, неудачная миграция, права на файлы, исчерпанное место или недоступная служба. Сначала связываю симптом с конкретным изменением, затем выбираю возврат или исправление. Поспешный перезапуск иногда просто стирает полезный контекст и добавляет ещё один сбой в хронологию.

Код ответа помогает искать причину, но сам её не доказывает.
Дерево первичной диагностики сайта после обновления CMS
Сначала зафиксируйте симптомы и изменения

2. Найдите причину в журналах и составе релиза

Сопоставляю журнал веб-сервера, приложения и базы данных за узкий интервал вокруг сбоя. Имена вроде error.log и php-fpm.log встречаются часто, но это не обязательные имена файлов: расположение и способ сбора журналов зависят от конфигурации, контейнера и панели хостинга. В Nginx путь к журналу задаётся конфигурацией; значит, искать файл по одному привычному пути и объявлять его отсутствующим — плохой способ диагностики. В панели или системе журналирования найдите сообщения именно нужного сайта и процесса. Сверяйте первую ошибку после релиза, а не последнюю строку после серии повторных запросов: последующие ошибки часто лишь следствие исходной.

Дальше проверяю, что именно поменялось: версия CMS, расширения и темы, файлы зависимостей, версия интерпретатора, настройки окружения, схема БД. Для ошибки «Class not found» возможен разрыв между кодом и установленными зависимостями, но вывод «всегда сломан автозагрузчик» слишком смелый. Сначала убеждаюсь, что нужный пакет есть в согласованном lock-файле и установлен в целевом окружении. В проектах на Composer команда install читает composer.json и, если есть composer.lock, устанавливает зафиксированные версии; флаг --no-dev лишь пропускает зависимости для разработки. Поэтому запускать composer install --no-dev вслепую на любой CMS не нужно: она может вообще не использовать Composer, а проект с другой конфигурацией получит иной результат.

Ошибка после обновления — повод проверить совместимость, а не доказательство того, что CMS целиком повреждена. В базе знаний отмечена ошибка 500 из-за обновления и конфликтов расширений; это полезная гипотеза, но не универсальный диагноз. Я сравниваю журналы до и после изменения, проверяю требования CMS к версии PHP и смотрю, какие расширения фактически загружены. Системные команды зависят от дистрибутива и способа установки: имя службы может включать номер версии PHP или отличаться в контейнере. Поэтому сначала определяю среду, а затем проверяю состояние соответствующего процесса. Перезапуск Nginx и PHP-FPM парой команд без такой проверки — лотерея с правами администратора.

Если подозрение падает на базу, выясняю, дошёл ли релиз до миграции и завершилась ли она. Сохраняю текущую базу до любых попыток отката и не выполняю миграцию «назад» только потому, что она есть в инструкции фреймворка. Команда php artisan migrate:pretend относится к Laravel и не является общей командой диагностики CMS; даже для проекта на Laravel результат нужно оценивать с учётом его миграций и версии. У WordPress, Drupal, MODX, OpenCart и собственного приложения разные механизмы обновления. Смешивать их команды в одном рецепте — быстрый путь получить новую проблему поверх старой.

Ни имя журнала, ни имя службы не универсальны.

3. Выберите безопасный способ отката

Перед восстановлением выясняю, что содержит резервная копия, когда её сделали и проверяли ли восстановление. Полезная копия — это не просто архив с названием backup: в ней должны быть нужные файлы, база данных и конфигурация, а у команды должна быть понятная инструкция восстановления. Такой состав подтверждает и экспертная база. Для динамического сайта отдельно оцениваю, какие данные появились после времени копии: новые заявки, заказы, комментарии, правки. Полный возврат старой базы может вернуть страницы, но одновременно удалить свежие записи. Если есть риск потери данных, сначала сохраняю текущую базу и согласую допустимую точку восстановления.

Восстановление выбираю по архитектуре сайта. Иногда достаточно вернуть предыдущую версию кода и зависимостей, оставив базу на текущем состоянии; иногда необходима согласованная копия и файлов, и базы. Это не решение по названию CMS в заголовке — проверяю требования конкретного релиза и последовательность миграций. Для SQL-дампа MySQL официальный клиент может прочитать файл через перенаправление ввода, но синтаксис команды ещё не означает, что выбран правильный сервер, схема и снимок. Если база работает в контейнере, через панель или на другом движке, процедура будет другой. Перед импортом проверяю адрес, имя базы и резервную копию текущего состояния; восстановление поверх действующих данных без этой проверки недопустимо.

С файлами та же дисциплина: определяю корневую директорию проекта по фактической конфигурации, а не подставляю /var/www/example из чужой статьи. Проверяю владельца, права, символические ссылки и пользовательские загрузки, которые могли храниться отдельно от кода. Если обновление было частичным, архивирование всего каталога поверх текущего может оставить лишние новые файлы. Способ замены зависит от CMS и процесса публикации: релизные каталоги, контейнерный образ, панель хостинга или ручная выкладка требуют разных шагов. До замены готовлю план возврата к текущему состоянию и проверяю, что копия доступна, читается и не лежит на том же отказавшем носителе.

Отдельно проверяю режим обслуживания. Файл .maintenance — механизм WordPress, а не общий переключатель для всех CMS; в WordPress он создаётся в корневой папке сайта и учитывается ограниченное время. Ручное создание пустого файла может не дать ожидаемого эффекта. Для другой CMS ищу штатный способ включить страницу обслуживания или использую настройку балансировщика/веб-сервера, согласованную с владельцем сайта. После восстановления режим отключаю только в подходящей системе и только когда проверил доступ посетителей и редакторов. На этом шаге мелкая путаница особенно дорога: сайт вроде бы восстановлен, но всё ещё отдаёт заглушку или блокирует административную работу.

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

4. Проверьте сайт до возвращения посетителей

После отката проверяю не только главную страницу. Открываю несколько типовых страниц, административную часть, поиск, формы, авторизацию, загрузку файлов и интеграции, которые критичны для работы компании. Для магазина добавляю корзину и тестовый сценарий заказа, не создавая реальную оплату; для сайта с заявками проверяю, что форма сохраняет запись и отправляет уведомление. Сверяю свежие записи с сохранённой точкой восстановления и отдельно убеждаюсь, что права редакторов не изменились. Проверка должна отвечать на практический вопрос: может ли пользователь выполнить основное действие, ради которого сайт существует? Ответ HTTP 200 у главной страницы этого не доказывает.

Проверяю ошибки в журналах уже после тестовых запросов, чтобы увидеть новые сбои, а не только старую историю. Смотрю, нет ли повторяющихся ошибок приложения, запросов к отсутствующим таблицам, отказов в записи файлов и проблем с внешними сервисами. Если после восстановления изменились DNS, сертификат, конфигурация прокси или кеширующий слой, проверяю их отдельно. Команда openssl s_client может помочь исследовать TLS-соединение, но она не проверяет CMS, формы и корректность сертификата для всех клиентов целиком. Точно так же curl -I показывает заголовки ответа на запрос, но не проходит по пользовательскому сценарию и не гарантирует, что данные записались.

Затем проверяю расписание фоновых заданий и интеграций. У WordPress, Laravel и других систем разные способы запуска задач; искать буквальную строку schedule:run в crontab любого сервера бессмысленно. Сверяюсь с конфигурацией проекта: какое задание запускается, от какого пользователя, с каким интервалом, куда пишет результат и как понять, что оно завершилось успешно. Если обновление меняло конфигурацию, проверяю её штатным способом перед перезапуском процессов. Никакой сервис не перезапускаю «для чистоты»: сначала выясняю, какой компонент затронут и что именно должна исправить операция. Перезапуск без гипотезы иногда добавляет простой, а полезных сведений не приносит.

Перед снятием заглушки прошу ответственного проверить контент и ключевой сценарий со своей стороны. Записываю время, на которое восстановлены данные, перечень применённых действий и оставшиеся ограничения. Если копия старше последних заявок или заказов, это проговаривается до включения трафика, а не прячется в техническом отчёте. После согласования возвращаю штатный режим работы и продолжаю наблюдение за журналами и поступлением данных. В базе знаний отдельно отмечены диагностика файлов, базы и CMS, а также проверка функций после восстановления. Это верный порядок: «страница открылась» — начало проверки, не её финал.

Проверяйте рабочий сценарий, а не только главную страницу.

5. Подготовьте обновления к следующему выпуску

После восстановления разбираю причину и фиксирую её в коротком отчёте: что обновляли, что упало, какая запись в журнале оказалась первой, какая копия использована, что пришлось повторить вручную и какие данные затронуты. Это не поиск виноватого. Мне нужно превратить аварию в понятный набор действий для следующего релиза. Если проблему вызвало расширение, отмечаю совместимую версию и владельца обновления; если миграция, записываю требуемый порядок и способ проверки; если конфигурация — сохраняю её эталон. Без этой записи через месяц команда повторит тот же эксперимент, только с менее свежей копией.

Проверяю, можно ли безопасно испытать выпуск на отдельной копии сайта. Staging должен отражать важные зависимости рабочего окружения, но не должен отправлять настоящие письма, проводить оплату или подключаться к боевым интеграциям без необходимости. Для проверки беру обезличенные либо тестовые данные, закрываю копию от индексации и назначаю ответственного за итог. Прогоняю обновление, проверяю журналы и основные пользовательские сценарии, а затем документирую возврат к прежнему выпуску. Экспертная база поддерживает предварительное тестирование критичных обновлений в staging; это практическая страховка от несовместимых расширений, а не гарантия нулевого риска.

Резервную копию делаю перед изменением и проверяю восстановление регулярно. Само сообщение «задание выполнено» ещё не доказывает, что архив читается, база цела и конфигурация найдётся при аварии. Тестовое восстановление на отдельной среде показывает, сколько занимает процесс и какие шаги забыли записать. Копия должна быть доступна, защищена от случайного удаления и отделена от основного отказа настолько, насколько позволяют ресурсы компании. Небольшому сайту обычно не нужна сложная корпоративная платформа, но ему нужна ясная схема: что копируется, куда, как часто, кто получает сигнал о сбое и кто имеет право начать восстановление.

В условном примере со студией «Терра-Плюс» итогом разбора становится не обещание «откатываем за четверть часа», а проверяемый план: перечень компонентов релиза, резервная копия файлов и базы, инструкция возврата и тест восстановления. Срок аварийных работ зависит от размера данных, причины сбоя, доступности копии и способа публикации; честно назвать его можно после первичной диагностики. Перед выпуском согласуйте окно работ, владельца решения и критерий успеха. После него наблюдайте за сайтом и проверяйте свежие записи. Бэкап, который никто не восстанавливал, — надежда в формате архива. Короткая проверка снимает часть этой магии.

Пробное восстановление выявляет пробелы до аварии.
Чеклист подготовки обновления и восстановления CMS
Проверьте копию до следующего релиза

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

Сайт выдаёт ошибку после обновления — что проверить сначала?

Зафиксируйте время сбоя, текст ошибки и последние изменения. Затем сопоставьте их с журналами приложения и веб-сервера.

Можно ли сразу восстановить последнюю копию?

Сначала проверьте дату и состав копии, сохраните текущее состояние и оцените, потеряются ли новые записи.

Подойдёт ли файл .maintenance любой CMS?

Нет. Это механизм WordPress. Для другой CMS используйте её штатный режим обслуживания или настройку веб-сервера.

Нужно ли запускать composer install --no-dev?

Только если проект использует Composer и команда соответствует его процедуре развёртывания. Сначала проверьте composer.lock и документацию проекта.

Как снизить риск следующего сбоя?

Проверяйте обновление на копии сайта, делайте резервную копию файлов и базы и регулярно испытывайте восстановление.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи