Runbooks & opérationsAudit des domaines publics (2026-09-25)

Audit des domaines publics (2026-09-25)

Suite : tranche pour sept sous-domaines (mcp, api, cdn, hooks, status, docs, preview). Le code est livre derriere un interrupteur ; checklist operateur : subdomains.md.

Suite : tranche pour sept sous-domaines (mcp, api, cdn, hooks, status, docs, preview). Le code est livre derriere un interrupteur ; checklist operateur : subdomains.md.

Rapport seulement : rien n'a ete change dans l'infra, le DNS, src/proxy.ts ni src/env/*. Question : « pourquoi pas mcp.boostecom.app, cdn.boostecom.app, preview.boostecom.app au lieu d'URLs longues ou etranges, pour toute la codebase ? ».

Ce que le produit montre ou emet aujourd'hui

SurfaceForme actuelleConstruite ouHote d'origine
Endpoint MCP (Studio, section MCP et API)https://www.boostecom.app/api/mcp/v1/<storeId>src/components/studio/connect-content.tsx (useEndpoint, window.location.origin)l'origine du navigateur
Endpoint MCP (guides publics)${APP_URL}/api/mcp/v1/<STORE_ID>src/app/(marketing)/features/mcp/connect/[client]/page.tsx:41APP_URL, src/config/platform.ts:19 (NEXT_PUBLIC_APP_URL, repli https://www.boostecom.app)
Endpoint MCP non versionne (clients installes)/api/mcp/<storeId>src/app/api/mcp/[storeId]/route.tsrequete
Metadonnees de ressource protegee (RFC 9728)${origin}/.well-known/oauth-protected-resource/api/mcp/v1/<id>src/app/api/mcp/[storeId]/helpers.ts:44-48req.url
Serveur d'autorisation OAuth (RFC 8414)issuer = origine nuesrc/app/.well-known/oauth-authorization-server/route.ts:26req.url
Consentement OAuth/oauth/authorizesrc/app/oauth/authorize/page.tsxorigine de l'app
Jeton OAuth/api/oauth/tokensrc/app/api/oauth/token/route.tsorigine de l'app
Callbacks OAuth sortants (Google, Meta, Klaviyo, Notion)*_REDIRECT_URIsrc/app/api/connectors/[connectorId]/route.ts:153-177, src/features/connectors/token-refresh.ts:93,131variables d'env, enregistrees chez chaque fournisseur
Webhook Shopify (Custom App)${NEXT_PUBLIC_APP_URL}/api/webhooks/shopify/eventssrc/app/api/integrations/shopify/custom-app/route.ts:359, src/features/ai/wizard-skills/webhook-wiring.ts:51env
Webhook WhatsApp${base}/api/webhooks/whatsappsrc/app/api/integrations/whatsapp/lib.ts:118env
Webhooks Stripe, Resend, GitHub, creative-render/api/webhooks/<provider>src/app/api/webhooks/*saisis a la main dans chaque console fournisseur
Images OG${APP_URL}/api/og?...src/lib/seo/marketing-metadata.ts:28APP_URL
Assets Vercel Blob (uploads, rendus Studio, captures de scan)https://<store>.public.blob.vercel-storage.com/...src/app/api/upload/route.ts:95, src/features/ai/orchestrator/runtime/studio-references.ts, src/features/tracking/lib/scan-retention.tsl'URL rendue par put(), persistee en base
Proxy de preview storefront/api/preview/proxy?url=... sur l'origine du dashboardsrc/app/api/preview/proxy/route.tsorigine de l'app
Origine de preview dedieeboostecom.vercel.appsrc/lib/storefront-origin-preview-host.ts:13 (DEDICATED_PREVIEW_HOST)litteral

Deux constats :

  1. L'URL MCP n'a pas de constante unique. Elle est ecrite deux fois (Studio sur l'origine du navigateur, guides publics sur APP_URL) et le serveur derive ses metadonnees OAuth de req.url. Un NEXT_PUBLIC_MCP_ORIGIN n'aurait donc pas ete un changement « tiny » : il faudrait d'abord une fonction mcpEndpoint(storeId) dans src/config/platform.ts (hot file), la cle dans src/env/server.ts, une ligne dans l'audit d'env (env-audit-coverage.test.ts) et un lecteur (env-var-consumed.test.ts). Non fait, volontairement.
  2. La longueur de l'URL MCP ne vient pas du domaine : elle vient de /api/mcp/v1/ et de l'identifiant de boutique (25 caracteres). Passer a mcp.boostecom.app/<storeId> gagne environ 20 caracteres ; retirer l'id demande que la CLE designe la boutique (decision de securite).

Carte de sous-domaines proposee

Sous-domaineSertDNSVercelsrc/proxy.tsCORS / CSP / cookiesOAuth et clients installes
mcp.boostecom.app/<storeId> → /api/mcp/v1/<storeId>, plus ses .well-knownCNAME cname.vercel-dns.comdomaine ajoute au meme projetrewrite par host : mcp.*/:id → /api/mcp/v1/:id, /.well-known/* passe tel quel ; tout autre chemin 404 (le dashboard ne doit pas repondre sur cet hote)pas de cookie de session necessaire (Bearer) ; CORS inchange (les clients MCP sont serveur a serveur)l'issuer et resource_metadata derivent de req.url, donc ils suivraient l'hote si le rewrite preserve host ; mais /oauth/authorize doit rester sur www (la session NextAuth est un cookie host-only) : l'issuer devra donc etre fixe sur www et non derive, sinon le consentement s'ouvre sur un hote sans session. Les URLs www/api/mcp/... deja collees dans Claude, ChatGPT, Cursor restent servies indefiniment : le resource OAuth est lie a l'URL appelee, une redirection casserait les jetons emis
cdn.boostecom.appassets Blob publicsCNAME vers VercelVercel Blob n'accepte pas de domaine personnalise : il faut un rewrite cdn.*/:path* → https://<store>.public.blob.vercel-storage.com/:path* (egress facture deux fois : fonction ou edge + Blob), ou un CDN tiers devantrewrite par hostimg-src / media-src de src/lib/security/csp.ts:153 et images.remotePatterns de next.config.mjs:91 a completer ; aucun cookieaucune. Les URLs deja persistees en base gardent l'hote Blob : il faut soit une reecriture a l'affichage, soit une migration de donnees. Gain surtout cosmetique
preview.boostecom.appproxy de preview storefrontCNAME vers Verceldomaine ajoute au projetdeja prevu : src/app/api/preview/proxy/route.ts et storefront-origin-preview-host.ts l'attendent ; il suffit de changer DEDICATED_PREVIEW_HOST et de restreindre cet hote au seul proxymeme site que www : un cookie Lax accompagne les fetchs, ce que boostecom.vercel.app empeche. Il faut donc que le proxy ne lise aucun cookie de session sur cet hote, et que la CSP de ce document ne l'autorise pas a appeler l'APIaucune. C'est le gain de securite reel (isoler du HTML tiers hors de l'origine du dashboard)
api.boostecom.appAPI Intelligence (bei_…)CNAMEdomaine au projetrewrite api.*/:path* → /api/intelligence/:path*Bearer, pas de cookie ; CORS a ouvrir si des appels navigateur sont visesaucune ; la doc content/docs/en/api-* a mettre a jour, les anciennes URLs gardees
og.boostecom.appnon recommande/api/og n'est lu que par des crawlers, le chemin n'est jamais vu
hooks.boostecom.appnon recommandechaque URL de webhook est enregistree chez Stripe, Shopify, Resend, GitHub, Meta : tout changement se re-saisit a la main, sans gain visible

Recommandation

Ordre par rapport gain / risque : preview d'abord (securite, code deja pret), puis mcp (lisibilite de l'URL que le client colle, a condition de garder l'issuer sur www et de servir les deux formes), puis api. cdn seulement si la marque blanche des URLs d'assets devient une exigence client : aujourd'hui elle coute une migration de donnees et de l'egress.