setup script

This commit is contained in:
salvacybersec
2025-11-11 04:36:35 +03:00
parent f0b61735cc
commit 05bb2fc55c
6 changed files with 438 additions and 15 deletions

View File

@@ -67,30 +67,72 @@ cd oltalama
### 2. Environment Dosyasını Hazırlayın ### 2. Environment Dosyasını Hazırlayın
**🎉 Yeni: SESSION_SECRET Artık Otomatik Oluşuyor!**
Docker entrypoint scripti sayesinde SESSION_SECRET'ı belirtmeseniz bile **otomatik oluşturulur** ve kaydedilir.
#### Seçenek 1: Minimal (Otomatik SESSION_SECRET)
```bash ```bash
# Örnek dosyadan kopyalayın # Sadece zorunlu ayarları girin, SESSION_SECRET otomatik!
cat > .env << 'EOF' cat > .env << 'EOF'
SESSION_SECRET=your-strong-random-secret-here # SESSION_SECRET boş bırakılırsa otomatik oluşturulur!
# Gmail ayarları (ZORUNLU)
GMAIL_USER=your-email@gmail.com GMAIL_USER=your-email@gmail.com
GMAIL_APP_PASSWORD=your-gmail-app-password GMAIL_APP_PASSWORD=your-gmail-app-password
# Telegram ayarları (ZORUNLU)
TELEGRAM_BOT_TOKEN=your-bot-token TELEGRAM_BOT_TOKEN=your-bot-token
TELEGRAM_CHAT_ID=your-chat-id TELEGRAM_CHAT_ID=your-chat-id
# Opsiyonel: Ollama AI
OLLAMA_SERVER_URL=http://host.docker.internal:11434 OLLAMA_SERVER_URL=http://host.docker.internal:11434
OLLAMA_MODEL=llama3.2:latest OLLAMA_MODEL=llama3.2:latest
# Frontend API URL
VITE_API_URL=http://localhost:3000 VITE_API_URL=http://localhost:3000
EOF EOF
# Editör ile açın ve konfigüre edin
nano .env
``` ```
**Minimum gerekli ayarlar:** #### Seçenek 2: Manuel SESSION_SECRET (Daha Güvenli)
```env
SESSION_SECRET=very-strong-random-secret-here 🔐 **Kendi SESSION_SECRET'ınızı Oluşturun:**
```bash
# Terminal'de çalıştır
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
# VEYA
openssl rand -hex 64
```
```bash
cat > .env << 'EOF'
# SESSION_SECRET: Oturumları şifreler (manuel oluşturduysanız buraya yapıştırın)
SESSION_SECRET=a3f8d92c7e1b4f5a9d8c7e2b1a4f5c8d9e2f1a3b4c5d6e7f8a9b0c1d2e3f4a5b
# Gmail ayarları
GMAIL_USER=your-email@gmail.com GMAIL_USER=your-email@gmail.com
GMAIL_APP_PASSWORD=your-gmail-app-password GMAIL_APP_PASSWORD=your-gmail-app-password
# Telegram ayarları
TELEGRAM_BOT_TOKEN=your-bot-token TELEGRAM_BOT_TOKEN=your-bot-token
TELEGRAM_CHAT_ID=your-chat-id TELEGRAM_CHAT_ID=your-chat-id
# Opsiyonel: Otomatik seed data (ilk kurulumda örnek veri)
AUTO_SEED=false
# Ollama AI (opsiyonel)
OLLAMA_SERVER_URL=http://host.docker.internal:11434
OLLAMA_MODEL=llama3.2:latest
# Frontend
VITE_API_URL=http://localhost:3000
EOF
```
**Editörle düzenleyin:**
```bash
nano .env
``` ```
### 3. Production Modunda Başlatın ### 3. Production Modunda Başlatın
@@ -99,10 +141,23 @@ TELEGRAM_CHAT_ID=your-chat-id
# Container'ları build edin ve başlatın # Container'ları build edin ve başlatın
docker compose up -d docker compose up -d
# Logları görüntüleyin # Logları görüntüleyin (SESSION_SECRET otomatik oluşturuldu mu kontrol edin)
docker compose logs -f docker compose logs backend
# Örnek çıktı:
# 🚀 Oltalama Backend başlatılıyor...
# 🔑 Yeni SESSION_SECRET otomatik oluşturuluyor...
# ✅ Yeni SESSION_SECRET oluşturuldu ve .env dosyasına kaydedildi
# 📝 SESSION_SECRET: a3f8d92c7e1b4f5a9d... (ilk 20 karakter)
# ✅ Backend hazır, uygulama başlatılıyor...
``` ```
**🎉 SESSION_SECRET Otomatik Yönetimi:**
- ✅ İlk çalıştırmada otomatik oluşturulur
- ✅ Backend volume'üne kaydedilir
- ✅ Sonraki restart'larda aynı secret kullanılır
- ✅ Session'lar korunur
### 4. Admin Kullanıcısı Oluşturun ### 4. Admin Kullanıcısı Oluşturun
İlk çalıştırmada admin kullanıcısı oluşturmanız gerekir: İlk çalıştırmada admin kullanıcısı oluşturmanız gerekir:

View File

@@ -32,6 +32,10 @@ COPY --from=builder /app/node_modules ./node_modules
# Copy application code # Copy application code
COPY --chown=oltalama:oltalama . . COPY --chown=oltalama:oltalama . .
# Copy entrypoint script
COPY --chown=oltalama:oltalama docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
# Create necessary directories # Create necessary directories
RUN mkdir -p database logs && \ RUN mkdir -p database logs && \
chown -R oltalama:oltalama /app chown -R oltalama:oltalama /app
@@ -46,8 +50,8 @@ EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node -e "require('http').get('http://localhost:3000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" CMD node -e "require('http').get('http://localhost:3000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
# Use tini as entrypoint for proper signal handling # Use tini and custom entrypoint for proper signal handling and auto-config
ENTRYPOINT ["/sbin/tini", "--"] ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
# Start application # Start application
CMD ["node", "src/app.js"] CMD ["node", "src/app.js"]

