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

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

  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)

# 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 pour l'annotation
  3. Entraînez avec Ultralytics :
    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
S
Description
ShootTracker — tir sportif SQLite+JWT+YOLOv8
Readme 141 KiB
Languages
TypeScript 74.6%
Python 16.6%
PLpgSQL 5.4%
Dockerfile 1.6%
CSS 0.8%
Other 1%