# ✅ Validation Configuration Redis & OSRM

## 🔍 Vérification effectuée

### 1️⃣ **Redis Local - Configuration validée**

**Code API (`apps/api/src/core/database/redis.ts`)** :
```typescript
const upstashUrl = process.env.UPSTASH_REDIS_REST_URL
const upstashToken = process.env.UPSTASH_REDIS_REST_TOKEN

const redisAdapter: RedisClient = (() => {
  if (upstashUrl && upstashToken) {
    // Utilise Upstash si variables présentes
    return new UpstashRedisAdapter(upstashClient)
  }
  
  // SINON: utilise Redis local (IORedis)
  logger.warn('⚠️ UPSTASH_* not set – falling back to local Redis')
  const fallbackOptions = {
    host: process.env.REDIS_HOST || 'localhost',
    port: Number(process.env.REDIS_PORT) || 6379,
    password: process.env.REDIS_PASSWORD,
    tls: process.env.REDIS_TLS === 'true' ? {} : undefined
  }
  return new IoRedisAdapter(new IORedis(fallbackOptions))
})()
```

**✅ Verdict Redis** : 
- Si tu **ne définis PAS** `UPSTASH_REDIS_REST_URL` dans `/srv/myroadtrip/.env.production`
- Le code utilisera automatiquement **Redis local** sur `localhost:6379`
- Configuration optimale déjà dans `bootstrap_vps.sh` (multi-threaded, 2GB, lazy freeing)

---

### 2️⃣ **OSRM Fallback - Nouveau système intelligent**

**Frontend (`apps/web/src/modules/map/services/osrmRoutingService.ts`)** :

```typescript
class OSRMRoutingService {
  private baseUrl: string
  private selfHostedUrl = 'https://osrm.roadtripper.io'
  private publicUrl = 'https://router.project-osrm.org'
  private usingFallback = false

  constructor() {
    // Par défaut: self-hosted
    this.baseUrl = this.selfHostedUrl
    
    // Health check au démarrage
    this.checkSelfHostedAvailability()
  }

  async getRoute(...) {
    try {
      // Essai self-hosted
      return await this.fetchRoute(this.baseUrl, ...)
    } catch (error) {
      // Si échec: switch automatique vers public
      if (!this.usingFallback) {
        this.switchToPublic()
        return await this.fetchRoute(this.publicUrl, ...)
      }
      throw error
    }
  }
}
```

**✅ Comportement OSRM** :
1. Essaie **self-hosted** (`osrm.roadtripper.io`) par défaut
2. Si timeout/erreur → **bascule automatiquement** vers public (`router.project-osrm.org`)
3. Une fois basculé, reste sur public pour éviter les retries
4. Console warn visible : `[OSRM] Self-hosted unavailable, using public server`

---

### 3️⃣ **Backend OSRM Health Check**

**Admin service (`apps/api/src/modules/admin/admin.service.ts`)** :
```typescript
private async checkOSRM(): Promise<boolean> {
  const url = process.env.VITE_OSRM_URL || 'https://router.project-osrm.org'
  const response = await fetch(`${url}/route/v1/driving/0,0;1,1`)
  return response.ok
}
```

**⚠️ Note** : 
- Backend utilise `VITE_OSRM_URL` (variable frontend)
- Tu peux ajouter `OSRM_URL` backend si besoin de séparer
- Pour l'instant, health check vérifie le serveur configuré

---

## 📝 Configuration Production Recommandée

### Sur VPS : `/srv/myroadtrip/.env.production`

```bash
# ======================================
# 🔴 REDIS LOCAL (VPS)
# ======================================
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_TLS=false

# ❌ NE PAS DÉFINIR CES VARIABLES
# (pour utiliser Redis local au lieu de Upstash)
# UPSTASH_REDIS_REST_URL=
# UPSTASH_REDIS_REST_TOKEN=

# ======================================
# 🗺️ OSRM (pas besoin de variable)
# ======================================
# Le frontend essaiera automatiquement:
# 1. https://osrm.roadtripper.io (self-hosted)
# 2. https://router.project-osrm.org (public fallback)

# Si tu veux forcer un serveur spécifique:
# VITE_OSRM_URL=https://osrm.roadtripper.io

# ======================================
# 🔥 FIREBASE, AUTH0, etc.
# ======================================
# ... (reste de ta config)
```

---

## 🚀 Pour lancer OSRM sur ton VPS

**1. Démarrer les services Docker maps** :
```bash
# Sur le VPS
cd /srv/myroadtrip/repo
docker compose -f scripts/vps/docker-compose.maps.yml up -d
```

**2. Vérifier que OSRM écoute** :
```bash
curl http://localhost:5000/health
# ou
curl http://localhost:5000/route/v1/driving/2.3522,48.8566;2.2945,48.8584
```

**3. Caddy expose automatiquement** :
- `https://osrm.roadtripper.io` → `localhost:5000`
- Déjà configuré dans `bootstrap_vps.sh`

---

## 🎯 Test de validation

**1. Redis local** :
```bash
# Sur VPS, après déploiement
redis-cli ping
# PONG

# Vérifier utilisation
redis-cli INFO stats
redis-cli CLIENT LIST
```

**2. OSRM fallback** :
- Ouvre DevTools console dans ton app
- Si self-hosted down : tu verras `[OSRM] Self-hosted unavailable, using public server`
- Routes continuent de fonctionner sans interruption

---

## ✅ Résumé final

| Service | Config | Fallback | Statut |
|---------|--------|----------|--------|
| Redis | Local VPS (localhost:6379) | Aucun (critique) | ✅ Auto-détecté |
| OSRM | Self-hosted prioritaire | Public automatique | ✅ Implémenté |
| API Port | 3000 | - | ✅ Corrigé |
| .env files | Dans .gitignore | - | ✅ Protégés |

**Tout est prêt pour le déploiement !** 🚀
