Files
fahricansecer 7814e0bc6b
Deploy Iddaai Backend / build-and-deploy (push) Failing after 4s
first (part 1: root files)
2026-04-16 15:09:10 +03:00

7.6 KiB
Raw Permalink Blame History

🚀 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

cd ~/Documents/Suggest-Bet-BE
git pull origin main

Adım 2: .env Dosyasını Oluştur

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

cd ~/Documents/Suggest-Bet-BE
docker compose up -d postgres redis

PostgreSQL'in hazır olduğunu kontrol et:

docker exec -i suggestbet-postgres pg_isready -U suggestbet
# Çıktı: /var/run/postgresql:5432 - accepting connections

Adım 4: Dump'u Restore Et

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

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):

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

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

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

# Build
npm run build

# Başlat
npm run start:prod

Adım 8: Doğrulama

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

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:

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ı)

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)

# 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

# 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