View File

@@ -19,14 +19,18 @@ RUN npm install
# Copy application code # Copy application code
COPY . . COPY . .
# Copy entrypoint script
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
# Create necessary directories # Create necessary directories
RUN mkdir -p database logs RUN mkdir -p database logs
# Expose port # Expose port
EXPOSE 3000 EXPOSE 3000
# Use tini as entrypoint # Use tini and custom entrypoint
ENTRYPOINT ["/sbin/tini", "--"] ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
# Start with nodemon for hot reload # Start with nodemon for hot reload
CMD ["npm", "run", "dev"] CMD ["npm", "run", "dev"]

82
backend/docker-entrypoint.sh Executable file
View File

@@ -0,0 +1,82 @@
#!/bin/sh
set -e
# Docker Entrypoint Script - Backend
# Otomatik SESSION_SECRET oluşturma ve yönetimi
echo "🚀 Oltalama Backend başlatılıyor..."
# SESSION_SECRET kontrolü ve otomatik oluşturma
if [ -z "$SESSION_SECRET" ] || [ "$SESSION_SECRET" = "change-this-to-a-very-strong-random-secret" ]; then
echo "⚠️ SESSION_SECRET boş veya varsayılan değerde!"
# .env dosyası varsa SESSION_SECRET'ı oradan al
if [ -f "/app/.env" ]; then
SESSION_SECRET_FROM_FILE=$(grep "^SESSION_SECRET=" /app/.env | cut -d'=' -f2-)
if [ -n "$SESSION_SECRET_FROM_FILE" ] && [ "$SESSION_SECRET_FROM_FILE" != "change-this-to-a-very-strong-random-secret" ]; then
export SESSION_SECRET="$SESSION_SECRET_FROM_FILE"
echo "✅ SESSION_SECRET .env dosyasından yüklendi"
fi
fi
# Hala boşsa otomatik oluştur
if [ -z "$SESSION_SECRET" ] || [ "$SESSION_SECRET" = "change-this-to-a-very-strong-random-secret" ]; then
echo "🔑 Yeni SESSION_SECRET otomatik oluşturuluyor..."
# Node.js ile güçlü random secret oluştur
SESSION_SECRET=$(node -e "console.log(require('crypto').randomBytes(64).toString('hex'))")
export SESSION_SECRET
# Session secret'ı .env dosyasına kaydet (persist)
if [ ! -f "/app/.env" ]; then
echo "SESSION_SECRET=$SESSION_SECRET" > /app/.env
echo "✅ Yeni SESSION_SECRET oluşturuldu ve .env dosyasına kaydedildi"
echo "📝 SESSION_SECRET: ${SESSION_SECRET:0:20}... (ilk 20 karakter)"
else
# Mevcut .env dosyasını güncelle
if grep -q "^SESSION_SECRET=" /app/.env; then
sed -i "s|^SESSION_SECRET=.*|SESSION_SECRET=$SESSION_SECRET|" /app/.env
else
echo "SESSION_SECRET=$SESSION_SECRET" >> /app/.env
fi
echo "✅ SESSION_SECRET güncellendi ve .env dosyasına kaydedildi"
fi
fi
else
echo "✅ SESSION_SECRET zaten ayarlanmış"
fi
# Database dizinini kontrol et
if [ ! -d "/app/database" ]; then
echo "📁 Database dizini oluşturuluyor..."
mkdir -p /app/database
fi
# Logs dizinini kontrol et
if [ ! -d "/app/logs" ]; then
echo "📁 Logs dizini oluşturuluyor..."
mkdir -p /app/logs
fi
# Database migration'ları çalıştır (ilk kurulumda)
if [ ! -f "/app/database/oltalama.db" ]; then
echo "🗄️ İlk kurulum tespit edildi, database oluşturuluyor..."
if [ -f "/app/migrations/run-migrations.js" ]; then
node /app/migrations/run-migrations.js || echo "⚠️ Migration hatası (normal olabilir)"
fi
# Seed data (opsiyonel)
if [ "${AUTO_SEED}" = "true" ] && [ -f "/app/seeders/run-seeders.js" ]; then
echo "🌱 Seed data ekleniyor..."
node /app/seeders/run-seeders.js || echo "⚠️ Seeding hatası (normal olabilir)"
fi
else
echo "✅ Database mevcut, migration atlanıyor"
fi
echo "✅ Backend hazır, uygulama başlatılıyor..."
echo ""
# CMD komutunu çalıştır (exec ile PID 1'e geç)
exec "$@"

View File

@@ -13,7 +13,8 @@ services:
environment: environment:
- NODE_ENV=production - NODE_ENV=production
- PORT=3000 - PORT=3000
- SESSION_SECRET=${SESSION_SECRET:-change-this-secret-in-production} - SESSION_SECRET=${SESSION_SECRET:-} # Boşsa otomatik oluşturulur
- AUTO_SEED=${AUTO_SEED:-false} # true yaparsanız örnek data eklenir
- GMAIL_USER=${GMAIL_USER} - GMAIL_USER=${GMAIL_USER}
- GMAIL_APP_PASSWORD=${GMAIL_APP_PASSWORD} - GMAIL_APP_PASSWORD=${GMAIL_APP_PASSWORD}
- TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN} - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}

277
docs/AUTO_SESSION_SECRET.md Normal file
View 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!**