Секреты и .env

Администратор онлайн-школы «Кодиум» прислала в рабочий чат токен Telegram-бота с припиской «вот токен, вставь куда надо». Школа выдуманная, она будет нашим заказчиком весь трек, а ситуация самая настоящая: заказчики пересылают пароли и ключи как обычный текст. Что с ним делать дальше, решаешь ты. Если токен окажется прямо в коде, а код уедет на GitHub, писать от имени бота школы сможет любой, кто откроет репозиторий.

Чему научишься в этом уроке:
• хранить токены и ключи в файле .env, а не в коде;
• спрятать .env от git и проверить это одной командой;
• передать проект заказчику без своих секретов, через .env.example;
• знать, что делать, если ключ всё-таки попал в коммит.

Что такое секрет

Представь ключ от офиса школы. Пока он у тебя в кармане, всё спокойно. Оставил его на столе в кафе, и уже неважно, пропало ли что-то: замок придётся менять. С цифровыми ключами так же. Секрет (строка, которая даёт доступ к чужим деньгам или данным) нельзя показывать никому, кроме программы, которой он нужен. Токен бота, ключ к модели через CloseRouter, пароль базы данных: всё это секреты. Утёкший ключ к модели означает, что кто-то потратит твой баланс, утёкший токен бота означает, что кто-то напишет клиентам школы от её имени.

Правило: секреты живут в файле .env

Секреты складывают в отдельный файл .env в папке проекта (от английского environment, «окружение»). Каждая строка в нём устроена одинаково: имя, знак «=», значение. Программа ищет значение по имени слева, поэтому имя пишут точно так, как его ждёт код. Ключ к модели в следующих уроках будет называться ANTHROPIC_API_KEY.

BOT_TOKEN=<твой токен>
ANTHROPIC_API_KEY=<твой ключ>

В коде остаётся только имя: «возьми значение BOT_TOKEN из окружения». Сам код можно показать кому угодно, ключа в нём нет.

Как создать файл с точкой в начале имени

Проводник Windows не даст создать файл .env правой кнопкой мыши: имя, которое начинается с точки, он считает пустым. Проще всего попросить агента: «создай в папке проекта файл .env со строкой BOT_TOKEN= без значения». Значение потом впиши сам, открыв файл в редакторе. Так ключ не попадёт в переписку с агентом. Если работаешь в терминале PowerShell, файл создаётся одной командой в папке проекта:

Set-Content -Encoding utf8 .env 'BOT_TOKEN='
Часть -Encoding utf8 нужна. Без неё PowerShell может записать файл в другой кодировке, и программа прочитает токен с мусором в начале. Ошибка будет звучать как «неверный токен», хотя токен верный.

Прячем .env от git

В уроке «git и GitHub» ты сделал папку проекта репозиторием и сохранял версии. git забирает в историю всё, что видит, поэтому ему нужен список исключений: файл .gitignore. Достаточно одной строки:

.env

Файл .gitignore тоже начинается с точки, создавай его так же, как .env. Проверка занимает секунду. Команду вводи в терминале в папке проекта или попроси агента её выполнить:

git check-ignore .env
.env

Если команда вернула .env, git этот файл не видит, всё правильно. Пустой ответ означает, что строки в .gitignore нет или в ней опечатка. Вторая проверка: git status. В списке изменений .env появляться не должен.

Схема папки проекта «bot-kodium»: файлы main.py, .env, .env.example, .gitignore. Стрелка от .gitignore к .env с подписью «git не забирает». Файл .env подсвечен как секретный, в нём строки BOT_TOKEN=<твой токен> и ANTHROPIC_API_KEY=<твой ключ>. Файл .env.example рядом с теми же именами без значений, стрелка от него к значку заказчика с подписью «уходит заказчику».

Если ключ уже попал в коммит

git помнит всю историю. Удалишь .env следующим коммитом, а ключ останется в старой версии, и его можно достать. Поэтому порядок один: сначала отозвать ключ там, где его выдали, и выпустить новый, потом поправить .gitignore. Для токена бота это делается в BotFather, для ключа модели в кабинете CloseRouter. Отозванный ключ уже ничего не открывает, и неважно, кто его видел.

Ключ самого Claude Code

