Files
balikci/docs/AUTO_SESSION_SECRET.md

278 lines
6.1 KiB
Markdown
Raw Normal View History

2025-11-11 04:36:35 +03:00
# 🔐 Otomatik SESSION_SECRET Yönetimi
## Docker Entrypoint ile Otomatik Secret Oluşturma
Bu proje, Docker ile çalıştırıldığında **SESSION_SECRET**'ı otomatik olarak oluşturur ve yönetir.
---
## 🎯 Nasıl Çalışır?
### 1. Entrypoint Script
`backend/docker-entrypoint.sh` container başlatıldığında çalışır ve:
1.**SESSION_SECRET Kontrolü**
- Ortam değişkeninde SESSION_SECRET var mı?
- Varsa varsayılan değer mi?
2. 🔍 **.env Dosyası Kontrolü**
- Volume'de `.env` dosyası var mı?
- Varsa içinde geçerli SESSION_SECRET var mı?
3. 🔑 **Otomatik Oluşturma**
- Hiçbir yerde geçerli secret yoksa:
- Node.js crypto modülü ile 64 byte rastgele hex oluşturur
- Backend volume'üne kaydeder
- Ortam değişkenine export eder
4. 💾 **Persistence**
- Secret, Docker volume'de saklanır
- Container restart olsa bile aynı secret kullanılır
- Session'lar korunur
---
## 🚀 Kullanım Senaryoları
### Senaryo 1: Hiç .env Dosyası Yok
```bash
# Sadece GMAIL ve TELEGRAM ayarları ile başlat
docker compose up -d
```
**Sonuç:**
- ✅ SESSION_SECRET otomatik oluşturulur
- ✅ Backend volume'e kaydedilir
- ✅ Log'larda görebilirsiniz:
```
🔑 Yeni SESSION_SECRET otomatik oluşturuluyor...
✅ Yeni SESSION_SECRET oluşturuldu ve .env dosyasına kaydedildi
```
### Senaryo 2: .env Var Ama SESSION_SECRET Yok
```bash
# .env dosyası var ama SESSION_SECRET yok
cat > .env << EOF
GMAIL_USER=test@gmail.com
GMAIL_APP_PASSWORD=xxxx
EOF
docker compose up -d
```
**Sonuç:**
- ✅ SESSION_SECRET otomatik oluşturulur
- ✅ Mevcut .env'e eklenir
- ✅ Diğer ayarlar korunur
### Senaryo 3: .env'de SESSION_SECRET Var
```bash
# .env'de SESSION_SECRET zaten var
cat > .env << EOF
SESSION_SECRET=my-manual-secret-here
GMAIL_USER=test@gmail.com
GMAIL_APP_PASSWORD=xxxx
EOF
docker compose up -d
```
**Sonuç:**
- ✅ Mevcut SESSION_SECRET kullanılır
- ✅ Değiştirilmez
- ✅ Log'da: "SESSION_SECRET zaten ayarlanmış"
### Senaryo 4: docker-compose.yml'de Belirtilmiş
```bash
# .env dosyası
SESSION_SECRET=production-secret-here
# docker-compose.yml
environment:
- SESSION_SECRET=${SESSION_SECRET}
docker compose up -d
```
**Sonuç:**
- ✅ docker-compose.yml'deki değer önceliklidir
- ✅ Entrypoint script, ortam değişkenini kontrol eder
- ✅ Geçerliyse kullanır, değilse oluşturur
---
## 🔒 Güvenlik
### Otomatik Oluşturma Güvenli mi?
**EVET**, çünkü:
1. **Kriptografik Rastgelelik**
```javascript
crypto.randomBytes(64).toString('hex')
```
- Node.js'in crypto modülü kullanılır
- 64 byte = 128 hex karakter
- Tahmin edilemez
2. **Persistence**
- Volume'de saklanır
- Her restart'ta aynı secret kullanılır
- Session'lar geçersiz olmaz
3. **Görünürlük**
- Log'larda sadece ilk 20 karakter gösterilir
- Tam secret log'lanmaz
### Otomatik vs Manuel: Hangisi Daha İyi?
| Özellik | Otomatik | Manuel |
|---------|----------|--------|
| Kolaylık | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Güvenlik | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Kontrol | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Production | ✅ Uygun | ✅ Önerilen |
**Öneriler:**
- 🧪 **Development/Test:** Otomatik (hızlı setup)
- 🏭 **Production:** Manuel (daha fazla kontrol)
- 🔄 **CI/CD:** Ortam değişkeni olarak enjekte et
---
## 📊 Entrypoint Script Akışı
```
Container Başlatılıyor
[docker-entrypoint.sh]
SESSION_SECRET var mı?
├─ Evet → Geçerli mi?
│ ├─ Evet → Kullan ✅
│ └─ Hayır → Oluştur 🔑
└─ Hayır → .env'de var mı?
├─ Evet → Yükle ✅
└─ Hayır → Oluştur 🔑
.env'e Kaydet 💾
Export SESSION_SECRET
Database Kontrol 🗄️
Migration (ilk kurulum)
Seed Data (AUTO_SEED=true ise)
Uygulama Başlat 🚀
```
---
## 🛠️ Özelleştirme
### SESSION_SECRET'ı Manuel Değiştirme
Container çalışırken:
```bash
# 1. Yeni secret oluştur
NEW_SECRET=$(node -e "console.log(require('crypto').randomBytes(64).toString('hex'))")
# 2. Container'a bağlan
docker compose exec backend sh
# 3. .env'i güncelle
echo "SESSION_SECRET=$NEW_SECRET" > .env
# 4. Container'ı yeniden başlat
exit
docker compose restart backend
```
### Otomatik Oluşturmayı Devre Dışı Bırakma
Eğer otomatik oluşturma istemiyorsanız:
```bash
# .env'e dummy değer ekle (entrypoint script bu değeri değiştirmez)
echo "SESSION_SECRET=DO-NOT-AUTO-GENERATE" > .env
# Veya docker-compose.yml'de:
environment:
- SESSION_SECRET=your-fixed-secret-here
```
---
## 🐛 Troubleshooting
### Problem: Her restart'ta yeni secret oluşuyor
**Sebep:** Volume mount edilmemiş veya .env dosyası kaydedilemiyor.
**Çözüm:**
```bash
# Volume'leri kontrol et
docker compose down
docker volume ls
docker volume inspect oltalama_backend-data
# Yeniden başlat
docker compose up -d
```
### Problem: SESSION_SECRET oluşturulmadı
**Kontrol:**
```bash
# Log'ları incele
docker compose logs backend | grep SESSION
# Container'a bağlan ve kontrol et
docker compose exec backend cat .env
```
### Problem: Session'lar sürekli sona eriyor
**Sebep:** SESSION_SECRET her restart'ta değişiyor.
**Çözüm:**
```bash
# Volume'ü kontrol et
docker compose exec backend ls -la /app/.env
# Manuel secret ata
docker compose exec backend sh -c 'echo "SESSION_SECRET=fixed-secret-here" > /app/.env'
docker compose restart backend
```
---
## 📚 İlgili Dosyalar
- `backend/docker-entrypoint.sh` - Ana entrypoint script
- `backend/Dockerfile` - Production Dockerfile
- `backend/Dockerfile.dev` - Development Dockerfile
- `docker-compose.yml` - Production compose
- `docker-compose.dev.yml` - Development compose
---
## 🎓 Daha Fazla Bilgi
- [Docker Entrypoint Best Practices](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#entrypoint)
- [Node.js Crypto Module](https://nodejs.org/api/crypto.html)
- [Express Session Security](https://expressjs.com/en/advanced/best-practice-security.html)
---
**🎉 Artık SESSION_SECRET'ı manuel oluşturmak zorunda değilsiniz!**