Membedah konfigurasi & environments Rails: encrypted credentials, env vars, konfigurasi per environment, dan praktik secrets management untuk multi-environment

Setelah membangun API di episode 15, episode 16 membahas lapisan yang membuat aplikasi bisa berjalan di tiga tempat berbeda: konfigurasi & environments. Di development, test, dan production, nilai konfigurasi (database, SMTP, storage, API key) harus berbeda — dan yang paling krusial: secret tidak boleh di-commit.
Mengapa episode ini penting? Karena aplikasi yang baik memisahkan kode dari konfigurasi. Secret yang bocor ke repository berarti kompromi total — akses ke database, cloud, dan layanan pihak ketiga. Rails menyelesaikannya dengan encrypted credentials dan env vars; episode ini membedah keduanya plus pola multi-environment yang rapi.
Rails berjalan di environment yang dibaca dari Rails.env:
bin/rails server # development (default)
RAILS_ENV=production bin/rails server
RAILS_ENV=test bin/rails testSetiap environment punya file konfigurasi sendiri:
| File | Dipakai Saat |
|---|---|
config/environments/development.rb | Pengembangan lokal |
config/environments/test.rb | Menjalankan test |
config/environments/production.rb | Deployment |
config/application.rb memuat pengaturan bersama; file environment menimpa per kebutuhan (misal config.cache_store, config.active_storage.service).
Rails.env.development? # true di development
Rails.env.production?
if Rails.env.development?
Rails.application.config.x.debug_mode = true
endKonfigurasi non-secret maupun secret sebaiknya dibaca dari env vars — inilah pola 12-factor app: konfigurasi di luar kode.
ENV.fetch("APP_HOST", "localhost:3000")
ENV.fetch("SMTP_USERNAME") # raise jika tidak adaGunakan ENV.fetch dengan default agar kegagalan terdeteksi sejak awal. Di development, file .env di-load gem dotenv:
APP_HOST=localhost:3000
SMTP_USERNAME=dev@example.comgem "dotenv-rails".env di-gitignore; .env.example di-commit sebagai template.
Rails menyimpan secret langsung di repository — tapi terenkripsi. File config/credentials.yml.enc berisi secret terenkripsi yang hanya bisa dibaca dengan config/master.key (di-gitignore) atau env var RAILS_MASTER_KEY.
bin/rails credentials:editsmtp:
user_name: api@example.com
password: super-secret
aws:
access_key_id: AKIA...
secret_access_key: ...Dibaca di kode sebagai Rails.application.credentials:
Rails.application.credentials.smtp[:user_name]
Rails.application.credentials.dig(:aws, :secret_access_key)Keuntungan: secret ter-version-control (audit perubahan), tetapi tetap aman karena hanya terbaca dengan master key.
Tip
Rails 8 mendukung credentials per-environment: bin/rails credentials:edit --environment production membuat credentials/production.yml.enc yang hanya berlaku di production. Baca dengan Rails.application.credentials.production! — di environment lain nilainya nil sehingga kebocoran tidak terjadi.
Pola lengkap untuk multi-environment:
bin/rails credentials:edit # default (dev/test)
bin/rails credentials:edit --environment production# development & test
Rails.application.credentials.smtp[:user_name]
# production (nil di env lain)
Rails.application.credentials.production!.dig(:aws, :access_key_id)Di production server, master key untuk tiap environment diberikan lewat env var (bukan file):
export RAILS_MASTER_KEY="$(cat config/credentials/production.key)"
export AWS_ACCESS_KEY_ID="..."
export SMTP_USERNAME="..."Rails membaca RAILS_MASTER_KEY otomatis jika config/master.key tidak ada.
Alur yang direkomendasikan untuk project nyata:
.env di-gitignore untuk dev; .env.example di-commit sebagai template.credentials --environment di Rails 8.env, CI secrets, Vault).git check-ignore .env && echo ".env aman"
rg -i "password|secret|api_key" --glob '!*.yml.enc' .Warning
config/master.key dan .env adalah file paling berbahaya jika ter-commit. Pastikan keduanya ada di .gitignore. Jika terlanjur ter-commit ke branch yang pernah di-push, anggap secret itu kompromi: rotasi key, bukan sekadar hapus commit.
seeds.rb; selalu credentials/env vars.ENV["X"] tanpa default — return nil diam-diam; pakai ENV.fetch..enc jadi tidak berguna; jaga di gitignore.application.rb, bukan environment..env di-commit — kebocoran langsung; .env.example saja yang di-commit.Episode 16 membekali kalian konfigurasi Rails: tiga environment dengan file konfigurasi masing-masing, env vars sebagai sumber konfigurasi 12-factor, encrypted credentials dengan credentials:edit, dukungan credentials per-environment di Rails 8, serta pola secrets management untuk development sampai production.
Inti yang harus dibawa pulang:
config/credentials.yml.enc dienkripsi master key; baca via Rails.application.credentials.--environment..env di-gitignore, .env.example di-commit sebagai template.Di episode 17 selanjutnya kita akan membedah logging & debugging — log levels, structured log untuk production, gem debug dengan breakpoints, dan troubleshooting via console. Sampai jumpa di episode 17!