Администратор онлайн-школы «Кодиум» прислала в рабочий чат токен 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 появляться не должен.

Если ключ уже попал в коммит
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)Выберите все верные варианты.
Подсказка: Секрет не должен оказаться ни в коде, ни в логах, ни в истории git. Закрытый репозиторий тоже видят люди и сервисы.
На курсе задания проверяются автоматически. Решить первое задание бесплатно → · Подобрать курс
Контрольный вопрос. Ты выполнил git check-ignore .env, и команда ничего не вывела. Что это значит?
Подсказка: Вспомни, что команда выводит, когда файл действительно в исключениях.
На курсе задания проверяются автоматически. Решить первое задание бесплатно → · Подобрать курс
Контрольный вопрос. Ты заметил, что неделю назад отправил на GitHub коммит с файлом .env, где лежит ключ CloseRouter. Что сделать первым?
Подсказка: Подумай, что хранит 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 с именами без значений;
• ключ, попавший в коммит, отзывают и выпускают новый, удаление файла не помогает.