Если ты идёшь дорожкой «без подписки», ключ CloseRouter лежит не в проекте, а в файле %USERPROFILE%\.claude\settings.json (так его подключали в уроке «Установка Claude Code»). Этот файл не уезжает в репозиторий проекта, но правила те же: не показывать его на скриншотах и не пересылать целиком.

Как передать проект заказчику: .env.example

Школе нужен проект, а не твои ключи. Рядом с .env кладут .env.example: те же имена, но без значений. Этот файл git сохраняет, и он уходит заказчику вместе с кодом. Администратор школы копирует его в свой .env и вписывает токен своего бота.

BOT_TOKEN=
ANTHROPIC_API_KEY=

Если не получилось

  • git check-ignore ответил «fatal: not a git repository». Терминал открыт не в папке проекта или в ней не было git init. Перейди в папку проекта и повтори.
  • Команда ответила пусто. Открой .gitignore и проверь строку: ровно .env, без пробелов и без расширения .txt у самого файла.
  • .env уже был в коммите до .gitignore. git продолжает за ним следить. Попроси агента «убери .env из отслеживания git, файл не удаляй». После этого отзови ключ, он уже в истории.
  • Программа пишет, что токен неверный, хотя он верный. Пересоздай .env с -Encoding utf8 или через агента и проверь, что вокруг значения нет кавычек и пробелов.

Контрольный вопрос. Разбор чужой ошибки. Джун собрал бота для школы так. Отметь все проблемы.

Исходный код для этого задания:

BOT_TOKEN = "12345:AbCdEf..."
print("Запускаю бота с токеном", BOT_TOKEN)

Выберите все верные варианты.

АДостаточно переименовать переменную, тогда токен не найдут
БТокен печатается в лог, и секрет окажется в логах
ВТокен вписан прямо в код, его место в .env
ГЕсли код попадёт в репозиторий, токен утечёт вместе с ним
ДПроблем нет, репозиторий же закрытый

Подсказка: Секрет не должен оказаться ни в коде, ни в логах, ни в истории git. Закрытый репозиторий тоже видят люди и сервисы.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. Ты выполнил git check-ignore .env, и команда ничего не вывела. Что это значит?

АВсё в порядке, .env уже спрятан
БФайл .env повреждён, проект надо пересоздать
ВКоманда не сработала, её надо запустить от администратора
Гgit пока видит .env: в .gitignore нет нужной строки или в ней опечатка

Подсказка: Вспомни, что команда выводит, когда файл действительно в исключениях.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. Ты заметил, что неделю назад отправил на GitHub коммит с файлом .env, где лежит ключ CloseRouter. Что сделать первым?

АУдалить .env следующим коммитом
БОтозвать ключ в кабинете и выпустить новый
ВСделать репозиторий закрытым
ГПереписать историю git, чтобы коммит исчез

Подсказка: Подумай, что хранит git про старые версии и что перестанет работать после каждого из действий.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Задание. МИССИЯ «Сейф для секретов». Возьми проект из урока «Первый проект» или «git и GitHub». Создай в нём .env со строками BOT_TOKEN и ANTHROPIC_API_KEY (значения можно оставить заглушками, настоящие ключи появятся позже), файл .env.example с теми же именами без значений и .gitignore со строкой .env. Сделай коммит. Приложи: (1) скриншот терминала с командой git check-ignore .env и её ответом; (2) скриншот git status или списка файлов последнего коммита, где нет .env; (3) содержимое .env.example текстом. Принято, если: команда вернула .env; в коммите есть .env.example и .gitignore, а .env нет; в .env.example только имена без значений; на скриншотах не видно ни одного настоящего токена или ключа.

Подсказка: Если на скриншот случайно попал настоящий ключ и ты его уже отправил, отзови ключ и выпусти новый. Закрыть значение можно прямоугольником в любом редакторе картинок.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Что дальше

Свои секреты ты теперь хранишь правильно. Следующий урок про вторую сторону безопасности: агент, у которого есть доступ к твоей папке, может принять чужой текст за твою команду.

Итог:
• секреты лежат в .env, в коде только их имена;
• строка .env в .gitignore прячет файл от git, проверка: git check-ignore .env;
• заказчик получает .env.example с именами без значений;
• ключ, попавший в коммит, отзывают и выпускают новый, удаление файла не помогает.

← Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева