Services Web Stack
Ce document explique les services externes réellement utilisés par apps/web, comment ils s'activent, et où lire les diagnostics.
Vue d'ensemble
Les services sont pilotés par la configuration d'environnement et par quelques garde-fous applicatifs:
- Supabase gère la base de données, l'auth côté serveur et le stockage.
- Clerk gère l'identité utilisateur et les sessions front-end.
- PostHog gère l'analytics produit avec consentement.
- Sentry gère la remontée d'erreurs techniques.
- Resend gère les emails transactionnels.
- Stripe gère les paiements et webhooks.
- Upstash gère Redis et QStash.
- Pinecone sert la recherche sémantique / IA.
- Vercel héberge l'application, les cron jobs et les previews.
- Cloudflare et Uptime Robot sont des dépendances externes de supervision/routage.
Statut réel observé
Les vérifications lancées pendant cette passe ont confirmé:
npm run backend:doctorretournevercelLinked=true,supabaseLinked=true,localEnvHasRequired=true,pulledVercelEnvHasRequired=true.npm run test -w apps/websur la suite cibléeservices,sentry,posthogpasse.- Les logs Supabase accessibles montrent des appels répétés et réussis vers
actionsetspots. - Les logs PostgreSQL Supabase montrent des connexions autorisées par PostgREST en TLS.
Références de logs récupérées
- Supabase API: requêtes
HEAD /rest/v1/actions?select=id&limit=1etGET /rest/v1/actions,GET /rest/v1/spotsavec statuts206et200. - Supabase PostgreSQL: connexions
connection authorizedetconnection authenticatedviapostgrest, utilisateurauthenticator, TLS actif. backend:doctor: Vercel et Supabase sont liés et les variables locales / Vercel pullées sont présentes.
La récupération des logs auth Supabase a demandé une réauthentification de l'app MCP dans cette session; ils n'ont donc pas pu être lus ici.
Comment chaque service fonctionne
Supabase
Rôle:
- base de données principale;
- accès RLS via client anon;
- accès serveur via
SUPABASE_SERVICE_ROLE_KEY; - stockage et quotas via les helpers
storage-*.
Activation:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEY
Code clé:
- apps/web/src/lib/supabase/server.ts
- apps/web/src/lib/supabase/client.ts
- apps/web/src/lib/supabase/clerk-rls.ts
Logs:
- Supabase API
- Supabase Postgres
- Supabase Storage
- Supabase Auth
Clerk
Rôle:
- authentification front-end;
- session utilisateur;
- gating des routes privées;
- synchronisation des profils.
Activation:
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEYNEXT_PUBLIC_CLERK_PROXY_URLseulement si Clerk doit passer par le proxy local/__clerk(sinon laisser vide)CLERK_SECRET_KEY- éventuels réglages de domaine et d'utilisateurs admin.
CLERK_DOMAIN=auth.cleanmymap.frNEXT_PUBLIC_CLERK_PROXY_URLvide
Si NEXT_PUBLIC_CLERK_PROXY_URL=/__clerk est utilisé volontairement, le proxy Frontend API est géré par apps/web/src/proxy.ts via frontendApiProxy et le code résout ensuite ce chemin par rapport à NEXT_PUBLIC_APP_URL pour fournir à Clerk une URL absolue.
Code clé:
- apps/web/src/components/auth/clerk-localization-provider.tsx
- apps/web/src/lib/clerk-session-config.ts
- apps/web/src/proxy.ts
Logs:
- route
GET /api/health - route
GET /api/services - proxy server logs sur Vercel
Statut observé au moment de cette passe:
GET /api/uptimeremonteclerk_keys: warningsi les clés Clerk en prod sont encore des clés test.- le proxy Vercel renvoie des headers
x-clerk-auth-statusetx-clerk-auth-reasonutiles pour distinguer un vrai refus d'une session absente en navigateur.
PostHog
Rôle:
- analytics produit;
- suivi des événements et page views;
- host EU/US selon la région du projet.
Activation:
NEXT_PUBLIC_POSTHOG_KEYrecommandéNEXT_PUBLIC_POSTHOG_TOKENencore accepté mais dépréciéNEXT_PUBLIC_POSTHOG_HOSTouNEXT_PUBLIC_POSTHOG_REGION- consentement analytics côté client
Code clé:
- apps/web/src/lib/posthog/config.ts
- apps/web/src/lib/posthog/client.ts
- apps/web/src/lib/posthog/server.ts
- apps/web/src/components/ui/conditional-analytics.tsx
Logs:
- console navigateur
- événements PostHog Live Events
Sentry
Rôle:
- capture des exceptions runtime;
- contexte technique sur les erreurs API;
- support des source maps via upload post-build quand la configuration est complète.
Activation:
NEXT_PUBLIC_SENTRY_DSNSENTRY_DSNSENTRY_ORGSENTRY_PROJECTSENTRY_AUTH_TOKENpour l'upload des source mapsSENTRY_RELEASEoptionnel, sinon le commit SHA Vercel est utilisé
Code clé:
- apps/web/src/lib/observability/sentry.ts
- apps/web/src/app/error.tsx
- apps/web/src/lib/http/api-errors.ts
- apps/web/next.config.ts
Logs:
- console serveur
- issues Sentry
Statut observé au moment de cette passe:
- le runtime Sentry reste actif dès que
NEXT_PUBLIC_SENTRY_DSNest configuré; - les builds de production activent
experimental.serverSourceMapspour générer aussi les maps serveur; - l'upload des source maps est géré après
next buildviasentry-cliavec injection des debug IDs; l'étape ne pousse que les bundles JavaScript qui ont un.mapcorrespondant, exclut les maps CSS tierces, et désactive la détection automatique dessourceMappingURLainsi que le rewriting, ce qui évite les fauxmissing sourcemap!et les warnings de chunks non résolus; - si
SENTRY_AUTH_TOKEN,SENTRY_ORGouSENTRY_PROJECTmanquent, l'upload est sauté sans bloquer le runtime.
Resend
Rôle:
- emails transactionnels;
- fallback loggable quand la clé n'est pas configurée.
Activation:
RESEND_API_KEYEMAIL_FROMCONTACT_EMAIL- éventuellement
RESEND_FROM_EMAILetRESEND_REPLY_TOpour compatibilité.
Code clé:
- apps/web/src/lib/services/resend.ts
- apps/web/src/lib/services/email.ts
- apps/web/src/lib/email-config.ts
Logs:
- console serveur lors des envois ou du fallback
- web dashboard Resend
Statut observé au moment de cette passe:
- les routes de test
/api/sendet/api/email/testrenvoient200 queuedquandRESEND_API_KEY,EMAIL_FROMetCONTACT_EMAILsont présents. - quand la configuration manque, les routes renvoient
503 Resend not configured. - les erreurs d'envoi sont journalisées côté serveur avec les préfixes
[Resend test]et[Email Service].
Stripe
Rôle:
- paiements;
- webhooks.
Activation:
STRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRET
Code clé:
Logs:
- Stripe Dashboard
- logs de webhooks
Statut observé au moment de cette passe:
POST /api/stripe/webhookrenvoie503siSTRIPE_SECRET_KEYouSTRIPE_WEBHOOK_SECRETmanque.GET /api/stripe/webhookn'est pas supporté et retourne405 Method Not Allowed, ce qui est normal pour un webhook.- les signatures invalides sont journalisées avec le préfixe
[Stripe Webhook].
Upstash
Rôle:
- Redis pour le cache et les flux asynchrones;
- QStash pour les jobs et messages programmés.
Activation:
UPSTASH_REDIS_REST_URLUPSTASH_REDIS_REST_TOKENQSTASH_TOKEN
Code clé:
Logs:
- console serveur
- tableaux de bord Upstash
Pinecone
Rôle:
- index sémantique pour les fonctions IA.
Activation:
PINECONE_API_KEY
Code clé:
Logs:
- dashboard Pinecone
- console serveur
Vercel
Rôle:
- hébergement;
- previews;
- cron jobs;
- analytics de plateforme.
Activation:
- projet lié dans
.vercel - variables d'environnement syncées
apps/web/vercel.jsonpour les cron jobs- fonction Node.js par défaut en région Paris (
cdg1) pour rapprocher le compute des données et des utilisateurs franciliens.
Code clé:
Logs:
vercel logs- dashboard Vercel
npm run backend:doctor
Région:
- la configuration projet et le déploiement doivent rester en
cdg1sauf exception explicite. - si une route a des données dépendantes d'une autre géographie, surcharger la région au niveau de cette route plutôt que d'élargir tout le projet.
Cloudflare et Uptime Robot
Rôle:
- routage/CDN/protection;
- surveillance externe.
Activation:
CLOUDFLARE_API_TOKENUPTIMEROBOT_API_KEY
Logs:
- dashboards respectifs
- console serveur si des appels API échouent
Variables de configuration
Les variables sensibles ne doivent pas être recopiées en dur dans le code.
- les variables publiques commencent par
NEXT_PUBLIC_; - les secrets serveur restent hors client;
- le template de référence est apps/web/.env.example;
- la liste des variables sensibles est maintenue dans documentation/operations/pre-release-security-check.md.
Diagnostic minimal
Pour vérifier l'état de base du stack:
bash
npm run backend:doctor
npm run security:secrets
npm run test -w apps/web src/app/api/services/route.test.ts
Lecture rapide
Si un service ne répond plus, commence par:
- vérifier la variable d'environnement correspondante;
- lire
GET /api/health; - lire
GET /api/services; - consulter le dashboard du service;
- relancer le test ciblé du module associé.