Выбор Vercel, Railway или Render определяет риск отката
Сравниваем Vercel, Railway и Render для безопасного отката Next.js: превью, миграции, секреты и восстановление после одного сбоя.

Унаследованный SaaS на Next.js не становится безопасным только потому, что у хостинга есть кнопка отката. Безопасность появляется, когда прежняя версия приложения еще работает с текущей базой и правильными секретами, пока человек, который не писал систему, выясняет причину изменений. По этому критерию Vercel дает самый чистый откат кода для обычного приложения Next.js, Render предлагает самую явную модель полного окружения, а Railway занимает практичную середину для стека из сервиса и базы данных.
По умолчанию я выбираю Vercel, если приложение укладывается в его управляемую модель Next.js, а работа с базой уже подчиняется строгому процессу миграций. Render подходит, когда нужны одноразовые копии нескольких сервисов и хранилищ, описанных как инфраструктура. Railway подходит, когда унаследованное приложение больше похоже на контейнерный сервис, а команде нужна простая схема проекта с изолированными окружениями. Ни один вариант не отменит разрушительную SQL-миграцию и не вернет отозванные учетные данные.
Поэтому решение начинается с границы восстановления, а не с таблицы функций. Код, настройки, данные, фоновые задания и ресурсы браузера меняются в разное время. Хостинг может безупречно переключить код, но система останется сломанной, потому что другой ее элемент уже ушел вперед.
Один сбой раскрывает три разных подхода к восстановлению
Для честного сравнения нужен один инцидент. Допустим, агентство получило SaaS на Next.js с Postgres, входом по электронной почте, платежным вебхуком и воркером, который отправляет сообщения из очереди. Релиз переименовывает users.plan в users.plan_code, меняет содержимое задания и обновляет AUTH_SECRET. Разработчик проверил страницу превью на данных из продакшена, слил изменения в 16:00 и увидел успешные проверки состояния. В 16:07 перестали работать существующие сессии, прежний воркер начал отвергать новые задания, а редко используемый административный маршрут по-прежнему запрашивал users.plan.
Оператор хочет вернуть прежний код. Действие кажется простым, но требует ответов на пять вопросов:
- Может ли хостинг направить трафик на известную сборку без повторной сборки?
- Какие значения переменных окружения получит эта сборка?
- Удалила ли миграция данные, нужные прежней сборке?
- Может ли превью обращаться к настоящим пользовательским данным или отправлять настоящие письма?
- Заменит ли автоматическое развертывание восстановленную сборку сразу после отката?
Vercel может на уровне маршрутизации направить продакшен-трафик на подходящее прежнее развертывание. В текущем руководстве сказано, что пересборка не нужна, а документация Instant Rollback предупреждает: внешние базы и API не откатываются вместе с приложением. Это предупреждение определяет все сравнение, а не дополняет его мелким примечанием.
Railway описывает откат как повторное развертывание выбранной прежней версии с восстановлением образа Docker и пользовательских переменных. Render запускает новое развертывание из выбранного артефакта сборки и использует переменные сервиса из целевой версии, но некоторые значения общих групп окружения остаются текущими. Все три платформы сохраняют часть прежнего состояния приложения. Разница состоит в составе этого состояния и скорости возврата в работу.
В нашем инциденте первый откат, скорее всего, восстановит административный маршрут лишь при условии, что база все еще содержит users.plan. Он может завершить все сессии, если восстановленная версия получит неверный AUTH_SECRET. В очереди также могут одновременно остаться два воркера с несовместимыми форматами заданий. Зеленый статус платформы подтверждает работу механизма развертывания. Он не подтверждает восстановление SaaS.
Неизменяемое развертывание еще не делает релиз обратимым
Все три хостинга в той или иной форме хранят артефакты развертывания, но неизменяемое развертывание не означает обратимость релиза. Неизменяемость означает, что готовый артефакт не меняется после создания. Обратимость означает, что все видимое пользователю поведение можно вернуть к известному состоянию после изменения кода, настроек и данных. Первое свойство помогает второму, но ничего не гарантирует.
В унаследованных системах Next.js эту разницу часто упускают, потому что один репозиторий содержит несколько единиц релиза, похожих на одно приложение. Веб-развертывание может включать серверные компоненты, обработчики маршрутов и статические ресурсы. Отдельный процесс читает очередь. Плановая задача запускается из настроек платформы. Postgres, объектное хранилище, платежная система и почтовый сервис хранят состояние в других местах. Откат одного неизменяемого артефакта меняет лишь одну строку такого списка.
Проверки состояния еще сильнее сужают обзор. Запрос к /api/health может доказать, что процесс запустился и отвечает по HTTP. Он не проверяет чтение существующей зашифрованной сессии, обновление старой строки базы, подпись вебхука или обработку задания из очереди. В этом SaaS полезная проверка релиза должна пройти по всем таким путям и не затронуть настоящих клиентов.
Я использую два уровня проверок. Системный endpoint состояния остается быстрым и не создает побочных эффектов, чтобы хостинг мог решить, направлять ли трафик на экземпляр. Отдельная релизная проверка входит под синтетической учетной записью, читает и меняет одноразовую запись, отправляет тестовое задание и подтверждает результат воркера. Ее запускают перед публикацией и после отката; балансировщик нагрузки никогда к ней не обращается.
Браузер добавляет еще одну границу версий. Пользователь может держать вкладку открытой во время развертывания, а затем отправить форму или вызвать серверное действие из кода, загруженного до переключения. Skew Protection в Vercel устраняет рассинхронизацию совместимых ресурсов и функций Next.js, но контракты приложения все равно должны выдерживать переход. При развертываниях Railway и Render приложение также обязано обрабатывать запросы, начатые до переключения трафика. Не меняйте идентификаторы действий, форматы cookie и обязательные поля так, чтобы открытая сессия сразу ломалась.
Самое долгое пересечение версий возникает в фоновых заданиях. Задание, записанное в 15:58, может выполниться после релиза в 16:00, а повторная попытка может начаться после отката в 16:07. Поэтому создателям и обработчикам заданий нужна более длинная совместимость, чем при переключении веб-трафика. Версионируйте содержимое, сначала делайте новые поля необязательными и отправляйте неизвестную версию в карантин вместо удаления или бесконечных повторов.
К воспроизводимости сборки тоже стоит относиться строго. Откат с повторным использованием сохраненного артефакта безопаснее, чем сборка старого коммита с сегодняшним реестром пакетов, текущим тегом базового образа и новыми инструментами. Vercel переключается на существующее развертывание. Render сообщает, что при обычном откате использует сохраненный артефакт. Railway восстанавливает выбранный образ Docker по описанному процессу. Однако срок хранения решает, будет ли нужный артефакт доступен во время инцидента.
Изменяемые теги контейнеров ослабляют это обещание. Render прямо предупреждает: при откате образа по тегу платформа может скачать тот образ, на который тег указывает сейчас, тогда как digest однозначно определяет образ. Общее правило действует на любом хостинге: записывайте digest образа или идентификатор развертывания как цель восстановления. Коммит Git не равен бинарному файлу, а его повторная сборка создает новое событие.
Называйте релиз обратимым только тогда, когда команда умеет без догадок восстановить проверенный набор версий веб-приложения, воркера, схемы и настроек. Такое определение строже терминов платформы и защищает от худшего сюрприза: кнопка сработала точно по документации, но приложение осталось недоступным.
Vercel лучше всего откатывает чистый код Next.js
Vercel дает самый безопасный первый выбор, если единица восстановления совпадает с развертыванием Next.js, а системы с состоянием находятся снаружи. Каждое развертывание получает уникальный адрес, и продакшен-домены указывают на одну версию. Instant Rollback переносит указатель на прежнее продакшен-развертывание без пересборки исходников. Среди трех вариантов это ближе всего к атомарному переключению кода.
Во время инцидента оператору приходится держать в голове меньше деталей. Он может просмотреть недавние продакшен-развертывания, найти известный коммит, выполнить откат, проверить статус и сравнить журналы. Последовательность CLI дает понятный результат:
vercel list
vercel inspect <bad-deployment-url>
vercel rollback <good-deployment-url>
vercel rollback status
vercel list возвращает недавние развертывания с адресами и временем создания; оператор выбирает нужную продакшен-версию. vercel inspect связывает ее с коммитом Git и метаданными настроек. vercel rollback status показывает завершение переключения маршрута. Документация также говорит, что откат отключает автоматическое назначение продакшен-домена до публикации другой версии, поэтому следующий push не отменит восстановление незаметно.
Есть ограничения. На плане Hobby можно вернуться только к предыдущему продакшен-развертыванию, а более дорогие планы позволяют выбрать другие подходящие версии. Превью, которое никогда не получало продакшен-домен, обычно нельзя выбрать для Instant Rollback. Политику хранения стоит проверить до инцидента, хотя Vercel хранит недавние продакшен-развертывания по опубликованным правилам.
Vercel также предлагает Skew Protection для поддерживаемых версий Next.js. Эта функция помогает браузеру получать ресурсы и серверные функции из согласованного развертывания при выходе новой версии. Она сокращает рассинхронизацию при обычном релизе, но не согласует две схемы базы или два формата задания. Это защита от смешивания ресурсов приложения, а не транзакция для всего стека.
Выбирайте Vercel для унаследованного SaaS только после проверки трех условий: требования Next.js подходят платформе, длительным задачам отведено правильное место, а каждое изменение базы совместимо с прежним приложением. Иначе быстрое переключение вернет старый код в среду, которую он уже не понимает.
Railway сохраняет понятную структуру сервисов
Railway часто проще понять, когда приложение Next.js работает как один сервис рядом с Postgres, воркером и, возможно, закрытым API. Модель проектов и окружений группирует ресурсы, но не притворяется, что они образуют единый обратимый объект. Окружения Railway изолируют изменения настроек, а временные PR-окружения могут создать сервисы, затронутые изменением.
При откате Railway использует исходники или образ выбранного развертывания и восстанавливает связанные пользовательские переменные в пределах срока хранения плана. Для нашего инцидента это важно: прежнее приложение и его старый AUTH_SECRET могут вернуться вместе. Операция остается повторным развертыванием, а не переключением указателя, поэтому время восстановления включает запуск и проверки состояния. Измерьте его на своем сервисе и не считайте слово «откат» синонимом мгновенности.
PR-окружения могут копировать структуру базового окружения вместе со ссылками между сервисами и переменными. В текущем руководстве Railway сказано, что стандартные PR-окружения воспроизводят всю базовую среду, а сфокусированные развертывают затронутые сервисы и зависимости. Так унаследованный репозиторий с несколькими сервисами становится понятнее: проверяющий увидит, одинаково ли веб-сервис и воркер понимают формат задания до слияния.
Опасность скрыта в наследовании. Если PR-окружение получает продакшен-учетные данные или строку подключения к настоящей базе, изоляция на схеме проекта остается декоративной. Выделите превью отдельную базу, приемник писем, тестовый платежный аккаунт и секреты без права выполнять продакшен-действия. Временное окружение должно безопасно отказывать при отсутствии переменной, предназначенной только для продакшена.
Railway поддерживает команду перед развертыванием. Она выполняется после сборки и перед запуском приложения, имеет доступ к закрытой сети и переменным. Это разумное место для миграции, но место не делает миграцию обратимой. Если команда успешно удалит users.plan, а новый сервис сломается позже, откат приложения не восстановит содержимое столбца.
Railway занимает для меня среднюю позицию. Он лучше показывает связи сервисов, чем интерфейс с упором на фронтенд, и требует меньше описания инфраструктуры, чем полный Blueprint Render. Безопасность снижается, когда люди без контроля редактируют продакшен-переменные или независимо развертывают каждый сервис, не записывая совместимый набор версий.
Render явно показывает границу окружения
Render лучше подходит, когда восстановление охватывает описанные веб-сервис, воркер, базу и общие настройки. Blueprint определяет эти ресурсы, а превью-окружение создает новые экземпляры сервисов и хранилищ для каждого PR. Документация Render прямо говорит, что хранилища превью не копируют продакшен-данные. Такое поведение заставляет команду отдельно решить, откуда брать тестовые данные, и это полезное ограничение.
Для превью-окружений нужен Blueprint и подходящий план. Они поддерживают переопределения previewValue и запускают initialDeployHook после первого успешного развертывания превью. Для унаследованного SaaS это дает изолированный тест: создать пустую базу, применить миграции, добавить синтетические учетные записи, проверить веб-приложение и воркер. Подготовки больше, чем для одной страницы, зато тестируется нужная граница сбоя.
Откат Render не переключает указатель. Платформа запускает новое развертывание из сохраненного артефакта. Целевая версия передает артефакт, команду запуска, путь проверки состояния, число экземпляров и переменные сервиса. Текущие настройки по-прежнему управляют дисками и пользовательскими доменами, а группы окружения ведут себя смешанно. Официальная таблица отката необычно прямо описывает это разделение.
У разделения два следствия. Переменная сервиса, сохраненная со старой версией, может вернуться, но значение из общей группы может остаться текущим. Постоянный диск вообще не откатывается вместе с сервисом. Render позволяет отдельно восстановить снимок диска, но откат приложения и восстановление диска остаются разными операциями с разным риском.
Откат из панели отключает автоматические развертывания, а откат через API не отключает их. В инструкции для инцидента нужно указать точный способ; иначе два оператора выполнят одинаковый на вид откат и оставят автоматизацию в разных состояниях. Срок хранения артефактов тоже зависит от плана, поэтому проверьте глубину доступных откатов заранее.
В нашем сценарии Render дает самое точное превью, если весь стек описан в Blueprint. Одновременно оператору нужно понимать больше настроек во время восстановления. Выбирайте его, если такая явность подходит команде. Сам по себе вид Blueprint, похожий на документацию, ничего не дает, если секреты, внешние сервисы и ручные изменения панели в нем не отражены.
Миграция базы определяет реальность отката
Когда релиз меняет постоянные данные, совместимость базы важнее хостинга. Безопасный откат означает, что версия N и версия N минус один работают в течение окна восстановления. Надежная схема сначала добавляет новые структуры, постепенно переводит чтение и запись и удаляет старые структуры лишь после закрытия возможности вернуть прежнее приложение.
При переименовании plan не переименовывайте и не удаляйте столбец в том же релизе, где меняется код. Добавьте новый столбец, заполните его и синхронизируйте оба значения, пока может работать старый код:
ALTER TABLE users ADD COLUMN plan_code text;
UPDATE users SET plan_code = plan WHERE plan_code IS NULL;
Новое приложение должно читать plan_code с временным переходом на plan и записывать оба поля. В следующем релизе можно прекратить чтение старого поля. Удаляйте plan отдельной миграцией только после окончания окна отката. Это требует больше релизов, чем прямое переименование, но дает настоящее восстановление.
То же правило действует для содержимого заданий. Добавьте поле версии и научите обработчики принимать старую и новую форму до того, как создатели начнут отправлять только новую:
{"version":2,"userId":"usr_123","template":"welcome"}
Воркер, который отвергает любое задание без version: 2, не сможет работать рядом с заданиями версии 1 в очереди. Откат веб-процесса способен усилить несовместимость, создав больше старых заданий. Осознанно опустошите очередь, отправьте задания в карантин или преобразуйте их; перезапуск процесса сам по себе не сделает очередь согласованной.
Команда миграции перед развертыванием помогает соблюсти порядок, но разрушительная миграция требует отдельного подтверждения и проверки резервной копии. Запишите идентификатор, время запуска, итоговый статус и проверенный способ восстановления. Если отмена требует восстановления резервной копии, до релиза укажите ожидаемое окно потери данных. Восстановление снимка может удалить правильные записи после развертывания, поэтому это не обычный откат.
Я не советую популярную схему с prisma migrate deploy в команде запуска приложения. Она кажется безопасной, потому что каждый экземпляр настраивает себя сам. В масштабированном сервисе несколько экземпляров могут конкурировать или блокировать запуск, а ошибка миграции превратит обычный перезапуск в сбой. Выполните миграцию один раз как часть релиза, проверьте результат и только затем запускайте новый код.
У секретов есть версии, даже если панель их скрывает
Для отката нужен набор секретов, с которым работала целевая версия, но восстановление старого секрета может снова открыть учетные данные, отозванные из соображений безопасности. Считайте откат настроек и ротацию учетных данных разными решениями. Хостинг хранит значения; инструкция должна объяснять их смысл и допустимый срок жизни.
Переменные Vercel привязаны к Production, Preview, Development и необязательным пользовательским окружениям, а изменения действуют на последующие развертывания. Документация Instant Rollback предупреждает, что восстановленная сборка может рассчитывать на настройки, не совпадающие с текущими внешними системами. Railway восстанавливает пользовательские переменные выбранного развертывания. Render восстанавливает переменные сервиса, но не возвращает прежние значения в общих группах.
Из-за этих различий полезно вести простой список секретов. Храните рядом с кодом названия и ответственных, но никогда не значения:
AUTH_SECRET:
owner: application
rotation: dual-read
rollback: previous value valid for 24 hours
BILLING_WEBHOOK_SECRET:
owner: billing-provider
rotation: accept old and new signatures
DATABASE_URL:
owner: operations
rollback: never point production code at preview data
dual-read здесь означает, что приложение временно принимает сессии или подписи, созданные старым либо новым секретом, а новые выпускает только с текущим. Возможность зависит от библиотеки. Если ее нет, при ротации или откате пользователей придется вывести из системы, и это влияние нужно записать в описание релиза.
Не добавляйте продакшен-секреты в превью ради реалистичности. Используйте ограниченные тестовые учетные данные и отдельные данные. Проверьте также утечки на этапе сборки: любая переменная, встроенная в значение NEXT_PUBLIC_, по замыслу видна в браузере, независимо от защиты на платформе. Перед первым переносом унаследованной базы в продакшен найдите имена секретов в клиентских пакетах.
Побочные эффекты превью должны оставаться изолированными
Превью безопасно, только если его побочные эффекты не выходят наружу. Уникальный URL и отдельный вычислительный экземпляр не мешают отправлять письма клиентам, списывать деньги, читать продакшен-очередь, менять общую базу или принимать настоящий вебхук.
Vercel автоматически создает превью для веток вне продакшена и поддерживает переменные превью, включая переопределения для веток. Для поверхности Next.js этого достаточно, но базы и воркеры обычно нужно создавать отдельно. PR-окружения Railway могут воспроизводить связанные сервисы и переменные проекта. Превью Render создают новые сервисы и хранилища из Blueprint без копирования существующих данных.
На каждом хостинге используйте один договор приемки:
- Создайте синтетического пользователя, войдите и обновите сессию после повторного развертывания.
- Примените миграции к пустой базе и очищенной копии с прежней схемой.
- Отправьте письмо в тестовый приемник, а платежный запрос в тестовый аккаунт.
- Обработайте одно старое и одно новое задание воркером-кандидатом.
- Откатите кандидата, снова проверьте вход и запись данных.
Пятый пункт команды обычно пропускают. Они проверяют движение вперед в превью, а откат считают очевидным. База, созданная только по новейшей схеме, не доказывает, что старый код выдержит состояние после миграции. Сохраните fixture предыдущего релиза, выполните миграцию, разверните новый код, затем верните старый код к уже мигрированному fixture.
Закрывайте публичный доступ к превью, если там воспроизводятся настоящие пользовательские сценарии. Vercel предлагает защиту развертываний, а Railway и Render позволяют управлять доступом через модели проектов и аутентификацию приложения. Контроль платформы не заменяет авторизацию в приложении. Проверьте, что обычный пользователь превью не видит административные маршруты и продакшен-интеграции.
Инструкция восстановления должна помещаться на одном экране
Во время сбоя безопаснее тот хостинг, процедуру которого уже отрепетировал настоящий оператор. В инструкции нужны проверяемые признаки и условия остановки, а не фраза «при необходимости откатить». Положите эту короткую карточку в репозиторий и заполняйте для каждого продакшен-релиза:
release: <git-sha>
previous: <known-good-deployment>
migration: <id-or-none>
compatible_with_previous_code: <yes-or-no>
secret_change: <name-or-none>
web: <deployment-id>
worker: <deployment-id>
recovery_owner: <person>
В начале инцидента остановите автоматические продакшен-развертывания, сохраните сбойную версию и журналы, затем выясните, менялись ли данные. Если миграция только добавляла данные, а прежний секрет еще принимается, восстановите веб и воркер как единый набор. Проверьте вход, одно чтение, одну запись, одно задание из очереди и платежный вебхук. До объявления о восстановлении проследите за числом ошибок.
Если миграция была разрушительной, не называйте действие откатом кода. Выберите исправление вперед, патч совместимости для старого приложения или восстановление базы. Исправление вперед обычно сохраняет больше данных. Восстановление базы оправдано при продолжающемся повреждении, но требует точной точки отсечения и плана сверки записей после резервной копии.
В Vercel запишите точный адрес продакшен-развертывания и подтвердите статус отката и домена. В Railway запишите развертывание каждого сервиса, потому что веб и воркер могут разойтись. В Render укажите целевое развертывание, способ через панель или API, а также группы и диски, которые останутся текущими.
Проведите это упражнение до смены хостинга. Измерьте время восстановления, откройте существующую сессию и выполните запись. Если платформа сообщает об успехе, а пользовательский путь не работает, добавьте недостающий шаг в инструкцию. Переезд не исправит неизвестную зависимость приложения.
Выбирайте хостинг после схемы унаследованной системы
Vercel дает самое чистое переключение развертывания Next.js, Railway предлагает компактное пространство для сервисов и базы, а Render дает описанное окружение из нескольких ресурсов с точными превью. Порядок изменится, если унаследованный код использует постоянный диск, необычные процессы, несколько независимо развертываемых воркеров или ручную инфраструктуру за пределами хостинга.
До решения составьте карту пяти групп: исполняемые процессы, хранилища данных, очереди и плановые задачи, владельцы секретов и внешние побочные эффекты. Укажите, какой объект хостинга отвечает за каждый элемент и меняет ли его операция отката. Пустая ячейка принадлежит вашему плану восстановления, а не доказывает, что платформа обо всем позаботится.
В унаследованном проекте, созданном ИИ, вызовы базы часто спрятаны в серверных действиях, логика аутентификации повторяется, а настройки развертывания смешаны с кодом. FixMyMess может провести диагностику, исправить логику и проблемы безопасности, выполнить рефакторинг и подготовить развертывание с экспертной проверкой, но выбор хостинга все равно требует описанной здесь границы восстановления.
Перед утверждением проведите разрушительный мысленный эксперимент: новый код работает семь минут, пользователи уже записали данные, секрет изменился, а у старого воркера остались задания. Попросите оператора восстановить систему без исходного разработчика. Выбирайте хостинг по качеству ответа. Быстрая кнопка отката полезна лишь после того, как приложение действительно стало способно вернуться назад.
Часто задаваемые вопросы
На каком хостинге откат приложения Next.js работает быстрее всего?
У Vercel самый понятный быстрый путь: платформа направляет продакшен-трафик на подходящее прежнее развертывание без пересборки. Преимущество относится к коду и состоянию развертывания, но не к внешней базе и не ко всем измененным секретам.
Откат развертывания откатывает и Postgres?
Нет. Откаты приложений в Vercel, Railway и Render не отменяют изменения схемы и не восстанавливают удаленные строки во внешней базе. Для обычных релизов применяйте совместимые миграции, а восстановление резервной копии считайте отдельным событием восстановления данных.
Vercel безопаснее Railway для унаследованного SaaS?
Обычно Vercel безопаснее для стандартного приложения Next.js с внешними управляемыми данными и строгими миграциями. Railway может быть понятнее, если приложение включает воркер, базу и другие сервисы, которые оператору нужно видеть вместе.
Когда стоит выбрать Render вместо Vercel?
Выбирайте Render, если хотите вместе описать веб-сервис, воркеры, базы и настройки, а затем воспроизводить их как ресурсы превью. Подготовки потребуется больше, а таблицу отката нужно прочитать внимательно: диски и часть общих настроек не возвращаются.
Можно ли безопасно подключить превью к продакшен-базе?
Не стоит. Превью может выполнять непроверенный код, а один неверный запрос изменит или раскроет настоящие данные. Дайте ему изолированные данные, ограниченные тестовые учетные данные и приемники для почты, платежей и других эффектов.
Какая миграция базы безопасна для отката?
После миграции должны работать прежняя и новая версии приложения. Сначала добавляйте столбцы или таблицы, сохраняйте старые пути в течение окна восстановления и удаляйте прежние структуры в более позднем релизе.
Нужно ли запускать миграции при старте приложения?
Я избегаю такой схемы в продакшен-сервисах. Несколько экземпляров могут конкурировать или блокировать запуск, а ошибка миграции превратит обычный перезапуск в сбой. Выполняйте миграцию один раз как действие релиза и проверяйте результат до запуска нового кода.
Сохраняют ли старые развертывания прежние переменные окружения?
Точное поведение зависит от хостинга и области настроек. Railway восстанавливает пользовательские переменные развертывания, Render возвращает переменные сервиса, но иначе работает с общими группами, а Vercel может восстановить сборку с предположениями, отличными от текущих внешних настроек.
Как проверить откат до переноса унаследованного приложения?
Разверните fixture релиза, примените следующую миграцию, запустите новый код, а затем верните старый код к уже мигрированной базе. Проверьте существующую сессию, чтение, запись, старое задание в очереди и каждый значимый внешний эффект.
Что должно входить в инструкцию по откату?
Запишите идентификаторы текущего и рабочего развертываний, состояние миграции, изменения секретов, версии веба и воркера, ответственного и пользовательские проверки. Также укажите, останавливаются ли автоматические развертывания и какие данные или настройки платформа не меняет.