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