<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LeSite on LaDoc</title><link>https://docs.fresquesystemique.org/lesite/</link><description>Recent content in LeSite on LaDoc</description><generator>Hugo</generator><language>fr-FR</language><atom:link href="https://docs.fresquesystemique.org/lesite/index.xml" rel="self" type="application/rss+xml"/><item><title>Fonctionnalités</title><link>https://docs.fresquesystemique.org/lesite/fonctionnalites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lesite/fonctionnalites/</guid><description>&lt;h1 id="fonctionnalités"&gt;Fonctionnalités&lt;a class="anchor" href="#fonctionnalit%c3%a9s"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Le site s&amp;rsquo;adresse au grand public : personnes curieuses de la démarche, futures participantes d&amp;rsquo;ateliers, organisations intéressées. Voici ses pages, dans l&amp;rsquo;ordre où un visiteur les découvre.&lt;/p&gt;
&lt;h2 id="accueil"&gt;Accueil&lt;a class="anchor" href="#accueil"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Une page d&amp;rsquo;accueil riche et interactive qui raconte la démarche systémique : fond animé en réseau, diagramme de l&amp;rsquo;iceberg, boucles systémiques, carte des liens, parcours en U. L&amp;rsquo;objectif est de faire comprendre la fresque avant même d&amp;rsquo;y participer.&lt;/p&gt;
&lt;h2 id="agenda-des-événements"&gt;Agenda des événements&lt;a class="anchor" href="#agenda-des-%c3%a9v%c3%a9nements"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/evenements&lt;/code&gt; : la liste des ateliers ouverts au public, avec filtres et carte interactive (Leaflet).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/evenements/[slug]&lt;/code&gt; : la fiche d&amp;rsquo;un atelier avec description, animateur·ices, tarifs par tiers (solidaire, classique, soutien) et inscription en ligne. Le paiement se fait sur HelloAsso, puis la personne revient sur la page de confirmation du site.&lt;/li&gt;
&lt;li&gt;Chaque fiche embarque des données structurées JSON-LD &lt;code&gt;Event&lt;/code&gt; pour le référencement (Google, agrégateurs d&amp;rsquo;événements).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les événements affichés sont ceux publiés dans LeHub ; les liens de partage générés dans LeHub pointent vers ces pages publiques.&lt;/p&gt;</description></item><item><title>Stack technique</title><link>https://docs.fresquesystemique.org/lesite/stack/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lesite/stack/</guid><description>&lt;h1 id="stack-technique"&gt;Stack technique&lt;a class="anchor" href="#stack-technique"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="technologies"&gt;Technologies&lt;a class="anchor" href="#technologies"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Couche&lt;/th&gt;
					&lt;th&gt;Technologie&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Framework&lt;/td&gt;
					&lt;td&gt;Next.js 16 (App Router, sortie standalone)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Langage&lt;/td&gt;
					&lt;td&gt;TypeScript, React 19&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Styles&lt;/td&gt;
					&lt;td&gt;Tailwind CSS 4&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Carte&lt;/td&gt;
					&lt;td&gt;Leaflet / React-Leaflet (agenda des événements)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Session&lt;/td&gt;
					&lt;td&gt;NextAuth v5, en lecture seule du cookie posé par LeHub&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E-mails&lt;/td&gt;
					&lt;td&gt;Resend (formulaire de contact)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Mesure d&amp;rsquo;audience&lt;/td&gt;
					&lt;td&gt;Plausible auto-hébergé (composant &lt;code&gt;Analytics&lt;/code&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Infra&lt;/td&gt;
					&lt;td&gt;Docker Compose, Nginx, GitHub Actions&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="structure-du-code"&gt;Structure du code&lt;a class="anchor" href="#structure-du-code"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;app/ # une route par page publique
 page.tsx # accueil (sections interactives)
 evenements/ # agenda + fiche [slug]
 blog/ # actualités + article [slug]
 mediatheque/ ateliers/ a-propos/ contact/
 confirmation/ chantier/ accessibilite/ mentions-legales/
 api/ # contact, me, og, revalidate, site-mode
components/ # composants de pages (Header, Footer, PdfCarousel,
 # IcebergDiagram, SystemicLoops, ChantierBar…)
lib/
 config.ts # URLs et constantes
 events.ts # appels à l&amp;#39;API publique de LeHub
 hub-auth.ts # lecture du cookie de session LeHub (pont d&amp;#39;auth)
middleware.ts # mode chantier (réécriture vers /chantier)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Quelques routes API à connaître :&lt;/p&gt;</description></item><item><title>Modèle de données</title><link>https://docs.fresquesystemique.org/lesite/donnees/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lesite/donnees/</guid><description>&lt;h1 id="modèle-de-données"&gt;Modèle de données&lt;a class="anchor" href="#mod%c3%a8le-de-donn%c3%a9es"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;LeSite n&amp;rsquo;a pas de base de données, et c&amp;rsquo;est un choix d&amp;rsquo;architecture : une seule source de vérité (LeHub), pas de synchronisation à maintenir, pas de contenu dupliqué qui divergerait.&lt;/p&gt;
&lt;h2 id="ce-que-lesite-consomme"&gt;Ce que LeSite consomme&lt;a class="anchor" href="#ce-que-lesite-consomme"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tout le contenu dynamique vient de l&amp;rsquo;API publique de LeHub :&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Endpoint&lt;/th&gt;
					&lt;th&gt;Contenu&lt;/th&gt;
					&lt;th&gt;Utilisé par&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GET /api/public/articles&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Liste des actualités publiées&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/blog&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GET /api/public/articles/[slug]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Un article complet&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/blog/[slug]&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GET /api/public/resources&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;La médiathèque publique&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/mediatheque&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GET /api/public/workshops/[slug]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Une fiche atelier&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/evenements/[slug]&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Les objets reçus sont volontairement pauvres en données personnelles. Par exemple, un article arrive avec deux champs calculés côté LeHub : l&amp;rsquo;avatar de l&amp;rsquo;auteur et sa tagline (ou son rôle associatif). LeSite ne connaît jamais l&amp;rsquo;e-mail, le téléphone ou le profil complet d&amp;rsquo;un membre.&lt;/p&gt;</description></item><item><title>Lancer en local</title><link>https://docs.fresquesystemique.org/lesite/developpement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lesite/developpement/</guid><description>&lt;h1 id="lancer-en-local"&gt;Lancer en local&lt;a class="anchor" href="#lancer-en-local"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="prérequis"&gt;Prérequis&lt;a class="anchor" href="#pr%c3%a9requis"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 20 ou plus récent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pas de base de données à installer : le contenu vient de l&amp;rsquo;API publique de LeHub (celle de production par défaut, ou d&amp;rsquo;un LeHub local si vous en faites tourner un).&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone &amp;lt;dépôt LeSite&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd LeSite
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# créer .env.local avec les variables ci-dessous&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run dev &lt;span style="color:#75715e"&gt;# http://localhost:3000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="variables-denvironnement"&gt;Variables d&amp;rsquo;environnement&lt;a class="anchor" href="#variables-denvironnement"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Variable&lt;/th&gt;
					&lt;th&gt;Rôle&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NEXT_PUBLIC_SITE_URL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;URL publique du site&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NEXT_PUBLIC_HUB_URL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;URL du LeHub à interroger&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NEXT_PUBLIC_ALLOW_INDEXING&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;true&lt;/code&gt; pour autoriser l&amp;rsquo;indexation par les moteurs ; toute autre valeur laisse le site en &lt;code&gt;noindex&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NEXTAUTH_SECRET&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Doit être strictement identique à celui de LeHub, sinon le pont d&amp;rsquo;auth ne reconnaît personne&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;REVALIDATE_SECRET&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Secret partagé avec LeHub pour la revalidation à la demande&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;RESEND_API_KEY&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Envoi du formulaire de contact&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CONTACT_EMAIL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Destinataire du formulaire de contact&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class='book-hint important'&gt;
&lt;p&gt;Les variables &lt;code&gt;NEXT_PUBLIC_*&lt;/code&gt; sont inlinées dans le JavaScript &lt;strong&gt;au moment du build&lt;/strong&gt; (elles passent en arguments de build dans Docker). Changer une URL ou activer l&amp;rsquo;indexation demande donc de reconstruire l&amp;rsquo;image, pas seulement de redémarrer le conteneur.&lt;/p&gt;</description></item><item><title>Déploiement</title><link>https://docs.fresquesystemique.org/lesite/deploiement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lesite/deploiement/</guid><description>&lt;h1 id="déploiement"&gt;Déploiement&lt;a class="anchor" href="#d%c3%a9ploiement"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="le-pipeline"&gt;Le pipeline&lt;a class="anchor" href="#le-pipeline"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Comme LeHub, LeSite se déploie automatiquement à chaque push sur &lt;code&gt;main&lt;/code&gt; via GitHub Actions : connexion SSH au VPS, &lt;code&gt;git pull&lt;/code&gt;, &lt;code&gt;docker compose build --no-cache&lt;/code&gt;, &lt;code&gt;docker compose up -d&lt;/code&gt;, reload de Nginx.&lt;/p&gt;
&lt;p&gt;Il n&amp;rsquo;y a pas d&amp;rsquo;étape de migration : LeSite n&amp;rsquo;a pas de base de données.&lt;/p&gt;
&lt;h2 id="limage-et-le-build"&gt;L&amp;rsquo;image et le build&lt;a class="anchor" href="#limage-et-le-build"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Le build Next.js est en sortie &lt;code&gt;standalone&lt;/code&gt;. Point d&amp;rsquo;attention principal : les variables &lt;code&gt;NEXT_PUBLIC_*&lt;/code&gt; (URLs publiques, autorisation d&amp;rsquo;indexation) sont passées en &lt;strong&gt;arguments de build&lt;/strong&gt; dans &lt;code&gt;docker-compose.yml&lt;/code&gt; et figées dans le bundle. Tout changement de ces valeurs passe par un rebuild de l&amp;rsquo;image.&lt;/p&gt;</description></item></channel></rss>