# 🚀 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