<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Quentin Lagonotte</title>
    <description>The latest articles on DEV Community by Quentin Lagonotte (@quentin_lagonotte_6a1344f).</description>
    <link>https://dev.to/quentin_lagonotte_6a1344f</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4125792%2F8cda30f8-6887-467f-8c31-b3ebda846d61.jpg</url>
      <title>DEV Community: Quentin Lagonotte</title>
      <link>https://dev.to/quentin_lagonotte_6a1344f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quentin_lagonotte_6a1344f"/>
    <language>en</language>
    <item>
      <title>Le site Internet super-économique</title>
      <dc:creator>Quentin Lagonotte</dc:creator>
      <pubDate>Tue, 15 Sep 2026 09:05:05 +0000</pubDate>
      <link>https://dev.to/onepoint/le-site-internet-super-economique-394p</link>
      <guid>https://dev.to/onepoint/le-site-internet-super-economique-394p</guid>
      <description>&lt;p&gt;Un site Internet, c'est un super moyen de communication. Les cas d'usage sont infinis, tout le monde y a accès du bout des doigts en quelques secondes, et c'est classe. Mais ça coûte !&lt;/p&gt;

&lt;p&gt;Je vous présente ici comment j'ai réduit le coût d'hébergement de mon site Internet au maximum, dans le cadre de mon association, BROCCONOTTE, qui avait pour but d'effectuer un raid humanitaire au Maroc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mes besoins simples
&lt;/h2&gt;

&lt;p&gt;Pour le contexte, mes besoins étaient très simples : je devais communiquer auprès de mes sponsors de manière professionnelle.&lt;/p&gt;

&lt;p&gt;Il me fallait donc des sites Internet, "bien faits" en apparence, disponibles 24h/24, mais avec assez peu de fréquentation. On parle de quelques dizaines de sponsors, qui consultent les informations relativement peu souvent.&lt;/p&gt;

&lt;p&gt;Mes cas d'usage étaient les suivants : présenter un contenu fixe (l'association, l'équipe et le projet), afficher une position en direct sur une carte, et enfin, récupérer des informations de contact d'abonnés à une newsletter (leurs e-mails).&lt;/p&gt;

&lt;p&gt;Le tout avec un credo absolu : &lt;strong&gt;dépenser l'extrême minimum d'argent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;J'ai donc creusé et trouvé des solutions super-économiques, que je vous partage ici.&lt;/p&gt;

&lt;p&gt;Mon but est de rendre cet article accessible à tout public, y compris aux moins techniques : pour cela, je vais aborder des concepts d'hébergement de site Internet le plus simplement possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F43gvzcrt0cgb95lw7nju.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F43gvzcrt0cgb95lw7nju.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Les Internet Content Management Systems
&lt;/h2&gt;

&lt;p&gt;La manière la plus simple de se faire un site Internet avec peu de connaissances, c'est d'utiliser des produits spécialisés qui proposent des offres sur étagère. On peut citer &lt;strong&gt;WordPress&lt;/strong&gt;, &lt;strong&gt;Wix&lt;/strong&gt;, &lt;strong&gt;Canvas&lt;/strong&gt; ou &lt;strong&gt;Internetador&lt;/strong&gt;. Au moment où je consulte les tarifs de WordPress, l'offre de base est à 4 € par mois, soit &lt;strong&gt;48 € par an&lt;/strong&gt; pour un seul site (ce qui me semble être une offre plutôt avantageuse par rapport aux concurrents).&lt;/p&gt;

&lt;p&gt;C'est une solution peu permissive en termes de fonction, et surtout, c'est un coût que je juge &lt;strong&gt;trop important&lt;/strong&gt; !&lt;/p&gt;

&lt;h2&gt;
  
  
  Coder soi-même
&lt;/h2&gt;

&lt;p&gt;L'alternative, c'est de coder mon propre site Internet. J'ai un peu d'expérience, je connais le HTML / CSS et le JavaScript, et l'IA peut être un bon accélérateur.&lt;/p&gt;

