two/main/versions/0.1.0.html
2026-09-09 22:07:27 +00:00

539 lines
No EOL
28 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr" data-content_root="../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Michael &#8212; Documentation two 0.1.0</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
</script>
<!--
this give us a css class that will be invisible only if js is disabled
-->
<noscript>
<style>
.pst-js-only { display: none !important; }
</style>
</noscript>
<!-- Loaded before other Sphinx assets -->
<link href="../_static/styles/theme.css?digest=8878045cc6db502f8baf" rel="stylesheet" />
<link href="../_static/styles/pydata-sphinx-theme.css?digest=8878045cc6db502f8baf" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=8f2a1f02" />
<link rel="stylesheet" type="text/css" href="../_static/styles/sphinx-book-theme.css?v=3c74b3bc" />
<!-- So that users can add custom icons -->
<script src="../_static/scripts/fontawesome.js?digest=8878045cc6db502f8baf"></script>
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../_static/scripts/bootstrap.js?digest=8878045cc6db502f8baf" />
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=8878045cc6db502f8baf" />
<script src="../_static/documentation_options.js?v=57395fb6"></script>
<script src="../_static/doctools.js?v=fd6eb6e6"></script>
<script src="../_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="../_static/scripts/sphinx-book-theme.js?v=fab101a9"></script>
<script src="../_static/translations.js?v=e6b791cb"></script>
<script>DOCUMENTATION_OPTIONS.pagename = 'versions/0.1.0';</script>
<script>
DOCUMENTATION_OPTIONS.theme_version = '0.16.1';
DOCUMENTATION_OPTIONS.theme_switcher_json_url = '../switcher.json';
DOCUMENTATION_OPTIONS.theme_switcher_version_match = 'main';
DOCUMENTATION_OPTIONS.show_version_warning_banner =
false;
</script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Recherche" href="../search.html" />
<link rel="prev" title="Bael" href="0.2.0.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="fr"/>
<meta name="docsearch:version" content="0.1" />
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Passer au contenu principal</a></div>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>Haut de page</button>
<dialog id="pst-search-dialog">
<form class="bd-search d-flex align-items-center"
action="../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
placeholder="Search..."
aria-label="Search..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form>
</dialog>
<div class="pst-async-banner-revealer d-none">
<aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Alerte de version"></aside>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<dialog id="pst-primary-sidebar-modal"></dialog>
<div id="pst-primary-sidebar" class="bd-sidebar-primary bd-sidebar">
<div class="sidebar-header-items sidebar-primary__section">
</div>
<div class="sidebar-primary-items__start sidebar-primary__section">
<div class="sidebar-primary-item">
<a class="navbar-brand logo" href="../index.html">
<p class="title logo__title">Documentation two 0.1.0</p>
</a></div>
<div class="sidebar-primary-item"><ul class="navbar-icon-links"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://git.g3e.fr/syonad/two" title="Dépôt" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-solid fa-code-branch fa-lg" aria-hidden="true"></i>
<span class="sr-only">Dépôt</span></a>
</li>
</ul></div>
<div class="sidebar-primary-item">
<div class="version-switcher__container dropdown pst-js-only">
<button id="pst-version-switcher-button-2"
type="button"
class="version-switcher__button btn btn-sm dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-2"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-2"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-2">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div></div>
<div class="sidebar-primary-item">
<button class="btn search-button-field search-button__button pst-js-only" title="Recherche" aria-label="Recherche" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Recherche</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button></div>
<div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
<div class="bd-toc-item navbar-nav active">
<ul class="nav bd-sidenav bd-sidenav__home-link">
<li class="toctree-l1">
<a class="reference internal" href="../index.html">
two
</a>
</li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Mise en œuvre</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1 has-children"><a class="reference internal" href="../demarrage/index.html">Démarrage</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../demarrage/installation.html">Installation d’un hyperviseur</a></li>
<li class="toctree-l2"><a class="reference internal" href="../demarrage/premier-vpc.html">Premier VPC, premier subnet, première VM</a></li>
</ul>
</details></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../deploiement/index.html">Déploiement d’un cluster</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/architecture-cluster.html">Architecture du cluster</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/image-qcow2.html">Construction de l’image qcow2</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/routeurs.html">Routeurs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/premier-hyperviseur.html">Premier hyperviseur</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/route-reflector.html">VM route reflector</a></li>
</ul>
</details></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Exploitation</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1 has-children"><a class="reference internal" href="../exploitation/index.html">Exploitation</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../exploitation/configuration.html">Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../exploitation/services.html">Services systemd</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../exploitation/api-agent/index.html">API de l’agent</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l3"><a class="reference internal" href="../exploitation/api-agent/asynchronisme.html">Modèle asynchrone et codes de retour</a></li>
<li class="toctree-l3"><a class="reference internal" href="../exploitation/api-agent/reference.html">Référence</a></li>
</ul>
</details></li>
<li class="toctree-l2"><a class="reference internal" href="../exploitation/observabilite.html">Observabilité</a></li>
<li class="toctree-l2"><a class="reference internal" href="../exploitation/diagnostic.html">Diagnostic</a></li>
</ul>
</details></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Interne</span></p>
<ul class="current nav bd-sidenav">
<li class="toctree-l1 has-children"><a class="reference internal" href="../concepts/index.html">Concepts</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../concepts/vpc-subnet-vm.html">VPC, subnet et VM</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/modes-reseau.html">Modes réseau</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/cycle-de-vie.html">Cycle de vie des ressources</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/metadata-cloud-init.html">Metadata et cloud-init</a></li>
</ul>
</details></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../architecture/index.html">Architecture</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../architecture/vue-densemble.html">Vue d’ensemble</a></li>
<li class="toctree-l2"><a class="reference internal" href="../architecture/stockage.html">Schéma des clés</a></li>
<li class="toctree-l2"><a class="reference internal" href="../architecture/contraintes.html">Invariants et pièges</a></li>
</ul>
</details></li>
<li class="toctree-l1 current active has-children"><a class="reference internal" href="index.html">Versions</a><details open="open"><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="0.2.0.html">Bael</a></li>
<li class="toctree-l2 current active"><a class="current reference internal" href="#">Michael</a></li>
</ul>
</details></li>
</ul>
</div>
</nav></div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
<div class="sidebar-primary-item">
<div id="ethical-ad-placement"
class="flat"
data-ea-publisher="readthedocs"
data-ea-type="readthedocs-sidebar"
data-ea-manual="true">
</div></div>
</div>
</div>
<main id="main-content" class="bd-main" role="main">
<div class="sbt-scroll-pixel-helper"></div>
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article d-print-none">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="fa-solid fa-bars"></span>
</button></div>
</div>
<div class="header-article-items__end">
<div class="header-article-item">
<div class="article-header-buttons">
<button onclick="toggleFullScreen()"
class="btn btn-sm btn-fullscreen-button pst-navbar-icon"
title="Mode plein écran"
data-bs-placement="bottom" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-expand"></i>
</span>
</button>
<button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button pst-js-only" aria-label="Thème" data-bs-title="Thème" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light" title="Clair"></i>
<i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark" title="Sombre"></i>
<i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto" title="Paramètres système"></i>
</button>
<button class="btn btn-sm pst-navbar-icon search-button search-button__button pst-js-only" title="Recherche" aria-label="Recherche" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass fa-lg"></i>
</button>
<button class="sidebar-toggle secondary-toggle btn btn-sm pst-navbar-icon" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="fa-solid fa-list"></span>
</button>
</div></div>
</div>
</div>
</div>
<div id="jb-print-docs-body" class="onlyprint">
<h1>Michael</h1>
<!-- Table of contents -->
<div id="print-main-content">
<div id="jb-print-toc">
<div>
<h2> Contenu </h2>
</div>
<nav aria-label="Page">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#fonctionnalites">Fonctionnalités</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#perimetre-et-limites-connues">Périmètre et limites connues</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#installation">Installation</a></li>
</ul>
</nav>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="michael">
<h1>Michael<a class="headerlink" href="#michael" title="Lien vers cette rubrique">#</a></h1>
<p>Première version stable de <strong>syonad/two</strong>, orchestrateur réseau et VM mono-nœud.</p>
<section id="fonctionnalites">
<h2>Fonctionnalités<a class="headerlink" href="#fonctionnalites" title="Lien vers cette rubrique">#</a></h2>
<p><strong>API et cycle de vie</strong></p>
<ul class="simple">
<li><p>API HTTP <code class="docutils literal notranslate"><span class="pre">/vpcs</span></code>, <code class="docutils literal notranslate"><span class="pre">/subnets</span></code>, <code class="docutils literal notranslate"><span class="pre">/vms</span></code> : création et suppression asynchrones (202 + état en base)</p></li>
<li><p>États unifiés pour les trois types de ressource : <code class="docutils literal notranslate"><span class="pre">creating</span></code> → <code class="docutils literal notranslate"><span class="pre">running</span></code> → <code class="docutils literal notranslate"><span class="pre">deleting</span></code> → <code class="docutils literal notranslate"><span class="pre">deleted</span></code>,
avec <code class="docutils literal notranslate"><span class="pre">error</span></code> en cas d’échec d’exécution ; suppression autorisée depuis <code class="docutils literal notranslate"><span class="pre">running</span></code> et <code class="docutils literal notranslate"><span class="pre">error</span></code></p></li>
<li><p>Migration au démarrage de l’agent : toute ressource restée dans un état transitoire est
basculée en <code class="docutils literal notranslate"><span class="pre">error</span></code>, la file de travail étant en mémoire</p></li>
<li><p>Arrêt gracieux : serveurs HTTP, puis drainage des workers, puis fermeture de la base. Si le
budget d’arrêt est dépassé, la base n’est <strong>pas</strong> fermée — la rejouer au démarrage suivant vaut
mieux que de la fermer sous un écrivain concurrent</p></li>
</ul>
<p><strong>Réseau</strong></p>
<ul class="simple">
<li><p>VPC isolés par network namespace, subnets en mode <code class="docutils literal notranslate"><span class="pre">vxlan</span></code> ou <code class="docutils literal notranslate"><span class="pre">bridge</span></code></p></li>
<li><p>DHCP par subnet via instances <code class="docutils literal notranslate"><span class="pre">dnsmasq&#64;</span></code> dédiées, entrées ip→mac en base, fichier de baux propre
à chaque instance</p></li>
<li><p>Toutes les routes sont distribuées par l’option 121 : route vers le serveur de metadata, route du
VPC, et route par défaut. L’option 3 reste émise pour les clients qui n’implémentent pas la 121</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">default_route</span></code> choisit le <strong>next-hop</strong> de la route par défaut : l”<code class="docutils literal notranslate"><span class="pre">interface_ip</span></code> du subnet par
défaut, sinon la <code class="docutils literal notranslate"><span class="pre">gateway</span></code> fournie ou celle déduite de l’host</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">gateway</span></code> optionnelle par subnet, non validée par l’agent</p></li>
<li><p>Isolation du DHCP par ebtables, redirection du service de metadata par iptables</p></li>
</ul>
<p><strong>Machines virtuelles</strong></p>
<ul class="simple">
<li><p>Plusieurs interfaces réseau par VM, dans un même VPC. La position de l’interface détermine son
slot PCI, donc son nom dans le guest ; <strong>exactement une</strong> interface est primaire et porte la route
par défaut et le serveur de metadata</p></li>
<li><p>Démarrage QEMU/KVM avec plusieurs disques et ordre de démarrage explicite</p></li>
<li><p>Amorçage UEFI optionnel (OVMF), avec magasin de variables par VM</p></li>
<li><p>Serveur de metadata cloud-init par VM (<code class="docutils literal notranslate"><span class="pre">metadata&#64;</span></code>), sans base de données dans le processus</p></li>
<li><p>Les VMs survivent à l’arrêt de l’agent : QEMU est lancé hors de son cgroup via <code class="docutils literal notranslate"><span class="pre">systemd-run</span></code></p></li>
</ul>
<p><strong>Metadata cloud-init</strong></p>
<ul class="simple">
<li><p>Objet <code class="docutils literal notranslate"><span class="pre">metadata</span></code> dans la création de VM : <code class="docutils literal notranslate"><span class="pre">password</span></code>, <code class="docutils literal notranslate"><span class="pre">sshkey</span></code>, <code class="docutils literal notranslate"><span class="pre">user_data</span></code></p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">user_data</span></code> transmis en base64, ce qui autorise les charges gzip+base64 ; un encodage invalide est
refusé en 400, jamais servi vide en silence</p></li>
<li><p>Un document fourni est servi <strong>verbatim</strong>, un document absent retombe sur le modèle par défaut, et
un document explicitement vide est servi vide — les trois cas sont distincts</p></li>
<li><p>Le compte <code class="docutils literal notranslate"><span class="pre">syonad</span></code> n’est créé que si un mot de passe ou une clé est fourni, et reste verrouillé
quand seule une clé l’est. L’agent n’impose aucune modification du compte root</p></li>
</ul>
<p><strong>Exploitation</strong></p>
<ul class="simple">
<li><p>Watchdog de cohérence : vérifie périodiquement que les ressources <code class="docutils literal notranslate"><span class="pre">running</span></code> existent encore sur
le système et signale les écarts. Lecture seule, il ne répare jamais. Désactivé par défaut,
activé dans le fichier d’exemple</p></li>
<li><p>API d’administration en lecture seule sur la boucle locale, pour inspecter la base</p></li>
<li><p>Métriques Prometheus : nombre de VPC, subnets et VMs par état</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">deploy.sh</span></code> avec profils d’host (<code class="docutils literal notranslate"><span class="pre">kvm</span></code>), préparation système déléguée à <code class="docutils literal notranslate"><span class="pre">bootstrap_kvm.sh</span></code></p></li>
<li><p>Units systemd et scripts publiés comme assets de release, avec manifeste <code class="docutils literal notranslate"><span class="pre">SHA256SUMS</span></code>
vérifié au déploiement</p></li>
</ul>
</section>
<section id="perimetre-et-limites-connues">
<h2>Périmètre et limites connues<a class="headerlink" href="#perimetre-et-limites-connues" title="Lien vers cette rubrique">#</a></h2>
<ul class="simple">
<li><p>Un seul nœud : pas d’ordonnanceur ni de placement entre hyperviseurs</p></li>
<li><p>Pas de rollback en cas d’échec partiel d’une création — les ressources réseau orphelines
ne sont pas nettoyées automatiquement</p></li>
<li><p>API destinée à un appelant logiciel : la validation de cohérence des entrées (CIDR, VXLAN
ID, format des noms, joignabilité d’une <code class="docutils literal notranslate"><span class="pre">gateway</span></code>) est à la charge de l’appelant</p></li>
<li><p>Le mode de subnet <code class="docutils literal notranslate"><span class="pre">public_ip</span></code> est accepté par l’API et par la sélection des routes DHCP, mais sa
mise en place réseau n’existe pas : créer un tel subnet échoue explicitement</p></li>
<li><p>Les interfaces multiples d’une VM doivent appartenir au même VPC</p></li>
<li><p>Le réseau des guests est configuré par le DHCP seul ; le <code class="docutils literal notranslate"><span class="pre">network-config</span></code> cloud-init servi est
sans effet et ne doit pas être « corrigé » sans mesurer l’impact sur les VM existantes</p></li>
<li><p>Modifier les routes d’une VM déjà démarrée ne prend effet qu’au renouvellement du bail, soit
jusqu’à six heures plus tard, ou à son redémarrage</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">vm/&lt;name&gt;/password</span></code> contient un <strong>hash</strong>, stocké en clair en base et restitué par l’API
d’administration ; celle-ci est désactivée par défaut et n’écoute que sur la boucle locale</p></li>
<li><p>L’API de l’agent n’a pas d’authentification : son exposition réseau doit être restreinte</p></li>
<li><p>Les packages <code class="docutils literal notranslate"><span class="pre">internal/netns</span></code>, <code class="docutils literal notranslate"><span class="pre">netif</span></code>, <code class="docutils literal notranslate"><span class="pre">qemu</span></code>, <code class="docutils literal notranslate"><span class="pre">vm</span></code>, <code class="docutils literal notranslate"><span class="pre">iptables</span></code> et <code class="docutils literal notranslate"><span class="pre">ebtables</span></code> ne
fonctionnent que sous Linux</p></li>
</ul>
</section>
<section id="installation">
<h2>Installation<a class="headerlink" href="#installation" title="Lien vers cette rubrique">#</a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">O</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">git</span><span class="o">.</span><span class="n">g3e</span><span class="o">.</span><span class="n">fr</span><span class="o">/</span><span class="n">syonad</span><span class="o">/</span><span class="n">two</span><span class="o">/</span><span class="n">raw</span><span class="o">/</span><span class="n">branch</span><span class="o">/</span><span class="n">main</span><span class="o">/</span><span class="n">scripts</span><span class="o">/</span><span class="n">deploy</span><span class="o">.</span><span class="n">sh</span>
<span class="n">bash</span> <span class="o">./</span><span class="n">deploy</span><span class="o">.</span><span class="n">sh</span> <span class="o">-</span><span class="n">t</span> <span class="mf">0.1.0</span> <span class="o">-</span><span class="n">i</span> <span class="c1"># -i : préparation de l'host (paquets, kernel, bridges)</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">deploy.sh</span></code> se vérifie lui-même contre la branche et télécharge les binaires, les units et
le manifeste depuis cette release.</p>
</section>
</section>
</article>
<footer class="prev-next-footer d-print-none">
<div class="prev-next-area">
<a class="left-prev"
href="0.2.0.html"
title="page précédente">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">précédent</p>
<p class="prev-next-title">Bael</p>
</div>
</a>
</div>
</footer>
</div>
<dialog id="pst-secondary-sidebar-modal"></dialog>
<div id="pst-secondary-sidebar" class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
<div class="sidebar-secondary-item"><div
id="pst-page-navigation-heading-2"
class="page-toc tocsection onthispage">
<i class="fa-solid fa-list"></i> Contenu
</div>
<nav id="pst-page-toc-nav" class="page-toc" aria-labelledby="pst-page-navigation-heading-2">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#fonctionnalites">Fonctionnalités</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#perimetre-et-limites-connues">Périmètre et limites connues</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#installation">Installation</a></li>
</ul>
</nav></div>
</div></div>
</div>
<footer class="bd-footer-content">
<div class="bd-footer-content__inner container">
<div class="footer-item">
<p class="component-author">
Par Nicolas Boufidjeline
</p>
</div>
<div class="footer-item">
<p class="copyright">
© Copyright 2026, Nicolas Boufidjeline.
<br/>
</p>
</div>
<div class="footer-item">
</div>
<div class="footer-item">
</div>
</div>
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script defer src="../_static/scripts/bootstrap.js?digest=8878045cc6db502f8baf"></script>
<script defer src="../_static/scripts/pydata-sphinx-theme.js?digest=8878045cc6db502f8baf"></script>
<footer class="bd-footer">
</footer>
</body>
</html>