Merhaba arkadaşlar, bugün Node.js projelerimizde sıkça kullandığımız dotenv paketinin ötesine geçip, daha merkezi, daha güvenli ve daha yönetilebilir bir konfigürasyon katmanı nasıl oluşturabileceğimizi konuşacağız. Özellikle mikroservis mimarisi veya farklı ortamlarda (development, staging, production) çalışan uygulamalarda, sadece .env dosyalarıyla idare etmek bazen çok zorlayıcı olabiliyor. İşte benim bu dertlere bulduğum çözüm!
Neden Sadece .env Dosyası Yetmeyebilir?
İlk başlarda her şey çok güzeldi. Proje köküne bir .env dosyası, içine KEY=VALUE yaz, dotenv ile yükle, tamam. Ama proje büyüdükçe, ortamlar çoğaldıkça şu sorunlar baş gösterdi:
- 3 farklı ortam için 3 farklı .env dosyasını manuel olarak senkronize tutmak.
- Docker container'ına environment variable'ları geçerken yaşanan karışıklıklar.
- Config değerlerinin tip güvenliğinin olmaması (her şey string!).
- Hassas bilgilerin (API key'ler) version kontrol sistemine yanlışlıkla commit edilme riski.
Bu sorunları aşmak için convict paketini dotenv ile birlikte kullanmaya başladım ve hayatım çok kolaylaştı.
Convict ile Şema Tabanlı Config Yönetimi
Convict, config değerleriniz için bir şema (schema) tanımlamanızı sağlar. Bu şema sayesinde değerlerin tipini (string, number, boolean), formatını (ip, url), hatta varsayılan değerlerini ve zorunluluk durumunu belirleyebilirsiniz. Validasyon otomatik olarak yapılır.
İlk adım, gerekli paketleri yüklemek:
Şimdi, klasik config.js dosyamızı nasıl dönüştüreceğimize bakalım:
Config Dosyalarını Yapılandırmak
Proje dizininiz şöyle görünebilir:
- config.js (Ana şema dosyası, yukarıdaki kod)
- config/ (Klasör)
- development.json (Sadece development'a özel varsayılanlar)
- production.json (Sadece production'a özel varsayılanlar)
- test.json
Örnek bir config/production.json dosyası:
Artık uygulamanızın herhangi bir yerinde config değerlerine tip güvenliği ile erişebilirsiniz:
Avantajları ve Son Sözler
Bu yapının en sevdiğim yanı, merkezi kontrol. Tüm config yapınız bir şemada tanımlı. Yeni bir geliştirici projeye katıldığında, hangi config değişkenlerine ihtiyaç olduğunu config.js dosyasına bakarak anında görebiliyor. Ayrıca, validasyon sayesinde uygulama başlarken eksik veya yanlış tipte bir değişken varsa hemen hata veriyor ve saatlerce debug etmenin önüne geçiyor.
Docker veya CI/CD pipeline'larında ise sadece ortam değişkenlerini (APP_PORT, DB_URL vb.) set etmeniz yeterli. Convict, önceliği her zaman environment variable'lara verir, bu da container ortamları için mükemmel.
Siz Node.js projelerinizde config yönetimi için hangi yöntemleri kullanıyorsunuz? Dotenv ile yetinip "idare ediyorum" diyen var mı, yoksa daha farklı, daha süslü çözümler bulan oldu mu? Yorumlarda deneyimlerinizi paylaşın!
İlk başlarda her şey çok güzeldi. Proje köküne bir .env dosyası, içine KEY=VALUE yaz, dotenv ile yükle, tamam. Ama proje büyüdükçe, ortamlar çoğaldıkça şu sorunlar baş gösterdi:
- 3 farklı ortam için 3 farklı .env dosyasını manuel olarak senkronize tutmak.
- Docker container'ına environment variable'ları geçerken yaşanan karışıklıklar.
- Config değerlerinin tip güvenliğinin olmaması (her şey string!).
- Hassas bilgilerin (API key'ler) version kontrol sistemine yanlışlıkla commit edilme riski.
Bu sorunları aşmak için convict paketini dotenv ile birlikte kullanmaya başladım ve hayatım çok kolaylaştı.
Convict, config değerleriniz için bir şema (schema) tanımlamanızı sağlar. Bu şema sayesinde değerlerin tipini (string, number, boolean), formatını (ip, url), hatta varsayılan değerlerini ve zorunluluk durumunu belirleyebilirsiniz. Validasyon otomatik olarak yapılır.
İlk adım, gerekli paketleri yüklemek:
Bash:
npm install convict convict-format-with-validator dotenv
Şimdi, klasik config.js dosyamızı nasıl dönüştüreceğimize bakalım:
JavaScript:
// config.js
const convict = require('convict');
require('dotenv').config(); // .env dosyasını yükle
// 1. Config Şemasını Tanımla
const config = convict({
env: {
doc: 'Uygulama ortamı.',
format: ['production', 'development', 'test'],
default: 'development',
env: 'NODE_ENV'
},
server: {
port: {
doc: 'HTTP sunucusunun bağlanacağı port.',
format: 'port',
default: 3000,
env: 'APP_PORT'
},
host: {
doc: 'Sunucu host adresi.',
format: 'ipaddress',
default: '127.0.0.1',
env: 'APP_HOST'
}
},
database: {
url: {
doc: 'Database bağlantı URL\'si.',
format: String,
default: '',
sensitive: true, // Bu değer loglarda gizlenecek!
env: 'DB_URL'
},
poolSize: {
doc: 'Connection pool boyutu.',
format: 'int',
default: 10,
env: 'DB_POOL_SIZE'
}
},
jwtSecret: {
doc: 'JWT imzalama için kullanılan gizli anahtar.',
format: String,
default: '',
sensitive: true,
env: 'JWT_SECRET'
}
});
// 2. Ortama göre config dosyası yükle (opsiyonel ama güçlü)
const env = config.get('env');
try {
config.loadFile(`./config/${env}.json`);
} catch (e) {
// Ortama özel dosya yoksa sorun değil, env variables devreye girer.
console.log(`Ortama özel config dosyası bulunamadı: ./config/${env}.json`);
}
// 3. Tüm tanımları validate et (Tipler, formatlar, zorunlu alanlar kontrol edilir)
config.validate({ allowed: 'strict' });
// 4. Config objesini dışa aktar
module.exports = config.getProperties();
Proje dizininiz şöyle görünebilir:
- config.js (Ana şema dosyası, yukarıdaki kod)
- config/ (Klasör)
- development.json (Sadece development'a özel varsayılanlar)
- production.json (Sadece production'a özel varsayılanlar)
- test.json
Örnek bir config/production.json dosyası:
JSON:
{
"server": {
"port": 8080,
"host": "0.0.0.0"
}
}
Artık uygulamanızın herhangi bir yerinde config değerlerine tip güvenliği ile erişebilirsiniz:
JavaScript:
// app.js
const config = require('./config');
const port = config.server.port; // number tipinde!
const dbUrl = config.database.url; // string
console.log(`Server ${port} portunda başlıyor...`);
// config.database.url 'sensitive:true' olduğu için loglarda [Sensitive] olarak gizlenir.
Bu yapının en sevdiğim yanı, merkezi kontrol. Tüm config yapınız bir şemada tanımlı. Yeni bir geliştirici projeye katıldığında, hangi config değişkenlerine ihtiyaç olduğunu config.js dosyasına bakarak anında görebiliyor. Ayrıca, validasyon sayesinde uygulama başlarken eksik veya yanlış tipte bir değişken varsa hemen hata veriyor ve saatlerce debug etmenin önüne geçiyor.
Docker veya CI/CD pipeline'larında ise sadece ortam değişkenlerini (APP_PORT, DB_URL vb.) set etmeniz yeterli. Convict, önceliği her zaman environment variable'lara verir, bu da container ortamları için mükemmel.
Siz Node.js projelerinizde config yönetimi için hangi yöntemleri kullanıyorsunuz? Dotenv ile yetinip "idare ediyorum" diyen var mı, yoksa daha farklı, daha süslü çözümler bulan oldu mu? Yorumlarda deneyimlerinizi paylaşın!