MAXBY SSD 512GB/1TB M.2 NVMe PCIe Gen4x4 SSD NVMe Gen3/1TB PCIe 4.0 Garansi Resmi 5 Tahun Original

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:

  1. Hapus secret dari repository sesuai prosedur.
  2. Rotate credential yang terlanjur terekspos.
  3. Perbarui .env production.
  4. Periksa akses repository.
  5. Pastikan .env kembali 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

KonfigurasiDevelopmentProduction
APP_ENVlocalproduction
APP_DEBUGtruefalse
DatabaseDevelopmentProduction
CacheFile/RedisRedis/File sesuai kebutuhan
QueueDatabase/sync/RedisRedis/database sesuai kebutuhan
MailTestingSMTP/service production
LoggingLebih verboseDisesuaikan kebutuhan
APP URLlocalhostDomain
APP KEYKey environment sendiriKey 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:

  1. Jangan commit .env ke Git.
  2. Gunakan .env.example sebagai template.
  3. Gunakan APP_DEBUG=false di production.
  4. Jangan membocorkan APP_KEY.
  5. Jangan menaruh secret production di source code.
  6. Gunakan env() terutama di file konfigurasi.
  7. Gunakan config() di application code.
  8. Gunakan environment berbeda untuk development dan production.
  9. Gunakan configuration cache di production sesuai kebutuhan.
  10. Rotate secret jika pernah terekspos.
  11. Perhatikan permission .env.
  12. 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.