setup script
This commit is contained in:
277
docs/AUTO_SESSION_SECRET.md
Normal file
277
docs/AUTO_SESSION_SECRET.md
Normal file
@@ -0,0 +1,277 @@
|
||||
# 🔐 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!**
|
||||
|
||||
Reference in New Issue
Block a user