Laravel Environment `.env`: Memahami Konfigurasi Development dan Production
Apa Itu File .env di Laravel?
File .env digunakan Laravel untuk menyimpan environment variable, yaitu konfigurasi yang nilainya dapat berbeda antara satu environment dengan environment lainnya.
Contohnya:
APP_NAME=MyLaravelApp
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost
Ketika aplikasi dipindahkan dari laptop developer ke VPS production, kita tidak perlu mengubah source code untuk menyesuaikan konfigurasi.
Cukup gunakan .env yang sesuai dengan environment.
Contohnya:
Development
↓
.env development
↓
localhost
↓
Database development
Sedangkan:
Production
↓
.env production
↓
domain.com
↓
Database production
Kenapa Laravel Menggunakan .env?
Bayangkan konfigurasi database ditulis langsung di source code:
'host' => 'localhost',
'username' => 'root',
'password' => 'password',
Ketika aplikasi dipindahkan ke server, semuanya harus diubah.
Selain merepotkan, cara tersebut juga berisiko karena credential dapat masuk ke Git repository.
Dengan .env, konfigurasi dipisahkan dari source code:
DB_HOST=127.0.0.1
DB_DATABASE=myapp
DB_USERNAME=myapp
DB_PASSWORD=secret
Source code tetap sama, sedangkan konfigurasi dapat berbeda sesuai server.
Contoh Struktur .env
File .env Laravel biasanya berisi beberapa kelompok konfigurasi.
Contohnya:
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
CACHE_STORE=file
QUEUE_CONNECTION=database
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Tidak semua variable tersebut harus digunakan oleh setiap aplikasi.
Konfigurasi yang tersedia dapat berbeda tergantung versi Laravel dan package yang digunakan.
.env vs config
Ini merupakan konsep yang sangat penting.
.env berisi nilai environment.
Sedangkan directory:
config/
berisi konfigurasi aplikasi Laravel.
Contohnya pada config/app.php:
'timezone' => env('APP_TIMEZONE', 'UTC'),
Artinya Laravel mengambil nilai:
APP_TIMEZONE=Asia/Jakarta
dari .env.
Jika variable tidak tersedia, Laravel menggunakan:
UTC
sebagai default.
Apa Fungsi APP_ENV?
Variable:
APP_ENV=local
menunjukkan environment aplikasi.
Umumnya kita dapat menemukan nilai seperti:
local
development
staging
production
Contoh development:
APP_ENV=local
Production:
APP_ENV=production
Nilai ini dapat digunakan aplikasi atau package tertentu untuk menentukan perilaku berdasarkan environment.
APP_ENV Tidak Membuat Server Menjadi Production
Perlu dipahami bahwa:
APP_ENV=production
tidak otomatis membuat server menjadi production.
Ini hanya memberi tahu aplikasi mengenai environment yang sedang digunakan.
Production deployment tetap membutuhkan konfigurasi server seperti:
- Web server
- PHP
- Database
- Permission
- Queue Worker
- Scheduler
- SSL
- Cache
- Monitoring
Apa Fungsi APP_DEBUG?
Variable:
APP_DEBUG=true
mengaktifkan mode debug.
Dalam development, biasanya:
APP_DEBUG=true
Ketika terjadi error, Laravel dapat menampilkan informasi debugging yang lebih lengkap.
Untuk production, gunakan:
APP_DEBUG=false
Ini sangat penting.
Kenapa APP_DEBUG Harus false di Production?
Jika:
APP_DEBUG=true
di server production, halaman error dapat memberikan informasi internal aplikasi.
Misalnya:
- Stack trace
- Lokasi file
- Nama class
- Query tertentu
- Konfigurasi internal
- Informasi environment
Informasi tersebut sebaiknya tidak ditampilkan kepada pengguna.
Jadi untuk production:
APP_ENV=production
APP_DEBUG=false
Contoh .env Development
Misalnya aplikasi berjalan di laptop:
APP_NAME="My Laravel App"
APP_ENV=local
APP_KEY=base64:...
APP_DEBUG=true
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp_dev
DB_USERNAME=root
DB_PASSWORD=
CACHE_STORE=file
QUEUE_CONNECTION=database
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Development biasanya lebih fleksibel.
Contoh .env Production
Di VPS:
APP_NAME="My Laravel App"
APP_ENV=production
APP_KEY=base64:...
APP_DEBUG=false
APP_URL=https://example.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=myapp
DB_PASSWORD=strong-password
CACHE_STORE=redis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Nilai tersebut hanyalah contoh. Credential production harus menggunakan nilai sebenarnya dan tidak dibagikan ke publik.
Apa Itu APP_KEY?
Laravel menggunakan:
APP_KEY=
sebagai application encryption key.
Key ini sangat penting untuk berbagai mekanisme enkripsi Laravel.
Biasanya dibuat dengan:
php artisan key:generate
Command tersebut akan mengisi:
APP_KEY=base64:...
Jangan Sembarangan Mengganti APP_KEY
APP_KEY bukan sekadar konfigurasi biasa.
Mengganti key pada aplikasi yang sudah berjalan dapat membuat data yang sebelumnya dienkripsi dengan key lama tidak dapat didekripsi lagi.
Karena itu, pada production:
APP_KEY
harus diperlakukan sebagai credential penting.
Jangan Commit .env ke Git
File:
.env
sebaiknya tidak dimasukkan ke repository.
Biasanya Laravel sudah memiliki:
.gitignore
yang mengabaikan .env.
Cek:
git status
Jika .env muncul sebagai file yang akan di-commit, periksa .gitignore.
Gunakan .env.example
Berbeda dengan .env, file:
.env.example
dapat digunakan sebagai template konfigurasi.
Contohnya:
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
Tidak perlu memasukkan password production ke .env.example.
.env.example Bukan Pengganti .env
Saat deployment, Anda tetap membutuhkan:
.env
yang berisi konfigurasi environment sebenarnya.
.env.example hanya membantu developer mengetahui variable apa saja yang dibutuhkan aplikasi.
Mengambil Variable .env dengan env()
Contoh:
$value = env('APP_ENV');
Atau:
$url = env('APP_URL');
Namun ada aturan penting:
Jangan terlalu sering menggunakan env() langsung di kode aplikasi.
Lebih baik gunakan env() di file konfigurasi.
Gunakan config() di Kode Aplikasi
Misalnya:
// config/app.php
'timezone' => env('APP_TIMEZONE', 'UTC'),
Kemudian di aplikasi:
$timezone = config('app.timezone');
Jadi alurnya:
.env
↓
config/*.php
↓
config()
↓
Application
Bukan:
.env
↓
env() di seluruh aplikasi
Kenapa config() Lebih Baik?
Laravel mendukung configuration caching.
Misalnya:
php artisan config:cache
Laravel akan menggabungkan konfigurasi menjadi cache.
Jika kode aplikasi bergantung langsung pada:
env('SOME_VALUE')
di luar file konfigurasi, perilakunya dapat menjadi tidak sesuai setelah configuration cache digunakan.
Karena itu pola yang lebih baik adalah:
// config/services.php
'my_service' => [
'url' => env('MY_SERVICE_URL'),
'token' => env('MY_SERVICE_TOKEN'),
],
Kemudian:
$url = config('services.my_service.url');
$token = config('services.my_service.token');
Contoh Konfigurasi API
.env:
PAYMENT_API_URL=https://api.example.com
PAYMENT_API_KEY=secret-key
config/services.php:
'payment' => [
'url' => env('PAYMENT_API_URL'),
'key' => env('PAYMENT_API_KEY'),
],
Di aplikasi:
$url = config('services.payment.url');
$key = config('services.payment.key');
Dengan struktur tersebut, source code tidak perlu mengetahui secara langsung bagaimana environment variable dibaca.
Database Configuration
Salah satu penggunaan .env yang paling umum adalah database.
Contoh:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=myapp
DB_PASSWORD=secret
Laravel kemudian menggunakan konfigurasi database dari config/database.php.
Development:
DB_DATABASE=myapp_dev
Production:
DB_DATABASE=myapp
Source code aplikasi tetap sama.
Jangan Menggunakan Database Production di Development
Hindari:
Laptop Developer
↓
Database Production
kecuali ada kebutuhan khusus dengan pengamanan yang tepat.
Lebih aman:
Development → Database Development
Staging → Database Staging
Production → Database Production
Hal ini mengurangi risiko data production berubah atau terhapus saat testing.
Redis di .env
Jika aplikasi menggunakan Redis:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Untuk production dengan Redis pada server berbeda:
REDIS_HOST=10.0.0.10
REDIS_PORT=6379
REDIS_PASSWORD=secret
Nilai sebenarnya bergantung pada arsitektur server.
Redis dapat digunakan untuk:
- Cache
- Session
- Queue
- Rate limiting
- Data sementara
Cache Store Development vs Production
Development dapat menggunakan:
CACHE_STORE=file
Production dapat menggunakan:
CACHE_STORE=redis
tergantung kebutuhan dan konfigurasi aplikasi.
Dengan .env, kita dapat mengganti backend cache tanpa mengubah logic aplikasi.
Queue Configuration
Misalnya development:
QUEUE_CONNECTION=database
Sedangkan production:
QUEUE_CONNECTION=redis
Kemudian aplikasi tetap menggunakan:
SomeJob::dispatch();
Perbedaan backend Queue ditentukan oleh environment.
Session Configuration
Contohnya:
SESSION_DRIVER=file
Untuk production:
SESSION_DRIVER=redis
jika Redis memang digunakan sebagai session store.
Dengan demikian konfigurasi dapat disesuaikan tanpa mengubah kode Controller.
Environment untuk Mail
Konfigurasi email juga sebaiknya berbeda.
Development dapat menggunakan mailer testing.
Production menggunakan SMTP atau service email sebenarnya.
Contohnya:
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=...
MAIL_PASSWORD=...
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="${APP_NAME}"
Credential email production jangan dimasukkan ke Git.
Hindari Email Production Saat Development
Ini salah satu kesalahan yang berbahaya.
Bayangkan developer menjalankan:
Mail::to($user)->send(...);
tetapi .env lokal ternyata menggunakan SMTP production.
Email testing dapat benar-benar terkirim ke user.
Untuk development, gunakan mail testing atau konfigurasi yang tidak mengirim email nyata.
Environment Variable untuk Feature Flag
.env juga dapat digunakan untuk mengontrol fitur.
Misalnya:
FEATURE_NEW_CHECKOUT=false
Kemudian:
if (config('features.new_checkout')) {
// fitur baru
}
config/features.php:
'new_checkout' => env('FEATURE_NEW_CHECKOUT', false),
Production:
FEATURE_NEW_CHECKOUT=false
Development:
FEATURE_NEW_CHECKOUT=true
Ini berguna saat melakukan rollout fitur secara bertahap.
.env Bukan Tempat Menyimpan Semua Data
Walaupun .env fleksibel, jangan menjadikannya database kecil.
Hindari memasukkan:
USERS=...
PRODUCTS=...
LONG_JSON_DATA=...
untuk data aplikasi yang sebenarnya harus disimpan di database.
.env sebaiknya digunakan untuk konfigurasi environment, bukan data bisnis.
Nilai .env Berupa String
Perlu diperhatikan bahwa environment variable pada dasarnya dibaca sebagai nilai konfigurasi.
Contohnya:
APP_DEBUG=false
Laravel menangani nilai konfigurasi tersebut sesuai mekanisme environment/configuration-nya.
Tetapi ketika membuat variable custom, pastikan format nilainya sesuai kebutuhan.
Misalnya:
FEATURE_ENABLED=true
kemudian mapping ke configuration dengan benar.
Gunakan Default Value
Pada file konfigurasi:
'timezone' => env('APP_TIMEZONE', 'UTC'),
Jika:
APP_TIMEZONE
tidak tersedia, Laravel menggunakan:
UTC
Pola ini bagus untuk konfigurasi opsional.
Contoh:
'url' => env('PAYMENT_API_URL', 'https://sandbox.example.com'),
Development dapat menggunakan sandbox secara default.
Jangan Menaruh Secret sebagai Default
Hindari:
'api_key' => env('API_KEY', 'production-secret'),
Karena jika .env tidak tersedia, aplikasi justru menggunakan secret yang tertanam di source code.
Lebih baik:
'api_key' => env('API_KEY'),
dan pastikan environment production menyediakan variable tersebut.
Configuration Cache di Production
Setelah deployment, Laravel biasanya dapat menggunakan:
php artisan config:cache
Ini membuat konfigurasi di-cache sehingga aplikasi tidak perlu membaca file konfigurasi secara terpisah pada setiap request.
Setelah configuration di-cache, jika Anda mengubah .env, jangan lupa refresh configuration cache.
Salah satu cara:
php artisan config:clear
atau rebuild:
php artisan config:cache
Masalah .env Sudah Diubah tetapi Laravel Masih Menggunakan Nilai Lama
Ini merupakan masalah yang cukup sering terjadi.
Misalnya Anda mengubah:
APP_DEBUG=false
tetapi aplikasi masih menggunakan konfigurasi sebelumnya.
Periksa apakah configuration cache aktif.
Jalankan:
php artisan config:clear
Kemudian cache kembali jika memang dibutuhkan:
php artisan config:cache
php artisan optimize:clear
Saat debugging configuration, command berikut juga berguna:
php artisan optimize:clear
Command tersebut membersihkan berbagai cache Laravel yang relevan.
Kemudian Anda dapat melakukan testing kembali.
.env pada Deployment Laravel
Misalnya source code di-deploy ke:
/var/www/myapp
Setelah code tersedia:
cd /var/www/myapp
pastikan file:
.env
tersedia.
Kemudian cek:
ls -la .env
Jangan menampilkan isi .env ke terminal atau memasukkannya ke log secara sembarangan.
Jangan Menggunakan .env dari Laptop untuk Production
Jangan melakukan:
Copy .env laptop
↓
Production
secara sembarangan.
Development dan production memiliki kebutuhan berbeda.
Lebih baik production memiliki .env sendiri:
.env development
.env staging
.env production
yang dikelola secara aman.
Permission File .env
File .env berisi informasi sensitif, sehingga permission harus diperhatikan.
Periksa:
ls -la .env
Jangan memberikan permission terlalu longgar tanpa alasan.
Hindari menjadikan file tersebut dapat ditulis atau dibaca oleh semua user:
chmod 777 .env
Permission sebaiknya disesuaikan dengan user aplikasi dan kebutuhan server.
.env dan Git
Periksa:
git status
Idealnya:
.env
tidak muncul sebagai file yang akan di-commit.
Periksa:
git check-ignore .env
Jika .env memang di-ignore, Git akan menunjukkan aturan ignore yang berlaku.
Bagaimana Jika .env Terlanjur Masuk Git?
Jangan hanya menghapus file dari working directory.
Jika secret pernah di-commit ke repository, anggap secret tersebut sudah terkompromi.
Langkah yang tepat adalah:
- Hapus secret dari repository sesuai prosedur.
- Rotate credential yang terlanjur terekspos.
- Perbarui
.envproduction. - Periksa akses repository.
- Pastikan
.envkembali masuk.gitignore.
Secret yang sudah pernah dipublikasikan sebaiknya tidak dianggap aman hanya karena commit berikutnya menghapusnya.
Jangan Menampilkan .env untuk Debugging
Hindari membuat endpoint seperti:
return file_get_contents(base_path('.env'));
atau mencetak seluruh konfigurasi ke halaman web.
Hal ini dapat membocorkan:
- Database password
- API key
- Redis password
- SMTP credential
- Application key
- Token service
Gunakan debugging secara selektif.
Cara Mengecek Environment Tanpa Membocorkan Secret
Anda dapat mengecek:
php artisan about
untuk mendapatkan informasi aplikasi.
Atau gunakan:
php artisan config:show app
sesuai kebutuhan dan versi Laravel.
Tetap berhati-hati agar output konfigurasi sensitif tidak disebarkan ke log atau chat publik.
Development, Staging, dan Production
Project yang lebih serius biasanya memiliki setidaknya:
Development
Staging
Production
Contohnya:
Development
APP_ENV=local
APP_DEBUG=true
Staging
APP_ENV=staging
APP_DEBUG=false
Production
APP_ENV=production
APP_DEBUG=false
Staging berguna untuk menguji deployment sebelum perubahan masuk production.
Perbedaan Konfigurasi yang Umum
| Konfigurasi | Development | Production |
|---|---|---|
APP_ENV | local | production |
APP_DEBUG | true | false |
| Database | Development | Production |
| Cache | File/Redis | Redis/File sesuai kebutuhan |
| Queue | Database/sync/Redis | Redis/database sesuai kebutuhan |
| Testing | SMTP/service production | |
| Logging | Lebih verbose | Disesuaikan kebutuhan |
| APP URL | localhost | Domain |
| APP KEY | Key environment sendiri | Key production |
Nilai sebenarnya tetap bergantung pada kebutuhan aplikasi.
Jangan Menyamakan .env dengan Security
Menggunakan .env bukan berarti aplikasi otomatis aman.
.env hanya menyediakan mekanisme konfigurasi environment.
Keamanan tetap membutuhkan:
- Permission file
- HTTPS
- Firewall
- Secure credential
- Database access control
- Server hardening
- Secret management
- Backup
- Monitoring
.env adalah salah satu bagian dari keamanan deployment, bukan solusi keamanan secara keseluruhan.
Masalah Umum .env di Laravel
.env Tidak Terbaca
Periksa:
ls -la .env
Pastikan file berada di root project.
Kemudian:
php artisan config:clear
Perubahan .env Tidak Berefek
Coba:
php artisan optimize:clear
Kemudian rebuild configuration cache jika diperlukan:
php artisan config:cache
Database Connection Error
Periksa:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=myapp
DB_PASSWORD=secret
Kemudian tes:
php artisan migrate:status
Jika gagal, periksa:
- Host
- Port
- Database name
- Username
- Password
- MySQL service
- Permission user database
Redis Tidak Terhubung
Periksa:
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=null
Kemudian pastikan Redis aktif:
sudo systemctl status redis
Jika aplikasi menggunakan Redis untuk Queue atau Cache, masalah .env dapat menyebabkan banyak fitur Laravel ikut bermasalah.
Best Practice .env untuk Laravel
Beberapa praktik yang sebaiknya diterapkan:
- Jangan commit
.envke Git. - Gunakan
.env.examplesebagai template. - Gunakan
APP_DEBUG=falsedi production. - Jangan membocorkan
APP_KEY. - Jangan menaruh secret production di source code.
- Gunakan
env()terutama di file konfigurasi. - Gunakan
config()di application code. - Gunakan environment berbeda untuk development dan production.
- Gunakan configuration cache di production sesuai kebutuhan.
- Rotate secret jika pernah terekspos.
- Perhatikan permission
.env. - Jangan menggunakan database production untuk testing tanpa pengamanan yang tepat.
Contoh Struktur Konfigurasi yang Baik
Misalnya aplikasi memiliki service pembayaran.
.env:
PAYMENT_API_URL=https://api.payment.example
PAYMENT_API_KEY=secret
config/services.php:
'payment' => [
'url' => env('PAYMENT_API_URL'),
'key' => env('PAYMENT_API_KEY'),
],
Service:
$url = config('services.payment.url');
$key = config('services.payment.key');
Alurnya:
.env
↓
config/services.php
↓
config()
↓
Service
↓
Application
Ini lebih rapi dibandingkan mengambil env() di banyak tempat.
.env Saat Deploy Laravel ke Ubuntu VPS
Untuk deployment Laravel ke VPS, pola sederhananya:
Source Code
↓
/var/www/myapp
↓
.env production
↓
composer install
↓
config:cache
↓
Database migration
↓
Queue Worker
↓
Scheduler
↓
Web Server
Contoh konfigurasi production:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://example.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=myapp
DB_PASSWORD=...
CACHE_STORE=redis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
Kemudian konfigurasi tersebut digunakan oleh Laravel tanpa perlu mengubah source code aplikasi.
Kesimpulan
File .env merupakan salah satu bagian penting dalam aplikasi Laravel karena memungkinkan konfigurasi dipisahkan dari source code.
Development dapat menggunakan:
APP_ENV=local
APP_DEBUG=true
sedangkan production sebaiknya:
APP_ENV=production
APP_DEBUG=false
Konfigurasi database, Redis, Queue, Session, Mail, API, dan berbagai service lainnya juga dapat disesuaikan berdasarkan environment.
Pola yang disarankan adalah:
.env
↓
config/*.php
↓
config()
↓
Application
dan bukan menggunakan env() secara langsung di seluruh bagian aplikasi.
Untuk deployment production, jangan lupa:
php artisan optimize:clear
php artisan config:cache
sesuai kebutuhan deployment dan cache aplikasi.
Yang paling penting, jangan pernah memasukkan .env yang berisi credential production ke repository Git atau membocorkan isinya ke publik. Dengan pengelolaan .env yang benar, aplikasi Laravel dapat menggunakan source code yang sama untuk development, staging, maupun production tanpa harus menanamkan konfigurasi sensitif langsung ke dalam kode.

