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