&lt;p&gt;Sauf qu'il faut héberger ce site, et là encore le coût est important.&lt;br&gt;
Exemple, chez &lt;strong&gt;OVH&lt;/strong&gt;, il y a une offre à ~2 € par mois, soit &lt;strong&gt;24 € par an&lt;/strong&gt;. C'est &lt;strong&gt;encore trop pour moi&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;Je pourrais également héberger ma propre infrastructure, mais alors, il faut investir dans du matériel et prévoir le coût électrique associé. Ça ne m'intéresse pas.&lt;/p&gt;

&lt;p&gt;Je vais donc fouiller et trouver les meilleures opportunités pour me faire mon infrastructure de site à moindre coût.&lt;/p&gt;
&lt;h2&gt;
  
  
  L'infrastructure
&lt;/h2&gt;
&lt;h3&gt;
  
  
  La mise en ligne du site
&lt;/h3&gt;

&lt;p&gt;La première chose, c'est de trouver un hébergement capable d'exposer le contenu de mon site Internet, donc mon code, à des visiteurs.&lt;/p&gt;

&lt;p&gt;En termes de technologie, je code une interface ultra-simple en HTML, CSS et JavaScript. Il serait tout à fait possible d'utiliser des bibliothèques comme React, Vue ou Angular, mais moi, je reste simple.&lt;/p&gt;

&lt;p&gt;Mon premier objectif, c'est de présenter mon projet et mon association. À ce stade, l'intégralité du contenu est donc directement dans le code.&lt;/p&gt;

&lt;p&gt;Une fois mon site réalisé, codé et testé localement, je peux le déposer sur &lt;strong&gt;GitHub&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  GitHub
&lt;/h4&gt;

&lt;p&gt;GitHub, c'est un outil de gestion de développement logiciel &lt;strong&gt;gratuit&lt;/strong&gt;, bien connu des développeurs.&lt;/p&gt;

&lt;p&gt;Pour faire simple, il me permet de stocker mes fichiers de code dans un dépôt, appelé "repository" dans GitHub, et de conserver l'historique des évolutions. Si un jour, par exemple, je fais une modification qui casse complètement mon site, je peux revenir facilement à une version précédente qui fonctionnait.&lt;/p&gt;

&lt;p&gt;Procédure :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Je vais sur le site https://github.com/ en étant connecté à mon compte (gratuit)
- Je crée un nouveau "repository" avec une visibilité "publique" (important pour la suite)
- Je pousse mon code sur ce répertoire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mon code est donc hébergé. Il faut maintenant l'exposer, c'est-à-dire le rendre visible par tous sur Internet. Pour ça, j'utilise une fonctionnalité de GitHub : &lt;strong&gt;GitHub Pages&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  GitHub Pages
&lt;/h4&gt;

&lt;p&gt;GitHub Pages permet nativement et &lt;strong&gt;gratuitement&lt;/strong&gt; d'exposer mon code.&lt;/p&gt;

&lt;p&gt;Concrètement, GitHub Pages va définir une URL accessible depuis n'importe quel navigateur sur Internet, et exécuter le fichier principal du site, généralement &lt;em&gt;index.html&lt;/em&gt;, à partir de mon dépôt GitHub.&lt;/p&gt;

&lt;p&gt;Procédure :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Sur GitHub, dans les paramètres du "repository" ("Settings")
- Dans la section "Code and automation", puis "Pages"
- Je sélectionne la branche "main" comme branche à exposer
- Je choisis entre "root (/)" ou "docs (/docs)" pour indiquer dans quel dossier se situe ma page HTML principale (index.html)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fva54n2vrfibekobic711.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fva54n2vrfibekobic711.png" alt=" " width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Première victoire : mon site est en ligne, visible sur Internet, et je n'ai pas dépensé un seul centime.&lt;/p&gt;

&lt;p&gt;Mais j'ai un soucis. L'URL du site est définie par GitHub : &lt;code&gt;https://quentin1500.github.io/newsletter-brocconotte&lt;/code&gt;. Ça révèle la solution gratuite, ça ne fait pas suffisament professionnel : en terme de communication, on peut faire mieux.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ajustement de l'URL
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Obtenir un domaine
&lt;/h4&gt;

&lt;p&gt;Sur GitHub Pages, j'ai la capacité de configurer un domaine personnalisé. C'est exactement ce qu'il me faut.&lt;/p&gt;

&lt;p&gt;Un domaine, c'est l'usage d'un nom unique sur Internet, basé sur une étiquette et une extension.&lt;/p&gt;

