Plateforme de scores sportifs en temps réel — Real-time football scores platform.
Live scores, classements, compositions, statistiques joueurs et historique de matchs, alimentés par une architecture event-driven (NestJS + Redis) et plusieurs sources de données football.
| Layer | Technology |
|---|---|
| Backend | NestJS 11 + TypeScript (strict) |
| Frontend | Next.js 16 + React + Tailwind CSS |
| Database | PostgreSQL 16 via Prisma 7 ORM |
| Cache | Redis 7 (ioredis) — cache TTL par type de donnée |
| Scheduling | @nestjs/schedule (cron de warmup pour limiter le rate-limit) |
| Infrastructure | Docker Compose + GitHub Actions CI |
| Source | Usage |
|---|---|
API-Football v3 (API_FOOTBALL_KEY) |
Source principale : fixtures, standings, joueurs, équipes, coaches, transferts, blessures, cotes, prédictions, H2H. Accès direct v3.football.api-sports.io (header x-apisports-key), pas via RapidAPI |
Football-Data.org (FOOTBALL_DATA_ORG_KEY) |
Livescores du jour (LivescoreService) |
| ESPN (client public) | Données complémentaires |
| TheSportsDB | Photos joueurs / lineups |
- Docker ≥ 24 et le plugin Docker Compose
- Node.js ≥ 22 (dév local hors Docker)
- npm ≥ 10
git clone https://github.com/your-org/pulsescore.git
cd pulsescore
cp .env.example .env
# Éditer .env : DATABASE_URL, REDIS_URL, API_FOOTBALL_KEY, FOOTBALL_DATA_ORG_KEYdocker compose up -d postgres redis
docker compose ps # STATUS doit afficher "(healthy)"npm install
npm run prisma:migrate:dev
npm run prisma:generatenpm run dev # API (3001) + Web (3000)
# ou
npm run dev:front # Web uniquementdocker compose up --build| Service | URL |
|---|---|
| Frontend | http://localhost:3000 |
| API | http://localhost:3001 |
| Health check | http://localhost:3001/health |
| Prisma Studio | npx prisma studio (depuis apps/api/) |
| PostgreSQL | localhost:5432 (user: pulsescore, db: pulsescore) |
| Redis | localhost:6379 |
Fichier .env à la racine (chargé par l'API via ../../.env) :
| Variable | Description |
|---|---|
DATABASE_URL |
URL PostgreSQL |
REDIS_URL |
URL Redis |
API_FOOTBALL_KEY |
Clé API-Football v3 (api-sports.io direct) |
APIFOOTBALL_TIMEZONE |
Timezone des fixtures (ex. Europe/Paris) |
FOOTBALL_DATA_ORG_KEY |
Clé Football-Data.org (livescores) |
NEXT_PUBLIC_API_URL |
URL de l'API exposée au front (http://localhost:3001) |
NODE_ENV / PORT |
Environnement et port de l'API |
Monorepo npm workspaces :
apps/api— backend NestJS 11 (port 3001)apps/web— frontend Next.js 16 (port 3000)
Le cœur de l'API. Chaque domaine a son service + controller, agrégeant plusieurs sources externes et normalisant les données via des normalizer/.
sports-data/
├── client/ # API-Football, Football-Data.org, ESPN
├── controllers/ # matches, teams, players, leagues, standings,
│ # h2h, transfers, injuries, coaches, venues,
│ # countries, predictions, trophies, sidelined, livescore
├── services/ # logique métier par domaine (+ warmup cron, odds, scorers)
├── normalizer/ # normalisation des réponses externes
├── interfaces/ # types des réponses providers
├── dto/ # DTOs exposés au front
└── constants/ # mapping ligues / saisons
Cache & rate-limit : SportsDataCacheService met en cache les réponses dans Redis avec des TTL par type (TTL court pour le live, long pour les données statiques). Un WarmupService (cron) pré-charge les données fréquentes pour éviter le rate-limit 429 des providers.
| Route | Contenu |
|---|---|
/ |
Accueil — feed live + ligues |
/fixtures |
Matchs à venir |
/results |
Résultats |
/leagues et /leagues/[slug] |
Liste et détail des ligues |
/standings/[leagueId] |
Classements |
/teams/[teamId] |
Fiche équipe (effectif, coach, stade, couleurs) |
/players/[playerId] |
Fiche joueur (stats, photo) |
/match/[id] |
Détail match (compositions, événements, H2H) |
/h2h/[teamId1]/[teamId2] |
Confrontations directes |
Composants par domaine : feed/, leagues/, match/, matches/, player/, scorers/, standings/, teams/, world-cup/, theme/, ui/.
User, Match, League, Team, Standing, Player, MatchEvent.
npm run dev # API + web en watch mode
npm run dev:front # Web uniquement
npm run build # Build production des deux apps
npm run lint # Lint des deux apps
npm run test # Tests API (Jest)
npm run prisma:generate # Régénère le client Prisma
npm run prisma:migrate:dev # Crée + applique une migration
npm run prisma:migrate:deploy # Applique les migrations (production)GitHub Actions (.github/workflows/ci.yml) sur push main et PR :
- Démarre PostgreSQL 16 + Redis 7 (service containers)
- Installe les dépendances
- Génère le client Prisma + migrations
- Lint des deux apps
- Build des deux apps
- Tests unitaires API
Un hook pre-push (Husky) rejoue les tests localement avant push.
- Infra monorepo (NestJS + Next.js + Docker + CI)
- Ingestion multi-sources (API-Football, Football-Data.org, ESPN, TheSportsDB)
- Pages ligues / classements / équipes / joueurs / matchs / H2H
- Cache Redis + cron de warmup anti rate-limit
- Recherche navbar, liens joueurs lineup, champion card, page rate-limit
- FIFA World Cup 2026
- WebSocket gateway — push temps réel des scores (Socket.io + Redis Pub/Sub), notifications de buts
- Leaderboards (Redis Sorted Sets)
- Mini-jeu de pronostics
- Authentification (JWT + refresh tokens)
- Déploiement (Railway / Fly.io)
PulseScore Arena — plateforme open-source d'engagement des fans de football.