Представь что ты написал программу с API-ключом прямо в коде и залил её на GitHub. Через час тебе приходит уведомление — боты уже нашли ключ и сделали 10 000 запросов от твоего имени. Твой аккаунт заблокирован.
Это реальная история. Происходит регулярно.
Правило: секреты не живут в коде
Никогда не храни в коде:
- API-ключи
- Пароли к базам данных
- Токены авторизации
- Секретные ключи приложения
Почему это критично:
- Git хранит всю историю — даже если удалишь ключ из последнего коммита, он останется в истории
- Публичный репозиторий = доступ всему миру
- Боты сканируют GitHub 24/7 в поисках ключей
Решение: файл .env
.env — текстовый файл с переменными окружения. Он хранится только локально и никогда не попадает в git.
# .env
DATABASE_URL=postgresql://user:password@localhost/mydb
API_KEY=abc123def456ghi789
SECRET_KEY=very-secret-key
DEBUG=True
Формат: ИМЯ=значение, без пробелов вокруг =.
python-dotenv: загружаем .env в Python
pip install python-dotenv
from dotenv import load_dotenv
import os
load_dotenv() # загружает переменные из .env в os.environ
api_key = os.getenv("API_KEY") # "abc123def456ghi789"
debug = os.getenv("DEBUG", "False") # второй аргумент — значение по умолчанию
load_dotenv() должен вызываться до первого os.getenv().
.gitignore: защищаем .env
Добавь .env в .gitignore — тогда git вообще не будет его видеть:
# .gitignore
.env
.env.local
.env.production
.venv/
__pycache__/
Проверить что файл игнорируется:
git status # .env не должен появляться в списке
Несколько окружений
Часто нужны разные настройки для разработки и продакшена:
.env # локальная разработка (в gitignore)
.env.example # шаблон без значений (коммитится в git!)
.env.production # продакшен (на сервере, не в git)
Файл .env.example показывает какие переменные нужны, но без реальных значений:
# .env.example
API_KEY=
DATABASE_URL=
SECRET_KEY=
Новый разработчик клонирует репозиторий, копирует .env.example в .env и заполняет своими значениями.
Передача секретов на сервер
На продакшен-сервере .env файл не нужен — там переменные задаются иначе:
# Heroku:
heroku config:set API_KEY=abc123
# Railway / Render / другие хостинги:
# Через веб-интерфейс в разделе Environment Variables
# Kubernetes:
kubectl create secret generic my-secret --from-literal=API_KEY=abc123
Код остаётся одинаковым — os.getenv("API_KEY") работает везде.
Типичные ошибки
os.getenv возвращает None
# Неправильно — load_dotenv после os.getenv:
api_key = os.getenv("API_KEY") # None
load_dotenv()
# Правильно:
load_dotenv()
api_key = os.getenv("API_KEY") # значение из .env
В .env есть пробелы вокруг =
API_KEY = abc123 # ← неправильно, python-dotenv не разбирает
API_KEY=abc123 # ← правильно
Файл называется env вместо .env
Обязательна точка в начале: .env — это скрытый файл на Unix-системах.
Итог
Паттерн прост: все секреты в .env, .env в .gitignore, в код только os.getenv(). Этого правила достаточно чтобы никогда не утечь ключи через git.
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!