<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Repo on slash-root.fr</title><link>https://beta.slash-root.fr/tags/repo/</link><description>Recent content in Repo on slash-root.fr</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><lastBuildDate>Sun, 15 Mar 2026 22:13:13 +0100</lastBuildDate><atom:link href="https://beta.slash-root.fr/tags/repo/index.xml" rel="self" type="application/rss+xml"/><item><title>Aptly : mirroiter Debian proprement</title><link>https://beta.slash-root.fr/aptly-mirroiter-debian-proprement/</link><pubDate>Fri, 13 Mar 2026 19:05:06 +0100</pubDate><guid>https://beta.slash-root.fr/aptly-mirroiter-debian-proprement/</guid><description>&lt;img src="https://beta.slash-root.fr/aptly-mirroiter-debian-proprement/cover.jpg" alt="Featured image of post Aptly : mirroiter Debian proprement" /&gt;&lt;p&gt;Quand on gère une flotte de serveurs Debian, on finit toujours par se poser la même question : comment maîtriser ce que mes machines vont installer ? Comment être sûr qu'un &lt;code&gt;apt update&lt;/code&gt; ne va pas me ramener une version de paquet qui casse tout ? Et surtout, comment faire pour que mes serveurs de prod ne dépendent pas d'un miroir externe qui peut tomber au pire moment ?&lt;/p&gt;
&lt;p&gt;La réponse classique, c'est de monter un miroir local. Sauf que mirrorer Debian avec les outils standards (&lt;code&gt;debmirror&lt;/code&gt;, &lt;code&gt;apt-mirror&lt;/code&gt;...), c'est lourd, c'est rigide, et ça ne répond qu'à la moitié du problème. On a une copie locale, d'accord, mais on n'a toujours aucun contrôle sur ce qui change d'un jour à l'autre.&lt;/p&gt;
&lt;p&gt;C'est là qu'aptly entre en jeu.&lt;/p&gt;
&lt;h2 id="ce-quaptly-fait-vraiment"&gt;&lt;a href="#ce-quaptly-fait-vraiment" class="header-anchor"&gt;&lt;/a&gt;Ce qu&amp;rsquo;aptly fait vraiment
&lt;/h2&gt;&lt;p&gt;aptly, c'est un gestionnaire de dépôts Debian écrit en Go. Il sait faire trois choses fondamentales :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;mirrorer un dépôt distant&lt;/strong&gt; -- comme &lt;code&gt;apt-mirror&lt;/code&gt;, mais en mieux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Figer l'état d'un miroir dans un snapshot immuable&lt;/strong&gt; -- ça, c'est la vraie valeur ajoutée&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publier ce snapshot&lt;/strong&gt; pour que vos machines puissent l'utiliser&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Le workflow de base, c'est ça :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mirror create → mirror update → snapshot create → publish snapshot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et quand il faut mettre à jour :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mirror update → snapshot create → publish switch
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le &lt;code&gt;publish switch&lt;/code&gt; bascule la publication d'un snapshot à un autre. Vos machines continuent de pointer sur la même URL, mais le contenu change de manière contrôlée. Si ça foire, vous rebasculez sur l'ancien snapshot. Pas de panique, pas de retélécharger quoi que ce soit.&lt;/p&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;h3 id="via-les-paquets-debian"&gt;&lt;a href="#via-les-paquets-debian" class="header-anchor"&gt;&lt;/a&gt;Via les paquets Debian
&lt;/h3&gt;&lt;p&gt;C'est la méthode standard, celle qu'on va utiliser ici :&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;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sur Debian Trixie, ça installe la version 1.5.0. C'est pas la toute dernière (la 1.6.2 existe), mais c'est largement suffisant pour ce qu'on va faire.&lt;/p&gt;
&lt;p&gt;Vérification :&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;$ aptly version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly version: 1.5.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="lupstream-optionnel"&gt;&lt;a href="#lupstream-optionnel" class="header-anchor"&gt;&lt;/a&gt;L&amp;rsquo;upstream (optionnel)
&lt;/h3&gt;&lt;p&gt;Si vous voulez absolument la dernière version upstream, vous pouvez ajouter le dépôt officiel d'aptly. Mais franchement, pour un usage classique, la version Debian fait le job. Je mentionne juste l'option pour ceux qui en ont besoin :&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;sudo mkdir -p /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O /etc/apt/keyrings/aptly.asc https://www.aptly.info/pubkey.txt
&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;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/aptly.asc] http://repo.aptly.info/release trixie main&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/aptly.list
&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;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mais encore une fois, c'est optionnel. On va continuer avec la version des dépôts Debian.&lt;/p&gt;
&lt;h2 id="configuration-de-base"&gt;&lt;a href="#configuration-de-base" class="header-anchor"&gt;&lt;/a&gt;Configuration de base
&lt;/h2&gt;&lt;p&gt;aptly stocke tout dans &lt;code&gt;~/.aptly&lt;/code&gt; par défaut. En prod, on va plutôt utiliser &lt;code&gt;/var/aptly&lt;/code&gt;. On crée le répertoire et on configure aptly pour l'utiliser :&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;sudo mkdir -p /var/aptly
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown $USER:$USER /var/aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le fichier de config, c'est &lt;code&gt;~/.aptly.conf&lt;/code&gt; (ou &lt;code&gt;/etc/aptly.conf&lt;/code&gt; pour une config globale). On va en créer un minimal :&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;cat &amp;gt; ~/.aptly.conf &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;rootDir&amp;#34;: &amp;#34;/var/aptly&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;architectures&amp;#34;: [&amp;#34;amd64&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On restreint à &lt;code&gt;amd64&lt;/code&gt; parce que c'est ce qu'on utilise. Pas la peine de télécharger du &lt;code&gt;i386&lt;/code&gt;, du &lt;code&gt;arm64&lt;/code&gt; ou du &lt;code&gt;armhf&lt;/code&gt; si on n'en a pas besoin.&lt;/p&gt;
&lt;p&gt;Le &lt;code&gt;rootDir&lt;/code&gt;, c'est la racine de tout. Dedans, aptly va créer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;db/&lt;/code&gt; -- sa base de données interne&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pool/&lt;/code&gt; -- les fichiers &lt;code&gt;.deb&lt;/code&gt; téléchargés&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public/&lt;/code&gt; -- les dépôts publiés, ceux qu'on va exposer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="importer-les-clés-gpg"&gt;&lt;a href="#importer-les-cl%c3%a9s-gpg" class="header-anchor"&gt;&lt;/a&gt;Importer les clés GPG
&lt;/h2&gt;&lt;p&gt;Avant de créer un miroir, aptly a besoin des clés GPG pour vérifier les signatures des dépôts distants. Sur Debian, les clés d'archive sont déjà présentes dans &lt;code&gt;/usr/share/keyrings/&lt;/code&gt;. Il suffit de les importer dans le trousseau d'aptly :&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;gpg --no-default-keyring &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keyring /usr/share/keyrings/debian-archive-keyring.gpg &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --export | &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gpg --no-default-keyring &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keyring trustedkeys.gpg &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --import
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça importe les clés dans &lt;code&gt;~/.gnupg/trustedkeys.gpg&lt;/code&gt;, le trousseau qu'aptly utilise par défaut.&lt;/p&gt;
&lt;h2 id="créer-un-miroir-de-debian-trixie"&gt;&lt;a href="#cr%c3%a9er-un-miroir-de-debian-trixie" class="header-anchor"&gt;&lt;/a&gt;Créer un miroir de Debian Trixie
&lt;/h2&gt;&lt;p&gt;On va mirrorer le dépôt officiel français (&lt;code&gt;ftp.fr.debian.org&lt;/code&gt;), avec les sections &lt;code&gt;main&lt;/code&gt; et &lt;code&gt;non-free-firmware&lt;/code&gt;. Pourquoi &lt;code&gt;non-free-firmware&lt;/code&gt; ? Parce que depuis Debian 12, les firmwares non-libres (wifi, GPU...) sont dans cette section, et on en a souvent besoin.&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;aptly mirror create &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -architectures&lt;span style="color:#f92672"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; debian-trixie &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; http://ftp.fr.debian.org/debian/ &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trixie main non-free-firmware
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quelques remarques :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le flag &lt;code&gt;-architectures=amd64&lt;/code&gt; se place &lt;strong&gt;avant&lt;/strong&gt; la sous-commande &lt;code&gt;mirror&lt;/code&gt;. C'est un flag global. Si vous le mettez après, aptly va râler.&lt;/li&gt;
&lt;li&gt;Le nom du miroir (&lt;code&gt;debian-trixie&lt;/code&gt;), c'est vous qui le choisissez. Prenez un nom explicite.&lt;/li&gt;
&lt;li&gt;L'URL doit finir par un &lt;code&gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On spécifie la distribution (&lt;code&gt;trixie&lt;/code&gt;) et les composants (&lt;code&gt;main non-free-firmware&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La commande crée la définition du miroir, mais ne télécharge rien encore. Pour ça, il faut lancer un &lt;code&gt;mirror update&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="remplir-le-miroir"&gt;&lt;a href="#remplir-le-miroir" class="header-anchor"&gt;&lt;/a&gt;Remplir le miroir
&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;aptly mirror update debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Là, ça télécharge. Et ça prend du temps. Un miroir complet de Debian main + non-free-firmware en amd64, c'est plusieurs dizaines de Go. Prévoyez du café.&lt;/p&gt;
&lt;p&gt;Vous pouvez suivre la progression dans le terminal. aptly affiche les paquets au fur et à mesure qu'il les télécharge.&lt;/p&gt;
&lt;p&gt;Une fois terminé, vous pouvez voir ce que contient le miroir :&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;aptly mirror show debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça vous donne le nombre de paquets, la taille totale, la date de dernière mise à jour, etc.&lt;/p&gt;
&lt;h2 id="créer-un-snapshot"&gt;&lt;a href="#cr%c3%a9er-un-snapshot" class="header-anchor"&gt;&lt;/a&gt;Créer un snapshot
&lt;/h2&gt;&lt;p&gt;Le miroir est à jour. Maintenant, on va en faire un snapshot. Un snapshot, c'est une copie figée et immuable de l'état du miroir à un instant T. Une fois créé, il ne bouge plus, quoi qu'il arrive au miroir source.&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;aptly snapshot create trixie-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; from mirror debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;J'utilise la date dans le nom du snapshot. C'est une bonne pratique : ça permet de savoir immédiatement à quoi correspond chaque snapshot.&lt;/p&gt;
&lt;p&gt;Vous pouvez lister vos snapshots :&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;aptly snapshot list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et voir le détail d'un snapshot :&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;aptly snapshot show trixie-20260313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="publier-le-snapshot"&gt;&lt;a href="#publier-le-snapshot" class="header-anchor"&gt;&lt;/a&gt;Publier le snapshot
&lt;/h2&gt;&lt;p&gt;Un snapshot qui n'est pas publié, ça ne sert à rien. La publication génère l'arborescence standard Debian (&lt;code&gt;dists/&lt;/code&gt;, &lt;code&gt;pool/&lt;/code&gt;, fichiers &lt;code&gt;Release&lt;/code&gt; signés...) dans &lt;code&gt;/var/aptly/public/&lt;/code&gt;.&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;aptly publish snapshot -distribution&lt;span style="color:#f92672"&gt;=&lt;/span&gt;trixie trixie-20260313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le flag &lt;code&gt;-distribution=trixie&lt;/code&gt; indique quelle distribution utiliser dans les métadonnées du dépôt publié. C'est ce que vos machines verront dans leur &lt;code&gt;sources.list&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;aptly va vous demander la passphrase de votre clé GPG pour signer le fichier &lt;code&gt;Release&lt;/code&gt;. Si vous n'avez pas encore de clé GPG, créez-en une :&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;gpg --full-generate-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Choisissez RSA 4096 bits, et renseignez un nom et un email.&lt;/p&gt;
&lt;p&gt;Une fois la publication terminée, vous avez un dépôt Debian complet dans &lt;code&gt;/var/aptly/public/&lt;/code&gt;. Il ne reste plus qu'à l'exposer via un serveur web.&lt;/p&gt;
&lt;h2 id="limpact-des-hard-links"&gt;&lt;a href="#limpact-des-hard-links" class="header-anchor"&gt;&lt;/a&gt;L&amp;rsquo;impact des hard links
&lt;/h2&gt;&lt;p&gt;Un détail important : quand aptly publie un snapshot, il ne copie pas les fichiers &lt;code&gt;.deb&lt;/code&gt;. Il crée des &lt;strong&gt;hard links&lt;/strong&gt; depuis le pool vers le répertoire &lt;code&gt;public/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ça veut dire quoi concrètement ?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pas de duplication&lt;/strong&gt; -- un paquet présent dans plusieurs snapshots n'occupe qu'une seule fois la place sur le disque&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publication instantanée&lt;/strong&gt; -- créer un hard link, c'est quasi gratuit en temps et en espace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plusieurs snapshots publiés en même temps&lt;/strong&gt; -- vous pouvez avoir &lt;code&gt;trixie-20260313&lt;/code&gt; et &lt;code&gt;trixie-20260310&lt;/code&gt; publiés simultanément, ils partagent les fichiers communs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C'est pour ça que le &lt;code&gt;publish switch&lt;/code&gt; est si rapide. aptly ne déplace rien, il change juste les liens.&lt;/p&gt;
&lt;p&gt;Par contre, attention : si vous supprimez un snapshot publié avec &lt;code&gt;snapshot drop&lt;/code&gt;, aptly refuse tant que la publication existe. Il faut d'abord dépublier (&lt;code&gt;publish drop&lt;/code&gt;) ou basculer vers un autre snapshot (&lt;code&gt;publish switch&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="mettre-à-jour-le-miroir-et-basculer"&gt;&lt;a href="#mettre-%c3%a0-jour-le-miroir-et-basculer" class="header-anchor"&gt;&lt;/a&gt;Mettre à jour le miroir et basculer
&lt;/h2&gt;&lt;p&gt;Quelques jours passent. Le miroir Debian a évolué. Vous voulez mettre à jour votre dépôt local. Voilà le workflow complet :&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;&lt;span style="color:#75715e"&gt;# 1. Mettre à jour le miroir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror update debian-trixie
&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;# 2. Créer un nouveau snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create trixie-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; from mirror debian-trixie
&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;# 3. Basculer la publication vers le nouveau snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish switch trixie trixie-20260315
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &lt;code&gt;publish switch&lt;/code&gt; fait tout le boulot :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il met à jour les métadonnées (&lt;code&gt;Release&lt;/code&gt;, &lt;code&gt;Packages&lt;/code&gt;, &lt;code&gt;Contents&lt;/code&gt;...)&lt;/li&gt;
&lt;li&gt;Il ajuste les hard links dans &lt;code&gt;public/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Il signe le nouveau &lt;code&gt;Release&lt;/code&gt; avec GPG&lt;/li&gt;
&lt;li&gt;Il nettoie les anciens liens qui ne servent plus&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vos machines qui pointent sur ce dépôt voient le changement au prochain &lt;code&gt;apt update&lt;/code&gt;. Pas de coupure, pas de temps d'arrêt.&lt;/p&gt;
&lt;p&gt;Si le nouveau snapshot pose problème, vous rebasculez sur l'ancien :&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;aptly publish switch trixie trixie-20260313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C'est aussi rapide dans un sens que dans l'autre.&lt;/p&gt;
&lt;h2 id="les-dépôts-locaux-mention-rapide"&gt;&lt;a href="#les-d%c3%a9p%c3%b4ts-locaux-mention-rapide" class="header-anchor"&gt;&lt;/a&gt;Les dépôts locaux (mention rapide)
&lt;/h2&gt;&lt;p&gt;aptly sait aussi gérer des dépôts locaux, où vous poussez vos propres paquets &lt;code&gt;.deb&lt;/code&gt;. Le workflow est similaire :&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;&lt;span style="color:#75715e"&gt;# Créer un dépôt local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly repo create mon-depot
&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;# Ajouter des paquets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly repo add mon-depot /chemin/vers/*.deb
&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;# Snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create mon-depot-v1 from repo mon-depot
&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;# Publier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish snapshot mon-depot-v1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je ne développe pas plus ici, parce que le cas d'usage principal d'aptly, c'est quand même le mirroring. Mais sachez que c'est possible.&lt;/p&gt;
&lt;h2 id="exposer-le-dépôt"&gt;&lt;a href="#exposer-le-d%c3%a9p%c3%b4t" class="header-anchor"&gt;&lt;/a&gt;Exposer le dépôt
&lt;/h2&gt;&lt;h3 id="le-serveur-embarqué-test-uniquement"&gt;&lt;a href="#le-serveur-embarqu%c3%a9-test-uniquement" class="header-anchor"&gt;&lt;/a&gt;Le serveur embarqué (test uniquement)
&lt;/h3&gt;&lt;p&gt;aptly a un petit serveur HTTP intégré. C'est pratique pour tester, mais la doc officielle est claire : &lt;strong&gt;not suitable for real production usage&lt;/strong&gt;.&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;aptly serve -listen&lt;span style="color:#f92672"&gt;=&lt;/span&gt;:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pouvez alors ajouter le dépôt sur une machine de test :&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;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb http://votre-serveur:8080/ trixie main non-free-firmware&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/aptly-test.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="nginx-production"&gt;&lt;a href="#nginx-production" class="header-anchor"&gt;&lt;/a&gt;nginx (production)
&lt;/h3&gt;&lt;p&gt;En prod, on utilise nginx. Je ne vais pas détailler ici parce que ça fera l'objet d'un second article si besoin, mais l'idée générale :&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-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;repo.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;root&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/var/aptly/public&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;autoindex&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;on&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;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous activez le vhost, vous rechargez nginx, et c'est bon. Pour HTTPS, ajoutez Let's Encrypt avec &lt;code&gt;certbot&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Côté client, vous ajoutez le dépôt :&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;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb http://repo.example.com/ trixie main non-free-firmware&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/mon-miroir.list
&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;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si le dépôt est signé (et il devrait l'être), distribuez votre clé GPG publique aux clients :&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;gpg --armor --export VOTRE_KEY_ID &amp;gt; /var/aptly/public/repo-key.asc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sur les clients :&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;wget -O /etc/apt/keyrings/mon-repo.asc http://repo.example.com/repo-key.asc
&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;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/mon-repo.asc] http://repo.example.com/ trixie main non-free-firmware&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/mon-miroir.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="automatiser-avec-cron"&gt;&lt;a href="#automatiser-avec-cron" class="header-anchor"&gt;&lt;/a&gt;Automatiser avec cron
&lt;/h2&gt;&lt;p&gt;Un miroir, ça se met à jour régulièrement. Voici un script cron qui fait le job :&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;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/cron.daily/aptly-update&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;set -euo pipefail
&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;MIRROR&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;debian-trixie&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DATE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&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;&lt;span style="color:#75715e"&gt;# Mise à jour du miroir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror update &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$MIRROR&lt;span style="color:#e6db74"&gt;&amp;#34;&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;&lt;span style="color:#75715e"&gt;# Nouveau snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create &lt;span style="color:#e6db74"&gt;&amp;#34;trixie-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;DATE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; from mirror &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$MIRROR&lt;span style="color:#e6db74"&gt;&amp;#34;&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;&lt;span style="color:#75715e"&gt;# Basculer la publication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish switch -batch -gpg-key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;VOTRE_KEY_ID&amp;#34;&lt;/span&gt; trixie &lt;span style="color:#e6db74"&gt;&amp;#34;trixie-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;DATE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&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;&lt;span style="color:#75715e"&gt;# Nettoyer les vieux snapshots (garder les 7 derniers)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot list -raw | grep &lt;span style="color:#e6db74"&gt;&amp;#34;^trixie-&amp;#34;&lt;/span&gt; | sort | head -n -7 | &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read snap; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; aptly snapshot drop &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$snap&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; 2&amp;gt;/dev/null &lt;span style="color:#f92672"&gt;||&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&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;&lt;span style="color:#75715e"&gt;# Nettoyer la base&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly db cleanup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le flag &lt;code&gt;-batch&lt;/code&gt; est crucial : il permet à GPG de fonctionner sans terminal interactif. Sans ça, le script va bloquer en attendant que vous tapiez la passphrase.&lt;/p&gt;
&lt;p&gt;Pour éviter ça, vous pouvez aussi utiliser &lt;code&gt;gpg-agent&lt;/code&gt; avec un cache de passphrase, ou stocker la passphrase dans un fichier sécurisé et utiliser &lt;code&gt;-passphrase-file&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="nettoyage-et-maintenance"&gt;&lt;a href="#nettoyage-et-maintenance" class="header-anchor"&gt;&lt;/a&gt;Nettoyage et maintenance
&lt;/h2&gt;&lt;p&gt;aptly conserve tous les paquets téléchargés dans son pool, même ceux qui ne sont plus référencés par aucun snapshot. Pour faire le ménage :&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;aptly db cleanup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça supprime les paquets orphelins. Si vous voulez voir ce qui va être supprimé avant de le faire :&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;aptly db cleanup -verbose -dry-run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour sauvegarder votre installation aptly, c'est simple : sauvegardez &lt;code&gt;/var/aptly&lt;/code&gt; en entier. Tout est dedans.&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;tar -czf aptly-backup-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;.tar.gz /var/aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="quelques-astuces"&gt;&lt;a href="#quelques-astuces" class="header-anchor"&gt;&lt;/a&gt;Quelques astuces
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Filtrer les paquets lors du mirroring.&lt;/strong&gt; Si vous ne voulez mirrorer que certains paquets (par exemple, uniquement nginx et ses dépendances), vous pouvez utiliser des filtres :&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;aptly mirror create -filter&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;nginx&amp;#39;&lt;/span&gt; -filter-with-deps &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nginx-only &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; http://ftp.fr.debian.org/debian/ &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trixie main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le flag &lt;code&gt;-filter-with-deps&lt;/code&gt; est important : sans lui, vous récupérez nginx mais pas ses dépendances, et ça ne servira à rien.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comparer deux snapshots.&lt;/strong&gt; Pour voir ce qui a changé entre deux snapshots :&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;aptly snapshot diff trixie-20260313 trixie-20260315
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Fusionner des snapshots.&lt;/strong&gt; Vous pouvez combiner plusieurs snapshots en un seul. Utile si vous avez un miroir Debian et un dépôt local, et que vous voulez les publier ensemble :&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;aptly snapshot merge trixie-complet trixie-20260315 mon-depot-v1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;aptly résout un vrai problème : comment garder le contrôle sur ce que vos machines Debian vont installer. Les miroirs classiques vous donnent une copie locale, d'accord, mais ils ne vous donnent pas la maîtrise des changements. Avec aptly et ses snapshots, vous décidez quand et comment vos serveurs voient les mises à jour.&lt;/p&gt;
&lt;p&gt;Le workflow &lt;code&gt;mirror create&lt;/code&gt; → &lt;code&gt;mirror update&lt;/code&gt; → &lt;code&gt;snapshot create&lt;/code&gt; → &lt;code&gt;publish snapshot&lt;/code&gt; → &lt;code&gt;publish switch&lt;/code&gt; devient vite un réflexe. Et le jour où une mise à jour casse quelque chose, vous serez bien content de pouvoir rebascule sur le snapshot d'hier en une commande.&lt;/p&gt;
&lt;p&gt;Les hard links font que tout ça reste léger en espace disque et rapide en exécution. Vous pouvez avoir plusieurs snapshots publiés en parallèle, pour des environnements de test et de prod différents, sans exploser votre stockage.&lt;/p&gt;
&lt;p&gt;Bref, si vous gérez des serveurs Debian sérieusement, aptly mérite sa place dans votre boîte à outils.&lt;/p&gt;</description></item></channel></rss>