Aller au contenu

Vue d'ensemble

Le site vitrine est un site statique, orienté référencement (SEO, optimisation pour les moteurs de recherche), sans logique métier : les formulaires envoient leurs données au backend. Les langues sont le français (par défaut, sans préfixe dans l’adresse), l’anglais et le néerlandais.

L’hébergement est Cloudflare Pages (non vérifié : le dépôt n’a ni configuration ni workflow de déploiement ; le README dit que la production se construit à chaque push sur la branche principale et qu’il y a un aperçu par branche). Le projet Pages, les domaines et les réglages se gèrent dans le tableau de bord Cloudflare. Le retour arrière consiste à re-promouvoir un déploiement antérieur (non vérifié). Le site envoie aussi des en-têtes de sécurité et des en-têtes de découverte pour les assistants IA.

Un petit programme (le middleware) s’exécute avant chaque requête et fait deux choses :

  • Barrière d’aperçu, désactivée sauf si son interrupteur est activé : les visiteurs non authentifiés vont vers la liste d’attente ; la liste d’attente et le calculateur partenaire restent publics, tout comme les ressources statiques (images, polices, feuilles de style, scripts, PDF). Une requête non authentifiée vers l’interface reçoit une erreur 404, pas une redirection. L’équipe se connecte par une page de connexion d’aperçu (cookie de 30 jours) ou avec un paramètre dans l’adresse (cookie de 24 heures, paramètre retiré par une redirection). Le cookie contient une empreinte du mot de passe, jamais le mot de passe. Si le mot de passe d’aperçu est absent, le site retombe sur une valeur par défaut codée en dur dans le fichier.

    Pourquoi : le site complet ne doit pas être public avant le lancement, tout en restant visible par l’équipe.

  • Version Markdown pour les assistants IA : une requête qui demande du Markdown ou du texte brut reçoit la version générée à la construction du site ; sans fichier, c’est la page normale.

    Pourquoi : les assistants lisent mieux le Markdown que le HTML et le site n’a pas de serveur applicatif. Coût : le Markdown suit les déploiements, pas les modifications en direct.

Les commandes pour travailler en local (sans le middleware, tests, contrôles, construction, aperçu avec middleware) sont dans le tableau « Correspondance technique ».

  • Jusqu’à l’enregistrement FSMA (Autorité des services et marchés financiers), le lien de souscription du site est codé en dur vers la liste d’attente, donc chaque bouton de souscription y mène. Le réglage prévu pour changer ce lien n’est lu par aucun code aujourd’hui.
  • Formulaires :
    • Contact : envoi en JSON vers le backend. L’adresse par défaut est un chemin relatif qui n’existe pas sur cet hôte, donc le réglage doit être défini.
    • Liste d’attente : même script, vers le backend (adresse par défaut en production).
    • Inscription partenaire : un formulaire HTML simple envoyé vers la page d’inscription du backend (une page web, hors de l’interface).
  • Côté backend, tout est limité à 5 par minute : contact, liste d’attente (les deux créent un prospect, mettent en file d’attente un email vers la boîte de contact et notifient Slack) et inscription partenaire. Un champ caché rempli est un piège à robots : la requête renvoie 200 sans rien enregistrer.
  • Turnstile (l’anti-robot de Cloudflare) : le widget s’affiche sur les formulaires contact et partenaire quand sa clé publique est définie. Seul le formulaire de contact vérifie la réponse (ignorée si le secret est vide). La vérification partenaire est commentée dans le backend. La liste d’attente n’a ni widget ni vérification.
  • Les appels depuis le site vers le backend reposent sur la liste d’origines autorisées (CORS) du backend ; elle doit contenir l’adresse du site.
  • Google Analytics 4 utilise le mode de consentement de Google : le tag se charge sur chaque page, mais le stockage d’audience reste refusé tant que le visiteur n’a pas accepté les cookies.
  • Les réglages publics sont lus à la construction du site ; l’interrupteur et le mot de passe d’aperçu sont lus à l’exécution. Les valeurs vivent dans le tableau de bord Pages ; voir Secrets et clés.
  • Le plan du site (sitemap) n’existe que si l’adresse publique du site est définie.
  • Tests : un test couvre la barrière ; d’autres couvrent la tarification et le tableau de bord de la page d’accueil.
  • landing-page/functions/_middleware.ts
  • landing-page/src/config/site.ts et landing-page/src/scripts/contact-form.ts
  • backend/routes/api/public.php
  • landing-page/astro.config.mjs et landing-page/src/i18n.ts
  • landing-page/.env.example
  • Le nom du projet Pages, la commande de build, le dossier de sortie, les domaines et les variables réellement définies en production ne sont pas visibles dans le code.
  • La barrière d’aperçu reste-t-elle une fois l’enregistrement FSMA obtenu ?
Nom courant Identifiant technique
Site vitrine dépôt landing-page : Astro 5, yarn 4, Node 24, Vitest ; langues fr, en, nl (astro.config.mjs, src/i18n.ts, src/content)
Travail en local yarn dev (sans middleware), yarn test, yarn check, yarn build, yarn preview:cf (port 8788, middleware inclus)
Middleware functions/_middleware.ts ; Markdown dans _markdown-cache/ (astro-markdown-for-agents)
En-têtes public/_headers
Interrupteur de la barrière PREVIEW_GATE (on, true ou 1), mot de passe PREVIEW_PASSWORD, pages /waitlist/, /partner-calculator, /_preview-login, paramètre ?preview=
Lien de souscription quoteHref dans src/config/site.ts ; réglage inutilisé PUBLIC_QUOTE_URL
Formulaire de contact src/scripts/contact-form.ts, PUBLIC_CONTACT_ENDPOINT (défaut /api/v1/contact), route POST /api/v1/contact
Liste d’attente PUBLIC_WAITLIST_ENDPOINT (défaut https://app.inqase.com/api/v1/waitlist), route POST /api/v1/waitlist
Inscription partenaire PUBLIC_PARTNER_ACTION_URL (défaut https://app.inqase.com/partner-signup), route POST /partner-signup
Prospect créé Lead ; champ piège website
Turnstile PUBLIC_TURNSTILE_SITE_KEY, TURNSTILE_SECRET
Origines autorisées FRONTEND_URL, APP_URL (backend/config/cors.php)
Google Analytics 4 Consent Mode v2, analytics_storage
Autres réglages au build PUBLIC_FSMA_NUMBER, PUBLIC_BROKER_URL, PUBLIC_PORTAL_URL, PUBLIC_PARTNER_URL, PUBLIC_COMPANY_*, PUBLIC_SITE_URL (lue par astro.config.mjs depuis l’environnement du processus)
Tests functions/_middleware.test.ts, src/lib/*.test.ts