<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LeBoard on LaDoc</title><link>https://docs.fresquesystemique.org/leboard/</link><description>Recent content in LeBoard on LaDoc</description><generator>Hugo</generator><language>fr-FR</language><atom:link href="https://docs.fresquesystemique.org/leboard/index.xml" rel="self" type="application/rss+xml"/><item><title>Fonctionnalités</title><link>https://docs.fresquesystemique.org/leboard/fonctionnalites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/leboard/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;h2 id="le-plateau"&gt;Le plateau&lt;a class="anchor" href="#le-plateau"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Canvas infini&lt;/strong&gt; : zoom à la molette, déplacement au glisser. Chacun navigue librement sur le plateau.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;283 cartes recto/verso&lt;/strong&gt; : glisser-déposer, clic pour retourner, visualiseur plein écran pour lire confortablement une carte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post-its&lt;/strong&gt; : notes libres, redimensionnables, avec choix de couleur et de taille de police.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flèches&lt;/strong&gt; : outil dédié pour tracer les liens entre cartes et post-its, avec plusieurs couleurs et styles, dans les deux sens. C&amp;rsquo;est le cœur de l&amp;rsquo;exercice systémique.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Annuler / refaire&lt;/strong&gt; : historique des actions (Ctrl+Z / Ctrl+Y).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="la-collaboration-temps-réel"&gt;La collaboration temps réel&lt;a class="anchor" href="#la-collaboration-temps-r%c3%a9el"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tous les participants voient les modifications des autres en direct, curseurs compris : chacun sait qui regarde quoi. La synchronisation passe par WebSocket (Socket.io), sans rechargement de page.&lt;/p&gt;</description></item><item><title>Stack technique</title><link>https://docs.fresquesystemique.org/leboard/stack/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/leboard/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) sur un serveur HTTP custom&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Temps réel&lt;/td&gt;
					&lt;td&gt;Socket.io 4&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Canvas&lt;/td&gt;
					&lt;td&gt;Konva.js / react-konva&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;Base de données&lt;/td&gt;
					&lt;td&gt;PostgreSQL 18 + Prisma 5, base partagée avec LeHub&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;Infra&lt;/td&gt;
					&lt;td&gt;Docker, Nginx (avec support WebSocket)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La particularité de LeBoard est son &lt;strong&gt;serveur custom&lt;/strong&gt; (&lt;code&gt;server.ts&lt;/code&gt;) : au lieu du serveur intégré de Next.js, un serveur HTTP unique porte à la fois l&amp;rsquo;application Next.js et le serveur Socket.io. C&amp;rsquo;est ce qui permet de servir les WebSockets et les pages sur le même port.&lt;/p&gt;</description></item><item><title>Modèle de données</title><link>https://docs.fresquesystemique.org/leboard/donnees/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/leboard/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;LeBoard n&amp;rsquo;a pas de base à lui : il travaille dans la base PostgreSQL de LeHub. Son dépôt porte son propre schéma Prisma, limité aux tables dont il a besoin, et c&amp;rsquo;est depuis ce dépôt que sont gérées les migrations des tables du plateau.&lt;/p&gt;
&lt;h2 id="les-tables-du-plateau"&gt;Les tables du plateau&lt;a class="anchor" href="#les-tables-du-plateau"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Modèle&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;Board&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Un plateau : jeton d&amp;rsquo;accès (l&amp;rsquo;URL &lt;code&gt;b/[token]&lt;/code&gt;), atelier LeHub associé, état (verrouillage, lots distribués), marqueur d&amp;rsquo;atelier test&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CardPlacement&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Chaque carte posée : position, face visible (recto/verso), lot d&amp;rsquo;origine&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;StickyNote&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Un post-it : position, taille, couleur, texte, taille de police&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;BoardArrow&lt;/code&gt; / &lt;code&gt;Connection&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Une flèche entre deux éléments : extrémités, style, couleur&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;AnimatorSession&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Session SSO d&amp;rsquo;un animateur venu de LeHub (jeton signé, durée courte)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="les-tables-lues-chez-lehub"&gt;Les tables lues chez LeHub&lt;a class="anchor" href="#les-tables-lues-chez-lehub"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LeBoard lit aussi des tables administrées côté LeHub, sans les modifier :&lt;/p&gt;</description></item><item><title>Lancer en local</title><link>https://docs.fresquesystemique.org/leboard/developpement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/leboard/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;li&gt;Une instance PostgreSQL : celle de votre LeHub local, puisque les deux applications partagent la base&lt;/li&gt;
&lt;/ul&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 LeBoard&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd LeBoard
&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;cp .env.example .env.local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# renseigner 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;npx prisma migrate deploy &lt;span style="color:#75715e"&gt;# applique les migrations du plateau&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run dev &lt;span style="color:#75715e"&gt;# serveur custom : Next.js + Socket.io, 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;DATABASE_URL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Connexion PostgreSQL (la même base que LeHub)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NEXT_PUBLIC_SOCKET_URL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;URL du serveur Socket.io (en production, l&amp;rsquo;URL publique de l&amp;rsquo;application)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;PORT&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Port d&amp;rsquo;écoute&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="les-images-de-cartes"&gt;Les images de cartes&lt;a class="anchor" href="#les-images-de-cartes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les images ne sont pas dans le dépôt. Pour un plateau fonctionnel en local, déposer les fichiers dans &lt;code&gt;public/cards/fr/&lt;/code&gt; (et &lt;code&gt;en/&lt;/code&gt;, &lt;code&gt;es/&lt;/code&gt; si besoin) au format &lt;code&gt;card-NNN-recto.webp&lt;/code&gt; / &lt;code&gt;card-NNN-verso.webp&lt;/code&gt;. Sans elles, l&amp;rsquo;application fonctionne mais les cartes s&amp;rsquo;affichent vides.&lt;/p&gt;</description></item><item><title>Déploiement</title><link>https://docs.fresquesystemique.org/leboard/deploiement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/leboard/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="mise-en-production"&gt;Mise en production&lt;a class="anchor" href="#mise-en-production"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LeBoard se déploie par script sur le VPS, sur le même principe que les autres applications :&lt;/p&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 pull
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose exec app npx prisma migrate deploy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les migrations appliquées ici ne concernent que les tables du plateau (voir &lt;a href="https://docs.fresquesystemique.org/leboard/donnees/"&gt;Modèle de données&lt;/a&gt;) ; celles de LeHub sont appliquées par son propre déploiement.&lt;/p&gt;
&lt;h2 id="nginx-et-les-websockets"&gt;Nginx et les WebSockets&lt;a class="anchor" href="#nginx-et-les-websockets"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Le virtual host de &lt;code&gt;board.fresquesystemique.org&lt;/code&gt; a une exigence de plus que les autres : le support WebSocket. La configuration Nginx transmet les en-têtes de montée en version du protocole :&lt;/p&gt;</description></item></channel></rss>