Copilot · Audit technique complet

Reworld Copilot — Santé & Backlinks

Audit du frontend, backend Render, Supabase, sécurité, FinOps, et opportunités netlinking Bourse Inside.

21 juillet 2026
API /health❌ DOWN
Frontend102 KB
Backend3 296 lignes
Sites couverts15
DR Bourse Inside27/100
Score global : 62/100

Fonctionnel mais fragile — 3 failles critiques, 5 correctifs urgents

Le Copilot fonctionne quand Render est actif, mais souffre d'instabilités récurrentes (cold starts, crash Supabase), d'une surface de sécurité trop ouverte et d'une base de code monolithique difficile à maintenir.

Priorités immédiates

  • ✅ Réparer le cold start Render (déjà fait — à surveiller)
  • 🔴 Ajouter une authentification minimale sur /api/chat
  • 🔴 Restreindre CORS à reworld-audits.pages.dev
  • 🟡 Découper main.py en modules
  • 🟡 Réactiver FinOps /api/metrics/costs

Architecture

Documentée

Frontend

  • 1 597 lignes, 102 KB, fichier unique
  • 15 sites dans le sélecteur
  • Dark/light mode, glassmorphism
  • API_BASE : audience-copilot.onrender.com
  • Pas de build step, pas de dépendances npm
  • Design system cohérent (Plus Jakarta Sans)

Backend

  • FastAPI sur Render (free tier)
  • 3 296 lignes dans un seul main.py
  • Supabase (optionnel, fallback gracieux)
  • GSC + GA4 + Marfeel + Freudix MCP
  • 3 modèles LLM : DeepSeek, Gemini, OpenAI
  • /api/ask (déterministe), /api/chat (DeepSeek), /api/resolve (OpenAI mini)

Sécurité

3 failles critiques

🔴 CORS ouvert à toutes les origines

allow_origins=["*"] — n'importe quel site peut appeler l'API. Restreindre à reworld-audits.pages.dev.

🔴 Aucune authentification sur /api/chat

N'importe qui peut consommer des tokens DeepSeek. Ajouter un header secret ou une clé API partagée.

🔴 /api/metrics/finops → HTTP 404

L'endpoint de suivi des coûts n'est pas accessible. Vérifier le routing FastAPI et la migration Supabase 003.

🟡 Clés API en variables d'environnement Render

GEMINI_API_KEY, DEEPSEEK_API_KEY, OPENAI_API_KEY exposées dans l'environnement Render. Risque si le dashboard Render est compromis.

🟢 Pas de secrets dans le frontend

Le HTML ne contient aucune clé. Conforme.

Performance & Fiabilité

Instable

Incidents récents

  • 21 juillet 16h10 : Crash loop Supabase → API down 3 min
  • Récurrent : Cold start Render (free tier, spin down après inactivité)
  • Timeout : /api/health → 30s+ pendant cold start

Résilience

  • ✅ Supabase DB_AVAILABLE = False → fallback gracieux
  • ✅ Mode dégradé sans persistance conversationnelle
  • ✅ Marfeel/GA4 realtime optionnels
  • ⚠️ Pas de healthcheck externe automatisé
  • ⚠️ Pas de circuit breaker sur les appels LLM

Qualité du code

Correct — dette technique modérée

✅ Points forts

  • Typage Pydantic sur tous les modèles
  • Sanitization de l'historique (8 tours, 900 chars)
  • Fallback gracieux pour chaque dépendance
  • Logique métier bien isolée (agents.py, db.py)
  • Pas de hardcoding de secrets

⚠️ Points faibles

  • 3 296 lignes dans main.py — monolithique
  • Duplication call_deepseek / call_deepseek_tracked
  • call_openai_json utilise urllib (pas httpx)
  • Pas de tests unitaires visibles
  • Gestion d'erreurs inégale (certains blocs try/except vides)

🔧 Dette technique

  • Séparer routes, services, clients LLM
  • Remplacer urllib par httpx (async, retries)
  • Ajouter rate limiting (slowapi)
  • Centraliser la config (pydantic-settings)
  • CI/CD avec tests avant déploiement Render

FinOps — Coûts LLM

Partiellement opérationnel

Ce qui fonctionne

  • ✅ DeepSeek : suivi des tokens (prompt + completion)
  • ✅ OpenAI : JSON mode pour /api/resolve (gpt-4.1-mini)
  • ✅ Coûts estimés via costs_tracker.py
  • ✅ Enregistrement dans llm_usage_logs (Supabase)

Ce qui manque

  • 🔴 /api/metrics/costs → 404 (endpoint non exposé ou migration manquante)
  • 🟡 Pas de dashboard de coûts accessible
  • 🟡 Pas d'alerte si le budget quotidien est dépassé
  • 🟡 Gemini : coûts non tracés séparément

Recommandations priorisées

#ActionEffortImpactRisque si ignoré
1Restreindre CORS à reworld-audits.pages.dev5 min🔴 CritiqueVol de tokens LLM
2Ajouter auth header sur /api/chat15 min🔴 CritiqueConsommation illimitée
3Réparer /api/metrics/costs (migration Supabase 003)30 min🟡 ÉlevéAveugle sur les coûts
4Healthcheck externe (cron watchdog 5 min)10 min🟡 ÉlevéAPI down non détectée
5Découper main.py en modules2 h🟡 MoyenMaintenance impossible
6Ajouter rate limiting (slowapi)30 min🟡 MoyenAbus API
7Passer à httpx + retries1 h🟢 FaibleTimeout non gérés
8Ajouter des tests (pytest + CI Render)3 h🟢 FaibleRégression silencieuse