Vercel: где задать переменные окружения, если .env не попал в Git

Опубликовано 24.09.20266 мин чтенияБазовый
Панель Vercel с полем 'Environment Variables', в которое вводится ключ, и облаками для сред Dev, Preview, Prod.
Что узнаешь
  • Где добавить настройки приложения в Vercel
  • Как выбрать окружение и проверить новое развёртывание
  • Почему секрет нельзя передавать через NEXT_PUBLIC_
Базовый

Инструкция для проекта, который уже размещается на Vercel. Нужны доступ к его настройкам и понимание, какие переменные читает приложение. Пример ниже относится к Next.js; названия переменных другого фреймворка нельзя переносить в него автоматически. Инструкция основана на официальной документации; на реальном аккаунте её не проверяли.

За новыми материалами об ИИ-инструментах можно следить в каналах.

Почему файл .env не нужно добавлять в Git

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

Next.js умеет загружать переменные из локальных файлов .env*. Но локальный файл и настройки проекта в Vercel - разные места. Если файл не отправлен в репозиторий, задавай значения на хостинге отдельно. Стандартный шаблон create-next-app добавляет .env-файлы в .gitignore; документация Next.js предупреждает, что отправлять их в репозиторий почти никогда не следует.

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

Сначала выясни, где приложение читает переменную

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

Что проверяемВозможные вариантыЗачем это знать
Окружение VercelDevelopment, Preview, ProductionНастройка должна относиться к той версии, которую проверяешь
Место чтенияСервер или браузерПриватный ключ нельзя включать в клиентский код
Момент чтенияСборка или выполнение серверной функцииВ Next.js публичные значения фиксируются при сборке

Окружение Development предназначено для локальной разработки. Preview - для предварительных развёртываний, а Production - для основной опубликованной версии. У Preview бывают настройки для конкретной Git-ветки: они перекрывают одноимённые общие настройки Preview.

Для проекта Next.js переменные без NEXT_PUBLIC_ по умолчанию доступны на сервере. Префикс NEXT_PUBLIC_ разрешает встраивание значения в JavaScript, который получает браузер. Это подходит для заведомо публичной настройки, например несекретной метки версии, но не для приватного API-ключа. Даже без этого префикса нельзя вручную возвращать секрет клиенту из кода приложения.

Если фреймворк ещё не определён, попроси агента назвать его по файлам проекта. Сравнение Astro и Next.js поможет разобраться в различиях; применять правило NEXT_PUBLIC_ к любому React-приложению нельзя.

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

Практикум по вайб-кодингу
+Твой второй мозг
3 вечера - инструменты, метод, первый проект
Старт 17–19 ноября  ·  2 000 ₽
Записаться →

Как добавить переменную в проект Vercel

Выполняй действия в официальном кабинете самостоятельно. Не передавай агенту настоящий ключ ради заполнения формы и не прикладывай снимок экрана с его значением.

  1. Открой панель Vercel и выбери нужный проект. Не ограничивайся совпадением названия репозитория: проверь, что настраиваешь именно приложение, которое собираешься открыть.
  2. Перейди в Environment Variables в боковом меню настроек проекта.
  3. В поле Name укажи имя, которое читает приложение, например SERVICE_API_KEY. Это условное имя; если код ждёт другое, используй его точное написание.
  4. В поле Value введи значение из своего хранилища учётных данных. Не помещай его в исходники, чат или журнал проверки.
  5. Выбери окружение, которому нужна эта настройка. Для проверки предварительной версии используй Preview; для основной - Production. Не назначай один секрет всем окружениям автоматически.
  6. Если настройка Preview относится к отдельной ветке, проверь выбранную ветку и возможное одноимённое переопределение.
  7. Нажми Save.

Vercel предоставляет переменные проекта и во время сборки, и при выполнении серверных функций Vercel Functions. Но доступность значения на стороне Vercel не означает, что его можно отдавать браузеру: это определяется кодом приложения и правилами фреймворка.

Почему после Save нужно новое развёртывание

Сохранение переменной не меняет уже существующие развёртывания. Документация Vercel требует повторно развернуть проект, чтобы новая настройка попала в используемую версию.

