Назад до блогу

Початок роботиПосібник

Безпечне зберігання API-ключа: змінна середовища, .gitignore, виправлення витоку

Тримайте свій ключ CheapTokens поза кодом і git: задайте змінну середовища, додайте .env до .gitignore і знайте, що робити, якщо ключ витече.

Автор: CheapTokens TeamОпубліковано 5 хв читання

Термінал з експортом змінної середовища та рядком .gitignore для API-ключа
На цій сторінці
  1. Чому ключу не місце в коді
  2. Крок 1: покладіть ключ у змінну середовища
  3. Крок 2: використовуйте файл .env, не комітячи його
  4. Якщо ключ витік: що робити, по порядку
  5. Перевірте себе

Тримайте ключ у змінній середовища, а не в коді, і не додавайте файл .env до git — додайте рядок у .gitignore. Якщо ключ уже потрапив у публічний доступ, спершу розберіться з ключем, а прибирання робіть після: чистити історію git, поки ключ досі лежить у вашому коді та інструментах, нічого не виправляє.

Ось і вся ідея. Цей посібник — практична версія (основи — у What is an API key): три команди, один робочий запит і короткий план на поганий день.

Чому ключу не місце в коді#

API-ключ — це пароль, який витрачає ваші гроші. Будь-хто, хто його має, може надсилати запити за ваш рахунок, і сервіс не відрізнить їх від вас.

Зазвичай усе ламається нудно. Ви вставляєте ключ у скрипт, щоб отримати перший робочий запит, скрипт працює, ви робите git push, і репозиторій стає публічним. Або надсилаєте колезі свій файл конфігурації. Або робите скриншот помилки, де ключ видно в кутку. Результат щоразу той самий.

GitHub добре знає цей патерн. Його сканування секретів (GitHub docs, перевірено 29 жовтня 2026) переглядає всю історію Git на всіх гілках у пошуках захардкоджених облікових даних, а також issues, pull requests, discussions, вікі та секретні gists, і піднімає тривогу, коли щось знаходить. Тобто видалення рядка в наступному коміті нічого не змінює: у старому коміті він досі є.

Ось той самий скрипт до і після.

Порівняйте

Той самий скрипт, ключ винесено з коду

Ключ у коді

python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key="<your-key>",  # pasted here: ends up in git
)

Ключ зі змінної середовища

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

Другу версію можна як є відправити на GitHub, у чат чи на код-рев'ю. Ключ живе на вашій машині, поза файлом.

Крок 1: покладіть ключ у змінну середовища#

Змінна середовища — це іменоване значення, яке ваш термінал передає кожній програмі, яку запускає. Скрипт запитує CHEAPTOKENS_API_KEY за назвою і ніколи не бачить, звідки воно взялося.

На macOS і Linux:

bash
export CHEAPTOKENS_API_KEY="<your-key>"

У Windows PowerShell:

powershell
setx CHEAPTOKENS_API_KEY "<your-key>"

Дві деталі найчастіше збивають з пантелику. export діє лише для цього вікна терміналу, тож щоб зберегти його, додайте рядок у свій профіль оболонки (~/.zshrc або ~/.bashrc). А setx не змінює вікно, у якому ви його ввели: відкрийте новий термінал перед перевіркою.

Тепер повний запит. Він використовує OpenAI-сумісний ендпоінт https://api.cheaptokens.dev/v1 і DeepSeek-V4-Flash з повним id (deepseek-ai/DeepSeek-V4-Flash-0731; беріть id з документації CheapTokens, бо назви різняться між провайдерами):

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": "Say hi in five words."}],
)
print(resp.choices[0].message.content)
print(resp.usage)

Коротке привітання — це запит приблизно на 20 токенів на вході й 20 на виході, що за поточними цінами становить $0.0000023 (повний список — на сторінці цін). Якщо ви ще не надсилали першого запиту, Your first API request with CheapTokens проведе вас від нуля.

Відповідь моделі повертається в choices[0].message.content, а usage показує пораховані токени. Ключ у файлі не з'являється.

Термінал із командами .env і .gitignore
Три команди, які тримають ключ поза git

