278 lines
6.1 KiB
Markdown
278 lines
6.1 KiB
Markdown
# 🔐 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!**
|
||
|