При работе через Git новое Production-развёртывание можно создать отправкой коммита в ветку, указанную в настройке Production Branch, а Preview - в другую ветку. Не предполагай, что основной всегда является main: проверь настройку своего проекта. Это должен быть обычный согласованный выпуск проекта, без добавления секретного файла в коммит.

После запуска дождись завершения сборки и открой адрес нового развёртывания. Сохрани для себя его URL, окружение и ветку. Если проверять старый адрес отдельного развёртывания, новые настройки в нём не появятся.

В Next.js есть ещё одно условие: обращения вроде process.env.NEXT_PUBLIC_RELEASE_LABEL заменяются значением во время next build. После сборки это значение зафиксировано. Изменение настройки без новой сборки не перепишет уже выданный клиентский JavaScript.

Как проверить результат, не показывая ключ

Начни с безопасного примера: заведомо несекретной метки NEXT_PUBLIC_RELEASE_LABEL со значением preview-check. Это условные имя и текст, не ключ и не проведённый здесь тест. Если приложение на Next.js читает эту переменную прямым обращением process.env.NEXT_PUBLIC_RELEASE_LABEL, после новой сборки оно может показать метку в предусмотренном для неё месте интерфейса. Такая проверка подтверждает только передачу публичной настройки.

Приватный ключ проверяют иначе. Не выводи его значение, часть, длину или весь process.env. Не создавай публичный адрес, возвращающий содержимое переменной. Для начала проверь на стороне сервера только признак «настройка задана / отсутствует», затем отдельно проверь ту функцию приложения, которая использует сервис. Наличие настройки не доказывает, что ключ действующий или имеет нужные права.

Результаты проверки удобно записать без секретов:

  • проект, окружение и ветка совпадают с выбранными при настройке;
  • проверяется URL нового развёртывания, выпущенного после сохранения переменной;
  • сборка завершилась, а нужная функция приложения отработала на безопасных тестовых данных;
  • секрет не выводится в браузер, ответы API, журналы или переписку.

Если функция выполняет платёж, отправку сообщения или другое действие с последствиями, используй предусмотренный сервисом тестовый режим. Проверка настройки сама по себе не даёт разрешения на реальную операцию.

Что проверить, если значение осталось undefined

undefined означает, что в данном месте чтения значение не получено. Иди от имени к окружению и версии, не меняя все настройки одновременно.

СимптомЧто проверить
Локально работает, в Preview нетЕсть ли имя в настройках проекта для Preview; не отличается ли выбранная ветка
Preview работает, Production нетЗадано ли имя для Production; создана ли новая основная версия после Save
В одной Preview-ветке другое поведениеНет ли одноимённого значения для этой ветки, перекрывающего общую настройку
Сервер видит переменную, браузер нетДля Next.js это ожидаемо у непубличной переменной; приватный ключ в браузер не переносить
Публичная метка Next.js осталась старойБыла ли новая сборка с нужным значением; открыт ли URL именно её развёртывания
Публичное имя правильное, но подстановка не работаетНет ли динамического чтения process.env[varName]: Next.js не встраивает такие обращения

Если имя, окружение и новая версия проверены, сама ошибка функции ещё не доказывает, что причина в переменной. Проверяй конкретную ошибку серверного кода, не публикуя диагностические данные с секретами. Эта инструкция не обещает устранить любой ответ HTTP 500.

Переезд на собственный сервер требует другого порядка действий: для него есть инструкция по размещению проекта через Coolify. Названия кнопок и порядок настройки Vercel для неё не подходят.

Источники

Практикум по вайб-кодингу
+Твой второй мозг
3 вечера - инструменты, метод, первый проект
Старт 17–19 ноября  ·  2 000 ₽
Записаться →

Новые материалы - дайджестом, без спама

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

Была инструкция полезна?
Артемий Миллер
Автор
Артемий Миллер
Предприниматель и вайб-кодер

Артемий Миллер - предприниматель и вайб-кодер. Бывший программист, собирает продукты исключительно вместе с ИИ-агентами, без найма разработчиков.

Связанные инструкции