Модуль 20

Конфігурація застосунку та env-змінні

Ось готовий урок, створений за твоїм майстер-промптом.


🏛️ CS50: Конфігурація застосунку та змінні оточення (Environment Variables)

Привіт, друзі! 👋 Це CS50 (умовно 😉), і сьогодні ми поговоримо про річ, яка перетворює ваш код із "домашньої поробки" на професійний, безпечний та гнучкий інструмент.

Сьогоднішня тема — Environment Variables або змінні оточення.


1. 🔥 Вступ: Чому не можна "просто написати в коді"?

Уявіть ситуацію. Ви написали крутого Telegram-бота. Щоб він працював, ви отримали від Telegram секретний токен (набір букв і цифр). Ви вставили його прямо в код:

bot_token = "12345:ABC-SECRET-TOKEN"

Ви залили цей код на GitHub. І знаєте що сталося через 30 секунд? Вам написав незнайомець і сказав, що тепер це ЙОГО бот.

Або інша ситуація: ви розробляєте інтернет-магазин. На вашому ноутбуці база даних називається localhost, а на реальному сервері — prod-db-server. ❓ Питання: Що ви будете робити? Кожного разу перед завантаженням на сервер вручну переписувати рядок коду? А якщо серверів десять?

Це проблема жорсткого кодування (hardcoding).

Аналогія: Уявіть, що ви купили настільну лампу. * Хардкод — це якби дріт від лампи був вмурований у стіну вашої спальні. Ви не можете перенести лампу на кухню, не роздовбавши стіну. * Конфігурація (Env vars) — це звичайна вилка і розетка. Лампа одна й та сама (код), але ви можете "встромити" її в спальні, на кухні або в офісі (різні середовища).

Сьогодні ми навчимося робити ваші програми "переносними" та безпечними.


2. 🧠 Теоретична база: Що це за "змінні"?

Давайте заглянемо під капот. Коли ви запускаєте будь-яку програму (процес) на вашому комп'ютері (неважливо, Windows, MacOS чи Linux), операційна система створює для неї маленький "рюкзачок" із даними. Це і є оточення (Environment).

В цьому "рюкзаку" лежать пари КЛЮЧ=ЗНАЧЕННЯ. Програма може в будь-який момент залізти в рюкзак і спитати: "Ей, а яка зараз мова системи?" або "Де лежить папка користувача?".

🔑 Що треба зрозуміти інтуїтивно:

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

📌 Що запам'ятати обов'язково (The 12-Factor App):

Є такий золотий стандарт розробки — "The Twelve-Factor App". Одне з правил говорить:

"Зберігайте конфігурацію в оточенні."

Код залишається незмінним, змінюється лише конфігурація навколо нього.


3. 🧪 Приклади: Від простого до реального

Для прикладів будемо використовувати Python, але логіка однакова і для JavaScript, і для Go, і для PHP.

Приклад 1: Що вже є у вашому "рюкзаку"?

Перш ніж створювати свої змінні, подивимося, що нам дала система.

import os

# Запитуємо у системи: "Хто зараз користувач?"
user = os.environ.get('USER') # На Windows може бути 'USERNAME'

print(f"Привіт, {user}!")

Очікування: Що виведе цей код? Ваше ім'я в системі. Реальність: Програма адаптувалася під вас. Запустіть це на комп'ютері друга — вона привітає друга. Код ми не змінювали!


Приклад 2: Симуляція "Бойового" режиму

Уявіть, що у нас є програма, яка поводиться по-різному: коли ви її тестуєте (DEBUG=True) і коли вона працює для клієнтів (DEBUG=False).

import os

# Читаємо змінну. Якщо її немає, вважаємо, що це False
debug_mode = os.environ.get('MY_APP_DEBUG')

if debug_mode == "True":
    print("🔧 РЕЖИМ РОЗРОБНИКА: Показуємо всі помилки і деталі.")
else:
    print("users 👀 РЕЖИМ ПРОДАКШН: Все працює тихо і стабільно.")

Як це запустити? У терміналі ми можемо передати змінну прямо перед командою (на Linux/Mac):

MY_APP_DEBUG=True python my_app.py

Результат: "🔧 РЕЖИМ РОЗРОБНИКА..."

python my_app.py

Результат: "👀 РЕЖИМ ПРОДАКШН..."

Бачите? Ми керуємо логікою програми ззовні, не торкаючись файлу .py!


Приклад 3: Файл .env (Як це роблять профі)

