From 05bb2fc55c22eb2e37f0124aef4e3b29f0b71efa Mon Sep 17 00:00:00 2001 From: salvacybersec Date: Tue, 11 Nov 2025 04:36:35 +0300 Subject: [PATCH] setup script --- DOCKER.md | 75 ++++++++-- backend/Dockerfile | 8 +- backend/Dockerfile.dev | 8 +- backend/docker-entrypoint.sh | 82 +++++++++++ docker-compose.yml | 3 +- docs/AUTO_SESSION_SECRET.md | 277 +++++++++++++++++++++++++++++++++++ 6 files changed, 438 insertions(+), 15 deletions(-) create mode 100755 backend/docker-entrypoint.sh create mode 100644 docs/AUTO_SESSION_SECRET.md diff --git a/DOCKER.md b/DOCKER.md index 4c46b77..5c7e9eb 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -67,30 +67,72 @@ cd oltalama ### 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 -# Örnek dosyadan kopyalayın +# Sadece zorunlu ayarları girin, SESSION_SECRET otomatik! 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_APP_PASSWORD=your-gmail-app-password + +# Telegram ayarları (ZORUNLU) TELEGRAM_BOT_TOKEN=your-bot-token TELEGRAM_CHAT_ID=your-chat-id + +# Opsiyonel: Ollama AI OLLAMA_SERVER_URL=http://host.docker.internal:11434 OLLAMA_MODEL=llama3.2:latest + +# Frontend API URL VITE_API_URL=http://localhost:3000 EOF - -# Editör ile açın ve konfigüre edin -nano .env ``` -**Minimum gerekli ayarlar:** -```env -SESSION_SECRET=very-strong-random-secret-here +#### Seçenek 2: Manuel SESSION_SECRET (Daha Güvenli) + +🔐 **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_APP_PASSWORD=your-gmail-app-password + +# Telegram ayarları TELEGRAM_BOT_TOKEN=your-bot-token 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 @@ -99,10 +141,23 @@ TELEGRAM_CHAT_ID=your-chat-id # Container'ları build edin ve başlatın docker compose up -d -# Logları görüntüleyin -docker compose logs -f +# Logları görüntüleyin (SESSION_SECRET otomatik oluşturuldu mu kontrol edin) +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 İlk çalıştırmada admin kullanıcısı oluşturmanız gerekir: diff --git a/backend/Dockerfile b/backend/Dockerfile index 06d2935..2af6943 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -32,6 +32,10 @@ COPY --from=builder /app/node_modules ./node_modules # Copy application code 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 RUN mkdir -p database logs && \ chown -R oltalama:oltalama /app @@ -46,8 +50,8 @@ EXPOSE 3000 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)})" -# Use tini as entrypoint for proper signal handling -ENTRYPOINT ["/sbin/tini", "--"] +# Use tini and custom entrypoint for proper signal handling and auto-config +ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"] # Start application CMD ["node", "src/app.js"] diff --git a/backend/Dockerfile.dev b/backend/Dockerfile.dev index fed6da5..5197c7e 100644 --- a/backend/Dockerfile.dev +++ b/backend/Dockerfile.dev @@ -19,14 +19,18 @@ RUN npm install # Copy application code COPY . . +# Copy entrypoint script +COPY docker-entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + # Create necessary directories RUN mkdir -p database logs # Expose port EXPOSE 3000 -# Use tini as entrypoint -ENTRYPOINT ["/sbin/tini", "--"] +# Use tini and custom entrypoint +ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"] # Start with nodemon for hot reload CMD ["npm", "run", "dev"] diff --git a/backend/docker-entrypoint.sh b/backend/docker-entrypoint.sh new file mode 100755 index 0000000..f3b6197 --- /dev/null +++ b/backend/docker-entrypoint.sh @@ -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 "$@" + diff --git a/docker-compose.yml b/docker-compose.yml index 7282776..c4c673d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,8 @@ services: environment: - NODE_ENV=production - 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_APP_PASSWORD=${GMAIL_APP_PASSWORD} - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN} diff --git a/docs/AUTO_SESSION_SECRET.md b/docs/AUTO_SESSION_SECRET.md new file mode 100644 index 0000000..fe12912 --- /dev/null +++ b/docs/AUTO_SESSION_SECRET.md @@ -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!** +