Крок 2: використовуйте файл .env, не комітячи його#

Вводити export у кожному новому вікні набридає. Файл .env тримає значення в одному місці, поруч із проєктом:

text
CHEAPTOKENS_API_KEY=<your-key>

Python читає його через python-dotenv (pip install python-dotenv):

python
from dotenv import load_dotenv
load_dotenv()  # fills os.environ from .env

Файл безпечний лише тоді, коли git його ніколи не бачить. Додайте його до .gitignore до першого коміту:

bash
echo ".env" >> .gitignore
git check-ignore -v .env

Якщо все правильно, друга команда виведе щось на кшталт .gitignore:1:.env .env: git підкаже, яке правило ігнорує файл. Якщо вона нічого не виводить, правило не працює. У Windows створіть .gitignore у редакторі з рядком .env або скористайтеся Add-Content .gitignore .env: >> у PowerShell може записати UTF-16, який git може проігнорувати.

Одна пастка: .gitignore впливає лише на файли, які git ще не відстежує. Якщо .env уже колись було закомічено, виконайте git rm --cached .env, щоб git перестав його відстежувати, і вважайте ключ усередині скомпрометованим (докладніше нижче). Корисна звичка — комітити .env.example з назвою змінної та плейсхолдером замість значення, щоб колега знав, що треба встановити.

Якщо ключ витік: що робити, по порядку#

Можливо, ключ потрапив у публічний репозиторій, можливо, засвітився на скриншоті, можливо, ви вставили весь конфіг у гілку форуму. Порядок важливіший за швидкість будь-якого окремого кроку.

Власна настанова GitHub (та сама сторінка, перевірено 29 жовтня 2026) — негайно відкликати облікові дані; переписування історії Git необов'язкове і часто непотрібне, щойно облікові дані відкликано. Люди зазвичай роблять навпаки: витрачають годину на чищення історії, поки ключ досі працює. Не робіть так.

Оберіть свій випадок

Що сталося з вашим ключем? Виберіть найближчий випадок

Ключ був у коміті, який тепер публічний

Спершу приберіть ключ з коду, перейдіть на змінну середовища, додайте .env до .gitignore і перегляньте баланс на предмет запитів, яких ви не надсилали. Чищення історії — приємний бонус потім, а не нагальна частина.

Ключ був на скриншоті або в поширеному файлі

Той самий порядок: припиніть використовувати цей ключ у своїх інструментах і перейдіть на змінну середовища, потім видаліть пост або файл, якщо можете. Видалений скриншот, можливо, вже скопіювали, тож не покладайтеся лише на видалення.

Той самий ключ використовується в кількох інструментах

Пройдіться кожним місцем, де був ключ: ваш профіль оболонки, файли .env, інструменти редактора й терміналу, — і налаштуйте кожне на змінну середовища, щоб було одне місце для зміни. Якщо інструмент не може прочитати змінну, 401/404 troubleshooting guide покаже, як виглядає помилка.

Три кроки після витоку: прибрати ключ з коду, оновити кожен інструмент, надіслати тестовий запит
Спершу ключ з коду, потім кожен інструмент, потім тестовий запит

Після прибирання надішліть один невеликий тестовий запит, як у Кроці 1, і перевірте баланс. Якщо він відповідає, а баланс і запити виглядають нормально, прибирання завершено; стежте за балансом наступні кілька днів. Ключ, що був публічним, слід вважати скомпрометованим навіть після видалення з коду, тож слідкуйте за балансом і кількістю запитів на предмет того, чого ви не надсилали, і не використовуйте цей ключ у нових місцях. Про місця, де зазвичай живе ключ, дивіться Where to plug in your own API key.

Перевірте себе#

Спробуйте саміСпробуйте: скасуйте змінну й запустіть скрипт. Що ви бачите?Показати відповідь

Python зупиняється з KeyError: 'CHEAPTOKENS_API_KEY' ще до того, як будь-який запит покине вашу машину. Це хороша відмова: скрипт відмовляється працювати без ключа, а не тихо використовує вставлений. Якщо натомість ви бачите 401, змінна встановлена, але ключ неправильний; перевірте ключ і адресу за 401/404 guide.