Files
shoottracker/README.md
T
2026-04-30 22:44:27 +02:00

223 lines
6.4 KiB
Markdown

# ShootTracker
**PWA de suivi de performance en tir sportif** — Analyse d'impacts par IA (YOLOv8), scores, progression, export PDF/Excel.
---
## Architecture
| Composant | Technologie | Rôle |
|---|---|---|
| Frontend | React 18 + TypeScript + Tailwind + Vite + PWA | Interface utilisateur |
| Backend | Node.js + Express + TypeScript | API proxy IA, exports PDF/Excel |
| Base de données | Supabase (PostgreSQL) | Données, authentification, stockage photos |
| Microservice IA | Python + FastAPI + YOLOv8 + OpenCV | Analyse automatique des impacts |
| Déploiement | Docker + Coolify + Gitea | Infrastructure domench.fr |
---
## Démarrage rapide (développement local)
### Prérequis
- Node.js 20+
- Python 3.11+
- Un projet Supabase créé (voir ci-dessous)
### 1. Configurer Supabase
1. Créez un projet sur [supabase.com](https://supabase.com)
2. Dans **SQL Editor**, exécutez le fichier `supabase/migrations/001_initial_schema.sql`
3. Dans **Storage**, créez 3 buckets privés : `avatars`, `weapon-photos`, `target-photos`
4. Dans **Authentication → URL Configuration**, ajoutez `http://localhost:5173` en Site URL
### 2. Variables d'environnement
```bash
# Frontend
cp frontend/.env.example frontend/.env
# Remplir VITE_SUPABASE_URL et VITE_SUPABASE_ANON_KEY
# Backend
cp backend/.env.example backend/.env
# Remplir SUPABASE_URL et SUPABASE_SERVICE_ROLE_KEY
```
### 3. Lancer le microservice IA
```bash
cd ai-service
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
# → http://localhost:8000
```
### 4. Lancer le backend
```bash
cd backend
npm install
npm run dev
# → http://localhost:3001
```
### 5. Lancer le frontend
```bash
cd frontend
npm install
npm run dev
# → http://localhost:5173
```
---
## Déploiement sur domench.fr
```bash
# Depuis le dossier Applications VPS
python deploy_shoottracker.py
```
Le script :
1. Demande les clés Supabase
2. Crée les repos Gitea (`shoottracker` + `shoottracker-ai`)
3. Push le code
4. Crée et configure les applications dans Coolify
5. Déclenche le déploiement
6. Attends que l'app soit live
**URLs de production :**
- Application : `https://shoottracker.domench.fr`
- Microservice IA : `https://shoottracker-ai.domench.fr`
---
## Déploiement avec Docker Compose (local)
```bash
# Créer .env depuis le modèle
cp .env.example .env
# Remplir les valeurs Supabase
# Build et démarrage
docker-compose up --build
# L'app est accessible sur http://localhost:3001
```
---
## Structure du projet
```
shoottracker/
├── frontend/ # React PWA
│ ├── src/
│ │ ├── pages/
│ │ │ ├── auth/ # Login, Register
│ │ │ ├── session/ # NewSession, SessionCapture, SessionDetail
│ │ │ ├── Dashboard.tsx
│ │ │ ├── Arsenal.tsx # Coffre virtuel
│ │ │ ├── WeaponForm.tsx
│ │ │ ├── Progress.tsx # Progression + graphiques
│ │ │ └── Profile.tsx # Profil + invitations
│ │ ├── components/ # Layout, BottomNav, Sidebar...
│ │ ├── lib/ # supabase.ts, api.ts, store.ts
│ │ └── types/ # TypeScript interfaces
│ └── ...
├── backend/ # Node.js/Express
│ └── src/
│ ├── routes/
│ │ ├── analyze.ts # Proxy → microservice IA
│ │ └── export.ts # PDF et Excel
│ └── middleware/auth.ts # Vérification JWT Supabase
├── ai-service/ # Python FastAPI
│ ├── main.py # API FastAPI
│ ├── analyzer.py # YOLOv8 + OpenCV
│ ├── requirements.txt
│ └── Dockerfile
└── supabase/
└── migrations/
└── 001_initial_schema.sql # Tables + RLS + Storage
```
---
## Modules
### Module 1 — Authentification
- Inscription / connexion email via Supabase Auth
- Profil éditable (nom, club, disciplines, photo)
- Invitations : jusqu'à 5 amis (lien unique, 7 jours)
### Module 2 — Arsenal (coffre virtuel)
- CRUD armes avec photo, type, calibre, marque, modèle, numéro de série
- Filtre par type, recherche, archivage
- Photos stockées dans Supabase Storage
### Module 3 — Séance d'entraînement
- Ouverture : date, lieu (mémorisé), arme, type cible, distance
- Cycle de tirs : photo → IA → ajustement manuel
- Analyse IA : YOLOv8 + zones ISSF (1-10) + groupement
- Soustraction d'image pour les séries sur même cible
- Clôture avec résumé complet
### Module 4 — Dashboard & Progression
- Tableau de bord global avec graphiques Recharts
- Filtres : période (30j/90j/1an/tout) + arme
- Courbe de progression, dispersion, histogramme
- Historique cliquable des séances
### Module 5 — Export
- PDF par séance (jsPDF + jspdf-autotable) avec photo annotée
- Excel global (SheetJS) avec toutes les séances
---
## Variables d'environnement
### Frontend (Vite)
| Variable | Description |
|---|---|
| `VITE_SUPABASE_URL` | URL du projet Supabase |
| `VITE_SUPABASE_ANON_KEY` | Clé publique Supabase |
### Backend (Node.js)
| Variable | Description |
|---|---|
| `SUPABASE_URL` | URL du projet Supabase |
| `SUPABASE_SERVICE_ROLE_KEY` | Clé service role (privée) |
| `AI_SERVICE_URL` | URL du microservice IA |
| `PORT` | Port du serveur (défaut: 3001) |
| `CORS_ORIGIN` | Domaine autorisé en CORS |
### Microservice IA (Python)
| Variable | Description |
|---|---|
| `PORT` | Port du serveur (défaut: 8000) |
| `YOLO_MODEL_PATH` | Chemin du modèle YOLOv8 (défaut: yolov8n.pt) |
---
## Fine-tuning YOLOv8
Pour améliorer la détection des impacts au-delà du modèle généraliste :
1. Collectez des photos de cibles annotées (labelisez les trous)
2. Utilisez [Roboflow](https://roboflow.com) pour l'annotation
3. Entraînez avec Ultralytics :
```bash
yolo train model=yolov8n.pt data=dataset.yaml epochs=100 imgsz=640
```
4. Remplacez `yolov8n.pt` par votre modèle fine-tuné dans `YOLO_MODEL_PATH`
---
## Sécurité
- Row Level Security (RLS) activé sur toutes les tables Supabase
- Chaque utilisateur n'accède qu'à ses propres données
- Photos stockées avec accès privé (buckets Supabase)
- Clé `service_role` uniquement côté backend, jamais exposée au frontend
- Tokens JWT Supabase vérifiés sur chaque appel API backend