Вводити змінні в терміналі щоразу — незручно. Профі використовують файл .env. Це просто текстовий файл.

Крок 1. Створюємо файл .env:

DB_PASSWORD=SuperSecretPassword123
API_KEY=xyz-987-abc

Крок 2. Використовуємо бібліотеку (наприклад, python-dotenv), щоб завантажити ці змінні в програму автоматично.

# Спочатку треба встановити: pip install python-dotenv
import os
from dotenv import load_dotenv

# Ця магія завантажує дані з .env у "рюкзак" програми
load_dotenv()

secret = os.getenv("DB_PASSWORD")

print(f"З'єднуюсь з базою даних використовуючи пароль: {secret}")

Тепер ваш пароль лежить у файлі, а не в коді.


4. 🛠 Практична частина

Час забруднити руки! Виконайте ці завдання:

🔹 Завдання 1: "Hello, Admin" Напишіть скрипт, який зчитує змінну ADMIN_NAME. Якщо змінна є — виводить "Welcome, Master [Ім'я]". Якщо немає — "Access Denied". Запустіть скрипт, змінюючи значення змінної в терміналі.

🔹 Завдання 2: Файл .env Створіть проєкт. Створіть файл .env. Запишіть туди COLOR=Green. Напишіть програму, яка читає цей колір і пише "Я люблю [Колір]". Потім змініть у файлі на Red і перезапустіть.

🔹 Завдання 3: "А що, якщо..." (Пріоритети) У вас є файл .env, де CITY=Kyiv. Спробуйте запустити програму командою: CITY=Lviv python main.py Що виведе програма: Київ чи Львів? Чому? (Це навчить вас пріоритетам змінних).

🔹 Завдання 4: Фатальна помилка (Fix it) Уявіть код, який підключається до банку: api_key = os.environ['BANK_KEY'] Якщо змінної немає, програма "впаде" з помилкою KeyError. Завдання: Перепишіть код так, щоб він перевіряв наявність ключа і, якщо його немає, виводив ввічливе повідомлення "Помилка конфігурації: відсутній ключ банку" і коректно завершував роботу, а не "крашився".

🔹 Завдання 5: .gitignore (Найважливіше!) Створіть файл .gitignore і додайте туди один рядок: .env. Перевірте командою git status, чи бачить git ваш файл із секретами. Якщо ні — ви впоралися!


5. 💡 Мислення як у розробника

Як відрізнити новачка від сеньйора в цій темі?

❌ Типова помилка новачка:

Він додає файл .env у репозиторій Git. Чому це погано: Історія Git пам'ятає все. Навіть якщо ви потім видалите файл, хакери можуть знайти його в історії комітів. Як думає сеньйор: "Секрети ніколи не потрапляють у контроль версій. У Git лежить тільки файл .env.example, де описано, які змінні потрібні, але без значень (наприклад, DB_PASSWORD=change_me)."

❌ Помилка: Дефолтні значення для всього

Новачок пише: os.getenv('SECRET_KEY', 'default_key'). Як думає сеньйор: "Для критичних речей (паролі, ключі шифрування) дефолтних значень бути не може! Програма має впасти на старті, якщо я забув налаштувати безпеку, а не запуститися з дірявим дефолтним ключем."

💡 Порада з практики:

Уявіть, що ваш код — це рецепт піци 🍕. Змінні оточення — це інгредієнти, які ви купуєте. В Італії ви купите одну моцарелу, в Україні — іншу. Рецепт (код) один, смак (результат) трохи різний залежно від "середовища". Не пишіть у рецепті "Купити сир у магазині АТБ на вулиці Шевченка, 10". Пишіть просто "Сир". А де його взяти — це вже конфігурація.


6. 🧩 Підсумок

Отже, що ми сьогодні зробили? 1. Зрозуміли, що хардкод — це зло. 2. Навчилися виносити налаштування у змінні оточення. 3. Захистили свої паролі за допомогою .env та .gitignore.

Тепер ви вмієте писати код, який можна безпечно викладати на GitHub і легко запускати як на своєму ноуті, так і на потужних серверах Amazon чи Google.

🚀 Тизер наступного уроку: Окей, ми навчилися налаштовувати програму. Але як запустити її так, щоб вона працювала абсолютно однаково на моєму Mac і на твоєму Windows, не встановлюючи купу бібліотек вручну? Наступного разу ми поговоримо про Docker і контейнеризацію. Це як змінні оточення, але для всієї операційної системи!

А поки що — це був CS50! 💻✨