← Назад к вопросам

Для чего нужен файл .env?

1.0 Junior🔥 152 комментариев
#Soft Skills и рабочие процессы

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Файл .env и его назначение

.env (environment) файл - это критичный компонент современной разработки. Он хранит переменные окружения, которые содержат конфиденциальную информацию и конфигурацию приложения, специфичную для каждого окружения.

Что такое переменные окружения

Переменные окружения - это значения, которые отличаются в зависимости от того, где запускается приложение:

  • На компьютере разработчика
  • На staging сервере
  • На production сервере

Зачем нужен .env файл

1. Безопасность - не коммитить секреты

# .env (НЕ коммитится в git)
API_KEY=sk-1234567890abcdef
DATABASE_PASSWORD=mySecurePassword123
JWT_SECRET=super_secret_key_123456

# .gitignore
.env           # Ignore this file
.env.local     # Ignore local overrides
.env.*.local   # Ignore environment-specific files

Если закоммитить .env с секретами в публичный репозиторий - это серьезная уязвимость. Любой может украсть API ключи, пароли и токены.

2. Разные конфиги для разных окружений

# .env.development (development окружение)
API_URL=http://localhost:3000
DATABASE_URL=postgres://localhost:5432/myapp_dev
DEBUG=true
LOG_LEVEL=debug

# .env.production (production окружение)
API_URL=https://api.myapp.com
DATABASE_URL=postgres://prod-server:5432/myapp_prod
DEBUG=false
LOG_LEVEL=error

Без .env пришлось бы менять код перед каждым деплоем.

3. Изоляция локальных изменений

# .env.local (локальные переменные, не в git)
# Каждый разработчик может переопределить значения для своей машины
DATABASE_URL=postgres://mylocal:5432/mydb
API_TIMEOUT=10000

Структура .env файла

# .env

# API конфигурация
REACT_APP_API_URL=https://api.example.com
REACT_APP_API_TIMEOUT=30000

# Authentication
REACT_APP_AUTH_TOKEN_NAME=auth_token
REACT_APP_AUTH_HEADER=Authorization

# Feature flags
REACT_APP_ENABLE_ANALYTICS=true
REACT_APP_ENABLE_BETA_FEATURES=false

# Third-party services
REACT_APP_STRIPE_PUBLIC_KEY=pk_live_1234567890
REACT_APP_GOOGLE_ANALYTICS_ID=UA-1234567-1

# Backend configuration
BACKEND_URL=http://localhost:8000
SECRET_API_KEY=sk_1234567890abcdef

Использование в приложении

React / Next.js

// lib/config.ts
export const config = {
  apiUrl: process.env.REACT_APP_API_URL,
  apiTimeout: parseInt(process.env.REACT_APP_API_TIMEOUT || '30000', 10),
  stripeKey: process.env.REACT_APP_STRIPE_PUBLIC_KEY,
  enableAnalytics: process.env.REACT_APP_ENABLE_ANALYTICS === 'true'
};

// Использование
import { config } from '@/lib/config';

const response = await fetch(`${config.apiUrl}/users`, {
  timeout: config.apiTimeout
});

Next.js (с публичными переменными)

// next.config.ts
module.exports = {
  env: {
    NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,
    NEXT_PUBLIC_STRIPE_KEY: process.env.NEXT_PUBLIC_STRIPE_KEY
  }
};

// pages/checkout.tsx - браузерный код
import { loadStripe } from '@stripe/js';

const stripe = await loadStripe(
  process.env.NEXT_PUBLIC_STRIPE_KEY // Доступно в браузере
);

Node.js / Backend

// .env
DATABASE_URL=postgres://user:pass@localhost/dbname
JWT_SECRET=super_secret_123
NODE_ENV=development

// app.js
require('dotenv').config(); // Загружаем .env

const dbUrl = process.env.DATABASE_URL;
const jwtSecret = process.env.JWT_SECRET;
const nodeEnv = process.env.NODE_ENV;

Важное правило: NEXT_PUBLIC

# .env.local

# SECRET - доступно только на сервере
API_SECRET_KEY=sk_super_secret_123
DATABASE_PASSWORD=mypassword

