Переменные окружения и API-ключи
Почти каждый проект работает с внешними сервисами: Telegram, OpenAI, база данных. Для каждого нужен ключ — токен или пароль. Эту главу пропускают чаще всего — и потом сталкиваются с утечкой ключей или сломанным деплоем.
Проблема: ключи нельзя хранить в коде
Представь такой код:
bot = Bot(token="7123456789:AAHxx...")Этот токен — конфиденциальная информация. Если ты загрузишь этот файл на GitHub (даже в приватный репозиторий), ключ окажется в истории git. Если репозиторий когда-нибудь станет публичным или кто-то получит доступ — ключ утечёт.
Проще говоря
Представь, что пароль от квартиры написан у тебя на куртке. Ты постоянно его видишь — удобно. Но все вокруг его тоже видят. Переменные окружения — это когда пароль у тебя в голове: ты его знаешь, куртка чистая.
Решение: файл .env
.env — это файл в корне проекта, в котором хранятся ключи и пароли. Он не попадает в git. Код читает значения из него.
Пример файла .env:
TELEGRAM_BOT_TOKEN=7123456789:AAHxx...
OPENAI_API_KEY=sk-...
DATABASE_URL=postgresql://user:password@localhost:5432/mydbОдин файл — все ключи. Удобно менять без правки кода.
Шаг 1: Создай .gitignore
Прежде всего — убедись что .env не попадёт в git. В корне проекта создай файл .gitignore:
.env
.env.local
.env.production
__pycache__/
*.pyc
node_modules/С этим файлом git будет игнорировать .env — он останется только у тебя локально.
Если .env уже в git
Если ты случайно закоммитил .env, просто удалить файл не поможет — он останется в истории. Нужно аннулировать ключи (создать новые в сервисе) и поменять их. Проще всего: удали старый ключ в сервисе → создай новый → обнови .env. Старый ключ больше не работает — утечки нет.
Шаг 2: Читай .env в коде
Python
Установи библиотеку python-dotenv:
pip install python-dotenvВ начале главного файла:
from dotenv import load_dotenv
import os
load_dotenv() # загружает .env
token = os.getenv("TELEGRAM_BOT_TOKEN")
api_key = os.getenv("OPENAI_API_KEY")JavaScript / Node.js
Установи dotenv:
npm install dotenvВ начале файла:
require('dotenv').config()
const token = process.env.TELEGRAM_BOT_TOKEN
const apiKey = process.env.OPENAI_API_KEYШаг 3: На сервере — устанавливай вручную
На сервере файл .env не появится сам — его нет в git. Нужно создать его руками один раз:
nano /opt/myproject/.envВставь содержимое (те же переменные что и локально), сохрани (Ctrl+O → Enter → Ctrl+X).
После этого приложение читает ключи из этого файла на сервере.
Проще говоря
Файл .env — как флешка с паролями. Ты её не отправляешь в интернет, не кладёшь в облако. Просто переносишь физически — с компьютера на сервер один раз через терминал.
Шаг 4: Проверь что всё правильно
Убедись, что .gitignore работает:
git statusЕсли .env в списке файлов — он попадёт в коммит. Если не виден — всё правильно.
Проверь что .gitignore содержит строку .env:
cat .gitignoreЧастые ошибки
None вместо значения ключа
print(os.getenv("TELEGRAM_BOT_TOKEN")) # NoneПричина: load_dotenv() не вызван, или .env файл не там (не в том каталоге). Убедись что load_dotenv() стоит раньше os.getenv().
Переменная есть локально, но нет на сервере
Причина: на сервере не создан .env. Зайди по SSH, создай файл, добавь переменные.
ИИ вставил ключ прямо в код
Когда ты просишь ИИ написать код с API, он может вставить пример ключа. Всегда проверяй — замени на os.getenv("KEY_NAME") и переноси реальный ключ в .env.
Что дальше?
Ключи в безопасности. В следующей главе разберём — что делать когда что-то сломалось.