Contexte
GridPulse est mon second pilier Web2 sur la niche énergie / climat : un pipeline qui ingère le mix électrique français (RTE open data) et l’intensité carbone (Electricity Maps), stocke les séries dans Supabase, et les expose via une API FastAPI consommée par un front Next.js.
La V2 ajoute des fonctionnalités « produit » : créneaux verts, export PDF/CSV, page /status pour l’observabilité du pipeline. Le tout est déployé en production : front sur Vercel, API sur Railway.
Architecture split front / API
Le monorepo contient frontend/ (Next.js) et backend/ (FastAPI). En local, deux terminaux : uvicorn sur :8000 et npm run dev sur :3000. Le front appelle l’API via NEXT_PUBLIC_API_URL.
En prod :
- Vercel — build Next.js, variable
NEXT_PUBLIC_API_URL= URL publique Railway. - Railway — Dockerfile à la racine du repo (contexte monorepo), variables
SUPABASE_*,ELECTRICITY_MAPS_TOKEN,CORS_ORIGINS(URL Vercel),INGEST_SECRET,PORT=8000.
Point d’attention : Railway injecte $PORT ; le Dockerfile et uvicorn doivent l’écouter. Un mismatch (ex. API sur 8080, proxy sur 8000) produit des 502 silencieux côté client.
Ingestion et cron
POST /api/v1/ingest/run déclenche l’ingestion (RTE + Electricity Maps → upsert Supabase). Un header X-Ingest-Secret protège l’endpoint. En prod, le secret doit être identique entre Railway et le workflow GitHub Actions ; un espace en trop ou une variable non redéployée → Invalid ingest secret.
Chaque run est journalisé dans la table ingest_runs (migration 002_ingest_runs.sql), alimentant la page /status : dernières exécutions, volumes upsertés, erreurs éventuelles.
V2 côté front
- Créneaux verts — endpoint
GET /api/v1/green-windows; carte dédiée sur le dashboard (fenêtres où le mix est favorable). - Export — PDF (pdf-lib) et CSV du rapport dashboard. Piège rencontré : caractères français (espaces insécables) et encodage WinAnsi → fonction
pdfSafeText()pour normaliser avant rendu. - Landing — trois cartes alignées sur les pages nav (dashboard, prévision, statut) plutôt qu’un doublon de boutons.
Compétences mises en œuvre
- Shipper une stack data + viz complémentaire d’un SaaS métier (GreenOps).
- Gérer CORS, secrets, health checks (
/healthavec flagssupabase_configured,electricity_maps_configured). - Observabilité minimale mais crédible sur un pipeline data full-stack orienté énergie.
Dépôt : github.com/ChristopheChollet/GridPulse · Démo : grid-pulse-steel.vercel.app