Reworld Copilot — Santé & Backlinks
Audit du frontend, backend Render, Supabase, sécurité, FinOps, et opportunités netlinking Bourse Inside.
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éeFrontend
- 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é
InstableIncidents 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érationnelCe 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
| # | Action | Effort | Impact | Risque si ignoré |
|---|---|---|---|---|
| 1 | Restreindre CORS à reworld-audits.pages.dev | 5 min | 🔴 Critique | Vol de tokens LLM |
| 2 | Ajouter auth header sur /api/chat | 15 min | 🔴 Critique | Consommation illimitée |
| 3 | Réparer /api/metrics/costs (migration Supabase 003) | 30 min | 🟡 Élevé | Aveugle sur les coûts |
| 4 | Healthcheck externe (cron watchdog 5 min) | 10 min | 🟡 Élevé | API down non détectée |
| 5 | Découper main.py en modules | 2 h | 🟡 Moyen | Maintenance impossible |
| 6 | Ajouter rate limiting (slowapi) | 30 min | 🟡 Moyen | Abus API |
| 7 | Passer à httpx + retries | 1 h | 🟢 Faible | Timeout non gérés |
| 8 | Ajouter des tests (pytest + CI Render) | 3 h | 🟢 Faible | Régression silencieuse |
Backlinks Bourse Inside — Nouvelles opportunités
DR +2 (25→27)Plateformes déjà utilisées (cron hebdo)
- ✅ Notion — DR 94
- ✅ Telegra.ph — DR 91 (5 pages)
- ⚠️ GitHub — repo local, jamais pushé
Nouvelles cibles (gratuites, DR ≥ 89)
| Plateforme | DR | Action |
|---|---|---|
| 98 | Page entreprise Bourse Inside + lien | |
| GitHub | 96 | Publier le repo local existant |
| Crunchbase | 91 | Fiche entreprise Bourse Inside |
| GitLab | 92 | Miroir du repo GitHub |
| Linktree | 90 | Page link-in-bio Bourse Inside |
| About.me | 91 | Page de profil avec lien |
Stratégie recommandée
1. Publier le repo GitHub déjà préparé (effet immédiat, DR 96).
2. Créer la page LinkedIn Bourse Inside (DR 98, légitime pour un média finance).
3. Crunchbase : fiche entreprise avec description et lien (DR 91, crédible).
4. GitLab : miroir automatique du repo GitHub (DR 92, doublon utile).
5. Ajouter ces 4 plateformes au cron netlinking hebdo existant.
Impact estimé : DR 27 → 32-35 en 4-6 semaines. Seuil Google News (DR ~30) franchissable.