ferhatyesilmen Eğer public root ise güvenli ama risk her zaman var. Nasıl karşınıza çıkar bilmiyorum. Bu .env dosyası çok karıştırılan bir konu ama yanlış yapanları şöyle bulabilirsiniz: Şunu Google'da aratın mesela:
db_password filetype:env inurl:com
.env'nin hikayesi
Yazılım geliştirmede temel olarak 3 ortam var (bunların sayısı artabilir). Bunlar sırasıyla local, staging ve production. Local geliştiricinin yani sizin bilgisayarınız diyelim, staging ise test ortamı (aynı ya da ayrı bir sunucu mesela) ve production da uygulamanın asıl çalıştığı ortam. Diyelim ki 3 kişilik bir ekipsiniz ve uygulamanız bir MySQL veritabanına bağlanıyor olsun. MySQL'e bağlanmak için temel olarak 4 adet değişkene ihtiyacınız var: host, veritabanı adı, kullanıcı adı ve şifre. Eğer tek bir ortamda çalışırsanız sorunsuz bir şekilde çalışmak için 3 kişinin bilgisayarında, staging sunucusunda ve production sunucusundaki tüm host, veritabanı adı, kullanıcı adı ve şifresinin aynı olması gerekiyor. Bu pek de mümkün olan bir şey değil, mantıklı da değil. Her değişiklikten sonra bu bilgileri değiştirip uzak depoya gönderecek haliniz de yok değil mi. İşte bu problemleri yaşamamak için ortam oluşturuyoruz. Laravel'de de bu ortam .env dosyası ile sağlanıyor. Asıl ortam ise yani production config/app.php içerisindeki env anahtarında belirleniyor. production ortamı ise .env dosyası kullanmayan ortam olmuş oluyor.
İki tane env dosyamız var. Biri .env.example ve diğeri ise Composer'ın scripts.post-root-package-install özelliği ile ilk paket kurulumunda bu .env.example dosyasının kopyalanmasıyla oluşan .env dosyası.
Laravel eğer kök dizinde .env dosyası varsa onun içindeki değerleri kullanıyor. Bu değerleri ise env() yardımcı yöntemi ile alıyor. Örneğin config/database.php dosyasına bakarsanız eğer orada mysql kısmında
'database' => env('DB_DATABASE', 'forge'),
görürsünüz. Bu şu demek: Eğer kök dizinde .env dosyası varsa ve içerisinde DB_DATABASE
varsa onun değerini kullan; eğer .env dosyası yoksa forge
değerini kullan. .env dosyasına bakarsanız orada APP_ENV=local
görürsünüz. Eğer kök dizinde .env dosyası varsa bu durumda uygulamanın ortamı local demektir. Burada forge değeri ise uygulamanın production ortamında kullanacağı değerdir. production ortamı config/app.php:['env'] içerisinde belirlendiği için .env dosyası yoksa ortam production olur.
Uygulama içerisinde ortam kontrolünü App::environment() ile yapabilir ve ona göre bazı işlemler de yaptırabilirsiniz:
$environment = App::environment(); // local
// ya da
if(App::environment('local')) {
// Buradaki işlem sadece local ortamda yapılacak...
}
if(App::environment('production')) {
// Buradaki işlem sadece production ortamda yapılacak...
}
.env dosyası otomatik olarak .gitignore dosyasına işlenmiş gelir. Bunun anlamı bu dosyayı uzak depoya (Github gibi) göndermeyeceksiniz demektir. .env ortama özel bir dosya olduğu için orada kalır. production hariç çünkü daha önce de belirttiğimiz gibi (default olarak) production ortamı .env dosyasının olmadığı ortamdır.
Özel olarak .env.testing şeklinde bir dosya oluşturabilmekteyiz. Bu dosya kök dizinde varsa testler sırasında (unit, feature vs) bu dosyadaki değerler kullanılır. Bu dosya .env dosyasından öncelikli olarak çalışır, daha doğrusu üzerine yazar. .env içerisinde bir değişken bu dosyada da varsa testlerde .env dosyasındaki değil bu dosyadaki değer alınır.
Senaryo
3 kişilik bir ekip olduğunuzdan bahsetmiştik. Şimdi bu 3 kişilik ekip, staging ve production için .env dosyalarının nasıl kullanıldığına dair bir senaryo yazalım:
- Her ekip elemanı projeyi klonladıktan sonra .env.example dosyasından bir tane kendine .env dosyası oluşturur. İçerisine kendi bilgisayarındaki değerleri girer. Yani kendi bilgisayarındaki veritabanı adı, kullanıcı adı, şifresi vs... Bu sayede kendi değerlerinin staging ve production ortamını etkilemesini engeller. .gitignore içerisinde tanımlı olduğu için bu dosya uzak repoya gönderilmez, GIT ile takip edilmez.
- Eğer ortak kullanılan değişkenler yada ortama göre oluşturulması gereken değişkenler (standart .env.example içinde yer almayan, sizin eklediğiniz) varsa, örneğin API key gibi, bunlar .env.example dosyasına eklenir ki ekip üyesi de kullanabilisin. .env.example dosyası GIT ile takip edildiği için uzak depoya gönderilir. O yüzden ekip üyesi projeyi klonladığında bu dosyaya sahip olacaktır.
- production ortamı için gerekli ayarlar direkt config/ klasöründeki dosyalara elle işlenir. env() fonksiyonu kullanılmışsa ikinci parametre production için gerekli değer olacaktır. production ortam .env dosyasının olmadığı ortam olduğu için bu ikinci parametre kullanılacaktır. Bazı yerlerde ortam-bağımlı değerler kullanılacaksa siz de env() fonksiyonunu kullanabilirsiniz. production ortamındaki değerlerin genellikle değişmediğini de buradan anlayabilirsiniz, nadir değişir.
- staging için test sunucunda elle .env dosyası oluşturulur. İçerisine APP_ENV=staging yazarsınız böylece App::environment('staging') ile staging ortama özel işlemler yaptırabilirsiniz.
- Ekibe yeni biri katıldığında tek yapması gereken projeyi klonlamak ve .env.example dosyasından kendi .env dosyasını oluşturmak olur.
Böylece ayarlar değiştirilmeden 3 kişi rahatlıkla 3 ortam kullanan bir uygulamada çalışabilir.