---
title: "Environment Variables Güvenli Yönetimi: .env Dosyalarının Doğrusu"
description: ".env dosyası nasıl güvenli yönetilir? VITE_ ve NEXT_PUBLIC_ prefix kuralları, .gitignore, service_role key tehlikesi ve secret rotation stratejisi rehberi."
date: 2026-04-14
category: guvenlik
tags: ["env", "guvenlik", "api-key", "deployment", "gitignore", "best-practices"]
url: https://mikroerp.dev/blog/env-dosyalari-guvenli-yonetim/
---

## En Yaygın Güvenlik Hatası

Bir geliştiricinin işe ilk başladığı gün yaptığı en tehlikeli şeylerden biri:

```bash
# ❌ YAPMAYIN — API key'iniz artık git geçmişinde SONSUZA KADAR
git add .env
git commit -m "config ekledim"
git push origin main
```

Tek bir commit — API key'iniz artık GitHub'da herkesin görebildiği yerde.

## .env Dosya Hiyerarşisi

| Dosya | Git'e eklenir mi? | Ne için? |
|-------|:---:|---------|
| `.env.example` | ✅ Evet | Şablon (değerler boş) |
| `.env` | ❌ Hayır | Varsayılan ortam değişkenleri |
| `.env.local` | ❌ Hayır | Kişisel geliştirme ayarları |
| `.env.production` | ❌ Hayır | Production değerleri |
| `.env.development` | ❌ Hayır | Development değerleri |

**Öncelik sırası** (Vite): `.env.local` > `.env.[mode]` > `.env`

## .gitignore — İlk Gün Yapılacak

```gitignore
# .gitignore — ZORUNLU
.env
.env.local
.env.*.local
.env.production
.env.development
```

## Client vs Server — VITE_ ve NEXT_PUBLIC_ Kuralı

Frontend framework'ler **prefix** ile hangi değişkenlerin client-side'a gönderileceğini belirler:

```bash
# .env
# ✅ Client-side'da kullanılabilir (tarayıcıda görünür!)
VITE_SUPABASE_URL=https://xxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhbGci...

# ❌ Client-side'da ERİŞİLEMEZ (server-only)
SUPABASE_SERVICE_ROLE_KEY=eyJhbGci...
DATABASE_URL=postgresql://user:pass@host:5432/db
```

| Framework | Client prefix | Erişim |
|-----------|-------------|--------|
| **Vite** | `VITE_` | `import.meta.env.VITE_*` |
| **Next.js** | `NEXT_PUBLIC_` | `process.env.NEXT_PUBLIC_*` |
| **Create React App** | `REACT_APP_` | `process.env.REACT_APP_*` |

> ⚠️ **Prefix** olan her değişken **tarayıcıda görünür**. Asla gizli key'leri prefix ile başlatmayın!

## Supabase Key'leri — Hangisi Tehlikeli?

```bash
# ✅ GÜVENLİ — Client-side'da kullanılabilir
# RLS ile korunur, sınırlı yetkili
VITE_SUPABASE_ANON_KEY=eyJhbGci...

# ❌ TEHLİKELİ — ASLA client-side'a koymayın!
# RLS'i BYPASS eder, tüm veritabanına TAM ERİŞİM
SUPABASE_SERVICE_ROLE_KEY=eyJhbGci...
```

**`service_role` key client'a sızarsa**: Herhangi biri tüm tablolarınızdaki tüm verileri okuyabilir, değiştirebilir ve silebilir.

## .env.example Dosyası

Her projede `.env.example` dosyası OLMALI:

```bash
# .env.example — Git'e ECLENİR, değerler boş
# Supabase Bağlantısı
VITE_SUPABASE_URL=
VITE_SUPABASE_ANON_KEY=

# Yalnızca server-side
SUPABASE_SERVICE_ROLE_KEY=
DATABASE_URL=

# İsteğe bağlı
SMTP_HOST=
SMTP_PORT=587
```

## Deployment Platform Ayarları

### Vercel
```
Settings → Environment Variables → Add
- SUPABASE_SERVICE_ROLE_KEY: [değer]
- Environments: Production ✅ Preview ✅ Development ❌
```

### Cloudflare Pages
```
Settings → Environment Variables → Production
- SUPABASE_SERVICE_ROLE_KEY: [Encrypt ✅]
```

### Netlify
```
Site Settings → Environment variables → Add
- SUPABASE_SERVICE_ROLE_KEY: [değer]
- Scopes: Builds ✅ Functions ✅ Runtime ❌
```

## Eğer Key Sızdıysa — Acil Eylem Planı

1. **Hemen revoke edin**: Supabase Dashboard → Settings → API → Regenerate
2. **Git geçmişini temizleyin**: `git filter-branch` veya `BFG Repo-Cleaner`
3. **İlgili servisleri kontrol edin**: Unauthorized access loglarını inceleyin
4. **Takıma bildirin**: Tüm geliştiriciler yeni key'leri almalı

```bash
# BFG ile git geçmişinden silme
brew install bfg
bfg --replace-text passwords.txt repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
```

## Checklist — Her Projede Kontrol Edin

- [ ] `.env` dosyası `.gitignore`'da mı?
- [ ] `.env.example` mevcut mu?
- [ ] Client prefix (`VITE_`/`NEXT_PUBLIC_`) sadece public key'lerde mi?
- [ ] `service_role` key sadece server-side'da mı?
- [ ] Deployment platform'da environment variables şifrelenmiş mi?
- [ ] Eski key'ler rotasyona alındı mı?

## İlgili Yazılar

- [API Güvenlik Kontrol Listesi](/blog/api-guvenlik-kontrol-listesi/) — Rate limiting, CORS, input validation
- [Supabase RLS Yetkilendirme](/blog/supabase-rls-cok-katmanli-yetkilendirme/) — anon key + RLS güvenliği
- [Supabase Auth](/blog/supabase-auth-react-kullanici-yonetimi/) — Auth key ve session yönetimi
- [Cloudflare Tunnel](/blog/mikro-erp-web-baglanti-cloudflare-tunnel/) — On-premise güvenli bağlantı

---

*Bu rehber [Vite Env Variables](https://vitejs.dev/guide/env-and-mode.html), [Next.js Environment Variables](https://nextjs.org/docs/app/building-your-application/configuring/environment-variables) ve [Supabase Security Best Practices](https://supabase.com/docs/guides/auth/managing-user-data) dokümantasyonuna dayanarak hazırlanmıştır.*