274 lines
7.6 KiB
Markdown
274 lines
7.6 KiB
Markdown
# 🚀 Suggest-Bet-BE — Deployment Guide
|
||
|
||
> **Tarih:** 2026-04-03
|
||
> **Versiyon:** Sport Partition Release (Futbol/Basketbol Ayrımı)
|
||
> **Amaç:** Masaüstü veya sunucuya kurulum adımları
|
||
|
||
---
|
||
|
||
## 🔑 Şifreler ve Bağlantı Bilgileri
|
||
|
||
| Servis | Kullanıcı | Şifre | Host | Port |
|
||
|--------|-----------|-------|------|------|
|
||
| **PostgreSQL** | `suggestbet` | `SuGGesT2026SecuRe` | `localhost` | `15432` |
|
||
| **Redis** | — | `RedisSecure2026` | `localhost` | `6379` |
|
||
| **JWT Secret** | — | `9bfa42fbdc6031da6d7c0bd30e9f5b6378a071613d0c02acf95eb576249c3a25` | — | — |
|
||
|
||
**Database URL:**
|
||
```
|
||
postgresql://suggestbet:SuGGesT2026SecuRe@localhost:15432/boilerplate_db?schema=public
|
||
```
|
||
|
||
---
|
||
|
||
## 📋 Gereksinimler
|
||
|
||
- **Node.js:** v20.19+
|
||
- **Docker + Docker Compose:** PostgreSQL + Redis için
|
||
- **npm:** Paket yöneticisi
|
||
|
||
---
|
||
|
||
## 🔧 Adım Adım Kurulum
|
||
|
||
### Adım 1: Kodu Çek
|
||
|
||
```bash
|
||
cd ~/Documents/Suggest-Bet-BE
|
||
git pull origin main
|
||
```
|
||
|
||
### Adım 2: .env Dosyasını Oluştur
|
||
|
||
```bash
|
||
# /Users/piton/Documents/Suggest-Bet-BE/.env
|
||
NODE_ENV=development
|
||
PORT=3005
|
||
DATABASE_URL="postgresql://suggestbet:SuGGesT2026SecuRe@localhost:15432/boilerplate_db?schema=public"
|
||
JWT_SECRET=9bfa42fbdc6031da6d7c0bd30e9f5b6378a071613d0c02acf95eb576249c3a25
|
||
JWT_ACCESS_EXPIRATION=7d
|
||
JWT_REFRESH_EXPIRATION=7d
|
||
REDIS_ENABLED=true
|
||
REDIS_HOST=localhost
|
||
REDIS_PORT=6379
|
||
REDIS_PASSWORD=RedisSecure2026
|
||
DEFAULT_LANGUAGE=en
|
||
FALLBACK_LANGUAGE=en
|
||
ENABLE_MAIL=false
|
||
ENABLE_S3=false
|
||
ENABLE_WEBSOCKET=false
|
||
ENABLE_MULTI_TENANCY=false
|
||
THROTTLE_TTL=60000
|
||
THROTTLE_LIMIT=100
|
||
ENABLE_GEMINI=true
|
||
GOOGLE_API_KEY=your-google-api-key
|
||
GEMINI_MODEL=gemini-2.5-flash
|
||
AI_ENGINE_URL=http://127.0.0.1:8000
|
||
```
|
||
|
||
### Adım 3: Docker Infrastructure Başlat
|
||
|
||
```bash
|
||
cd ~/Documents/Suggest-Bet-BE
|
||
docker compose up -d postgres redis
|
||
```
|
||
|
||
PostgreSQL'in hazır olduğunu kontrol et:
|
||
```bash
|
||
docker exec -i suggestbet-postgres pg_isready -U suggestbet
|
||
# Çıktı: /var/run/postgresql:5432 - accepting connections
|
||
```
|
||
|
||
### Adım 4: Dump'u Restore Et
|
||
|
||
```bash
|
||
# Dump dosyasını container'a kopyala
|
||
docker cp /path/to/dump-boilerplate_db-202604020914-v5 suggestbet-postgres:/tmp/dump_file
|
||
|
||
# Restore et
|
||
export PGPASSWORD="SuGGesT2026SecuRe"
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" suggestbet-postgres pg_restore \
|
||
-U suggestbet -d boilerplate_db --clean --if-exists /tmp/dump_file
|
||
```
|
||
|
||
### Adım 5: Sport Partition Migration'ını Çalıştır
|
||
|
||
**Sırayla çalıştır — her biri ayrı transaction:**
|
||
|
||
```bash
|
||
export PGPASSWORD="SuGGesT2026SecuRe"
|
||
DB="suggestbet-postgres"
|
||
MIGRATION_DIR="prisma/migrations/20260403161000_sport_partition"
|
||
|
||
# 1. Yeni team stats tabloları oluştur
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i $DB psql -U suggestbet -d boilerplate_db < $MIGRATION_DIR/01_create_team_stats.sql
|
||
|
||
# 2. Team stats verilerini kopyala
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i $DB psql -U suggestbet -d boilerplate_db < $MIGRATION_DIR/02_copy_team_stats.sql
|
||
|
||
# 3. Yeni AI features tabloları oluştur
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i $DB psql -U suggestbet -d boilerplate_db < $MIGRATION_DIR/03_create_ai_features.sql
|
||
|
||
# 4. AI features verilerini kopyala
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i $DB psql -U suggestbet -d boilerplate_db < $MIGRATION_DIR/04_copy_ai_features.sql
|
||
|
||
# 5. match_player_stats → basketball_player_stats rename
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i $DB psql -U suggestbet -d boilerplate_db < $MIGRATION_DIR/05_rename_player_stats.sql
|
||
|
||
# 6. odd_categories + odd_selections'e sport kolonu ekle
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i $DB psql -U suggestbet -d boilerplate_db < $MIGRATION_DIR/06_add_sport_to_odds.sql
|
||
```
|
||
|
||
**odd_selections için batch update (14.8M satır — her çalıştır 1M günceller):**
|
||
|
||
```bash
|
||
# Bunu "remaining = 0" olana kadar tekrar tekrar çalıştır
|
||
export PGPASSWORD="SuGGesT2026SecuRe"
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i suggestbet-postgres psql -U suggestbet -d boilerplate_db -c "
|
||
WITH t AS (
|
||
SELECT os.db_id, oc.sport
|
||
FROM odd_selections os
|
||
JOIN odd_categories oc ON os.odd_category_db_id = oc.db_id
|
||
WHERE os.sport IS NULL
|
||
LIMIT 1000000
|
||
)
|
||
UPDATE odd_selections SET sport = t.sport FROM t WHERE odd_selections.db_id = t.db_id;
|
||
|
||
SELECT COUNT(*) as remaining FROM odd_selections WHERE sport IS NULL;
|
||
"
|
||
```
|
||
|
||
**Kalan satırlar bitince index oluştur:**
|
||
```bash
|
||
export PGPASSWORD="SuGGesT2026SecuRe"
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i suggestbet-postgres psql -U suggestbet -d boilerplate_db -c "
|
||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_odd_selections_sport ON odd_selections(sport) WHERE sport IS NOT NULL;
|
||
"
|
||
```
|
||
|
||
### Adım 6: Bağımlılıkları Yükle + Prisma Generate
|
||
|
||
```bash
|
||
cd ~/Documents/Suggest-Bet-BE
|
||
|
||
# Bağımlılıkları yükle
|
||
npm ci
|
||
|
||
# Prisma client oluştur
|
||
npx prisma generate
|
||
```
|
||
|
||
### Adım 7: Build + Başlat
|
||
|
||
```bash
|
||
# Build
|
||
npm run build
|
||
|
||
# Başlat
|
||
npm run start:prod
|
||
```
|
||
|
||
### Adım 8: Doğrulama
|
||
|
||
```bash
|
||
# Sağlık kontrolü
|
||
curl http://localhost:3005/api/health
|
||
|
||
# Swagger UI
|
||
open http://localhost:3005/api/docs
|
||
|
||
# Yeni tabloları kontrol et
|
||
export PGPASSWORD="SuGGesT2026SecuRe"
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i suggestbet-postgres psql -U suggestbet -d boilerplate_db -c "
|
||
SELECT 'football_team_stats' as tbl, COUNT(*) FROM football_team_stats
|
||
UNION ALL SELECT 'basketball_team_stats', COUNT(*) FROM basketball_team_stats
|
||
UNION ALL SELECT 'basketball_player_stats', COUNT(*) FROM basketball_player_stats
|
||
UNION ALL SELECT 'odd_categories (sport)', COUNT(*) FROM odd_categories WHERE sport IS NOT NULL
|
||
UNION ALL SELECT 'odd_selections (sport)', COUNT(*) FROM odd_selections WHERE sport IS NOT NULL;
|
||
"
|
||
```
|
||
|
||
---
|
||
|
||
## 🤖 AI Engine (Opsiyonel)
|
||
|
||
```bash
|
||
cd ~/Documents/Suggest-Bet-BE/ai-engine
|
||
|
||
# Bağımlılıklar
|
||
pip install -r requirements.txt
|
||
|
||
# Başlat
|
||
uvicorn main:app --host 0.0.0.0 --port 8000
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ Tablo Durumu (Migration Sonrası)
|
||
|
||
| Tablo | Satır (~) | Durum |
|
||
|-------|-----------|-------|
|
||
| `football_team_stats` | 217,956 | ✅ Yeni |
|
||
| `basketball_team_stats` | 48,824 | ✅ Yeni |
|
||
| `basketball_player_stats` | 273,140 | ✅ Rename edildi |
|
||
| `football_ai_features` | 0 | ⚠️ Feeder dolduracak |
|
||
| `basketball_ai_features` | 0 | ⚠️ Feeder dolduracak |
|
||
| `odd_categories (sport)` | 2,695,511 | ✅ Güncellendi |
|
||
| `odd_selections (sport)` | 14,810,396 | ✅ Güncellendi |
|
||
| `match_team_stats` (ESKİ) | 266,780 | 🗑️ Silinebilir (yedek olarak kalsın) |
|
||
| `match_ai_features` (ESKİ) | 0 | 🗑️ Silinebilir |
|
||
|
||
---
|
||
|
||
## 🗑️ Eski Tabloları Silme (Opsiyonel)
|
||
|
||
**SADECE her şey çalıştığını doğruladıktan sonra:**
|
||
|
||
```bash
|
||
export PGPASSWORD="SuGGesT2026SecuRe"
|
||
docker exec -e PGPASSWORD="$PGPASSWORD" -i suggestbet-postgres psql -U suggestbet -d boilerplate_db -c "
|
||
DROP TABLE IF EXISTS match_team_stats CASCADE;
|
||
DROP TABLE IF EXISTS match_ai_features CASCADE;
|
||
"
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Sorun Giderme
|
||
|
||
### PostgreSQL başlamıyor (postmaster.pid hatası)
|
||
```bash
|
||
docker compose stop postgres
|
||
docker compose rm -f postgres
|
||
docker volume rm suggest-bet-be_pgml_data
|
||
docker compose up -d postgres
|
||
# Sonra dump + migration tekrar
|
||
```
|
||
|
||
### Docker Desktop başlamıyor (disk dolu)
|
||
```bash
|
||
# Büyük dosyaları temizle
|
||
rm -rf ~/Library/Caches/Homebrew/*
|
||
rm -rf ~/.npm/_cacache
|
||
docker system prune -af
|
||
df -h / # En az 3-4GB boş olmalı
|
||
```
|
||
|
||
### Feeder çalışmıyor
|
||
```bash
|
||
# Logları kontrol et
|
||
tail -f logs/app.log # veya docker logs suggestbet-app
|
||
|
||
# Manuel feeder çalıştır
|
||
npm run feeder:live
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 Notlar
|
||
|
||
- **Veri kaybolmaz** — eski tablolar migration sonrası silinmez, yedek olarak kalır
|
||
- **Feeder** otomatik yeni tablolara yazar (`footballTeamStats`, `basketballTeamStats`, vb.)
|
||
- **Redis** opsiyonel — `REDIS_ENABLED=false` yapabilirsin (in-memory fallback)
|
||
- **Swagger** sadece development modunda aktif
|