Episode ini membahas konfigurasi aplikasi yang aman: Twelve-Factor config melalui environment variables, pemuatan .env dengan python-dotenv, alat seperti dynaconf dan pydantic settings, serta best practice mengelola secret agar tidak pernah ter-commit ke Git.

Konfigurasi dan secret adalah bagian yang paling sering disepelekan namun paling krusial. Episode 11 membahas cara mengelola konfigurasi aplikasi dengan benar: memisahkan konfigurasi dari kode, memuatnya dari environment, dan melindungi secret agar tidak pernah bocor ke Git.
Kita akan mempelajari Twelve-Factor config, python-dotenv, alat modern seperti dynaconf dan pydantic-settings, serta best practice yang diadopsi tim produksi di seluruh dunia.
Twelve-Factor App adalah metodologi membangun aplikasi modern. Prinsip ketiganya menyatakan: simpan konfigurasi di environment. Konfigurasi adalah segala sesuatu yang berbeda antar deployment — URL database, kredensial, dan fitur toggle.
import os
host = os.getenv("DATABASE_HOST", "localhost")
port = os.getenv("DATABASE_PORT", "5432")
print(host, port)os.getenv("DATABASE_HOST", "localhost") membaca environment variable dengan nilai default. Konfigurasi yang dipegang environment bisa berubah tanpa mengubah kode — fondasi deployment yang fleksibel.
Menyimpan konfigurasi di kode menimbulkan masalah: kode tidak bisa dipakai ulang antar environment, dan secret ikut ter-commit ke Git. Dengan environment, konfigurasi dev dan production berbeda tanpa mengubah kode sumber sama sekali.
Saat pengembangan lokal, mengetik export berulang kali tidak praktis. python-dotenv memuat file .env ke environment:
pip install python-dotenvfrom dotenv import load_dotenv
import os
load_dotenv()
database_url = os.getenv("DATABASE_URL")
print(database_url)load_dotenv() membaca file .env di direktori kerja dan memasukkan isinya ke environment. Setelah itu os.getenv langsung bekerja. Ini mempercepat setup lokal tanpa mengorbankan konsistensi.
File .env berisi pasangan kunci dan nilai:
DATABASE_URL=postgresql://user:pass@localhost/db
API_KEY=secret-anda-jangan-di-commit
LOG_LEVEL=INFOFile .env ini wajib masuk .gitignore — kita akan bahas caranya di bagian secret. Isinya spesifik per pengembang, tidak boleh dibagikan lewat Git.
dynaconf menyediakan konfigurasi berlapis dengan dukungan banyak format:
pip install dynaconffrom dynaconf import Dynaconf
settings = Dynaconf(
settings_files=["settings.toml", ".env"],
envvar_prefix="APP",
)
print(settings.host)
print(settings.get("port", 8000))Dynaconf(settings_files=["settings.toml", ".env"]) memuat konfigurasi dari beberapa sumber dengan prioritas. envvar_prefix="APP" berarti env var seperti APP_PORT juga dikenali. dynaconf cocok untuk aplikasi dengan banyak lapisan konfigurasi.
pydantic-settings memadukan pydantic dengan environment:
pip install pydantic-settingsfrom pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
app_name: str
database_url: str
debug: bool = False
model_config = SettingsConfigDict(env_file=".env")
settings = Settings()
print(settings.app_name)class Settings(BaseSettings) mendefinisikan konfigurasi dengan tipe dan validasi otomatis. model_config menunjuk file .env. Jika database_url tidak ada atau tipe salah, aplikasi gagal saat startup — jauh lebih baik daripada error di tengah jalan.
Aturan pertama pengelolaan secret: jangan pernah commit ke Git:
.env
*.env
!.env.exampleBaris .env dan *.env mengecualikan file secret dari Git. Pengecualian !.env.example tetap mengizinkan template tanpa nilai rahasia untuk di-commit. Ini praktik standar semua project Python profesional.
Commit template kosong agar tim tahu variabel apa yang diperlukan:
DATABASE_URL=postgresql://user:pass@localhost/db
API_KEY=ganti-dengan-key-anda
LOG_LEVEL=INFOFile .env.example berisi nama variabel dengan nilai contoh atau placeholder. Anggota tim baru tinggal menyalinnya menjadi .env dan mengisi nilai nyata. Template ini aman untuk di-commit karena tidak berisi secret.
Di production, secret sebaiknya dikelola oleh sistem khusus, bukan di file:
Aturan emasnya: secret disuntikkan saat runtime, bukan ditulis di kode atau image. Kalian akan mempraktikkannya saat deployment di episode 20.
Inti yang harus dibawa pulang:
Di episode 12 selanjutnya kita akan membahas networking dasar dan HTTP clients — penggunaan modern requests, httpx untuk sync dan async, pengaturan retries, timeouts, dan connection pooling, serta gambaran server WSGI dengan Gunicorn dan ASGI dengan Uvicorn. Project kalian mulai berkomunikasi dengan dunia luar!