main
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
- Créez un projet sur supabase.com
- Dans SQL Editor, exécutez le fichier
supabase/migrations/001_initial_schema.sql - Dans Storage, créez 3 buckets privés :
avatars,weapon-photos,target-photos - Dans Authentication → URL Configuration, ajoutez
http://localhost:5173en Site URL
2. Variables d'environnement
# 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
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
cd backend
npm install
npm run dev
# → http://localhost:3001
5. Lancer le frontend
cd frontend
npm install
npm run dev
# → http://localhost:5173
Déploiement sur domench.fr
# Depuis le dossier Applications VPS
python deploy_shoottracker.py
Le script :
- Demande les clés Supabase
- Crée les repos Gitea (
shoottracker+shoottracker-ai) - Push le code
- Crée et configure les applications dans Coolify
- Déclenche le déploiement
- 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)
# 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 :
- Collectez des photos de cibles annotées (labelisez les trous)
- Utilisez Roboflow pour l'annotation
- Entraînez avec Ultralytics :
yolo train model=yolov8n.pt data=dataset.yaml epochs=100 imgsz=640 - Remplacez
yolov8n.ptpar votre modèle fine-tuné dansYOLO_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_roleuniquement côté backend, jamais exposée au frontend - Tokens JWT Supabase vérifiés sur chaque appel API backend
Description
Languages
TypeScript
74.6%
Python
16.6%
PLpgSQL
5.4%
Dockerfile
1.6%
CSS
0.8%
Other
1%