02.02.2026

Node.js’te Dinamik Konfigürasyon: .env’den Feature Flag’e, Güvenli ve Canlı Yönetim

Konfigürasyonu koddan ayırın: şema doğrulama, secret yönetimi ve feature flag ile canlı aç/kapat stratejileri.

Node.js projelerinde hata ayıklaması en zor problemlerden biri, “aynı kod farklı ortamda neden farklı çalışıyor?” sorusudur. Çoğu zaman kök neden konfigürasyondur: eksik env, hatalı tip, yanlış varsayılan değer veya sızan secret.

Bu yazıda, .env ile başlayan yolu şemayla doğrulanan, secret’ları güvenli, feature flag ile canlı yönetilebilir bir konfigürasyon yapısına dönüştürelim.

1) Konfigürasyonu katmanlı tasarla

Genel bir kural: varsayılanlar < env < secret store < uzaktan config/flag.

  • Default: repo içinde, güvenli ve sabit değerler
  • ENV: ortam bazlı farklar (port, log level)
  • Secrets: token/şifre/anahtar (repo’ya asla girmemeli)
  • Remote flags/config: canlı aç/kapat (deploy gerektirmeden)

Bu yaklaşım, hem geliştirici deneyimini hem de operasyonel güvenliği artırır.

2) Tip güvenliği: Konfigürasyonu şemayla doğrula

process.env her zaman string döner; “PORT=abc” gibi bir hata production’da sürpriz olur. Şemayla erken patlatmak en iyisi.

Aşağıdaki örnek zod ile basit ama etkili bir doğrulama yapar:

// config.js
import { z } from "zod";
import "dotenv/config";

const schema = z.object({
  NODE_ENV: z.enum(["development", "test", "production"]).default("development"),
  PORT: z.coerce.number().int().min(1).max(65535).default(3000),
  DATABASE_URL: z.string().url(),
  LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
  FEATURE_NEW_CHECKOUT: z.coerce.boolean().default(false),
});

export const config = schema.parse(process.env);

Artık uygulama açılışında yanlış konfig varsa net bir hata alırsınız.

3) Secret yönetimi: “env var” yeterli değil

Yerel geliştirmede .env pratik; ancak production’da secret’ları merkezi yönetmek gerekir.

  • Kubernetes: Secret
  • AWS: Secrets Manager / Parameter Store
  • GCP: Secret Manager
  • Vault: HashiCorp Vault

Basit bir kural: secret’ı log’lama. Hatta konfig objesini komple log’lamak bile risklidir. Gerekirse “maskelenmiş” bir çıktı üretin:

export function safeConfigForLogs(cfg) {
  return {
    ...cfg,
    DATABASE_URL: "***",
  };
}

4) Feature flag: Canlı aç/kapat için minimal altyapı

Feature flag, sadece “yeni özelliği aç/kapat” değildir; risk azaltma aracıdır:

  • Kademeli yayılım (yüzde bazlı)
  • Kullanıcı/tenant bazlı açma
  • A/B deneyi

Harici bir servis (LaunchDarkly vb.) kullanabilirsiniz; fakat öğrenmek için hafif bir kendi çözümünüz de mümkün.

Örnek: Uygulama her 30 saniyede bir flag’leri uzak bir JSON endpoint’ten çeker ve bellekte tutar.

// flags.js
const state = { flags: {}, lastFetch: 0 };

export async function refreshFlags(url) {
  const res = await fetch(url, { headers: { "cache-control": "no-cache" } });
  if (!res.ok) throw new Error(`Flag fetch failed: ${res.status}`);
  state.flags = await res.json();
  state.lastFetch = Date.now();
}

export function isEnabled(key, fallback = false) {
  return (state.flags?.[key] ?? fallback) === true;
}

Uygulamada kullanımı:

import express from "express";
import { config } from "./config.js";
import { refreshFlags, isEnabled } from "./flags.js";

const app = express();

setInterval(() => {
  refreshFlags("https://example.com/flags.json").catch(() => {});
}, 30_000);

app.post("/checkout", async (req, res) => {
  if (isEnabled("newCheckout", config.FEATURE_NEW_CHECKOUT)) {
    return res.json({ flow: "new" });
  }
  return res.json({ flow: "legacy" });
});

app.listen(config.PORT);

Notlar:

  • Flag endpoint’i için imza doğrulama veya en azından TLS + auth düşünün.
  • Fetch hatasında mevcut flag’lerle devam etmek, “fail open/close” tercihinize bağlıdır.

5) Konfigürasyon değişince ne olacak?

Her konfig “hot reload” olmaz. Örnek:

  • Log level: canlı değişebilir
  • DB connection string: genelde yeniden bağlantı ister
  • Cache TTL: canlı değişebilir

Bu yüzden konfigleri “başta yükle ve unut” yerine, kritik yerlerde okuma noktalarını iyi belirleyin.

Sonuç

Node.js’te sağlam konfigürasyon; şema doğrulama + secret hijyeni + feature flag ile birleşince, deploy sayısını azaltır ve üretimdeki belirsizlikleri ciddi ölçüde düşürür. .env ile başlayın, ama orada kalmayın: konfigürasyonu ürünle birlikte yaşayan bir bileşen gibi tasarlayın.