nuage de tags sur la liste, suppression dropdown navbar, rôles/droits sur le profil

This commit is contained in:
Cedric Abonnel
2026-05-12 20:07:33 +02:00
parent 1d2e3d9a24
commit 6e438835f8
3470 changed files with 97124 additions and 109 deletions
@@ -0,0 +1,106 @@
<svg width="100%" viewBox="0 0 1210 640" role="img" xmlns="http://www.w3.org/2000/svg" style="">
<title style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Couverture d'article Webmin — Article par Cédrix pour A5L</title>
<desc style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Couverture au format Open Graph 1200x630 reprenant le logo Webmin (toile d'araignée stylisée et araignée bleue) sur fond clair, avec le titre Webmin et la signature « Article par Cédrix pour A5L ».</desc>
<defs>
<radialGradient id="bgGrad" cx="35%" cy="45%" r="75%">
<stop offset="0%" stop-color="#ffffff"/>
<stop offset="100%" stop-color="#eaf2fb"/>
</radialGradient>
<linearGradient id="bodyGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#2b7fd6"/>
<stop offset="100%" stop-color="#1559a8"/>
</linearGradient>
<linearGradient id="headGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#3a8fe0"/>
<stop offset="100%" stop-color="#1d68c0"/>
</linearGradient>
</defs>
<!-- Fond clair -->
<rect width="1200" height="630" fill="url(#bgGrad)" style="stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Liseré bleu fin en bas -->
<rect x="0" y="618" width="1200" height="12" fill="#1559a8" style="fill:rgb(21, 89, 168);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- === LOGO WEBMIN : toile d'araignée + araignée === -->
<!-- Toile centrée à gauche, ancrée en haut à gauche -->
<g transform="translate(360 315)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<!-- Rayons de la toile (8 rayons partant du coin supérieur gauche conceptuel) -->
<g stroke="#1559a8" stroke-width="2.2" stroke-linecap="round" fill="none" opacity="0.85" style="fill:none;stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:miter;opacity:0.85;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<line x1="0" y1="0" x2="230" y2="0" style="fill:none;stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="0" x2="218" y2="75" style="fill:none;stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="0" x2="190" y2="140" style="fill:none;stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="0" x2="140" y2="195" style="fill:none;stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="0" x2="75" y2="220" style="fill:none;stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="0" x2="0" y2="230" style="fill:none;stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="0" x2="-75" y2="220" style="fill:none;stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<line x1="0" y1="0" x2="-140" y2="195" style="fill:none;stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:2.2px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
<!-- Arcs concentriques de la toile (quart de cercle bas-droit + bas-gauche) -->
<g stroke="#2b7fd6" stroke-width="1.8" fill="none" opacity="0.9" style="fill:none;stroke:rgb(43, 127, 214);color:rgb(0, 0, 0);stroke-width:1.8px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.9;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<path d="M -55 0 A 55 55 0 0 0 55 0 M 0 -55 A 55 55 0 0 0 0 55" stroke="none" style="fill:none;stroke:none;color:rgb(0, 0, 0);stroke-width:1.8px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M 60 0 A 60 60 0 0 1 -60 0" style="fill:none;stroke:rgb(43, 127, 214);color:rgb(0, 0, 0);stroke-width:1.8px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M 110 0 A 110 110 0 0 1 -110 0" style="fill:none;stroke:rgb(43, 127, 214);color:rgb(0, 0, 0);stroke-width:1.8px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M 165 0 A 165 165 0 0 1 -165 0" style="fill:none;stroke:rgb(43, 127, 214);color:rgb(0, 0, 0);stroke-width:1.8px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M 220 0 A 220 220 0 0 1 -150 162" style="fill:none;stroke:rgb(43, 127, 214);color:rgb(0, 0, 0);stroke-width:1.8px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
<!-- Centre de la toile : petit nœud -->
<circle cx="0" cy="0" r="5" fill="#1559a8" style="fill:rgb(21, 89, 168);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- === ARAIGNÉE === position décalée sur la toile -->
<g transform="translate(70 105)" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<!-- Pattes (4 de chaque côté) -->
<g stroke="url(#bodyGrad)" stroke-width="3.5" fill="none" stroke-linecap="round" style="fill:none;color:rgb(0, 0, 0);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<!-- Côté gauche -->
<path d="M -8 -4 Q -45 -35 -70 -55" style="fill:none;color:rgb(0, 0, 0);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M -10 0 Q -55 -10 -80 -15" style="fill:none;color:rgb(0, 0, 0);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M -10 6 Q -55 18 -82 22" style="fill:none;color:rgb(0, 0, 0);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M -8 12 Q -45 40 -65 60" style="fill:none;color:rgb(0, 0, 0);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Côté droit -->
<path d="M 8 -4 Q 45 -35 70 -55" style="fill:none;color:rgb(0, 0, 0);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M 10 0 Q 55 -10 80 -15" style="fill:none;color:rgb(0, 0, 0);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M 10 6 Q 55 18 82 22" style="fill:none;color:rgb(0, 0, 0);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<path d="M 8 12 Q 45 40 65 60" style="fill:none;color:rgb(0, 0, 0);stroke-width:3.5px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
<!-- Abdomen (corps principal, ovale) -->
<ellipse cx="0" cy="6" rx="20" ry="26" fill="url(#bodyGrad)" style="stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Reflet subtil sur l'abdomen -->
<ellipse cx="-6" cy="-2" rx="6" ry="10" fill="#ffffff" opacity="0.18" style="fill:rgb(255, 255, 255);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:0.18;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Tête (céphalothorax) -->
<circle cx="0" cy="-18" r="13" fill="url(#headGrad)" style="stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Yeux -->
<circle cx="-5" cy="-20" r="2.4" fill="#ffffff" style="fill:rgb(255, 255, 255);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="5" cy="-20" r="2.4" fill="#ffffff" style="fill:rgb(255, 255, 255);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="-5" cy="-20" r="1.1" fill="#0d3f7a" style="fill:rgb(13, 63, 122);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<circle cx="5" cy="-20" r="1.1" fill="#0d3f7a" style="fill:rgb(13, 63, 122);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
</g>
</g>
<!-- === TYPOGRAPHIE === -->
<!-- Étiquette catégorie -->
<text x="700" y="225" font-family="Inter, 'Helvetica Neue', Arial, sans-serif" font-size="22" font-weight="500" fill="#1559a8" letter-spacing="3" style="fill:rgb(21, 89, 168);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Inter, &quot;Helvetica Neue&quot;, Arial, sans-serif;font-size:22px;font-weight:500;text-anchor:start;dominant-baseline:auto">ADMINISTRATION SYSTÈME</text>
<!-- Titre principal -->
<text x="700" y="310" font-family="Inter, 'Helvetica Neue', Arial, sans-serif" font-size="96" font-weight="700" fill="#0d2a4f" style="fill:rgb(13, 42, 79);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Inter, &quot;Helvetica Neue&quot;, Arial, sans-serif;font-size:96px;font-weight:700;text-anchor:start;dominant-baseline:auto">Webmin</text>
<!-- Sous-titre -->
<text x="700" y="365" font-family="Inter, 'Helvetica Neue', Arial, sans-serif" font-size="26" font-weight="400" fill="#3d5878" style="fill:rgb(61, 88, 120);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Inter, &quot;Helvetica Neue&quot;, Arial, sans-serif;font-size:26px;font-weight:400;text-anchor:start;dominant-baseline:auto">Panneau d'administration web pour Linux</text>
<!-- Trait séparateur -->
<line x1="700" y1="410" x2="800" y2="410" stroke="#1559a8" stroke-width="3" stroke-linecap="round" style="fill:rgb(0, 0, 0);stroke:rgb(21, 89, 168);color:rgb(0, 0, 0);stroke-width:3px;stroke-linecap:round;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<!-- Signature -->
<text x="700" y="465" font-family="Inter, 'Helvetica Neue', Arial, sans-serif" font-size="22" font-weight="500" fill="#1559a8" style="fill:rgb(21, 89, 168);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Inter, &quot;Helvetica Neue&quot;, Arial, sans-serif;font-size:22px;font-weight:500;text-anchor:start;dominant-baseline:auto">Article par Cédrix</text>
<text x="700" y="498" font-family="Inter, 'Helvetica Neue', Arial, sans-serif" font-size="22" font-weight="400" fill="#3d5878" style="fill:rgb(61, 88, 120);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Inter, &quot;Helvetica Neue&quot;, Arial, sans-serif;font-size:22px;font-weight:400;text-anchor:start;dominant-baseline:auto">pour A5L</text>
<!-- Petit point d'accent en bas à droite -->
<circle cx="1140" cy="585" r="5" fill="#1559a8" style="fill:rgb(21, 89, 168);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="1115" y="592" font-family="Inter, 'Helvetica Neue', Arial, sans-serif" font-size="14" font-weight="400" fill="#3d5878" text-anchor="end" style="fill:rgb(61, 88, 120);stroke:none;color:rgb(0, 0, 0);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:Inter, &quot;Helvetica Neue&quot;, Arial, sans-serif;font-size:14px;font-weight:400;text-anchor:end;dominant-baseline:auto">a5l.fr</text>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

@@ -0,0 +1,95 @@
Quand on monte un nouveau serveur, les premières heures sont toujours les mêmes : on durcit la machine, on crée un utilisateur correct, on coupe ce qui traîne, et on met en place de quoi l'administrer sans avoir à ouvrir un terminal pour chaque détail. Cet article décrit la procédure que j'utilise sur mes Debian fraîches : préparation via mes scripts, installation de Webmin, et activation de `firewalld` pour ne laisser passer que ce qui doit l'être.
L'idée n'est pas de transformer le serveur en sapin de Noël, mais d'avoir une base saine sur laquelle bâtir, qu'il s'agisse d'expérimenter dans un LXC ou de préparer une VM destinée à recevoir une vraie charge.
## Étape 1 — Préparer la machine
Sur une Debian neuve, on commence par récupérer un petit script qui en télécharge d'autres. C'est juste un point d'entrée : il va chercher dans mon dépôt Forgejo un ensemble de scripts d'initialisation que je maintiens à jour.
```bash
wget -O fetch_scripts.sh https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/branch/main/scripts/fetch_scripts.sh
chmod +x fetch_scripts.sh
./fetch_scripts.sh
```
À ce stade, un dossier `common/` apparaît à côté du script. C'est là que se trouve le vrai travail :
```bash
cd common/
./setup_debian.sh
```
`setup_debian.sh` fait ce qu'on a tous fini par écrire un jour : mise à jour des paquets, installation des outils de base, création d'un utilisateur non-root avec les bons droits sudo, durcissement minimal de SSH. Rien de magique, mais c'est répétable et c'est ce qui compte quand on provisionne souvent.
**Important** : une fois le script terminé, il faut se déconnecter de la session `root` et se reconnecter avec l'utilisateur que le script vient de créer. Tout ce qui suit se fait avec cet utilisateur, en passant par `sudo` quand nécessaire. Continuer en root est une mauvaise habitude qui finit toujours par se payer.
## Étape 2 — Installer Webmin
Webmin est une interface web d'administration système. Pour quelqu'un qui débute, c'est une porte d'entrée appréciable : on voit les services qui tournent, les utilisateurs, les paquets installés, les logs, le tout depuis un navigateur. Pour quelqu'un d'expérimenté, c'est un complément pratique quand on veut donner un accès limité à un collègue moins à l'aise en ligne de commande.
Webmin fournit son propre script pour configurer le dépôt apt :
```bash
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.sh
```
Ce script ajoute le dépôt officiel Webmin à la liste des sources apt et importe la clé GPG associée. Une fois fait, l'installation devient une commande apt classique :
```bash
sudo apt-get install webmin usermin --install-recommends
```
Petite précision sur les deux paquets : **Webmin** sert à l'administration système (root ou utilisateur sudo), **Usermin** est sa version pour les utilisateurs standards, qui leur permet de gérer leur propre compte, leurs mails, leurs fichiers, sans toucher au système. Sur une machine mono-utilisateur, on peut se passer d'Usermin, mais l'installer maintenant coûte trois mégaoctets et évite d'y revenir plus tard.
## Étape 3 — Se connecter à l'interface
Webmin écoute par défaut sur le port **10000** en HTTPS. Depuis un navigateur :
```
https://<ip-du-serveur>:10000
```
`<ip-du-serveur>` est à remplacer par l'adresse de la machine. Le navigateur va râler à propos du certificat — c'est normal, Webmin génère un certificat auto-signé à l'installation. On peut accepter l'avertissement pour l'instant ; si la machine est destinée à un usage durable, on remplacera ça plus tard par un vrai certificat (Let's Encrypt via un reverse proxy, par exemple).
Pour la connexion, **on utilise les identifiants Linux de l'utilisateur sudo**, pas un compte spécifique à Webmin. C'est l'utilisateur que `setup_debian.sh` a créé à l'étape 1. Webmin s'appuie sur PAM, donc tout compte système autorisé à se connecter peut potentiellement entrer — d'où l'importance de l'étape suivante.
## Étape 4 — Activer le pare-feu
Une machine accessible sur internet sans pare-feu, c'est une question de temps avant les premiers ennuis. Sur Debian, je préfère `firewalld` à `ufw` ou à la configuration brute de `nftables` : la notion de zones est pratique, la syntaxe se retient, et l'intégration avec Webmin est correcte.
Installation et activation :
```bash
sudo apt update
sudo apt install firewalld
sudo systemctl enable firewalld
sudo systemctl start firewalld
```
`enable` rend le service persistant au redémarrage, `start` le lance immédiatement. Vérification :
```bash
sudo firewall-cmd --state
```
Le retour attendu est `running`. Si c'est autre chose, `systemctl status firewalld` permet de comprendre ce qui coince — c'est souvent un conflit avec un autre service de filtrage déjà en place.
À ce stade, le pare-feu tourne mais avec une configuration par défaut qui, selon la zone active, peut bloquer Webmin. Il faut donc explicitement autoriser le port 10000 :
```bash
sudo firewall-cmd --add-port=10000/tcp --permanent
sudo firewall-cmd --reload
```
Le `--permanent` écrit la règle dans la configuration ; sans ça, elle disparaît au prochain redémarrage. Le `reload` recharge la configuration pour que la règle prenne effet immédiatement. C'est l'erreur classique : on ajoute une règle, on continue à ne pas pouvoir se connecter, on perd dix minutes avant de se rappeler du `reload`.
## Pour aller plus loin
Une fois cette base en place, plusieurs directions s'offrent selon le rôle de la machine.
Si elle est destinée à héberger un service web public, l'étape logique suivante consiste à placer Webmin **derrière un reverse proxy** plutôt que de l'exposer directement sur le port 10000. Le port 10000 est alors fermé vers l'extérieur, et l'interface devient accessible via un sous-domaine en HTTPS avec un vrai certificat. C'est plus propre, plus sûr, et ça évite l'avertissement de certificat à chaque connexion.
Si la machine est un serveur d'applications, autant profiter du fait que `firewalld` est en place pour réfléchir aux ports en amont. Mieux vaut décider tout de suite quelles applications écoutent où, plutôt que d'empiler les `--add-port` au fil de l'eau et de finir avec une configuration que plus personne ne comprend.
Et dans tous les cas, **garder une trace écrite** des choix faits : quels ports ouverts, quel utilisateur sudo, quelle convention de nommage. Un fichier `README.md` à la racine du home de l'admin, peu importe le support — l'important c'est que dans six mois, on puisse retrouver le fil sans avoir à tout rétro-ingénierer.
@@ -0,0 +1,27 @@
{
"uuid": "7cf4eff3-2bab-4f2e-8982-247c89f7ca16",
"slug": "installer-webmin-l-outil-d-administration-en-mode-web",
"title": "Mettre en place un serveur Debian administrable avec Webmin",
"author": "cedric@abonnel.fr",
"published": true,
"published_at": "2025-11-13 11:57",
"created_at": "2025-11-13 11:57:05",
"updated_at": "2026-05-12 10:48:26",
"revisions": [],
"cover": "cover.svg",
"files_meta": {
"11f42517bdead1c0-18569.svg": {
"author": "Cédrix / Générée par IA",
"source_url": ""
},
"cover.svg": {
"author": "Cédrix / Générée par IA",
"source_url": ""
}
},
"external_links": [],
"seo_title": "Sécuriser une Debian fraîche : Webmin et firewalld pas à pas",
"seo_description": "Procédure complète pour sécuriser une Debian fraîche : préparation via scripts, installation de Webmin et configuration de firewalld. Guide pas à pas.",
"og_image": "",
"category": "linux"
}