&lt;p&gt;Exemples :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;google.com
wikipedia.org
mon-domaine.fr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cela va donc me permettre d'utiliser un domaine au nom de mon association, qui me servira d'URL et masquera celle de GitHub.&lt;/p&gt;

&lt;p&gt;Pour acquérir un domaine, il faut passer par des hébergeurs. Il va falloir lâcher quelques deniers… Ce sera le prix à payer pour maximiser ma communication, alors j'essaye d'optimiser ça au maximum.&lt;/p&gt;

&lt;p&gt;Chaque nom de domaine a un prix différent, et certaines extensions sont plus chères que d'autres. J'ai remarqué qu'en général les &lt;code&gt;.fr&lt;/code&gt; sont moins chères que les &lt;code&gt;.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Il y a une multitude de combinaisons, de bons plans, etc. Il va falloir faire des choix et des essais pour économiser un maximum.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;association-brocconotte.com
brocconotte-asso.org
the-brocconotte.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les hébergeurs proposent des simulateurs pour découvrir le prix d'un nom de domaine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F763jxi1yiwznrux4ybxp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F763jxi1yiwznrux4ybxp.png" alt=" " width="778" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il existe beaucoup d'hébergeurs, donc je préfère m'orienter vers des plateformes reconnues, en vérifiant bien leur capacité à gérer les "sous-domaines" et les "résolutions DNS". J'en aurai besoin un peu plus tard.&lt;/p&gt;

&lt;p&gt;J'ai opté pour IONOS, qui me semble adapté et surtout &lt;strong&gt;peu cher&lt;/strong&gt;. Mais il existe plein d'alternatives possibles : Hostinger, OVHcloud, Nom-domaine.fr, etc. J'ai trouvé une offre à 1,20 € pour 1 an, pour un nom de domaine parfait : &lt;code&gt;brocconotte.fr&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configuration de mon domaine
&lt;/h4&gt;

&lt;p&gt;Maintenant richement propriétaire de mon domaine, je vais pouvoir me créer un sous-domaine dédié à l'exposition de mon site.&lt;/p&gt;

&lt;p&gt;Un sous-domaine est comme une portion de mon domaine. C'est un bon moyen de multiplier les URL disponibles, et donc d'avoir autant de sites que je le souhaite, sans surcoût. Je n'utilise donc pas directement mon domaine &lt;code&gt;brocconotte.fr&lt;/code&gt; mais un sous-domaine que je vais définir.  &lt;/p&gt;

&lt;p&gt;Exemples de sous-domaines :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;drive.google.com
mail.google.com
fr.wikipedia.org
mon-site.brocconotte.fr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Je crée donc le sous-domaine sous lequel sera exposé mon site : &lt;code&gt;newsletter.brocconotte.fr&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Je retourne sur GitHub, pour configurer ce domaine personnalisé dans mes Pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzqqxqlzdmxenoikb5mlr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzqqxqlzdmxenoikb5mlr.png" alt=" " width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Je dois maintenant configurer le DNS de mon sous-domaine.&lt;/p&gt;

&lt;h4&gt;
  
  
  DNS
&lt;/h4&gt;

