Files
balikci/docs/AUTO_SESSION_SECRET.md
salvacybersec 05bb2fc55c setup script
2025-11-11 04:36:35 +03:00

278 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🔐 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!**