Mission : `docs/prompt-deploiement-paillasse.md`, étapes 1 à 16, exécutée du
2026-10-07 au 2026-10-12 sur la Dedibox `163.172.4.195` (Debian 12, Xeon
D-1531, 32 Go, RAID 1). Le détail de chaque étape (commandes, problèmes,
explications) est dans `docs/journal.md` ; ce document en est la synthèse.
## Ce qui fonctionne, avec la preuve de chaque critère
| Étape | Critère | Preuve (journal) |
|---|---|---|
| 1. Reconnaissance | Inventaire, KVM, version de Kolla justifiée | `docs/inventaire-serveur.md` ; `/dev/kvm` présent ; Kolla 2025.2, seule série maintenue qui supporte Debian 12 (ADR 0001) |
| 2. Durcissement | Clé OK, mot de passe et root refusés, seuls 22/80/443 | `Permission denied (publickey)` pour le mot de passe et pour root ; `nmap` depuis le Mac : 22 seul ouvert (80/443 autorisés, rien n'écoutait encore) |
| 3. Sauvegardes | Une sauvegarde envoyée, un fichier restauré | `quotidienne-20261007.tar.zst.age` présente sur Dedibackup ; `etc/hostname` restauré dans `/tmp` (`sd-124443`) |
| 4. Réseau OpenStack | Après redémarrage : SSH, `dummy0`, veth, Internet | Redémarrage 11:37, SSH 11:39 ; interfaces et IP présentes ; ping 9.9.9.9 et DNS OK ; RAID `[UU]` |
| 5. Kolla | Services OK, aucune API joignable de l'extérieur | `openstack service list` et `compute service list` OK ; `nmap` sur tous les ports OpenStack + 1-1024 : 22 seul |
| 7. Supervision | Une alerte de test reçue par Adam | Alerte injectée dans Alertmanager ; **reçue par Adam sur ntfy** |
| 8. Portail | Pest OK, élève fictif voit son tableau de bord | 11/11 tests ; `lea.m` connectée voit « Salut Léa » |
| 9. Console web | `ip a` dans le navigateur ; un autre élève refusé | Sortie de `ip a` par navigateur → Nginx → proxy Go → Nova ; autre élève : `403` ; écriture du prof ignorée côté serveur |
| 11. Stock et correction | <5s;correct→réussi;incorrect→échoué+message|4,06s(mesurepessimiste,voirétape13);«Pasencoreréussi»6/10aveclesmessagesdulab,puis«Réussi»10/10;3essaispuiséchecvisibleduprof,vérifiés|
| 12. HTTPS | Certificat valide, parcours prof → élève → lab → correction | Let's Encrypt, TLS 1.2/1.3, HSTS, CSP ; parcours en `https`/`wss` : 4,35 s, 6/10 puis 10/10 ; VM sans IP publique ni sortie |
| 13. Capacité et résistance | Chiffres écrits, restauration, retour seul après redémarrage | `docs/capacite.md` ; « RESTAURATION RÉUSSIE » (17 tables identiques) ; tout revenu seul en 11 min, parcours 10/10 ensuite ; ouverture mesurée à 2,80 / 2,85 / 2,85 s |
| 14. Légal et RGPD | Pages en ligne, purge prouvée par Pest | `/legal`, `/confidentialite` en 200, `/statut` → page de statut ; `PurgeRgpdTest` (5 tests) |
| 15. Visio | Prof + 2 élèves ; main levée → parole ; intrus refusé | Test Playwright à 3 navigateurs + intrus : « CRITÈRE DE L’ÉTAPE 15 : RÉUSSI » ; élève sans parole reste en sourdine ; intrus : « Authentication required » |
| 16. Nettoyage | Proposer le retrait de `90-adam` | Proposé avec ses conséquences ; **Adam a choisi de le garder jusqu'à la fin du bloc A** (voir risques) |
**État relevé le 2026-10-12 à la fin de la mission** : 0 unité systemd en
| 15 | 10-12 matin → 12:35 | une demi-journée | Pare-feu entre conteneurs (`br_netfilter`), rôles Jitsi |
| 16 et bilan | 10-12 après-midi | ≈ 1 h | — |
En tout : **six jours calendaires, dont environ quatre jours de travail**.
## Capacité mesurée
- **20 VM `eleve.petit` (1 vCPU, 768 Mo) en même temps**, sessions et stock chaud
compris : par exemple **une classe de 20 élèves** sur un lab à une VM, ou
**6 élèves** sur le lab 08 (3 VM chacun). Limite appliquée par Nova
(`reserved_host_memory_mb = 16500`) et par le portail (`LABS_CAPACITE_VM`).
- Pourquoi 20 : la mémoire est la limite (≈ 600 Mo par VM active, ≈ 250 Mo au
repos), pas le CPU (20 vCPU à 100 % → hôte à 89 %, correction en 0,6 s).
22 avant la visio, 20 depuis qu'1,5 Go est réservé à Jitsi.
- Ouverture d'un lab pris dans le stock : **2,8 s** (critère <5s).Lancement
à froid de 20 VM : 53 s en médiane, 75 s au p95. D'où le pré-remplissage
10 minutes avant une séance.
- Visio : non mesurée au-delà de 3 participants. Une classe de 30 en visio
est à tester au pilote (CPU de JVB, débit sortant).
Détails : `docs/capacite.md`.
## Dettes et risques connus
La liste complète, tenue à jour, est dans `docs/dette.md`. Les risques qui
comptent avant une vraie classe :
| Risque | Conséquence | Réponse |
|---|---|---|
| **Copie de la clé age non confirmée** | Si le serveur est perdu, aucune sauvegarde n'est déchiffrable | Adam (voir plus bas) |
| **Base OpenStack non sauvegardée** | Perte du serveur → projet, compte, gabarits et stacks à recréer à la main | `kolla-ansible mariadb_backup` dans la sauvegarde quotidienne |
| **Un seul serveur, pas de sonde extérieure** | Si le serveur tombe, aucune alerte, et la classe s'arrête | Sonde externe (à décider et commander par Adam) ; self-healing ne couvre pas la panne totale |
| **Visio sans TURN sur 443** | Sur un réseau scolaire qui bloque l'UDP : ni son ni image | coturn derrière 443 avant le pilote |
| **`sudo` sans mot de passe pour `adam`** | La clé SSH de Claude Code donne un accès root complet | Gardé par choix d'Adam jusqu'à la fin du bloc A ; retrait ensuite (commande prête ci-dessous) |
| Images Kuma non figée, Jitsi sans procédure de mise à jour | Mise à jour non testée au prochain redéploiement | Variables de version dans les rôles |
| Vitrine : Tailwind par CDN, scripts en ligne, Pyodide depuis jsDelivr | CSP de la vitrine moins stricte que celle de l'application | Compilation par Vite avant ouverture publique |
| Peu de vérifications dans un vrai navigateur | Hors visio et `/ide`, les pages n'ont été vérifiées qu'en HTML | Playwright est maintenant installé : l'étendre aux parcours clés |
| Kolla installé depuis une branche | Pas reproductible à l'identique | À régler lors de la montée de version |
Deux incidents de ma part, déjà traités : un secret d'application credential
de test affiché en clair (credential supprimée aussitôt) ; un déploiement en
échec pris pour un succès (règle depuis : toujours lire `PLAY RECAP`).
## Ce qu'Adam doit faire lui-même
**Secrets et sécurité**
1.**Copier la clé age hors du serveur et le prouver** : procédure dans