24 KiB
Plan de Correction - HabitForge
Date: 2025-12-30
Basé sur: revue_critique_habitforge.md
Objectif: Transformer HabitForge en une application professionnelle et production-ready
Vue d'ensemble
Ce plan organise les corrections nécessaires en 5 phases prioritaires, des problèmes critiques de sécurité jusqu'aux améliorations de l'expérience utilisateur.
graph TD
A[Phase 1: Sécurité & Stabilité] --> B[Phase 2: Architecture & Qualité]
B --> C[Phase 3: Tests & CI/CD]
C --> D[Phase 4: Observabilité & Performance]
D --> E[Phase 5: UX & Documentation]
A --> A1[Configuration env vars]
A --> A2[Secrets management]
A --> A3[CORS & Rate limiting]
A --> A4[PostgreSQL migration]
A --> A5[HTTPS & Nginx]
B --> B1[Restructuration backend]
B --> B2[Couche de services]
B --> B3[Modularisation frontend]
B --> B4[DX tools]
C --> C1[Tests unitaires]
C --> C2[Tests intégration]
C --> C3[GitHub Actions CI/CD]
D --> D1[Logging structuré]
D --> D2[Health checks]
D --> D3[Performance DB]
E --> E1[Notifications UI]
E --> E2[Documentation]
Phase 1: Sécurité & Stabilité (Critique)
1.1 Configuration et Environment Variables
Objectif: Éliminer toute configuration hardcodée et sécuriser les secrets.
Étape 1.1.1: Créer le module de configuration
- Créer
backend/core/config.pyavecpydantic_settings - Définir la classe
Settingsavec tous les paramètres - Configurer le chargement depuis
.env - Générer
SECRET_KEYavectoken_urlsafe(32)par défaut
Fichiers à créer/modifier:
backend/core/config.py(nouveau)backend/core/__init__.py(nouveau)
Étape 1.1.2: Créer les fichiers d'environnement
- Créer
.env.exampleavec tous les paramètres documentés - Créer
.env.development(gitignored) - Créer
.env.staging(gitignored) - Créer
.env.production(gitignored)
Fichiers à créer:
.env.example.env.development.env.staging.env.production
Étape 1.1.3: Mettre à jour .gitignore
- Ajouter
.env*(sauf.env.example) - Ajouter
backend/client_secret*.json - Ajouter
data/*.db - Ajouter
__pycache__/,*.pyc,.pytest_cache/ - Ajouter
.coverage,htmlcov/ - Ajouter
node_modules/,.DS_Store
Fichiers à modifier:
.gitignore
Étape 1.1.4: Migrer le code vers la configuration centralisée
- Modifier
backend/auth.pypour utilisersettings.SECRET_KEY - Modifier
backend/main.pypour utilisersettings.CORS_ORIGINS - Modifier
backend/database.pypour utilisersettings.DATABASE_URL - Modifier
backend/google_fit.pypour utiliser les env vars Google
Fichiers à modifier:
backend/auth.pybackend/main.pybackend/database.pybackend/google_fit.py
1.2 Sécurité des Secrets
Objectif: Supprimer tous les secrets hardcodés du code.
Étape 1.2.1: Nettoyer les secrets Google
- Supprimer
backend/client_secret_947199050300-boi4r9r8eekmv61h748lrvjmvp1f2v38.apps.googleusercontent.com.json - Supprimer
backend/client_secret.jsondu git - Documenter la configuration des credentials Google dans
.env.example
Fichiers à supprimer:
backend/client_secret_947199050300-boi4r9r8eekmv61h748lrvjmvp1f2v38.apps.googleusercontent.com.jsonbackend/client_secret.json
Étape 1.2.2: Supprimer le SECRET_KEY hardcodé
- Remplacer
"supersecretkey_change_me_in_production"dansbackend/auth.py - Utiliser
settings.SECRET_KEYà la place
Fichiers à modifier:
backend/auth.py
1.3 CORS et Rate Limiting
Objectif: Sécuriser les accès API et prévenir les attaques DoS.
Étape 1.3.1: Configurer CORS sécurisé
- Modifier
backend/main.pypour utilisersettings.CORS_ORIGINS - Supprimer
allow_origins=["*"] - Configurer
allow_credentials=True - Configurer
allow_methodsetallow_headersexplicites
Fichiers à modifier:
backend/main.py
Étape 1.3.2: Ajouter rate limiting
- Installer
slowapi - Configurer
Limiterdansbackend/main.py - Ajouter rate limit sur les endpoints d'authentification
- Ajouter rate limit sur les endpoints de création/modification
Fichiers à modifier:
requirements.txtbackend/main.py
1.4 Migration PostgreSQL
Objectif: Remplacer SQLite par PostgreSQL pour la production.
Étape 1.4.1: Préparer la migration
- Installer
psycopg2-binarydansrequirements.txt - Créer un script de migration des données SQLite vers PostgreSQL
- Documenter le processus de migration
Fichiers à créer/modifier:
requirements.txtscripts/migrate_to_postgres.py(nouveau)
Étape 1.4.2: Configurer PostgreSQL
- Mettre à jour
docker-compose.ymlpour PostgreSQL - Créer
docker-compose.dev.ymlpour développement - Créer
docker-compose.prod.ymlpour production - Configurer les volumes persistants
Fichiers à créer/modifier:
docker-compose.ymldocker-compose.dev.yml(nouveau)docker-compose.prod.yml(nouveau)
Étape 1.4.3: Exécuter la migration
- Sauvegarder les données SQLite existantes
- Exécuter le script de migration
- Vérifier l'intégrité des données
- Mettre à jour les migrations Alembic si nécessaire
1.5 HTTPS et Reverse Proxy
Objectif: Sécuriser les communications en production.
Étape 1.5.1: Configurer Nginx
- Créer
nginx/nginx.conf - Configurer SSL/TLS avec Let's Encrypt
- Configurer le reverse proxy vers FastAPI
- Servir les fichiers statiques via Nginx
Fichiers à créer:
nginx/nginx.conf(nouveau)nginx/Dockerfile(nouveau)
Étape 1.5.2: Configurer Gunicorn
- Installer
gunicorndansrequirements.txt - Créer un script de démarrage avec Gunicorn
- Configurer le nombre de workers
Fichiers à créer/modifier:
requirements.txtscripts/start_prod.sh(nouveau)
Étape 1.5.3: Mettre à jour Docker Compose
- Ajouter le service Nginx dans
docker-compose.prod.yml - Configurer les réseaux Docker
- Configurer les health checks
Fichiers à modifier:
docker-compose.prod.yml
1.6 Backups de Base de Données
Objectif: Automatiser les sauvegardes de la base de données.
Étape 1.6.1: Créer le script de backup
- Créer
scripts/backup_db.sh - Configurer la rotation des backups
- Compresser les backups
- Envoyer les backups vers un stockage externe (optionnel)
Fichiers à créer:
scripts/backup_db.sh(nouveau)
Étape 1.6.2: Automatiser les backups
- Configurer un cron job dans Docker
- Documenter la procédure de restauration
Fichiers à modifier:
docker-compose.prod.yml
Phase 2: Architecture & Qualité
2.1 Restructuration du Backend
Objectif: Organiser le code backend selon les principes de Clean Architecture.
Étape 2.1.1: Créer la nouvelle structure de dossiers
- Créer
backend/api/v1/pour les routes - Créer
backend/core/pour la configuration et sécurité - Créer
backend/models/pour les SQLAlchemy models - Créer
backend/schemas/pour les Pydantic schemas - Créer
backend/services/pour la logique métier - Créer
backend/repositories/pour l'accès aux données - Créer
backend/integrations/pour les APIs externes
Dossiers à créer:
backend/api/v1/backend/core/backend/models/backend/schemas/backend/services/backend/repositories/backend/integrations/
Étape 2.1.2: Extraire les routes
- Créer
backend/api/v1/auth.pyavec les endpoints d'auth - Créer
backend/api/v1/challenges.pyavec les endpoints challenges - Créer
backend/api/v1/health.pyavec le health check - Créer
backend/api/v1/__init__.pypour l'agrégation
Fichiers à créer:
backend/api/v1/auth.pybackend/api/v1/challenges.pybackend/api/v1/health.pybackend/api/v1/__init__.py
Étape 2.1.3: Séparer models et schemas
- Déplacer les SQLAlchemy models vers
backend/models/ - Créer
backend/models/__init__.py - Extraire les Pydantic schemas vers
backend/schemas/ - Créer
backend/schemas/__init__.py
Fichiers à créer/modifier:
backend/models/user.pybackend/models/challenge.pybackend/models/tracking.pybackend/models/__init__.pybackend/schemas/user.pybackend/schemas/challenge.pybackend/schemas/tracking.pybackend/schemas/__init__.py
Étape 2.1.4: Créer la couche de services
- Créer
backend/services/auth_service.py - Créer
backend/services/challenge_service.py - Créer
backend/services/health_service.py - Créer
backend/services/__init__.py
Fichiers à créer:
backend/services/auth_service.pybackend/services/challenge_service.pybackend/services/health_service.pybackend/services/__init__.py
Étape 2.1.5: Créer la couche de repositories
- Créer
backend/repositories/base.pyavec le repository de base - Créer
backend/repositories/user_repository.py - Créer
backend/repositories/challenge_repository.py - Créer
backend/repositories/__init__.py
Fichiers à créer:
backend/repositories/base.pybackend/repositories/user_repository.pybackend/repositories/challenge_repository.pybackend/repositories/__init__.py
Étape 2.1.6: Déplacer les intégrations
- Déplacer
backend/google_fit.pyversbackend/integrations/ - Déplacer
backend/import_zepp.pyversbackend/integrations/ - Créer
backend/integrations/__init__.py
Fichiers à déplacer/créer:
backend/integrations/google_fit.pybackend/integrations/import_zepp.pybackend/integrations/__init__.py
Étape 2.1.7: Créer les modules core
- Créer
backend/core/security.pyavec les fonctions de sécurité - Créer
backend/core/deps.pyavec les dépendances FastAPI - Créer
backend/core/__init__.py
Fichiers à créer:
backend/core/security.pybackend/core/deps.pybackend/core/__init__.py
Étape 2.1.8: Simplifier main.py
- Nettoyer
backend/main.pypour ne contenir que l'initialisation - Supprimer
models.Base.metadata.create_all(bind=database.engine) - Enregistrer les routers depuis
api/v1/ - Configurer le middleware de gestion d'erreurs
Fichiers à modifier:
backend/main.py
2.2 Modularisation du Frontend
Objectif: Découper le fichier monolithique app.js en modules cohérents.
Étape 2.2.1: Créer la structure de modules
- Créer
frontend/api/pour les appels API - Créer
frontend/components/pour les composants UI - Créer
frontend/utils/pour les utilitaires - Créer
frontend/state/pour la gestion d'état
Dossiers à créer:
frontend/api/frontend/components/frontend/utils/frontend/state/
Étape 2.2.2: Créer le service API
- Créer
frontend/api/client.jsavec le client HTTP - Créer
frontend/api/auth.jspour les endpoints d'auth - Créer
frontend/api/challenges.jspour les endpoints challenges - Supprimer le fetch wrapper monkey-patch
Fichiers à créer:
frontend/api/client.jsfrontend/api/auth.jsfrontend/api/challenges.js
Étape 2.2.3: Extraire les composants UI
- Créer
frontend/components/ChallengeList.js - Créer
frontend/components/ChallengeForm.js - Créer
frontend/components/TrackingForm.js - Créer
frontend/components/Charts.js - Créer
frontend/components/Navigation.js
Fichiers à créer:
frontend/components/ChallengeList.jsfrontend/components/ChallengeForm.jsfrontend/components/TrackingForm.jsfrontend/components/Charts.jsfrontend/components/Navigation.js
Étape 2.2.4: Créer les utilitaires
- Créer
frontend/utils/notifications.jspour les toasts - Créer
frontend/utils/storage.jspour localStorage - Créer
frontend/utils/date.jspour les formats de date
Fichiers à créer:
frontend/utils/notifications.jsfrontend/utils/storage.jsfrontend/utils/date.js
Étape 2.2.5: Créer la gestion d'état
- Créer
frontend/state/store.jsavec un store simple - Créer
frontend/state/actions.jspour les actions - Créer
frontend/state/reducers.jspour les reducers
Fichiers à créer:
frontend/state/store.jsfrontend/state/actions.jsfrontend/state/reducers.js
Étape 2.2.6: Simplifier app.js
- Réécrire
app.jspour utiliser les modules - Initialiser l'application
- Gérer le routing basique
Fichiers à modifier:
frontend/app.js
2.3 Expérience Développeur (DX)
Objectif: Améliorer les outils de développement.
Étape 2.3.1: Configurer Ruff (linter/formatter)
- Installer
ruffdansrequirements.txt - Créer
ruff.tomlavec la configuration - Configurer les règles de linting
Fichiers à créer/modifier:
requirements.txtruff.toml(nouveau)
Étape 2.3.2: Configurer MyPy (type checking)
- Installer
mypydansrequirements.txt - Créer
mypy.iniavec la configuration - Ajouter les stubs nécessaires
Fichiers à créer/modifier:
requirements.txtmypy.ini(nouveau)
Étape 2.3.3: Configurer pre-commit hooks
- Créer
.pre-commit-config.yaml - Configurer les hooks Ruff et MyPy
- Documenter l'installation
Fichiers à créer:
.pre-commit-config.yaml
Étape 2.3.4: Créer un Makefile
- Créer
Makefileavec les commandes de dev - Ajouter les cibles: dev, test, lint, format, migrate
Fichiers à créer:
Makefile
Phase 3: Tests & CI/CD
3.1 Tests Backend
Objectif: Mettre en place une couverture de tests minimale.
Étape 3.1.1: Configurer pytest
- Installer
pytest,pytest-cov,pytest-asynciodansrequirements.txt - Créer
pytest.iniavec la configuration - Créer
tests/conftest.pyavec les fixtures
Fichiers à créer/modifier:
requirements.txtpytest.ini(nouveau)tests/conftest.py(nouveau)
Étape 3.1.2: Tests unitaires des services
- Créer
tests/unit/test_auth_service.py - Créer
tests/unit/test_challenge_service.py - Créer
tests/unit/test_health_service.py
Fichiers à créer:
tests/unit/test_auth_service.pytests/unit/test_challenge_service.pytests/unit/test_health_service.py
Étape 3.1.3: Tests d'intégration API
- Créer
tests/integration/test_api_auth.py - Créer
tests/integration/test_api_challenges.py - Créer
tests/integration/test_api_health.py
Fichiers à créer:
tests/integration/test_api_auth.pytests/integration/test_api_challenges.pytests/integration/test_api_health.py
Étape 3.1.4: Tests E2E
- Créer
tests/e2e/test_user_flow.py - Tester le flux complet: inscription → login → création challenge → tracking
Fichiers à créer:
tests/e2e/test_user_flow.py
3.2 CI/CD avec GitHub Actions
Objectif: Automatiser les tests et le déploiement.
Étape 3.2.1: Créer le workflow CI
- Créer
.github/workflows/ci.yml - Configurer le job de tests
- Configurer le job de linting
- Configurer le reporting de couverture
Fichiers à créer:
.github/workflows/ci.yml
Étape 3.2.2: Créer le workflow CD
- Créer
.github/workflows/cd.yml - Configurer le déploiement vers staging
- Configurer le déploiement vers production
Fichiers à créer:
.github/workflows/cd.yml
Phase 4: Observabilité & Performance
4.1 Observabilité
Objectif: Mettre en place le monitoring et le logging.
Étape 4.1.1: Logging structuré
- Installer
python-json-loggerdansrequirements.txt - Créer
backend/core/logging.py - Configurer le logging JSON
- Remplacer les
print()par deslogger.info()
Fichiers à créer/modifier:
requirements.txtbackend/core/logging.py
Étape 4.1.2: Health check endpoint
- Créer le endpoint
/api/health - Vérifier la connexion à la base de données
- Retourner le statut de l'application
Fichiers à modifier:
backend/api/v1/health.py
Étape 4.1.3: Métriques Prometheus
- Installer
prometheus-fastapi-instrumentatordansrequirements.txt - Configurer l'instrumentation dans
main.py - Exposer le endpoint
/metrics
Fichiers à créer/modifier:
requirements.txtbackend/main.py
4.2 Performance Base de Données
Objectif: Optimiser les requêtes et l'indexation.
Étape 4.2.1: Ajouter des indexes
- Créer une migration Alembic pour les indexes
- Ajouter index sur
challenges(user_id, display_order) - Ajouter index sur
challenges(user_id, period_type) - Ajouter index sur
tracking(challenge_id, date) - Ajouter index sur
tracking(date)
Fichiers à créer:
alembic/versions/xxxx_add_indexes.py
Étape 4.2.2: Eager loading
- Modifier les repositories pour utiliser
selectinload - Éliminer les N+1 queries
- Optimiser les requêtes d'agrégation
Fichiers à modifier:
backend/repositories/challenge_repository.py
Étape 4.2.3: Pagination
- Ajouter la pagination aux endpoints de liste
- Créer les schemas de pagination
- Documenter les paramètres de pagination
Fichiers à créer/modifier:
backend/schemas/pagination.pybackend/api/v1/challenges.py
Phase 5: UX & Documentation
5.1 Améliorations UX
Objectif: Améliorer l'expérience utilisateur.
Étape 5.1.1: Notifications/Toasts
- Créer le système de notifications dans
frontend/utils/notifications.js - Ajouter des toasts pour les actions réussies
- Ajouter des toasts pour les erreurs
Fichiers à créer:
frontend/utils/notifications.js
Étape 5.1.2: Loading states
- Ajouter des spinners pendant les appels API
- Désactiver les boutons pendant le chargement
- Ajouter des indicateurs de progression
Fichiers à modifier:
frontend/components/ChallengeForm.jsfrontend/components/TrackingForm.js
Étape 5.1.3: Gestion d'erreurs utilisateur
- Afficher des messages d'erreur clairs
- Proposer des solutions aux erreurs courantes
- Logger les erreurs côté client
Fichiers à modifier:
frontend/api/client.jsfrontend/app.js
5.2 Documentation
Objectif: Documenter le projet pour les développeurs.
Étape 5.2.1: Docstrings API
- Ajouter des docstrings à toutes les fonctions
- Documenter les paramètres et les retours
- Utiliser le format Google ou NumPy
Fichiers à modifier:
- Tous les fichiers Python dans
backend/
Étape 5.2.2: README amélioré
- Mettre à jour
README.md - Ajouter la section Installation
- Ajouter la section Configuration
- Ajouter la section Développement
- Ajouter la section Déploiement
Fichiers à modifier:
README.md
Étape 5.2.3: Architecture Decision Records (ADRs)
- Créer
docs/adr/ - Documenter les décisions d'architecture majeures
- Utiliser le template ADR standard
Fichiers à créer:
docs/adr/001-architecture-backend.mddocs/adr/002-choix-postgresql.mddocs/adr/003-securite-jwt.md
Résumé des Fichiers à Créer
Configuration
.env.example.env.development.env.staging.env.productionruff.tomlmypy.inipytest.ini.pre-commit-config.yamlMakefile
Backend - Core
backend/core/config.pybackend/core/security.pybackend/core/deps.pybackend/core/logging.pybackend/core/__init__.py
Backend - API
backend/api/v1/auth.pybackend/api/v1/challenges.pybackend/api/v1/health.pybackend/api/v1/__init__.py
Backend - Models
backend/models/user.pybackend/models/challenge.pybackend/models/tracking.pybackend/models/__init__.py
Backend - Schemas
backend/schemas/user.pybackend/schemas/challenge.pybackend/schemas/tracking.pybackend/schemas/pagination.pybackend/schemas/__init__.py
Backend - Services
backend/services/auth_service.pybackend/services/challenge_service.pybackend/services/health_service.pybackend/services/__init__.py
Backend - Repositories
backend/repositories/base.pybackend/repositories/user_repository.pybackend/repositories/challenge_repository.pybackend/repositories/__init__.py
Backend - Integrations
backend/integrations/google_fit.pybackend/integrations/import_zepp.pybackend/integrations/__init__.py
Frontend - API
frontend/api/client.jsfrontend/api/auth.jsfrontend/api/challenges.js
Frontend - Components
frontend/components/ChallengeList.jsfrontend/components/ChallengeForm.jsfrontend/components/TrackingForm.jsfrontend/components/Charts.jsfrontend/components/Navigation.js
Frontend - Utils
frontend/utils/notifications.jsfrontend/utils/storage.jsfrontend/utils/date.js
Frontend - State
frontend/state/store.jsfrontend/state/actions.jsfrontend/state/reducers.js
Tests
tests/conftest.pytests/unit/test_auth_service.pytests/unit/test_challenge_service.pytests/unit/test_health_service.pytests/integration/test_api_auth.pytests/integration/test_api_challenges.pytests/integration/test_api_health.pytests/e2e/test_user_flow.py
CI/CD
.github/workflows/ci.yml.github/workflows/cd.yml
Docker & Nginx
docker-compose.dev.ymldocker-compose.prod.ymlnginx/nginx.confnginx/Dockerfile
Scripts
scripts/migrate_to_postgres.pyscripts/backup_db.shscripts/start_prod.sh
Documentation
docs/adr/001-architecture-backend.mddocs/adr/002-choix-postgresql.mddocs/adr/003-securite-jwt.md
Checklist de Validation
Avant de considérer le projet comme "production-ready", vérifier:
Sécurité
- Aucun secret hardcodé dans le code
- CORS configuré avec des origines spécifiques
- Rate limiting activé
- HTTPS configuré en production
- Secrets Google exclus du git
Base de Données
- PostgreSQL utilisé en production
- Backups automatisés en place
- Indexes créés sur les colonnes fréquentes
- N+1 queries éliminées
Architecture
- Backend restructuré avec séparation des responsabilités
- Couche de services créée
- Frontend modularisé
- Configuration centralisée
Tests
- Tests unitaires backend créés
- Tests d'intégration API créés
- Tests E2E créés
- Couverture minimale de 70%
CI/CD
- Pipeline CI configuré
- Pipeline CD configuré
- Tests exécutés automatiquement
Observabilité
- Logging structuré en place
- Health check endpoint créé
- Métriques Prometheus exposées
DX
- Linter configuré (Ruff)
- Type checker configuré (MyPy)
- Pre-commit hooks configurés
- Makefile créé
Documentation
- README à jour
- Docstrings ajoutées
- ADRs créés
Notes Importantes
-
Ordre d'exécution: Les phases doivent être exécutées dans l'ordre indiqué. La Phase 1 (Sécurité) est critique et doit être complétée avant tout déploiement en production.
-
Tests continus: À chaque étape, exécuter les tests existants pour s'assurer que rien n'est cassé.
-
Documentation: Mettre à jour la documentation à mesure que des changements sont apportés.
-
Commits: Faire des commits fréquents et descriptifs pour faciliter le rollback si nécessaire.
-
Review: Faire une revue de code après chaque phase majeure.
Fin du Plan de Correction