promo : le diaporama des Rencontres Linux du Quebec (24 octobre 2026)

Dix-neuf diapositives et leurs notes, sans adresse interne, secret, prix,
faiblesse de securite ni defaut interne,
datees du 15 octobre 2026. CHANGELOG 155 : le diaporama, et les dossiers
clients dont les generateurs citaient dix chemins deplaces par (154).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-10-15 14:51:51 -04:00
parent 4645e4723b
commit baabfe5bbf
22 changed files with 651 additions and 1 deletions

View file

@ -1,3 +1,28 @@
## 2026-10-15 (155) — Le diaporama des Rencontres Linux du Québec, et des dossiers clients qui ne trouvaient plus leurs sources
**95 preuves.** `make verifier` : 95 OK, 0 échec. Aucun changement au moteur : un diaporama
public dans `promo/`, et les dossiers clients révisés hors de ce dépôt.
**Le diaporama** (`promo/rlq-2026-10-24/`) : la présentation de Set-OPS aux Rencontres Linux du
Québec (ÉTS, 24 octobre 2026). Dix-neuf diapositives et leurs notes : pourquoi, comment le moteur
est fait (plan, adressage dérivé, pare-feu dérivés des flux, site et locataire), où il en est
(chiffres, reconstructions datées, chiffrement est-ouest, second site, preuves), six choses bonnes
à savoir pour ses propres machines, la suite. Aucune adresse interne, aucun secret, aucun prix, ni
faiblesse de sécurité ni défaut interne : ce sont des choses à corriger, pas à raconter. L'exemple
d'adressage est calculé par `inventory_rules.deriver_nomenclature` pour un index fictif (42).
La source est versionnée ici ; la présentation et ses exports vivent dans un artefact claude.ai.
**Les dossiers clients ne trouvaient plus leurs sources.** Les générateurs des dossiers de
livraison, de responsabilités et du comparatif SOC 2 citent ce dépôt par chemin. La refonte de
(154) en avait déplacé dix ; le générateur des responsabilités lisait sa charte à l'ancienne
place et refusait de tourner. Personne ne l'a vu : ces générateurs vivent hors du dépôt, et
aucune garde n'en lit les chemins. Corrigés, puis les cinq documents régénérés (révision du
15 octobre). Ils portent des adresses internes et des références de voûte : ils vont dans un
dépôt **privé**, `Livraisons`, à côté des autres, sans le kit VPN, qui porte une clé privée.
**Reste** : l'adresse publique de ce dépôt dans le diaporama (`[adresse publique du dépôt]`) ;
une garde qui lirait, dans `Livraisons`, les chemins de `docs/` que ses générateurs citent.
## 2026-10-15 (154) — La documentation, rangée par lecteur, avec trois portes d'entrée ## 2026-10-15 (154) — La documentation, rangée par lecteur, avec trois portes d'entrée
**95 preuves.** `make verifier` : 94 OK, 1 échec — P60, le wiki publié est en retard depuis **95 preuves.** `make verifier` : 94 OK, 1 échec — P60, le wiki publié est en retard depuis

View file