&lt;p&gt;Le DNS, c'est ce qui permet à un navigateur de savoir vers quel serveur aller chercher le code, et donc d'afficher le bon site Internet. On pourrait y mettre une adresse IP, par exemple, ou, dans mon cas, un autre site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6pbg0f62nu4xbag0k220.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6pbg0f62nu4xbag0k220.gif" alt=" " width="562" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Procédure :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Sur mon hébergeur de domaine, je configure le DNS de mon sous-domaine
- Type CNAME (il en existe d'autres, mais c'est celui qui m'intéresse)
- Valeur : l'URL du GitHub Pages
    - quentin1500.github.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9f0kj7zrvqs4a9scbash.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9f0kj7zrvqs4a9scbash.png" alt=" " width="656" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Après quelques minutes d'attente, c'est bon : mon site '&lt;a href="https://newsletter.brocconotte.fr" rel="noopener noreferrer"&gt;https://newsletter.brocconotte.fr&lt;/a&gt;' est accessible partout sur Internet au travers de mon domaine, et pour &lt;strong&gt;vraiment pas cher&lt;/strong&gt; !&lt;/p&gt;

&lt;h3&gt;
  
  
  Gestion de données
&lt;/h3&gt;

&lt;p&gt;Mais, pour l'instant, mon site ne contient que des informations statiques, rédigées directement dans le code. Or, désormais, je veux aussi récupérer des informations provenant d'une source de données externe, en l'occurrence pour afficher une position sur une carte en temps réel.&lt;/p&gt;

&lt;h4&gt;
  
  
  La persistance de données
&lt;/h4&gt;

&lt;p&gt;Le principe, c'est de stocker les données utilisées par mon site sur un système dédié. &lt;/p&gt;

&lt;p&gt;Dans mon cas, ces données sont des positions GPS, qui me permettent d'afficher ma localisation en temps réel. Elles sont mises à jour régulièrement, toutes les minutes, par une application sur mon smartphone. Comme elles changent trop souvent, GitHub ne convient pas, contrairement à mon code, qui lui évolue peu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy5ppu52lq0i3mv5gf86x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy5ppu52lq0i3mv5gf86x.jpg" alt=" " width="651" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En temps normal, on utiliserait une base de données. Mais même si certaines sont gratuites, comme MySQL ou PostgreSQL, leur hébergement, lui, &lt;strong&gt;coûte&lt;/strong&gt;. Et vous connaissez ma politique à propos de ce qui a un coût…&lt;/p&gt;

&lt;p&gt;J'ai décidé d'utiliser un outil bien connu de tous : &lt;strong&gt;Google Sheets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cela me permet de stocker mes données dans un tableur (comme Excel), de manière ordonnée, et surtout &lt;strong&gt;gratuitement&lt;/strong&gt;, dans la limite des 20 Go offerts par Google Drive.&lt;/p&gt;

&lt;p&gt;Procédure :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Je vais sur https://drive.google.com/ (connecté à mon compte Google)
- Je crée un nouveau fichier Google Sheets
- Je renomme l'onglet par défaut (en bas) "positions"
- Je complète les en-têtes des colonnes "timestamp | lat | lng | accuracy | battery | device"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zilhzbehuet4ok2xi03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zilhzbehuet4ok2xi03.png" alt=" " width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maintenant que je sais où stocker ces données, il faut que je fasse le lien avec mon site.&lt;/p&gt;

&lt;h4&gt;
  
  
  Interface de programmation
&lt;/h4&gt;

&lt;p&gt;Pour faire le lien entre mes données et mon site Internet, j'utilise un autre outil de l'écosystème Google : &lt;strong&gt;Apps Script&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Disponible dans le menu "Extensions" de Google Sheets, Apps Script va me permettre de créer une API personnalisée, capable de lire et d'alimenter mon fichier Google Sheets, et donc de permettre à mon site d'accéder à mes données stockées, &lt;strong&gt;gratuitement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Une API, ou interface de programmation, c'est simplement le tunnel qui permet à deux applications de communiquer. D'un côté, j'ai le site qui s'exécute dans le navigateur ; de l'autre, j'ai mon fichier Google Sheets avec mes données.&lt;/p&gt;

&lt;p&gt;Apps Script permet de coder dans un langage proche de JavaScript, et c'est typiquement prévu pour créer une interface entre le Internet et l'écosystème Google Drive. C'est parfait, et c'est &lt;strong&gt;gratuit&lt;/strong&gt;.&lt;br&gt;
Ici, l'intelligence artificielle est un bon allié pour m'accompagner dans le développement de cette interface.&lt;/p&gt;

&lt;p&gt;Des fonctions utiles que j'ai utilisées :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;doGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;déclenchée&lt;/span&gt; &lt;span class="nx"&gt;par&lt;/span&gt; &lt;span class="nx"&gt;une&lt;/span&gt; &lt;span class="nx"&gt;requête&lt;/span&gt; &lt;span class="nx"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;typiquement&lt;/span&gt; &lt;span class="nx"&gt;pour&lt;/span&gt; &lt;span class="nx"&gt;lire&lt;/span&gt; &lt;span class="nx"&gt;les&lt;/span&gt; &lt;span class="nx"&gt;données&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;doPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;       &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;déclenchée&lt;/span&gt; &lt;span class="nx"&gt;par&lt;/span&gt; &lt;span class="nx"&gt;une&lt;/span&gt; &lt;span class="nx"&gt;requête&lt;/span&gt; &lt;span class="nx"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;typiquement&lt;/span&gt; &lt;span class="nx"&gt;pour&lt;/span&gt; &lt;span class="nx"&gt;modifier&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;créer&lt;/span&gt; &lt;span class="nx"&gt;des&lt;/span&gt; &lt;span class="nx"&gt;données&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getSheet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;          &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;récupération&lt;/span&gt; &lt;span class="nx"&gt;du&lt;/span&gt; &lt;span class="nx"&gt;contenu&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="nx"&gt;du&lt;/span&gt; &lt;span class="nx"&gt;tableur&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;spreadsheetId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;PropertiesService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getScriptProperties&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;getProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SHEET_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SpreadsheetApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;spreadsheetId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;getSheetByName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SHEET_NAME&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Une fois déployée, l'application fournit une URL que mon site peut appeler :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://script.google.com/macros/library/d/APPS_SCRIPT_ID/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ici, pas de nom de domaine personnalisé, mais ce n'est pas important : ce ne sera pas visible à l'usage du site Internet.&lt;/p&gt;

&lt;p&gt;Mon site est désormais capable de récupérer et afficher des données stockées sur un système dédié. La position de ma voiture est donc affichable en temps réel !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1wn0mlc5qbvrpu1ddr4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy1wn0mlc5qbvrpu1ddr4.png" alt=" " width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Mécanisme de protection des données
&lt;/h4&gt;

&lt;p&gt;Pour un autre usage, une problématique apparaît : l'accès à mes données. Que tout le monde voit les données n'est pas gênant (dans ce cas), mais je veux être le seul à pouvoir les modifier. Il faut donc mettre en place un mécanisme de protection.&lt;/p&gt;

&lt;p&gt;Le contenu de mon site n'est pas critique, donc je fais au plus simple, au &lt;strong&gt;moins cher&lt;/strong&gt;, et donc pas forcément au plus sécurisé. Mais ça me convient.&lt;/p&gt;

&lt;p&gt;Dans Apps Script, je code une fonction de vérification de mot de passe, que j'applique systématiquement à chaque modification ou création de données. Elle compare simplement le mot de passe envoyé dans la requête API à celui que je stocke dans un attribut privé d'Apps Script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verifyPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;PropertiesService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getScriptProperties&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;getProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ADMIN_PASSWORD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;stored&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
           &lt;span class="err"&gt;↑&lt;/span&gt;             &lt;span class="err"&gt;↑&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mdp&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="nx"&gt;requête&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mdp&lt;/span&gt; &lt;span class="nx"&gt;stocké&lt;/span&gt; &lt;span class="nx"&gt;dans&lt;/span&gt; &lt;span class="nx"&gt;Apps&lt;/span&gt; &lt;span class="nx"&gt;Script&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Côté interface utilisateur, sur le navigateur, un mot de passe est demandé pour accéder à une interface d'administration. Pour vérifier qu'il est correct, le code compare la valeur saisie à une valeur stockée. Cette valeur stockée est chiffrée pour éviter qu'elle ne soit récupérée et utilisée.&lt;/p&gt;

&lt;p&gt;Cette valeur chiffrée peut néanmoins, en théorie, être "brute-forcée", c'est-à-dire qu'un utilisateur malveillant pourrait comparer cette valeur avec des valeurs déjà calculées pour retrouver le véritable mot de passe.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Valeur chiffrée&lt;/th&gt;
&lt;th&gt;Valeur préalablement calculée&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;f54dff746357502db7e8fa684e79f5f6ac063f65736077fe412e661a807cf43a&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Azerty&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;73d5b2f4ba82d59c723c16a909524559d8f31e33c5d8fdcfc57065dca5c9f189&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Qwerty&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f&lt;/td&gt;
&lt;td&gt;&lt;code&gt;12345678&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mais, encore une fois, c'est un risque que j'accepte, car mon site et ses données ne sont pas critiques.&lt;/p&gt;

&lt;p&gt;Finalement, c'est tout : mon site est sur Internet, sur un domaine à mon nom, et il persiste ses données de manière (relativement) sécurisée, le tout avec une dépense d'argent super limité.&lt;/p&gt;

&lt;h2&gt;
  
  
  Synthèse
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Architecture globale
&lt;/h3&gt;

&lt;p&gt;Pour récapituler, voilà l'architecture globale de mon site Internet :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn43fq8rybr5ht1t5p4t2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn43fq8rybr5ht1t5p4t2.jpg" alt=" " width="645" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bilan financier
&lt;/h3&gt;

&lt;p&gt;Voici le bilan financier de l'exposition de mon site pour 1 an :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Poste&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Coût&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Serveur d'hébergement Internet&lt;/td&gt;
&lt;td&gt;GitHub Pages&lt;/td&gt;
&lt;td&gt;00.00 €&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistance des données&lt;/td&gt;
&lt;td&gt;Google Sheets&lt;/td&gt;
&lt;td&gt;00.00 €&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface de programmation (API)&lt;/td&gt;
&lt;td&gt;Google Apps Script&lt;/td&gt;
&lt;td&gt;00.00 €&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nom de domaine&lt;/td&gt;
&lt;td&gt;IONOS&lt;/td&gt;
&lt;td&gt;01.20 €&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TOTAL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;01.20 €&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pas mal…&lt;/p&gt;

&lt;p&gt;J'ai divisé la facture par 20 comparé à un hébergement sur OVH et encore 2 fois plus comparé à une solution comme WordPress (soldes de 97.5% !). Et surtout, 1,20 € par an, c'est négligeable dans mon fonctionnement associatif.&lt;/p&gt;

&lt;p&gt;À noter que je peux me créer autant de sites Internet que je veux pour ce prix, en découpant mon domaine en plusieurs sous-domaines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Les limites
&lt;/h3&gt;

&lt;p&gt;Bien sûr, cette réduction de moyens limite ce que je peux implémenter et le niveau de sécurisation associé.&lt;/p&gt;

&lt;h4&gt;
  
  
  Limites de stockage
&lt;/h4&gt;

&lt;p&gt;Les données que je stocke restent limitées par l'offre gratuite de Google Drive, soit 20 Go, ce qui est déjà très confortable. Je suppose aussi que Google limite l'usage des API Apps Script si le site est trop sollicité, ce qui pourrait se traduire par des chargements de pages plus lents.&lt;/p&gt;

&lt;h4&gt;
  
  
  Limites de sécurité
&lt;/h4&gt;

&lt;p&gt;Mon mot de passe reste vulnérable, car il n'est protégé que par un chiffrement théoriquement cassable.&lt;/p&gt;

&lt;h4&gt;
  
  
  Limites de confidentialité
&lt;/h4&gt;

&lt;p&gt;Enfin, mon code est public sur GitHub, donc non confidentiel : tout le monde peut le récupérer.&lt;/p&gt;




&lt;p&gt;Pour toutes ces raisons, et dans ces conditions, on ne peut donc pas implémenter de site Internet avec des fonctions complexes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On exclut une exposition à d'énormes volumes de données ou de consommation : le site va ramer et potentiellement atteindre des limites qui le casseront&lt;/li&gt;
&lt;li&gt;On exclut l'usage de données critiques : fuite de données&lt;/li&gt;
&lt;li&gt;On exclut la gestion de comptes utilisateurs : fuite de données liées à des usagers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Pour un besoin simple, peu d'affluence, des données peu sensibles, et avec une forte contrainte de budget, cette architecture est plutôt efficace. En combinant &lt;strong&gt;GitHub Pages&lt;/strong&gt;, un &lt;strong&gt;nom de domaine&lt;/strong&gt; peu cher, &lt;strong&gt;Google Sheets&lt;/strong&gt; et &lt;strong&gt;Apps Script&lt;/strong&gt;, on obtient un site visible sur Internet, personnalisable, capable de gérer de la données, pour un coût presque nul et d'une qualité presque professionnelle.&lt;/p&gt;

&lt;p&gt;Évidemment, ce n'est pas une solution universelle. Dès qu'on a besoin de sécurité forte, de confidentialité, de volumétrie importante, on atteint vite ses limites. Mais pour un projet associatif, personnel, vitrine ou expérimental, c'est une très bonne solution : simple, efficace, et surtout super-économique.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