# PUBLIC - видно в браузере
NEXT_PUBLIC_API_URL=https://api.example.com
NEXT_PUBLIC_STRIPE_KEY=pk_live_1234567890
// На сервере (можем использовать оба)
export async function getServerSideProps() {
  const secret = process.env.API_SECRET_KEY; // OK
  const publicUrl = process.env.NEXT_PUBLIC_API_URL; // OK
}

// В браузере (только PUBLIC)
export default function Page() {
  const publicUrl = process.env.NEXT_PUBLIC_API_URL; // OK
  const secret = process.env.API_SECRET_KEY; // UNDEFINED!
}

.env.example - шаблон для других разработчиков

# .env.example (коммитится в git)
# Этот файл показывает, какие переменные нужны, но без значений

REACT_APP_API_URL=http://localhost:3000
REACT_APP_API_TIMEOUT=30000
REACT_APP_STRIPE_PUBLIC_KEY=pk_test_...

# Инструкция
# 1. Скопируй этот файл: cp .env.example .env.local
# 2. Заполни настоящие значения в .env.local

Распространённые ошибки

# Ошибка 1: Коммитить .env в git
git add .env  # ПЛОХО!
# Решение: добавить в .gitignore
echo ".env" >> .gitignore
echo ".env.local" >> .gitignore

# Ошибка 2: Не переполнять значения для публичных ключей
# ПЛОХО: REACT_APP_SECRET_API_KEY=sk_secret_123
# ХОРОШО: используй только публичные ключи с NEXT_PUBLIC_

# Ошибка 3: Забыть загрузить dotenv модуль
require('dotenv').config(); // Важно добавить в первую строку

# Ошибка 4: Использовать пробелы неправильно
# ПЛОХО: API_KEY = sk_123 (пробелы вокруг =)
# ХОРОШО: API_KEY=sk_123

Пример в React компоненте

// lib/api.ts
const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3000';

export async function fetchUser(id: string) {
  const response = await fetch(`${API_URL}/api/users/${id}`);
  if (!response.ok) {
    throw new Error(`Failed to fetch user: ${response.statusText}`);
  }
  return response.json();
}

// components/UserProfile.tsx
import { fetchUser } from '@/lib/api';

export default function UserProfile({ userId }: { userId: string }) {
  const [user, setUser] = React.useState(null);
  const [loading, setLoading] = React.useState(true);

  React.useEffect(() => {
    fetchUser(userId)
      .then(setUser)
      .catch(console.error)
      .finally(() => setLoading(false));
  }, [userId]);

  if (loading) return <div>Loading...</div>;
  if (!user) return <div>Not found</div>;

  return <div>{user.name}</div>;
}

Проверка переменных при запуске

// lib/validateEnv.ts
export function validateEnv() {
  const required = [
    'REACT_APP_API_URL',
    'REACT_APP_STRIPE_PUBLIC_KEY'
  ];

  const missing = required.filter(
    (key) => !process.env[key]
  );

  if (missing.length > 0) {
    throw new Error(
      `Missing required environment variables: ${missing.join(', ')}`
    );
  }
}

// pages/_app.tsx
import { validateEnv } from '@/lib/validateEnv';

validateEnv(); // Проверяем при запуске

export default function App({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

Security best practices

# 1. НИКОГДА не коммитить .env
.env
.env.local
.env.*.local

# 2. Хранить в .env.example только примеры
REACT_APP_API_URL=http://localhost:3000
REACT_APP_API_KEY=YOUR_API_KEY_HERE

# 3. Ротировать секреты регулярно
# Если секрет утёк - сразу его изменить на сервере

# 4. Разные секреты для разных окружений
# Production секрет != development секрет

Заключение

.env файл критичен для:

  • Безопасности (не коммитить секреты)
  • Конфигурации (разные значения для dev/staging/prod)
  • Гибкости (не менять код, менять только переменные)
  • Удобства (каждый разработчик использует свой .env.local)

Всегда помни: НИКОГДА не коммитить настоящие секреты в git!

Для чего нужен файл .env? | PrepBro