setup script
This commit is contained in:
75
DOCKER.md
75
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:
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
|
||||
82
backend/docker-entrypoint.sh
Executable file
82
backend/docker-entrypoint.sh
Executable 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 "$@"
|
||||
|
||||
@@ -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}
|
||||
|
||||
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