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

Зачем нужен env?

2.0 Middle🔥 111 комментариев
#DevOps и инфраструктура

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

Environment Variables (env) — конфигурация вне кода

Env переменные отделяют конфигурацию от исходного кода. Это позволяет использовать один код в разных окружениях (dev, staging, production) без изменений.

Основная задача

Проблема без env переменных:

# ❌ Секреты в коде
DATABASE_URL = "postgresql://localhost/mydb"
SECRET_KEY = "my-secret-key-123"
API_KEY = "sk_test_abc123"

Риски:

  • Секреты видны в Git
  • Разные конфиги для разных окружений
  • Невозможно скрывать пароли

Правильно: конфигурация из env

import os
from dotenv import load_dotenv

load_dotenv()  # Загружаем из .env

class Config:
    DATABASE_URL = os.getenv('DATABASE_URL')
    SECRET_KEY = os.getenv('SECRET_KEY')
    DEBUG = os.getenv('DEBUG', 'false') == 'true'

app = FastAPI()

Конфигурация хранится отдельно от кода.

Способ 1: .env файл

# .env (в .gitignore!)
DATABASE_URL=postgresql://localhost/mydb
REDIS_URL=redis://localhost:6379
SECRET_KEY=dev-secret
JWT_SECRET=jwt-secret
DEBUG=true
from dotenv import load_dotenv
import os

load_dotenv()
database_url = os.getenv('DATABASE_URL')

Способ 2: Pydantic Settings (рекомендуется)

from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    database_url: str
    jwt_secret: str
    debug: bool = False
    log_level: str = "INFO"
    
    class Config:
        env_file = ".env"

settings = Settings()

Преимущества:

  • Валидация типов (int, bool, URL)
  • Дефолтные значения
  • IDE автодополнение
  • Чёткая документация

На сервере (Docker, Kubernetes)

Docker Compose:

services:
  api:
    environment:
      DATABASE_URL: postgresql://db:5432/mydb
      SECRET_KEY: ${SECRET_KEY}
      DEBUG: "false"

Kubernetes Secrets:

apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
stringData:
  JWT_SECRET: super-secret
  DATABASE_PASSWORD: secret-pass

Типичный набор переменных

# Окружение
ENVIRONMENT=production
DEBUG=false

# БД
DATABASE_URL=postgresql://user:pass@host/db
REDIS_URL=redis://host:6379

# Безопасность (СЕКРЕТЫ!)
SECRET_KEY=ultra-secret
JWT_SECRET=jwt-secret
JWT_EXPIRATION=3600

# Интеграции
SENDGRID_API_KEY=SG.xxx
STRIPE_API_KEY=sk_live_xxx

# Приложение
CORS_ORIGINS=https://example.com
MAX_UPLOAD_SIZE=10485760

Безопасность

В env нужно:

  • API ключи и токены
  • Пароли БД
  • Секреты для подписи
  • Приватные ключи

В env НЕ нужно:

  • Имя приложения
  • Версия
  • Логирование уровни
  • Количество воркеров

Обязательно

# .gitignore
.env
.env.local
.env.*.local

Итог

Env переменные нужны для:

Безопасность — секреты не видны в коде
Гибкость — один код для всех окружений
DevOps стандарт — контейнеры и оркестрация используют env
Командная работа — каждый разработчик свой .env
CI/CD — переменные передаются в pipeline

Это базовый инструмент в профессиональной разработке.