@ -2,7 +2,8 @@
Cinq pages web **autonomes** (un seul fichier chacune, aucun asset externe, aucune Cinq pages web **autonomes** (un seul fichier chacune, aucun asset externe, aucune
dépendance réseau) : quatre pages de présentation liées par la barre de navigation, dépendance réseau) : quatre pages de présentation liées par la barre de navigation,
et une chronique éditoriale accessible depuis la page Capacités. et une chronique éditoriale accessible depuis la page Capacités. S'y ajoute, dans
`rlq-2026-10-24/`, le diaporama d'une présentation publique (section plus bas).
| Fichier | Public visé | Répond à | | Fichier | Public visé | Répond à |
|---|---|---| |---|---|---|
@ -145,6 +146,26 @@ les commits concernés et mettre à jour ensemble le récit, le JSON `commit-dat
le graphique journalier, les compteurs, les périodes et le lien de la page Capacités. le graphique journalier, les compteurs, les périodes et le lien de la page Capacités.
Ne pas remplacer les résultats historiques par des affirmations sur la flotte actuelle. Ne pas remplacer les résultats historiques par des affirmations sur la flotte actuelle.
## `rlq-2026-10-24/` — le diaporama des Rencontres Linux du Québec
La présentation de Set-OPS et de son état d'avancement aux Rencontres Linux du Québec (ÉTS,
24 octobre 2026) : dix-neuf diapositives 16:9, notes de présentation comprises, **sans adresse
interne, secret, prix, faiblesse de sécurité ni défaut interne**. Les chiffres et les faits sont ceux du **15 octobre 2026** (révision
`4645e47`, 95 preuves), datés comme tels ; ne pas les rafraîchir sans les relever de nouveau.
| Fichier | Rôle |
|---|---|
| `deck.json` | l'index : titre, ordre des diapositives, sections, polices |
| `slides/<id>.html` | une diapositive par fichier : une `<section>` en styles en ligne, notes dans `<aside>` |
Le format est celui de l'artefact « Slides » de claude.ai, où le diaporama est présenté et
exporté (PDF, PowerPoint) ; ces fichiers en sont la source versionnée. Une modification se fait
aux deux endroits, ou se republie depuis ces fichiers.
Avant de présenter : remplacer `[adresse publique du dépôt]` (diapositives `libre` et
`questions`). L'exemple d'adressage (`adressage`) est calculé par le moteur pour un index
fictif, 42 ; le recalculer si la règle de nomenclature change.
### Ouvrir les pages ### Ouvrir les pages
```bash ```bash

View file

@ -0,0 +1,19 @@
{
"v": 4,
"createdOnFiles": {"v": 1, "at": "2026-10-15T18:40:00Z"},
"lists": "css",
"title": "Set-OPS — Rencontres Linux du Québec",
"order": ["cover", "probleme", "setops", "ecosysteme", "plan", "adressage", "declarations", "filtrage", "site", "chiffres", "reconstructions", "etat", "zeroconfiance", "secondsite", "preuves", "lecons", "reste", "libre", "questions"],
"sections": {
"s1": {"description": "Pourquoi Set-OPS existe et ce qu’il est.", "start": "cover"},
"s2": {"description": "Comment le moteur est fait : du plan aux machines.", "start": "ecosysteme"},
"s3": {"description": "Où il en est au 15 octobre 2026, preuves datées à l’appui.", "start": "chiffres"},
"s4": {"description": "Ce que la flotte a appris, ce qui reste, et comment le reprendre.", "start": "lecons"}
},
"faces": {
"source-serif-4": {"family": "Source Serif 4", "href": "https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,wght@0,300..700;1,300..700&display=swap"},
"ibm-plex-sans": {"family": "IBM Plex Sans", "href": "https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;600&display=swap"},
"jetbrains-mono": {"family": "JetBrains Mono", "href": "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&display=swap"}
},
"designSystems": []
}

View file

@ -0,0 +1,24 @@
<section id="adressage" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">02 · L’adressage</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Tout l’adressage dérive d’un seul nombre.</h2>
</div>
<div style="display:grid;grid-template-columns:600px 1fr;gap:56px">
<div style="background:#102E28;border-radius:12px;padding:40px">
<p style="font-family:'JetBrains Mono', 'Courier New', monospace;font-size:26px;line-height:1.5;color:#CFDDD3"><span style="color:#8FA79B"># plan/nomenclature.yml</span><br><span style="color:#B9EED2">index:</span> 42<br><br><span style="color:#8FA79B"># plan/serveurs.yml</span><br><span style="color:#B9EED2">infra-dns-01:</span><br>&#160;&#160;fonction: infra-dns<br>&#160;&#160;etat: actif<br><span style="color:#B9EED2">idm-01:</span><br>&#160;&#160;fonction: idm<br><span style="color:#B9EED2">collab-01:</span><br>&#160;&#160;fonction: collab</p>
</div>
<div style="display:flex;flex-direction:column;gap:32px">
<table style="font-size:26px;color:#3E5550">
<tr><th style="width:31%">Machine</th><th style="width:27%">Adresse</th><th style="width:15%">VLAN</th><th style="width:27%">VMID</th></tr>
<tr><td style="font-family:'JetBrains Mono', 'Courier New', monospace">infra-dns-01</td><td style="font-family:'JetBrains Mono', 'Courier New', monospace">10.42.19.11</td><td style="font-family:'JetBrains Mono', 'Courier New', monospace">1424</td><td style="font-family:'JetBrains Mono', 'Courier New', monospace">142401101</td></tr>
<tr><td style="font-family:'JetBrains Mono', 'Courier New', monospace">idm-01</td><td style="font-family:'JetBrains Mono', 'Courier New', monospace">10.42.17.11</td><td style="font-family:'JetBrains Mono', 'Courier New', monospace">1422</td><td style="font-family:'JetBrains Mono', 'Courier New', monospace">142201101</td></tr>
<tr><td style="font-family:'JetBrains Mono', 'Courier New', monospace">collab-01</td><td style="font-family:'JetBrains Mono', 'Courier New', monospace">10.42.21.21</td><td style="font-family:'JetBrains Mono', 'Courier New', monospace">1426</td><td style="font-family:'JetBrains Mono', 'Courier New', monospace">142602101</td></tr>
</table>
<p style="font-size:28px;line-height:1.45;color:#152F2C">Le VMID est le miroir de l’adresse : <b>VLAN · octet d’hôte · rang</b>. On retrouve la machine depuis son adresse, et l’inverse, sans registre.</p>
<p style="font-size:26px;line-height:1.45">Une preuve refuse un adressage écrit à la main au plan ; une autre refuse deux écosystèmes au même index. Plusieurs organisations cohabitent sur une même grappe sans collision.</p>
</div>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026 · exemple calculé par le moteur, index fictif</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">06</p>
<aside>Un exemple concret, calculé par le moteur lui-même pour un index fictif, 42. Le seul champ saisi est l’index ; chaque machine ne déclare que sa fonction. Le supernet, le VLAN, l’adresse, la passerelle et le VMID en dérivent. Le VMID est le miroir de l’adresse sur neuf chiffres : le VLAN, l’octet d’hôte, le rang. Quand on voit 142401101 dans Proxmox, on sait que c’est la machine 10.42.19.11, sans consulter de registre. Deux gardes protègent la règle : on ne peut pas écrire une adresse à la main dans le plan, et deux écosystèmes ne peuvent pas prendre le même index. C’est ce qui permet le multi-locataire sur une même grappe.</aside>
</section>

View file

@ -0,0 +1,43 @@
<section id="chiffres" data-section="Où il en est au 15 octobre 2026, preuves datées à l’appui." data-transition="fade" style="background:#102E28;color:#CFDDD3;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:56px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#B9EED2;font-weight:600">03 · Où il en est · 15 octobre 2026</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#F3F6EE">Moins de quatre mois, mesurés dans le dépôt.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:48px 32px">
<div style="display:flex;flex-direction:column;gap:8px;border-top:1px solid #426056;padding:20px 0 0 0">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:96px;line-height:1.05;color:#B9EED2">70</p>
<p style="font-size:24px;line-height:1.4">rôles Ansible</p>
</div>
<div style="display:flex;flex-direction:column;gap:8px;border-top:1px solid #426056;padding:20px 0 0 0">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:96px;line-height:1.05;color:#B9EED2">95</p>
<p style="font-size:24px;line-height:1.4">preuves statiques, 0 échec</p>
</div>
<div style="display:flex;flex-direction:column;gap:8px;border-top:1px solid #426056;padding:20px 0 0 0">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:96px;line-height:1.05;color:#B9EED2">874</p>
<p style="font-size:24px;line-height:1.4">commits depuis le 24 juin 2026</p>
</div>
<div style="display:flex;flex-direction:column;gap:8px;border-top:1px solid #426056;padding:20px 0 0 0">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:96px;line-height:1.05;color:#B9EED2">85</p>
<p style="font-size:24px;line-height:1.4">décisions d’architecture en vigueur</p>
</div>
<div style="display:flex;flex-direction:column;gap:8px;border-top:1px solid #426056;padding:20px 0 0 0">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:96px;line-height:1.05;color:#D2B273">2 × 13</p>
<p style="font-size:24px;line-height:1.4">écosystèmes et leurs VM</p>
</div>
<div style="display:flex;flex-direction:column;gap:8px;border-top:1px solid #426056;padding:20px 0 0 0">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:96px;line-height:1.05;color:#D2B273">2 × 9</p>
<p style="font-size:24px;line-height:1.4">sites d’hébergement et leurs VM</p>
</div>
<div style="display:flex;flex-direction:column;gap:8px;border-top:1px solid #426056;padding:20px 0 0 0">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:96px;line-height:1.05;color:#D2B273">43</p>
<p style="font-size:24px;line-height:1.4">groupes, ordonnés sans cycle</p>
</div>
<div style="display:flex;flex-direction:column;gap:8px;border-top:1px solid #426056;padding:20px 0 0 0">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:96px;line-height:1.05;color:#D2B273">154</p>
<p style="font-size:24px;line-height:1.4">entrées datées au journal</p>
</div>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#8FA79B">Set-OPS · Rencontres Linux du Québec 2026 · relevés le 15 octobre 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#8FA79B">10</p>
<aside>Où en est le projet, en chiffres, au 15 octobre. Soixante-dix rôles Ansible. Quatre-vingt-quinze preuves statiques, toutes conformes. Huit cent soixante-quatorze commits depuis le 24 juin. Quatre-vingt-cinq décisions d’architecture écrites et en vigueur. En vert pâle, le dépôt ; en or, la flotte réelle : deux écosystèmes de treize VM chacun, Chezlepro et TechnoLibre, hébergés par deux sites de neuf VM chacun. C’est un chantier, pas encore la production : on les rase et on les reconstruit pour prouver le moteur. Quarante-trois groupes de déploiement, ordonnés par un graphe vérifié sans cycle. Et cent cinquante-quatre entrées datées dans le journal des changements. Les chiffres du dépôt, rôles et décisions, sont recomptés par une preuve qui refuse tout écart ; les autres ont été relevés le 15 octobre.</aside>
</section>

View file

@ -0,0 +1,29 @@
<section id="cover" data-transition="fade" style="background:#102E28;color:#CFDDD3;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px;display:grid;grid-template-columns:1fr 520px;gap:64px;align-items:center">
<div style="display:flex;flex-direction:column;gap:32px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#B9EED2;font-weight:600">Rencontres Linux du Québec · ÉTS · 24 octobre 2026</p>
<h1 style="font-family:'Source Serif 4', Georgia, serif;font-size:160px;font-weight:400;line-height:1;color:#F3F6EE">Set-OPS</h1>
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:56px;line-height:1.15;color:#B9EED2;font-style:italic">Un écosystème numérique souverain, décrit en code</p>
<p style="font-size:30px;line-height:1.4;color:#DCE8DF">Daniel Allaire · Chezlepro / Alliance Boréale</p>
<div style="display:flex;flex-wrap:wrap;gap:12px">
<p style="font-size:24px;color:#DCE8DF;border:1px solid #4F7465;border-radius:999px;padding:8px 20px">Logiciel libre · AGPLv3</p>
<p style="font-size:24px;color:#DCE8DF;border:1px solid #4F7465;border-radius:999px;padding:8px 20px">Proxmox · Debian 13</p>
<p style="font-size:24px;color:#DCE8DF;border:1px solid #4F7465;border-radius:999px;padding:8px 20px">Ansible · Python</p>
<p style="font-size:24px;color:#DCE8DF;border:1px solid #4F7465;border-radius:999px;padding:8px 20px">Exploitable sans IA</p>
</div>
</div>
<svg aria-label="Une constellation : six services reliés autour d’un plan central" width="520" height="480" viewBox="0 0 520 480" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="#557C68" stroke-width="1.5">
<circle cx="260" cy="240" r="190"/>
<circle cx="260" cy="240" r="140" stroke-dasharray="3 10"/>
<path d="M260 50V430M95 145L425 335M95 335L425 145"/>
<path d="M260 50L425 145V335L260 430L95 335V145Z"/>
</g>
<circle cx="260" cy="240" r="78" fill="#B9EED2"/>
<circle cx="260" cy="240" r="78" fill="none" stroke="#102E28" stroke-width="6" stroke-dasharray="2 14"/>
<g fill="#D2B273" stroke="#102E28" stroke-width="7">
<circle cx="260" cy="50" r="11"/><circle cx="425" cy="145" r="11"/><circle cx="425" cy="335" r="11"/>
<circle cx="260" cy="430" r="11"/><circle cx="95" cy="335" r="11"/><circle cx="95" cy="145" r="11"/>
</g>
</svg>
<aside>Bonjour. Je m’appelle Daniel Allaire ; je viens présenter Set-OPS, un moteur libre qui construit et exploite un écosystème numérique complet à partir d’un plan déclaratif. Le projet a commencé le 24 juin 2026 : il a moins de quatre mois. Je vais dire pourquoi il existe, comment il est fait, où il en est aujourd’hui avec des preuves datées, et ce qui reste à faire. Les chiffres de cette présentation sont ceux du 15 octobre 2026.</aside>
</section>

View file

@ -0,0 +1,19 @@
<section id="declarations" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:44px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">02 · Ce que les rôles déclarent</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Chaque rôle déclare ; le moteur dérive.</h2>
</div>
<table style="font-size:26px;color:#3E5550">
<tr><th style="width:36%">Déclaration du rôle</th><th style="width:64%">Ce que le moteur en dérive</th></tr>
<tr><td style="font-family:'JetBrains Mono', 'Courier New', monospace;color:#176754">meta/flux.yml</td><td>nftables, pare-feu Proxmox, frontière OPNsense, registre d’audit</td></tr>
<tr><td style="font-family:'JetBrains Mono', 'Courier New', monospace;color:#176754">meta/empreinte.yml</td><td>RAM, cœurs et disque : la somme des rôles que la VM porte</td></tr>
<tr><td style="font-family:'JetBrains Mono', 'Courier New', monospace;color:#176754">meta/liens.yml</td><td>les variables de connexion d’un service à un autre</td></tr>
<tr><td style="font-family:'JetBrains Mono', 'Courier New', monospace;color:#176754">meta/supervision.yml</td><td>les services Icinga ; avec metriques.yml, Prometheus et Grafana</td></tr>
<tr><td style="font-family:'JetBrains Mono', 'Courier New', monospace;color:#176754">meta/authentification.yml</td><td>la portée et le mécanisme d’authentification, gardés par une preuve</td></tr>
<tr><td style="font-family:'JetBrains Mono', 'Courier New', monospace;color:#176754">meta/acces.yml</td><td>les rôles d’accès projetés dans Keycloak</td></tr>
</table>
<p style="font-size:32px;line-height:1.4;color:#152F2C;border-left:4px solid #176754;padding:8px 0 8px 28px">Aucune liste n’est tenue à la main ailleurs. La leçon la plus payée du dépôt : <i>une liste qui suit une autre prend du retard.</i></p>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">07</p>
<aside>Le deuxième mécanisme central : chaque rôle porte ses déclarations dans son dossier meta. Le rôle de PostgreSQL dit de quels flux il a besoin, combien de mémoire il consomme, comment on le supervise, comment on s’y authentifie. Le moteur agrège ces déclarations : le pare-feu de chaque hôte, celui de Proxmox et la frontière OPNsense sortent du même fichier ; la taille de la VM est la somme des empreintes des rôles qu’elle porte. Aucune liste n’est maintenue à la main à côté. On a appris cette leçon plusieurs fois : dès qu’une liste en recopie une autre, elle prend du retard, et on finit par annoncer une adresse où il n’y a personne.</aside>
</section>

View file

@ -0,0 +1,44 @@
<section id="ecosysteme" data-section="Comment le moteur est fait : du plan aux machines." data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">02 · Ce qu’un écosystème contient</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Huit fonctions reliées, une seule identité.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:24px">
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:32px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Identité</h3>
<p style="font-size:24px;line-height:1.4">OpenLDAP · Keycloak · oauth2-proxy</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:32px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Confiance</h3>
<p style="font-size:24px;line-height:1.4">step-ca, une autorité de certification interne, ACME</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:32px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Noms</h3>
<p style="font-size:24px;line-height:1.4">PowerDNS · Unbound · DNSSEC</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:32px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Courriel</h3>
<p style="font-size:24px;line-height:1.4">Postfix · Dovecot · rspamd</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:32px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Données</h3>
<p style="font-size:24px;line-height:1.4">PostgreSQL · Redis · restic hors nœud</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:32px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Collaboration</h3>
<p style="font-size:24px;line-height:1.4">Nextcloud · Collabora</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:32px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Observation</h3>
<p style="font-size:24px;line-height:1.4">Prometheus · Loki · Grafana · Icinga</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:32px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Web et forge</h3>
<p style="font-size:24px;line-height:1.4">nginx · pare-feu applicatif CRS · Forgejo</p>
</div>
</div>
<p style="font-size:30px;line-height:1.4;color:#152F2C">Aujourd’hui, un écosystème de référence compte <b>13 machines virtuelles</b>, nées du même gabarit Debian 13 durci : nftables, auditd, AppArmor, fail2ban, SSH par clé seulement.</p>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">04</p>
<aside>Ce qu’un écosystème contient. L’identité d’abord : OpenLDAP est la source de vérité, Keycloak fait l’authentification unique, et oauth2-proxy protège les applications qui ne parlent pas OIDC. Une autorité de certification interne, step-ca, délivre les certificats par ACME. PowerDNS pour les noms, avec DNSSEC. Postfix, Dovecot et rspamd pour le courriel — la pile mature, pas la plus jeune. PostgreSQL pour les données, sauvegardées par restic hors du nœud. Nextcloud et Collabora pour travailler ensemble. Prometheus, Loki, Grafana et Icinga pour voir ce qui se passe. Chaque machine part du même gabarit durci. Un écosystème de référence compte treize VM.</aside>
</section>

View file

@ -0,0 +1,41 @@
<section id="etat" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">03 · L’état traverse la reconstruction</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Le code reconstruit, la sauvegarde restitue.</h2>
</div>
<div style="display:flex;gap:16px;align-items:stretch">
<div style="flex:1;display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:28px">
<p style="font-size:24px;font-weight:600;color:#176754">1 · Instantané</p>
<p style="font-size:24px;line-height:1.4">« avant-raser », pris par chaque détenteur d’état</p>
</div>
<div style="flex:1;display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:28px">
<p style="font-size:24px;font-weight:600;color:#176754">2 · Raser</p>
<p style="font-size:24px;line-height:1.4">toutes les VM de l’écosystème</p>
</div>
<div style="flex:1;display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:28px">
<p style="font-size:24px;font-weight:600;color:#176754">3 · Reconstruire</p>
<p style="font-size:24px;line-height:1.4">cloner, armer le serveur d’exploitation, déployer</p>
</div>
<div style="flex:1;display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:28px">
<p style="font-size:24px;font-weight:600;color:#176754">4 · Restaurer</p>
<p style="font-size:24px;line-height:1.4">depuis restic, hors du nœud, chaque service à sa naissance</p>
</div>
<div style="flex:1;display:flex;flex-direction:column;gap:10px;background:#102E28;border-radius:12px;padding:28px">
<p style="font-size:24px;font-weight:600;color:#B9EED2">5 · Comparer</p>
<p style="font-size:24px;line-height:1.4;color:#CFDDD3">les témoins, clé par clé, avant et après</p>
</div>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:48px">
<div style="display:flex;flex-direction:column;gap:12px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Ce qui revient</h3>
<p style="font-size:26px;line-height:1.5">Autorité de certification · annuaire · bases PostgreSQL · fichiers Nextcloud · boîtes de courriel · historique de supervision · métriques · journaux</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Le principe</h3>
<p style="font-size:26px;line-height:1.5">L’infrastructure se reconstruit par le code ; on sauvegarde la <b>donnée</b>, pas la VM. Un service qui naît demande au dépôt si une incarnation précédente l’attend.</p>
</div>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">12</p>
<aside>Comment l’état traverse une reconstruction. Avant de raser, chaque machine qui détient de l’état prend un instantané nommé « avant-raser », dans un dépôt restic hors du nœud. On rase. On clone les VM, on arme le serveur d’exploitation de l’écosystème, on déploie. Chaque service, en naissant, demande au dépôt de sauvegarde si une incarnation précédente l’attend, et se restaure. Puis on compare des témoins, clé par clé : les empreintes avant et après doivent être identiques. Le principe est simple : l’infrastructure se reconstruit par le code, donc on ne sauvegarde pas des VM, on sauvegarde la donnée. Un détail qui a son importance : si le dépôt est illisible, le service refuse de naître neuf, parce que conclure « rien à restaurer » faute de joindre le dépôt effacerait ce qui attend ailleurs.</aside>
</section>

View file

@ -0,0 +1,42 @@
<section id="filtrage" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:44px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">02 · Le réseau</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Un flux déclaré, trois pare-feu cohérents.</h2>
</div>
<div style="position:relative;width:1664px;height:420px">
<div style="position:absolute;left:572px;top:0px;width:520px;height:88px;background:#102E28;border-radius:12px;display:flex;align-items:center;justify-content:center">
<p style="font-family:'JetBrains Mono', 'Courier New', monospace;font-size:26px;color:#B9EED2">roles/*/meta/flux.yml</p>
</div>
<div style="position:absolute;left:0px;top:170px;width:300px;height:250px;background:#E8EFE5;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Internet</h3>
<p style="font-size:24px;line-height:1.4">ce qui vient de l’extérieur</p>
</div>
<div style="position:absolute;left:341px;top:170px;width:300px;height:250px;background:#FDFDFA;border:2px solid #176754;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Frontière OPNsense</h3>
<p style="font-size:24px;line-height:1.4">nord-sud ; un refus se journalise</p>
</div>
<div style="position:absolute;left:682px;top:170px;width:300px;height:250px;background:#E8EFE5;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">SDN EVPN</h3>
<p style="font-size:24px;line-height:1.4">une zone par écosystème, passerelles anycast</p>
</div>
<div style="position:absolute;left:1023px;top:170px;width:300px;height:250px;background:#FDFDFA;border:2px solid #176754;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Pare-feu Proxmox</h3>
<p style="font-size:24px;line-height:1.4">est-ouest, par VM, refus par défaut</p>
</div>
<div style="position:absolute;left:1364px;top:170px;width:300px;height:250px;background:#FDFDFA;border:2px solid #176754;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">nftables</h3>
<p style="font-size:24px;line-height:1.4">sur chaque hôte, devant le service</p>
</div>
<x-connector x1="300" y1="295" x2="341" y2="295" head="end" style="color:#5F716B"></x-connector>
<x-connector x1="641" y1="295" x2="682" y2="295" head="end" style="color:#5F716B"></x-connector>
<x-connector x1="982" y1="295" x2="1023" y2="295" head="end" style="color:#5F716B"></x-connector>
<x-connector x1="1323" y1="295" x2="1364" y2="295" head="end" style="color:#5F716B"></x-connector>
<x-connector x1="760" y1="88" x2="491" y2="170" head="end" style="color:#176754;border-style:dashed"></x-connector>
<x-connector x1="900" y1="88" x2="1173" y2="170" head="end" style="color:#176754;border-style:dashed"></x-connector>
<x-connector x1="1000" y1="88" x2="1514" y2="170" head="end" style="color:#176754;border-style:dashed"></x-connector>
</div>
<p style="font-size:30px;line-height:1.4;color:#152F2C">Les trois cadres verts sortent du même fichier. Un flux <span style="color:#176754">pair: externe</span> devient la politique de bordure ; le registre des flux, généré, sert d’audit et dit le chiffrement de chacun.</p>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">08</p>
<aside>Le réseau, de l’Internet jusqu’au service. La frontière OPNsense tient la bordure nord-sud ; chaque écosystème a sa zone EVPN dans le SDN de Proxmox, avec des passerelles anycast ; le pare-feu de Proxmox filtre l’est-ouest, VM par VM, avec un refus par défaut ; et nftables protège chaque hôte. Les trois pare-feu — en vert — ne sont pas écrits à la main : ils sont dérivés des flux que les rôles déclarent. Un flux dont le pair est « externe » devient une règle de la frontière, posée par son API. Et le registre des flux est généré : c’est la matrice d’audit, qui dit pour chaque flux s’il est chiffré.</aside>
</section>

View file

@ -0,0 +1,35 @@
<section id="lecons" data-section="Ce que la flotte a appris, ce qui reste, et comment le reprendre." data-transition="fade" style="background:#E8EFE5;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:44px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">04 · Pour vos propres machines</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Six choses bonnes à savoir.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:24px">
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border-radius:12px;padding:32px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Un connect() TCP ne prouve rien</h3>
<p style="font-size:24px;line-height:1.4">Un pare-feu peut accepter la poignée de main sans relayer la suite. Seule la livraison compte.</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border-radius:12px;padding:32px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Une sonde trop courte fabrique une panne</h3>
<p style="font-size:24px;line-height:1.4">L’API de Proxmox, sans authentification, répond en 3 s par prudence ; un délai de 2 s y voit une panne.</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border-radius:12px;padding:32px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">nginx reload ne déplace pas une écoute</h3>
<p style="font-size:24px;line-height:1.4">Une nouvelle adresse <span style="color:#176754">listen</span> demande un restart. Comparer <span style="color:#176754">ss</span> à la configuration.</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border-radius:12px;padding:32px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Renouveler un certificat ne suffit pas</h3>
<p style="font-size:24px;line-height:1.4">Le fichier est neuf ; le service sert l’ancien tant qu’on ne le recharge pas.</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border-radius:12px;padding:32px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Ansible veut un tube</h3>
<p style="font-size:24px;line-height:1.4">Une sortie non bloquante donne un échec silencieux. Remède : <span style="color:#176754">&lt; /dev/null 2&gt;&amp;1 | cat</span></p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;background:#FDFDFA;border-radius:12px;padding:32px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">OPNsense : le groupe passe d’abord</h3>
<p style="font-size:24px;line-height:1.4">Les règles du groupe wireguard s’appliquent avant celles d’une interface WireGuard assignée.</p>
</div>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">16</p>
<aside>Pour une salle d’administrateurs Linux, voici ce qui vous servira peut-être demain matin. Un : un connect TCP réussi ne prouve rien ; un pare-feu peut accepter la poignée de main sans relayer le trafic. Seule la livraison compte, et la destination en est le seul juge. Deux : l’API de Proxmox, quand on l’interroge sans authentification, met un peu plus de trois secondes à répondre, par protection contre la force brute ; une sonde avec un délai de deux secondes y voit une panne qui n’existe pas. Trois : nginx reload n’applique pas un changement d’adresse d’écoute ; il faut un restart, et comparer ss à la configuration. Quatre : un certificat renouvelé sur disque reste servi périmé tant qu’on ne recharge pas le service. Cinq : Ansible lancé avec une sortie non bloquante échoue en silence ; on le fait passer dans un tube. Six : dans OPNsense, les règles du groupe wireguard passent avant celles d’une interface WireGuard assignée.</aside>
</section>

View file

@ -0,0 +1,28 @@
<section id="libre" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">04 · Le reprendre</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Libre, et fait pour être repris.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:24px">
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">AGPLv3 ou ultérieure</h3>
<p style="font-size:26px;line-height:1.45">Le moteur est libre. Le modèle d’affaires : libre + services, héberger et accompagner.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Sans IA pour l’exploiter</h3>
<p style="font-size:26px;line-height:1.45">Un administrateur reprend l’écosystème avec la documentation, make et la console.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Une remise en deux temps</h3>
<p style="font-size:26px;line-height:1.45">L’identité au jour de la livraison, puis les clés des machines à une échéance écrite.</p>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:16px;background:#102E28;border-radius:12px;padding:40px">
<p style="font-size:26px;color:#B9EED2;font-weight:600">Essayer avec le modèle public</p>
<p style="font-family:'JetBrains Mono', 'Courier New', monospace;font-size:28px;color:#F3F6EE">make instance-creer NOM=OPS-MonOrg MODELE=socle</p>
<p style="font-size:26px;line-height:1.45;color:#CFDDD3">Le code : [adresse publique du dépôt] · Contact : chezlepro.ca/contact</p>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">18</p>
<aside>Le projet est libre, sous AGPLv3 ou ultérieure. Le modèle d’affaires est simple : le logiciel est libre, et on vend des services — héberger, accompagner, former. L’outil est conçu pour qu’un administrateur le reprenne sans IA, avec la documentation, make et la console. Et un écosystème se remet à son organisation en deux temps : l’identité le jour de la livraison, puis les clés des machines à une échéance convenue, une fois les nouveaux accès vérifiés. Pour essayer : le dépôt public fournit un modèle générique, socle, et la commande instance-creer en fait un écosystème à vous. Je serai heureux d’en parler après la présentation.</aside>
</section>

View file

@ -0,0 +1,44 @@
<section id="plan" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">02 · Du plan aux machines</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">On édite le plan, jamais l’inventaire.</h2>
</div>
<div style="display:flex;gap:16px;align-items:stretch">
<div style="flex:1;display:flex;flex-direction:column;gap:12px;background:#102E28;border-radius:12px;padding:32px">
<p style="font-family:'JetBrains Mono', 'Courier New', monospace;font-size:26px;color:#B9EED2">plan/*.yml</p>
<p style="font-size:24px;line-height:1.4;color:#CFDDD3">Serveurs, applications, bases, domaines, nomenclature : ce qu’on écrit.</p>
</div>
<x-shape kind="arrow-right" style="width:56px;height:32px;background:#176754;flex:none;align-self:center"></x-shape>
<div style="flex:1;display:flex;flex-direction:column;gap:12px;background:#102E28;border-radius:12px;padding:32px">
<p style="font-family:'JetBrains Mono', 'Courier New', monospace;font-size:26px;color:#B9EED2">make instancier</p>
<p style="font-size:24px;line-height:1.4;color:#CFDDD3">Dérive VMID, IP, VLAN, noms et groupes ; montre l’écart avant d’écrire.</p>
</div>
<x-shape kind="arrow-right" style="width:56px;height:32px;background:#176754;flex:none;align-self:center"></x-shape>
<div style="flex:1;display:flex;flex-direction:column;gap:12px;background:#102E28;border-radius:12px;padding:32px">
<p style="font-family:'JetBrains Mono', 'Courier New', monospace;font-size:26px;color:#B9EED2">hosts.yml</p>
<p style="font-size:24px;line-height:1.4;color:#CFDDD3">L’inventaire Ansible, généré. Personne ne l’édite à la main.</p>
</div>
<x-shape kind="arrow-right" style="width:56px;height:32px;background:#176754;flex:none;align-self:center"></x-shape>
<div style="flex:1;display:flex;flex-direction:column;gap:12px;background:#102E28;border-radius:12px;padding:32px">
<p style="font-family:'JetBrains Mono', 'Courier New', monospace;font-size:26px;color:#B9EED2">make deployer</p>
<p style="font-size:24px;line-height:1.4;color:#CFDDD3">Couche par couche, dans l’ordre d’un graphe de 43 groupes, sans cycle.</p>
</div>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:24px">
<div style="display:flex;flex-direction:column;gap:10px;border-top:3px solid #176754;padding:24px 0 0 0">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Un groupe, un playbook</h3>
<p style="font-size:24px;line-height:1.45">Chaque groupe applique ses rôles ; le socle et le durcissement passent en premier.</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;border-top:3px solid #176754;padding:24px 0 0 0">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Lire avant d’écrire</h3>
<p style="font-size:24px;line-height:1.45">Les cibles <span style="color:#152F2C">-plan</span> comparent le réel au plan sans rien changer ; <span style="color:#152F2C">-appliquer</span> réconcilie, sur confirmation.</p>
</div>
<div style="display:flex;flex-direction:column;gap:10px;border-top:3px solid #176754;padding:24px 0 0 0">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Un modèle pour démarrer</h3>
<p style="font-size:24px;line-height:1.45">Le modèle public <span style="color:#152F2C">socle</span> : PKI, DNS interne, edge TLS, magasin de courriel.</p>
</div>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">05</p>
<aside>La règle d’or : on édite le plan, jamais l’inventaire. Le plan, ce sont quelques fichiers YAML : les serveurs, les applications, les bases, les domaines, la nomenclature. make instancier en dérive tout le reste, et montre l’écart sémantique avant d’écrire quoi que ce soit. L’inventaire Ansible est généré. Puis make deployer applique, couche par couche, dans l’ordre d’un graphe de 43 groupes qu’on vérifie sans cycle. Toutes les commandes qui touchent au réel suivent la même convention : une cible -plan qui lit et compare, une cible -appliquer qui réconcilie, et seulement avec CONFIRMER=true. Pour démarrer, le dépôt public fournit un modèle générique, socle.</aside>
</section>

View file

@ -0,0 +1,25 @@
<section id="preuves" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">03 · Comment on sait</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Prouver le dépôt, mesurer le système.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:32px">
<div style="display:flex;flex-direction:column;gap:16px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:40px">
<p style="font-family:'JetBrains Mono', 'Courier New', monospace;font-size:26px;color:#176754">make verifier · make prouver</p>
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Les preuves statiques</h3>
<p style="font-size:26px;line-height:1.45">Lisent le dépôt seul, sans réseau : plan, rôles, flux, documentation, ordre de déploiement. 95 preuves, un rapport daté et rejouable.</p>
</div>
<div style="display:flex;flex-direction:column;gap:16px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:40px">
<p style="font-family:'JetBrains Mono', 'Courier New', monospace;font-size:26px;color:#176754">make SUJET-plan</p>
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Les devis</h3>
<p style="font-size:26px;line-height:1.45">Lisent le système en marche, par les API de Proxmox et d’OPNsense et sur les VM, et le comparent au plan. Ils n’écrivent rien.</p>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#102E28;border-radius:12px;padding:40px">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:40px;line-height:1.25;color:#F3F6EE">Chaque garde a son témoin : on casse exprès, elle doit le voir.</p>
<p style="font-size:26px;line-height:1.45;color:#CFDDD3">Et chaque sonde a son contrôle : avant de conclure, on vérifie d’où l’instrument mesure.</p>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">15</p>
<aside>Comment sait-on que tout ça tient ? Deux familles d’outils, qu’on ne confond pas. Les preuves statiques lisent le dépôt seul, sans réseau : la cohérence du plan, des rôles, des flux, de la documentation. Il y en a 95 ; elles produisent un rapport daté qu’on peut rejouer. Les devis, eux, lisent le système en marche et le comparent au plan, sans rien écrire. La discipline qui compte le plus : chaque garde a un témoin. On casse exprès — une adresse faussée, un nom retiré — et la garde doit le voir. Une garde qui ne mord jamais ne prouve rien. Même chose pour les sondes : avant d’accuser une machine, on vérifie d’où l’instrument mesure.</aside>
</section>

View file

@ -0,0 +1,24 @@
<section id="probleme" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:56px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">01 · Pourquoi</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Une petite organisation loue aujourd’hui<br>ses comptes, son courriel et ses fichiers.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:24px">
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">L’identité</h3>
<p style="font-size:26px;line-height:1.45">Les comptes vivent chez le fournisseur. Un départ, un oubli de révocation, et l’accès reste ouvert ailleurs.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">Les données</h3>
<p style="font-size:26px;line-height:1.45">L’export est une option du contrat, pas une procédure éprouvée. Partir coûte cher.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:32px;font-weight:600;color:#152F2C">La confiance</h3>
<p style="font-size:26px;line-height:1.45">Certificats, noms de domaine, journaux : la mémoire de l’infrastructure est chez quelqu’un d’autre.</p>
</div>
</div>
<p style="font-size:32px;line-height:1.4;color:#152F2C;border-left:4px solid #176754;padding:8px 0 8px 28px">Set-OPS vise les OBNL, les coopératives et les PME : leur remettre ces fonctions, en logiciel libre, sur leur matériel ou celui d’un hébergeur de confiance.</p>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">02</p>
<aside>Le point de départ n’est pas technique. Une petite organisation — un OBNL, une coopérative — loue aujourd’hui son identité, son courriel et ses fichiers à des fournisseurs en nuage. Trois conséquences : les comptes vivent ailleurs, l’export des données n’est jamais vraiment éprouvé, et la mémoire de l’infrastructure, certificats, DNS et journaux, n’est pas chez elle. Set-OPS veut rendre ces fonctions à l’organisation, en logiciel libre, sans exiger d’elle une équipe d’administrateurs.</aside>
</section>

View file

@ -0,0 +1,10 @@
<section id="questions" data-transition="fade" style="background:#102E28;color:#CFDDD3;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px;display:flex;flex-direction:column;justify-content:center;gap:40px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#B9EED2;font-weight:600">Merci</p>
<h1 style="font-family:'Source Serif 4', Georgia, serif;font-size:140px;font-weight:400;line-height:1.05;color:#F3F6EE">Questions ?</h1>
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:44px;line-height:1.3;color:#B9EED2;font-style:italic">Votre numérique. Vos règles.</p>
<div style="display:flex;flex-direction:column;gap:8px;border-top:1px solid #426056;padding:32px 0 0 0">
<p style="font-size:30px;line-height:1.45;color:#DCE8DF">Daniel Allaire · Chezlepro / Alliance Boréale</p>
<p style="font-size:28px;line-height:1.45">chezlepro.ca/contact · [adresse publique du dépôt]</p>
</div>
<aside>Merci. Je prends vos questions. Questions probables : pourquoi pas Kubernetes ou des conteneurs — parce que la cible, ce sont de petites organisations dont l’administrateur connaît Debian et systemd, et que le moteur tient à rester lisible. Pourquoi pas NetBox ou AWX — le plan de contrôle maison est volontairement figé ; on adoptera ces outils quand des seuils seront franchis. Pourquoi pas Stalwart pour le courriel — trop jeune ; Postfix et Dovecot sont éprouvés. Quelle place pour l’IA — elle assiste le mainteneur pour écrire le moteur ; l’exploitation n’en demande aucune.</aside>
</section>

View file

@ -0,0 +1,19 @@
<section id="reconstructions" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:44px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">03 · Raser pour prouver</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">On rase, on reconstruit, on recommence.</h2>
</div>
<table style="font-size:26px;color:#3E5550">
<tr><th style="width:16%">Date</th><th style="width:64%">Ce que la reconstruction a prouvé</th><th style="width:20%">Durée</th></tr>
<tr><td>13 août</td><td>Une flotte remontée d’un trait : 43 groupes, 0 échec</td><td>37 min</td></tr>
<tr><td>2 sept.</td><td>Un écosystème rasé et refait depuis zéro ; recette à 0 échec</td><td>—</td></tr>
<tr><td>10 sept.</td><td>Reconstruction de confirmation, 0 échec</td><td>34 min</td></tr>
<tr><td>1er oct.</td><td>L’état revient : autorité, annuaire, bases, fichiers, courriel</td><td>41 puis 40 min</td></tr>
<tr><td>4 oct.</td><td>Les deux écosystèmes avant une release étiquetée et signée</td><td>42 min chacun</td></tr>
<tr style="background:#E8EFE5"><td><b>9 oct.</b></td><td><b>Sans PyPI, Galaxy ni app store ; supervision, métriques et journaux compris</b></td><td><b>43 min, d’une traite</b></td></tr>
</table>
<p style="font-size:28px;line-height:1.45;color:#152F2C">Une commande : <span style="color:#176754">make reconstruire-locataire</span>. Des épreuves datées sur des VM réelles, pas un délai de reprise garanti.</p>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026 · journal des changements du dépôt</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">11</p>
<aside>La meilleure preuve qu’un plan décrit vraiment un écosystème, c’est de tout raser et de tout reconstruire depuis le plan. On le fait régulièrement. Le 13 août, une flotte complète remontée d’un trait. Le 2 septembre, un écosystème rasé et refait depuis zéro. Depuis le 30 septembre, la reconstruction remet aussi l’état : l’autorité de certification, l’annuaire, les bases, les fichiers, le courriel. Le 4 octobre, les deux écosystèmes reconstruits avant d’étiqueter une release. Et le 9 octobre, les deux sur le même commit, sans rien demander à PyPI, à Ansible Galaxy ni à l’app store de Nextcloud : le site fournit tout. Quarante-trois minutes pour Chezlepro, d’une traite. Je précise : ce sont des épreuves datées, pas une promesse de délai de reprise.</aside>
</section>

View file

@ -0,0 +1,27 @@
<section id="reste" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">04 · La suite</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Les prochaines étapes.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:24px">
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">La délégation DNS</h3>
<p style="font-size:26px;line-height:1.45">Enregistrer la colle des deux serveurs de noms chez les registraires, puis déléguer les domaines.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Le web public</h3>
<p style="font-size:26px;line-height:1.45">Des certificats Let’s Encrypt sur le frontal web, derrière son pare-feu applicatif.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">La reprise entre sites</h3>
<p style="font-size:26px;line-height:1.45">Des sauvegardes croisées : chaque site garde une copie de l’autre.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">D’autres sites</h3>
<p style="font-size:26px;line-height:1.45">Construire de nouveaux sites depuis zéro, d’une traite, avec le même moteur.</p>
</div>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">17</p>
<aside>La suite. D’abord la délégation DNS : enregistrer chez les registraires la colle de nos deux serveurs de noms, puis leur déléguer nos domaines. Ensuite le web public : poser les certificats Let’s Encrypt sur le frontal web, qui a déjà son pare-feu applicatif. Puis la reprise entre les sites : des sauvegardes croisées, pour que chaque site garde une copie de l’autre. Et construire d’autres sites depuis zéro, avec le même moteur.</aside>
</section>

View file

@ -0,0 +1,38 @@
<section id="secondsite" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:44px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">03 · 13 et 14 octobre</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Un second site, construit depuis zéro.</h2>
</div>
<div style="position:relative;width:1664px;height:480px">
<div style="position:absolute;left:0px;top:40px;width:330px;height:190px;background:#E8EFE5;border-radius:12px;padding:24px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Internet</h3>
<p style="font-size:24px;line-height:1.4">visiteurs, résolveurs, registraires</p>
</div>
<div style="position:absolute;left:444px;top:40px;width:330px;height:190px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:24px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Relais (VPS)</h3>
<p style="font-size:24px;line-height:1.4">3 adresses fixes louées, routées en /32</p>
</div>
<div style="position:absolute;left:888px;top:40px;width:330px;height:190px;background:#102E28;border-radius:12px;padding:24px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#F3F6EE">Frontière OPNsense</h3>
<p style="font-size:24px;line-height:1.4;color:#CFDDD3">sans adresse fixe, elle initie le tunnel</p>
</div>
<div style="position:absolute;left:1334px;top:40px;width:330px;height:190px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:24px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Proxmox · 9 VM</h3>
<p style="font-size:24px;line-height:1.4">clonées en 30 secondes chacune</p>
</div>
<x-connector x1="330" y1="135" x2="444" y2="135" head="both" style="color:#5F716B"></x-connector>
<x-connector x1="774" y1="135" x2="888" y2="135" head="both" style="color:#176754;border-width:4px;border-style:dashed"></x-connector>
<p style="position:absolute;left:762px;top:0px;width:138px;font-size:24px;text-align:center;color:#176754">WireGuard</p>
<x-connector x1="1218" y1="135" x2="1334" y2="135" head="both" style="color:#5F716B"></x-connector>
<div style="position:absolute;left:888px;top:340px;width:330px;height:140px;background:#E8EFE5;border-radius:12px;padding:24px;display:flex;flex-direction:column;gap:8px">
<h3 style="font-size:28px;font-weight:600;color:#152F2C">Site de Chezlepro</h3>
<p style="font-size:24px;line-height:1.4">l’autre frontière</p>
</div>
<x-connector x1="1053" y1="230" x2="1053" y2="340" head="both" style="color:#176754;border-width:4px;border-style:dashed"></x-connector>
<p style="position:absolute;left:1250px;top:300px;width:414px;font-size:24px;line-height:1.4;color:#152F2C">Lien entre les sites, WireGuard : réplication du DNS public, administration à distance.</p>
<p style="position:absolute;left:0px;top:300px;width:820px;font-size:28px;line-height:1.45;color:#152F2C">Aucune traduction d’adresse : l’adresse du client arrive intacte. Deux serveurs de noms publics, un par site, servent les zones signées DNSSEC.</p>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026 · site de reprise de TechnoLibre</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">14</p>
<aside>Le 13 et le 14 octobre, on a construit un second site, chez TechnoLibre, destiné à la reprise des deux écosystèmes. Le matériel : une frontière OPNsense, un nœud Proxmox, un stockage ZFS en miroir pour les sauvegardes. Le défi : ce site n’a qu’une adresse dynamique. La solution est un relais : trois adresses fixes louées sur un VPS, qui répond à l’ARP pour elles et les route en /32 dans un tunnel WireGuard que la frontière du site initie. Aucune traduction d’adresse : l’adresse du client arrive intacte jusqu’au service. Un second tunnel relie les deux sites : il réplique le DNS public et sert à administrer le site distant. Depuis le 14 octobre, chacune de nos zones publiques est servie par deux serveurs de noms, un par site, signés DNSSEC. Les neuf VM du site sont nées du gabarit en une trentaine de secondes chacune.</aside>
</section>

View file

@ -0,0 +1,34 @@
<section id="setops" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">01 · Ce que c’est</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Un moteur qui transforme un plan<br>en écosystème.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 600px;gap:48px">
<div style="display:flex;flex-direction:column">
<div style="display:grid;grid-template-columns:260px 1fr;gap:24px;padding:20px 0;border-top:1px solid #C9D6CC">
<p style="font-size:28px;font-weight:600;color:#176754">Le moteur</p>
<p style="font-size:26px;line-height:1.4">Rôles Ansible, playbooks, scripts Python de dérivation, preuves. Un seul dépôt, générique.</p>
</div>
<div style="display:grid;grid-template-columns:260px 1fr;gap:24px;padding:20px 0;border-top:1px solid #C9D6CC">
<p style="font-size:28px;font-weight:600;color:#176754">L’écosystème</p>
<p style="font-size:26px;line-height:1.4">Un dépôt par organisation : son plan, son inventaire généré, sa voûte chiffrée.</p>
</div>
<div style="display:grid;grid-template-columns:260px 1fr;gap:24px;padding:20px 0;border-top:1px solid #C9D6CC">
<p style="font-size:28px;font-weight:600;color:#176754">Le site</p>
<p style="font-size:26px;line-height:1.4">Un dépôt par hébergeur : grappe Proxmox, réseau, frontière OPNsense.</p>
</div>
<div style="display:grid;grid-template-columns:260px 1fr;gap:24px;padding:20px 0;border-top:1px solid #C9D6CC;border-bottom:1px solid #C9D6CC">
<p style="font-size:28px;font-weight:600;color:#176754">L’exploitation</p>
<p style="font-size:26px;line-height:1.4">La documentation, <span style="color:#152F2C">make</span> et une console web. Aucune IA requise.</p>
</div>
</div>
<div style="display:flex;flex-direction:column;justify-content:center;gap:24px;background:#102E28;border-radius:16px;padding:48px">
<p style="font-family:'Source Serif 4', Georgia, serif;font-size:44px;line-height:1.2;color:#F3F6EE">Logiciel libre, exclusivement.</p>
<p style="font-size:28px;line-height:1.45;color:#CFDDD3">Ni Docker, ni Podman : des services natifs, des paquets Debian et systemd, sur des VM Debian 13 clonées d’un gabarit durci.</p>
<p style="font-size:24px;color:#B9EED2">Licence AGPLv3 ou ultérieure</p>
</div>
</div>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">03</p>
<aside>Set-OPS est un moteur : des rôles Ansible et des scripts Python qui lisent un plan déclaratif et en dérivent tout le reste. Le moteur est générique ; chaque écosystème réel vit dans son propre dépôt, avec sa voûte. L’hébergeur, lui, a son dépôt de site : la grappe Proxmox, le réseau, la frontière OPNsense. Deux principes fondateurs : tout est en logiciel libre, et pas de conteneurs — des services natifs, comme un administrateur Debian les installerait à la main. Et l’outil doit s’exploiter sans IA : la documentation, make et la console suffisent. Je le dis franchement : le mainteneur, lui, se fait assister par une IA pour écrire le moteur ; l’exploitant n’en a pas besoin.</aside>
</section>

View file

@ -0,0 +1,31 @@
<section id="site" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">02 · Héberger sans posséder</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Un site héberge, une organisation possède.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 300px 1fr;gap:32px;align-items:center">
<div style="display:flex;flex-direction:column;gap:16px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:40px">
<h3 style="font-size:32px;font-weight:600;color:#7A5A1E">Le site · l’hébergeur</h3>
<p style="font-size:26px;line-height:1.4">Grappe Proxmox, SDN, stockage, frontière OPNsense.</p>
<p style="font-size:26px;line-height:1.4">Crée et détruit les machines, avec sa propre voûte.</p>
<p style="font-size:26px;line-height:1.4">Prête trois services à un écosystème jeune : les paquets, la forge du moteur, la résolution de noms.</p>
</div>
<div style="display:flex;flex-direction:column;gap:20px;align-items:center">
<p style="font-size:24px;color:#152F2C;text-align:center">fiche du site</p>
<x-shape kind="arrow-right" style="width:180px;height:56px;background:#C59C56"></x-shape>
<div style="height:24px"></div>
<x-shape kind="arrow-left" style="width:180px;height:56px;background:#176754"></x-shape>
<p style="font-size:24px;color:#152F2C;text-align:center">face réseau</p>
</div>
<div style="display:flex;flex-direction:column;gap:16px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:40px">
<h3 style="font-size:32px;font-weight:600;color:#176754">L’écosystème · l’organisation</h3>
<p style="font-size:26px;line-height:1.4">Son plan, sa voûte, son annuaire, son autorité, ses journaux.</p>
<p style="font-size:26px;line-height:1.4">Configure ses services par son propre serveur d’exploitation.</p>
<p style="font-size:26px;line-height:1.4">Peut partir : plan, données, voûte et domaines s’emportent.</p>
</div>
</div>
<p style="font-size:30px;line-height:1.4;color:#152F2C;border-left:4px solid #176754;padding:8px 0 8px 28px">Même entreprise ne veut pas dire même pouvoir : une voûte par dépôt, une clé par voûte, et chaque serveur d’exploitation ne lit que son propre dépôt.</p>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">09</p>
<aside>Deux classes d’écosystème, un contrat entre elles. Le site, c’est l’hébergeur : le matériel, le réseau, la frontière ; il crée les machines. L’écosystème, c’est l’organisation : son plan, sa voûte, son identité, ses journaux ; il configure ses propres services. Le site publie une fiche — son résolveur, son cache de paquets, sa forge, les adresses publiques qu’il attribue — que le moteur dépose chez chaque locataire. Le locataire publie sa face réseau, que le site lit pour poser ses règles. Le site prête trois services à un écosystème jeune, jusqu’à ce qu’il ait les siens : on appelle ça la filiation, puis l’émancipation. Et une organisation peut partir avec son plan, ses données, sa voûte et ses domaines. Même quand une seule entreprise tient les deux rôles, les clés restent séparées.</aside>
</section>

View file

@ -0,0 +1,28 @@
<section id="zeroconfiance" data-transition="fade" style="background:#F6F7F0;color:#3E5550;font-family:'IBM Plex Sans', Arial, sans-serif;padding:128px 128px 160px;display:flex;flex-direction:column;gap:48px">
<div style="display:flex;flex-direction:column;gap:16px">
<p style="font-size:24px;letter-spacing:3px;text-transform:uppercase;color:#176754;font-weight:600">03 · Zéro confiance, est-ouest</p>
<h2 style="font-family:'Source Serif 4', Georgia, serif;font-size:64px;font-weight:400;line-height:1.1;color:#152F2C">Le trafic interne est chiffré aussi.</h2>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:24px">
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">PostgreSQL : TLS obligatoire</h3>
<p style="font-size:26px;line-height:1.45"><span style="color:#176754">hostssl</span> seulement dans <span style="color:#176754">pg_hba</span> ; les clients vérifient le serveur en <span style="color:#176754">verify-full</span>.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Métriques et journaux en HTTPS</h3>
<p style="font-size:26px;line-height:1.45">Mesuré le 12 octobre : 15 écoutes sur 15 en TLS dans chaque écosystème, 11 sur 11 au site.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Aucune sortie sans déclaration</h3>
<p style="font-size:26px;line-height:1.45">Depuis le 10 octobre, aucune machine ne sort vers Internet sans un rôle qui le dise. Le site sert les paquets.</p>
</div>
<div style="display:flex;flex-direction:column;gap:12px;background:#FDFDFA;border:1px solid #D5DFD7;border-radius:12px;padding:36px">
<h3 style="font-size:30px;font-weight:600;color:#152F2C">Un pare-feu devant chaque VM</h3>
<p style="font-size:26px;line-height:1.45">Le pare-feu de Proxmox est actif, VM par VM, refus par défaut, depuis le 28 septembre.</p>
</div>
</div>
<p style="font-size:28px;line-height:1.45;color:#152F2C;border-left:4px solid #176754;padding:8px 0 8px 28px">Chaque flux déclare son chiffrement ; le registre des flux, généré, en fait la synthèse.</p>
<p style="position:absolute;left:128px;bottom:64px;width:1200px;font-size:24px;color:#5F716B">Set-OPS · Rencontres Linux du Québec 2026</p>
<p style="position:absolute;right:128px;bottom:64px;width:120px;text-align:right;font-size:24px;color:#5F716B">13</p>
<aside>Une directive du 12 octobre : tout transit est chiffré, l’interne comme l’externe. PostgreSQL n’accepte plus que des connexions TLS, et ses clients vérifient l’identité du serveur. Les métriques et les journaux passent en HTTPS vérifié par l’autorité de certification de l’écosystème : mesuré le 12 octobre, toutes les écoutes concernées sont en TLS. Deuxième chantier : plus aucune machine ne sort vers Internet sans qu’un rôle le déclare ; les paquets Debian, les roues Python, les collections Ansible et les applications Nextcloud viennent du site. Et le pare-feu de Proxmox filtre devant chaque VM. Chaque flux déclare s’il est chiffré, et le registre des flux, généré, en fait la synthèse.</aside>
</section>