<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Projets - Kevin Allioli</title>
    <link>https://kevinallioli.com/projets/</link>
    <description>Ce que je publie en open source, et pourquoi.</description>
    <language>fr-CH</language>
    <managingEditor>kevin@stackops.ch (Kevin Allioli)</managingEditor>
    <webMaster>kevin@stackops.ch (Kevin Allioli)</webMaster>
    <copyright>CC BY 4.0, 2026 Kevin Allioli</copyright>
    <atom:link href="https://kevinallioli.com/projets/index.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Open Image Cloud</title>
      <link>https://kevinallioli.com/projets/open-image-cloud/</link>
      <guid isPermaLink="true">https://kevinallioli.com/projets/open-image-cloud/</guid>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <description>Des images cloud pour OpenStack et Proxmox : builds reproductibles, signature cosign keyless, provenance embarquée dans chaque image.</description>
      <content:encoded><![CDATA[<p>Open Image Cloud publie des images cloud prêtes à l&rsquo;emploi pour OpenStack
et Proxmox. Huit distributions Linux (Alpaquita, Alpine, Amazon Linux 2 et
2023, Gentoo, NixOS, Oracle Linux 9 et 10), plus les amphores Octavia
alignées sur chaque version d&rsquo;OpenStack.</p>
<p>Ce qui distingue ces images des images officielles des distributions n&rsquo;est
pas leur contenu. C&rsquo;est ce qu&rsquo;on peut en dire avec certitude.</p>
<h2 id="le-problème">Le problème</h2>
<p>Vous démarrez une image cloud. Elle vient d&rsquo;un miroir, elle a un nom de
fichier et une somme de contrôle. La somme prouve que le fichier n&rsquo;a pas
été altéré depuis sa publication. Elle ne dit rien de ce qui s&rsquo;est passé
avant : quel dépôt, quelle révision, quelle machine, quels paquets à quelle
date, quelles retouches appliquées après l&rsquo;installation de base.</p>
<p>Sur une machine, c&rsquo;est un détail. Sur une flotte, c&rsquo;est la couche dont
tout le reste hérite, et c&rsquo;est la seule que personne ne relit.</p>
<h2 id="ce-qui-est-mis-en-place">Ce qui est mis en place</h2>
<p><strong>Builds reproductibles.</strong> Chaque image est construite par un workflow
GitHub Actions, à partir de sources amont épinglées et d&rsquo;un conteneur de
build lui-même étiqueté. La révision du dépôt, l&rsquo;URL d&rsquo;exécution du build
et l&rsquo;empreinte du conteneur constructeur sont écrites dans le
<code>MANIFEST.json</code> livré à côté de l&rsquo;image.</p>
<p><strong>Signature cosign keyless.</strong> Les images sont signées via l&rsquo;OIDC de GitHub
Actions. Il n&rsquo;y a pas de clé privée à conserver, donc pas de clé privée à
perdre. La vérification se fait contre l&rsquo;identité du workflow qui a
produit l&rsquo;image :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cosign verify-blob alpine-3.23.4-uefi-x86_64.qcow2 <span class="se">\
</span></span></span><span class="line"><span class="cl">  --bundle alpine-3.23.4-uefi-x86_64.qcow2.bundle --new-bundle-format <span class="se">\
</span></span></span><span class="line"><span class="cl">  --certificate-identity-regexp <span class="s1">&#39;https://github.com/open-img-cloud/&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --certificate-oidc-issuer https://token.actions.githubusercontent.com
</span></span></code></pre></div><p><strong>Chemins immuables.</strong> Le registre public sert les images sous
<code>images.openimages.cloud/&lt;os&gt;/&lt;version&gt;/&lt;fichier&gt;</code>. Un chemin publié ne
change plus. Un alias <code>latest/</code> mutable existe à côté, pour ceux qui le
veulent, mais ce n&rsquo;est jamais lui qui fait foi.</p>
<h2 id="larchitecture">L&rsquo;architecture</h2>
<p>La chaîne de build vit dans un dépôt <code>.github</code> partagé, sous forme de
workflows réutilisables et d&rsquo;actions composites. Chaque dépôt d&rsquo;image
reste mince : un <code>VERSION</code>, un script de personnalisation (libguestfs ou
diskimage-builder selon la distribution), un détecteur de nouvelle version
amont, et deux workflows appelants.</p>
<p>Côté stockage, la source de vérité est un
<a href="https://garagehq.deuxfleurs.fr">Garage</a> auto-hébergé, miroité vers
Cloudflare R2 et servi derrière le CDN. Un petit Worker route les chemins
<code>/&lt;os&gt;/*</code> vers les compartiments correspondants.</p>
<h2 id="pourquoi-ça-compte">Pourquoi ça compte</h2>
<p>Le mot souverain est aujourd&rsquo;hui vendu comme une propriété
géographique. Mais un datacentre situé en Europe qui démarre des images
dont personne ne sait reconstruire la généalogie ne vous donne aucune
garantie supplémentaire : il déplace la confiance, il ne la supprime pas.</p>
<p>L&rsquo;objectif d&rsquo;Open Image Cloud est de rendre cette confiance inutile. Vous
pouvez vérifier ce que vous démarrez sans avoir à me croire.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
