refactor(docs): réorganiser ADR et règles métier pour clarté
**Changements majeurs** : 1. **Suppression ADR-010 (Commandes volant et likes)** : - Contenu consolidé dans Règle 05 (section 5.3) - Raison : ADR-010 était du métier déguisé en architecture - Section "Implémentation Technique" ajoutée à Règle 05 - Pattern correct (addition) vs incorrect (multiplication) 2. **Déplacement ADR-011 → Compliance** : - `docs/adr/011-conformite-stores.md` → `docs/compliance/stores-submission.md` - Raison : Nature opérationnelle/légale, pas architecture technique - Nouveau dossier `/docs/compliance/` créé 3. **Renumérotation ADR (010-022)** : - Combler les trous de numérotation (010 et 011) - ADR-012→010, ADR-013→011, ..., ADR-024→022 - 22 ADR numérotés en continu (001-022) - Historique Git préservé (git mv) 4. **Mise à jour références** : - Règle 03 : ADR-010 → Règle 05 (section 5.3) - Règle 09 : ADR-010 → Règle 05 (section 5.3) - INCONSISTENCIES-ANALYSIS.md : toutes références mises à jour - Incohérence #15 annulée (faux problème : modes séparés) **Résultat** : - ✅ Séparation claire ADR (technique) vs Règles métier (fonctionnel) - ✅ Documentation compliance séparée - ✅ Numérotation ADR continue sans trous - ✅ Single Source of Truth (pas de redondance) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
118
docs/adr/019-geolocalisation-ip.md
Normal file
118
docs/adr/019-geolocalisation-ip.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# ADR-019 : Service de Géolocalisation par IP
|
||||
|
||||
**Statut** : Accepté
|
||||
**Date** : 2026-01-31
|
||||
|
||||
## Contexte
|
||||
|
||||
RoadWave nécessite un service de géolocalisation par IP pour le mode dégradé (utilisateurs sans GPS activé). Ce service permet de détecter la ville/région de l'utilisateur à partir de son adresse IP et d'afficher du contenu régional même sans permission GPS.
|
||||
|
||||
**Évolution du marché** :
|
||||
- **Avant 2019** : MaxMind GeoLite2 était téléchargeable gratuitement (base de données locale)
|
||||
- **Depuis 2019** : MaxMind nécessite un compte + limite 1000 requêtes/jour (gratuit), puis 0.003$/requête au-delà
|
||||
|
||||
**Usage RoadWave** :
|
||||
- Mode dégradé : ~10% des utilisateurs (estimation)
|
||||
- Volume : 1000 utilisateurs × 10% = 100 requêtes/jour (MVP)
|
||||
- Critère : Aucune dépendance à un service tiers payant
|
||||
|
||||
## Décision
|
||||
|
||||
**IP2Location Lite DB** (self-hosted) pour la géolocalisation par IP.
|
||||
|
||||
## Alternatives considérées
|
||||
|
||||
| Option | Coût/mois | Précision | Hébergement | Maintenance |
|
||||
|--------|-----------|-----------|-------------|-------------|
|
||||
| **IP2Location Lite** | Gratuit | ±50 km | Self-hosted | Mise à jour mensuelle |
|
||||
| MaxMind GeoLite2 API | ~10€ (dépassement) | ±50 km | Cloud MaxMind | Nulle |
|
||||
| Self-hosted MaxMind | Gratuit | ±50 km | Self-hosted | Compte requis + MAJ |
|
||||
|
||||
## Justification
|
||||
|
||||
### IP2Location Lite (choix retenu)
|
||||
|
||||
**Avantages** :
|
||||
- Gratuit (pas de limite de requêtes)
|
||||
- Self-hosted (souveraineté des données, cohérence avec [ADR-004](004-cdn.md))
|
||||
- Base de données SQLite légère (50-100 MB)
|
||||
- Mise à jour mensuelle automatisable via cron
|
||||
- Licence permissive (Creative Commons BY-SA 4.0)
|
||||
- Pas de compte tiers requis
|
||||
|
||||
**Inconvénients** :
|
||||
- Maintenance mensuelle (mise à jour DB)
|
||||
- Précision équivalente à MaxMind (~±50 km)
|
||||
|
||||
### MaxMind GeoLite2 API (rejeté)
|
||||
|
||||
**Pourquoi rejeté** :
|
||||
- Coût potentiel en cas de dépassement quota (risque faible mais existant)
|
||||
- Dépendance à un service tiers (perte de souveraineté)
|
||||
- Compte requis (friction opérationnelle)
|
||||
|
||||
### Self-hosted MaxMind (rejeté)
|
||||
|
||||
**Pourquoi rejeté** :
|
||||
- Compte MaxMind obligatoire pour télécharger la DB (friction)
|
||||
- Complexité identique à IP2Location pour résultat équivalent
|
||||
- IP2Location offre même fonctionnalité sans compte tiers
|
||||
|
||||
## Architecture technique
|
||||
|
||||
### Composants
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[Backend Go<br/>API Handler]
|
||||
B[GeoIP Service<br/>Wrapper Go autour IP2Location]
|
||||
C[IP2Location DB<br/>SQLite ~50 MB<br/>Mise à jour mensuelle]
|
||||
|
||||
A --> B
|
||||
B --> C
|
||||
```
|
||||
|
||||
### Flux de géolocalisation
|
||||
|
||||
1. **Requête** : API reçoit requête utilisateur sans GPS
|
||||
2. **Extraction IP** : Lecture IP depuis en-têtes HTTP (`X-Forwarded-For`, `X-Real-IP`)
|
||||
3. **Lookup DB** : Query SQLite IP2Location (index sur plages IP)
|
||||
4. **Réponse** : Ville + région + code pays
|
||||
|
||||
**Précision attendue** : ±50 km (équivalent MaxMind)
|
||||
|
||||
### Maintenance
|
||||
|
||||
**Mise à jour mensuelle** :
|
||||
- Cron job télécharge nouvelle DB IP2Location (1er du mois)
|
||||
- Backup DB actuelle avant remplacement
|
||||
- Rechargement service GeoIP (hot reload sans downtime)
|
||||
|
||||
**Monitoring** :
|
||||
- Alertes si DB > 60 jours (DB obsolète)
|
||||
- Logs requêtes "IP non trouvée" (détection problèmes DB)
|
||||
|
||||
## Conséquences
|
||||
|
||||
### Positives
|
||||
- Aucun coût récurrent (gratuit à l'infini)
|
||||
- Souveraineté complète des données (cohérence ADR-004)
|
||||
- Pas de dépendance externe (service tiers)
|
||||
- Latence minimale (lookup local SQLite < 1ms)
|
||||
|
||||
### Négatives
|
||||
- Maintenance mensuelle requise (automatisable)
|
||||
- Précision limitée (±50 km, acceptable pour mode dégradé)
|
||||
- Taille base de données (~50-100 MB sur disque)
|
||||
|
||||
### Risques atténués
|
||||
- **DB obsolète** : Alertes automatiques si > 60 jours
|
||||
- **IP non trouvée** : Fallback "France" par défaut (code pays FR)
|
||||
- **Perte DB** : Backup automatique avant chaque mise à jour
|
||||
|
||||
## Références
|
||||
|
||||
- [ADR-004 : CDN (Souveraineté)](004-cdn.md)
|
||||
- [ADR-015 : Hébergement](015-hebergement.md)
|
||||
- [Règle 02 : RGPD (Mode Dégradé)](../regles-metier/02-conformite-rgpd.md#136-géolocalisation-optionnelle)
|
||||
- IP2Location Lite : https://lite.ip2location.com/
|
||||
Reference in New Issue
Block a user