.env — куда складывать секреты
У вас в коде нельзя писать `const KEY = "sk-proj-..."` — потому что когда запушите в гит, ключ уйдёт в публичный архив. Поэтому ключи живут отдельно от кода — в файле `.env`, который игнорируется гитом. Код только ЧИТАЕТ из этого файла через `process.env.ИМЯ`.
Как устроен .env
Это просто текстовый файл в корне проекта. Внутри — пары КЛЮЧ=ЗНАЧЕНИЕ, по одной на строку. Без кавычек (если в значении нет пробелов). Без = вокруг знака равенства. Комментарии — через #. Имена принято писать UPPER_SNAKE_CASE: OPENAI_API_KEY, DATABASE_URL. Когда запускается
или next start, значения автоматически подгружаются в process.env.
Разные .env под разные среды
.env — общий, читается везде. .env.local — только локально, НЕ коммитится никогда. .env.development / .env.production — для соответствующего режима. .env.example — пустой шаблон с именами без значений, КОММИТИТСЯ в гит — чтобы коллега скачал и понял, какие переменные ему создать. Правило: реальные значения — только в .env.local, если речь про команду.
Что должно быть в .gitignore
Без .gitignore весь смысл .env теряется. Минимальный набор строк: .env, .env.local, .env.*.local. Современные шаблоны (create-next-app, vite create) добавляют их автоматически — но всегда проверяйте: откройте .gitignore, найдите эти строки. Если их нет — добавьте ДО первого коммита. Уже коммитили реальный .env? — отзывайте все ключи, чистите историю через
или
Как читать в коде
В Node.js / Next.js: process.env.OPENAI_API_KEY — возвращает строку или undefined. Восклицательный знак (!) в TypeScript говорит «я уверен, что значение есть». На практике лучше падать с понятной ошибкой:
Vite использует другой синтаксис: import.meta.env.VITE_API_URL.
// .env файл в корне проекта — это просто текстовый файл. // Формат: KEY=VALUE, по одной паре на строку. // .env OPENAI_API_KEY=sk-proj-abc123def456ghi789... DATABASE_URL=postgresql://user:pass@host:5432/db ADMIN_EMAIL=admin@example.com // .gitignore (в корне проекта) ОБЯЗАТЕЛЬНО содержит: .env .env.local .env.*.local // В коде читаем через process.env.ИМЯ: const key = process.env.OPENAI_API_KEY; console.log(key); // sk-proj-abc123... // БЕЗ .env пришлось бы писать ключ прямо в коде. // А потом пушнуть в GitHub. А потом плакать.
Структура .env и .gitignore — каноническая раскладка