Исправить DATABASE_URL в Prisma Turborepo на Vercel
Полное руководство по решению проблем с переменной окружения DATABASE_URL для Prisma в монорепозиториях Turborepo при развертывании на Vercel. Узнайте правильные шаги настройки и лучшие практики.
Отсутствует переменная окружения DATABASE_URL для Prisma в Turborepo при развертывании на Vercel
Я сталкиваюсь с проблемой при развертывании фронтенда Next.js из моего монорепозитория Turborepo на Vercel. Развертывание завершается неудачей на этапе сборки при выполнении prisma generate, с ошибкой, указывающей, что переменная окружения DATABASE_URL отсутствует.
Несмотря на то, что переменная определена в моих локальных файлах .env и добавлена в настройки проекта Vercel, развертывание всё равно завершается неудачей.
Error Log from Vercel
@repo/db:build:
@repo/db:build: > @repo/db@ build /vercel/path0/packages/db
@repo/db:build: > prisma generate && tsc
@repo/db:build:
@repo/db:db:generate: [dotenv@17.2.3] injecting env (0) from .env.example -- tip: ⚙️ override existing env vars with { override: true }
@repo/db:db:generate: Failed to load config file "/vercel/path0/packages/db" as a TypeScript/JavaScript module. Error: PrismaConfigEnvError: Missing required environment variable: DATABASE_URL
@repo/db:db:generate: ELIFECYCLE Command failed with exit code 1.
@repo/db:db:generate: ERROR: command finished with error: command (/vercel/path0/packages/db) /pnpm10/node_modules/.bin/pnpm run db:generate exited (1)
@repo/db:build: [dotenv@17.2.3] injecting env (0) from .env.example -- tip: 🛠️ run anywhere with `dotenvx run -- yourcommand`
@repo/db:build: Loaded Prisma config from prisma.config.ts.
@repo/db:build:
@repo/db:build: ELIFECYCLE Command failed with exit code 130.
@repo/db#db:generate: command (/vercel/path0/packages/db) /pnpm10/node_modules/.bin/pnpm run db:generate exited (1)
Prisma Configuration
packages/db/prisma.config.ts
import "dotenv/config";
import { defineConfig, env } from "prisma/config";
import fs from "fs";
import dotenv from "dotenv";
if (fs.existsSync(".env")) {
dotenv.config({ path: ".env" });
} else {
dotenv.config({ path: ".env.example" });
}
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
},
engine: "classic",
datasource: {
url: env("DATABASE_URL"),
},
});
Turborepo Configuration
turbo.json
{
"$schema": "https://turborepo.com/schema.json",
"ui": "tui",
"tasks": {
"build": {
"dependsOn": ["^build", "^db:generate"],
"inputs": ["$TURBO_DEFAULT$", ".env*"],
"outputs": ["dist/**", ".next/**", "!.next/cache/**"],
"env": ["DATABASE_URL", "FETCH_BASE_URL", "JWT_SECRET"]
},
"lint": {
"dependsOn": ["^lint"]
},
"check-types": {
"dependsOn": ["^check-types"]
},
"dev": {
"dependsOn": ["^db:generate"],
"cache": false,
"persistent": true
},
"db:generate": {
"cache": false
},
"db:migrate": {
"cache": false,
"persistent": true
},
"db:deploy": {
"cache": false
}
}
}
Question
Как правильно настроить переменную окружения DATABASE_URL для Prisma в монорепозитории Turborepo при развертывании на Vercel, чтобы она была доступна во время процесса сборки?
Понимание проблемы
Ошибка возникает потому, что среда сборки Vercel не наследует переменные окружения из вашего локального окружения или из панели управления Vercel при использовании структуры монорепозитория Turborepo. Пакет Prisma запускается изолированно во время сборки и не может получить доступ к DATABASE_URL, если он явно не предоставлен через правильные каналы.
Согласно документации Turborepo, при развертывании на Vercel необходимо явно настроить переменные окружения в файле turbo.json, чтобы они были доступны во время процессов сборки.
Решение 1: Настройка переменных окружения в turbo.json
Самый простой способ — явно определить DATABASE_URL в определениях задач turbo.json. На основе вашей текущей конфигурации убедитесь, что переменная правильно ограничена.
{
"$schema": "https://turborepo.com/schema.json",
"ui": "tui",
"tasks": {
"build": {
"dependsOn": ["^build", "^db:generate"],
"inputs": ["$TURBO_DEFAULT$", ".env*"],
"outputs": ["dist/**", ".next/**", "!.next/cache/**"],
"env": ["DATABASE_URL", "FETCH_BASE_URL", "JWT_SECRET"]
},
"db:generate": {
"cache": false,
"env": ["DATABASE_URL"]
},
"db:migrate": {
"cache": false,
"persistent": true,
"env": ["DATABASE_URL"]
},
"db:deploy": {
"cache": false,
"env": ["DATABASE_URL"]
}
}
}
Ключевые моменты:
- Добавьте
DATABASE_URLв массивenvдля всех соответствующих задач, особенноdb:generate. - Это гарантирует, что переменная будет доступна во время процесса генерации Prisma.
- Согласно Stack Overflow, это самое распространённое решение для данной ошибки.
Решение 2: Конфигурация панели управления Vercel
Независимо от конфигурации turbo.json, вам всё равно нужно задать DATABASE_URL в настройках проекта Vercel.
Пошаговая настройка Vercel
- Перейдите в панель управления вашего проекта Vercel.
- Перейдите в Settings → Environment Variables.
- Добавьте новую переменную окружения:
- Name:
DATABASE_URL - Value: ваша строка подключения к базе данных
- Scope: убедитесь, что она установлена для Production, Preview и Development.
- Name:
Согласно Answer Overflow, «Чтобы решить эту ошибку, перейдите в настройки проекта на Vercel, откройте Environment Variables и добавьте DATABASE_URL с соответствующим значением.»
- Убедитесь в наследовании переменной:
- Vercel должен знать, что эта переменная должна быть доступна всем пакетам.
- В настройках проекта убедитесь, что переменная не привязана к конкретному приложению.
Решение 3: Обновления конфигурации Prisma
Ваша текущая конфигурация Prisma имеет некоторые недостатки, которые можно улучшить для более надёжного управления переменными окружения.
Обновлённый packages/db/prisma.config.ts
import dotenv from "dotenv";
import { defineConfig, env } from "prisma/config";
// Загрузка переменных окружения из нескольких потенциальных источников
dotenv.config({ path: process.env.NODE_ENV === "production" ? ".env.production" : ".env.local" });
dotenv.config({ path: ".env" }); // резервный вариант из корневого .env
dotenv.config({ path: ".env.example" }); // окончательный резервный вариант
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
},
engine: "classic",
datasource: {
url: env("DATABASE_URL"),
},
});
Ключевые улучшения:
- Более надёжный порядок загрузки переменных окружения.
- Поддержка файлов окружения, специфичных для продакшена.
- Улучшенные резервные механизмы.
- Согласно документации Prisma, такой подход рекомендуется для монорепозиториев.
Решение 4: Настройка команды сборки Vercel
Для проектов Turborepo на Vercel может потребоваться изменить команду сборки, чтобы обеспечить правильное наследование переменных окружения.
Переопределение конфигурации Vercel
-
В настройках проекта Vercel:
- Перейдите в Settings → Build & Development Settings.
- Переопределите Framework Preset на Next.js.
- Build Command:
cd ../.. && npm run build --filter=web.
-
Root Directory: Установите
apps/web(или ваш конкретный каталог приложения).
Согласно Dotenv documentation, «Ваш первый деплой, скорее всего, завершится неудачей, потому что вам нужно добавить несколько пользовательских настроек. Установите Build & Development Settings → Framework Preset на Next.js и переопределите команду сборки с
cd ../.. && npm run build --filter=web».
Устранение распространённых проблем
Проблема 1: Переменные всё ещё недоступны
Если вы выполнили все шаги и всё равно сталкиваетесь с проблемами:
- Проверьте область действия переменной: убедитесь, что
DATABASE_URLне привязана к конкретному приложению. - Проверьте имена переменных: убедитесь, что нет опечаток.
- Тестируйте локально: используйте
dotenvx run -- pnpm run db:generate, чтобы проверить локально.
Проблема 2: Команда Prisma не найдена
Согласно руководству по развертыванию Prisma на Vercel, если вы видите ошибку prisma: command not found:
- Переместите
prismaиз devDependencies в обычные зависимости вpackage.json. - Или используйте пользовательский путь вывода и включите Prisma Client в контроль версий.
Проблема 3: Отсутствуют файлы движка запросов
Тот же руководитель Prisma упоминает, что в монорепозиториях вы можете столкнуться с отсутствием файлов, таких как libquery_engine-rhel-openssl-3.0.x.so.node. Решение — убедиться, что файлы правильно включены в процесс сборки.
Лучшие практики работы с переменными окружения в Turborepo
1. Иерархия переменных окружения
Создайте чёткую иерархию переменных окружения:
.env.local # Локальные переопределения (не коммитятся)
.env.production # Переменные продакшена
.env.example # Шаблон (коммитится в git)
2. Переменные, специфичные для пакета
Для пакетов, которым нужны конкретные переменные, настройте их в turbo.json:
{
"tasks": {
"db:generate": {
"env": ["DATABASE_URL", "DATABASE_AUTH_TOKEN"]
}
}
}
3. Сборка, специфичная для окружения
Согласно лучшим практикам Turborepo, используйте конфигурации, зависящие от окружения:
{
"globalDependencies": ["**/.env.local", "**/.env.${{TURBO_ENV}}"]
}
4. Безопасное управление переменными
- Никогда не коммитите чувствительные переменные в контроль версий.
- Используйте
.env.exampleкак шаблон. - Документируйте необходимые переменные для каждого пакета.
Источники
- Prisma Documentation - Using Prisma with Turborepo
- Vercel Turborepo Deployment Guide
- Stack Overflow - Environment variable not set during build on Vercel
- Answer Overflow - Prisma + Turborepo build fails in Vercel
- Dotenv - Deploy a Turborepo App to Vercel
- Prisma Documentation - Deploy to Vercel
- Turborepo - Using Environment Variables
- GitHub Discussion - Global Environment Variables from Root
Заключение
Чтобы решить проблему с переменной окружения DATABASE_URL при развертывании Turborepo на Vercel, необходимо реализовать многоуровневый подход:
- Настройте
turbo.json— явно включитеDATABASE_URLв массивыenvдля всех релевантных задач. - Настройте панель управления Vercel — добавьте переменную с правильным диапазоном доступа.
- Обновите конфигурацию Prisma — обеспечьте надёжную загрузку переменных окружения.
- Настройте параметры сборки Vercel — убедитесь, что монорепозиторий обрабатывается корректно.
Ключевой вывод: переменные окружения в Turborepo требуют явной конфигурации на нескольких уровнях — как в файле сборки, так и в настройках платформы развертывания. Следуя этим шагам последовательно, вы гарантируете доступность DATABASE_URL во время генерации Prisma и устраните ошибки развертывания.
Проверяйте каждое изменение поэтапно и убедитесь, что переменные окружения корректно загружаются как в локальной разработке, так и в продакшене.