ajoute les alertes Prometheus du self-healing et installe Larastan (dette de l'étape 8, 72 erreurs corrigées à la racine)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-10-12 21:32:52 +02:00
parent f2649d0f8b
commit d47e8356fc
23 changed files with 340 additions and 22 deletions

View file

@ -8,7 +8,6 @@ retirer la ligne (et le noter dans le journal) quand c'est fait.
| **Image Uptime Kuma non figée** (`louislam/uptime-kuma:1`) | Une version différente peut arriver à n'importe quel redéploiement, sans test. Figer un tag précis (voire le digest) dans une variable du rôle `supervision`, et documenter la mise à jour par Ansible (changer la variable, relancer le rôle, vérifier) — jamais par le bouton de l'interface. Kuma lui-même qualifie ce tag d'« historique » (il injecte `docker-latest-warning.js` dans les images `latest`/`1`, constaté le 2026-10-09) : prévoir la migration vers un tag versionné, en testant la page de statut et les sondes. | Avant le pilote | Demande d'Adam, 2026-10-09 |
| Projet `paillasse`, compte `paillasse-service` et son rôle créés à la main (étape 6) | Pas rejouables par Ansible (gabarit et quota le sont depuis l'étape 13, rôle `openstack-projet`). | Bloc B | Étape 6 |
| Clé age des sauvegardes : copie hors du serveur non confirmée | Sans elle, aucune sauvegarde n'est déchiffrable si le serveur est perdu (voir `docs/runbooks/sauvegardes.md`). Adam doit confirmer l'avoir mise en lieu sûr. | Dès que possible | Étape 3 |
| Larastan (PHPStan niveau 6) absent | Exigé par le CLAUDE.md depuis l'étape 8, jamais installé. | Bloc B | Étape 8 |
| Vitrine : Tailwind par CDN d'exécution (`cdn.tailwindcss.com`, 19 pages) | Non destiné à la production selon Tailwind, lent, et oblige la vitrine à tolérer les scripts en ligne dans sa CSP. Compiler ces styles avec Vite. | Avant ouverture publique | Étape 12 (design) |
| Vitrine : 52 scripts en ligne ; Pyodide et sql.js depuis jsDelivr (`/ide`) ; vidéo YouTube possible (`/cours/…/cm`) | CSP vitrine avec `'unsafe-inline'` ; tiers déclarés dans `/confidentialite`. Polices, xterm.js et CodeMirror sont auto-hébergés depuis l'étape 14. Héberger Pyodide/sql.js, passer les scripts en fichiers. | Avant ouverture publique | Étapes 12 et 14 |
| xterm.js 5.5.0 (6.0.0 disponible) | Version majeure à évaluer séparément. | Bloc B | Étape 12 |

View file

@ -748,3 +748,28 @@ La vraie difficulté du self-healing n'est pas de détecter une panne, c'est de
**Suite**
Prochaines étapes du bloc A : TURN 443 pour la visio, sauvegarde OpenStack (fait le 2026-10-12), pilote avec une vraie classe. Pas de montée de version d'OpenStack (décision d'Adam : la 2025.2 reste en place).
## 2026-10-12 — Alerte Prometheus pour le self-healing, et Larastan (dette de l'étape 8)
**Alerte Prometheus**
- Trois règles ajoutées (`kolla/config/prometheus/alertes.rules`) : `VmPanneGenerale` (critique, 5 min), `VmIrreparable` (avertissement, 5 min), `VmSurveillanceArretee` (si `labs:surveiller-vm` ne publie plus sa métrique, comme `CertificatNonMesure`).
- Déployées par `kolla-ansible reconfigure --tags prometheus` (service systemd, survit à une coupure SSH) : correctif en route, le premier essai a échoué faute du `PATH` du venv Kolla dans l'environnement du service — même piège que l'étape 5 (« install-deps : No such file or directory 'ansible-galaxy' »), corrigé en ajoutant `PATH=/opt/kolla-venv/bin:...` à `systemd-run`.
- Vérifié : les 3 règles chargées (`/api/v1/rules`, toutes `health: ok`) ; `VmIrreparable` injectée via l'API d'Alertmanager (comme à l'étape 7), reçue en « active ». Confirmation de la notification ntfy par Adam à faire.
- Au passage : le nom d'utilisateur de l'API Prometheus/Alertmanager n'est pas `prometheus` mais `admin` (lu dans la config réelle du conteneur, `prometheus.yml`) — à corriger partout où le runbook `supervision.md` dirait le contraire.
**Larastan (dette de l'étape 8, jamais traitée depuis)**
- `larastan/larastan` ^3.0 installé, `phpstan.neon` (niveau 6, `app/` seulement — les tests ont leur propre style Pest, pas une exigence du CLAUDE.md).
- 72 erreurs au premier passage, 0 à la fin, sans aucune suppression (`@phpstan-ignore`, baseline, `@var`) : chaque défaut corrigé à la racine.
- **33 generics manquants** sur les relations Eloquent (`BelongsTo<Related, $this>`, etc.) et `HasFactory<...>` : mécanique, mais a mis en évidence 3 modèles (`LabSession`, `LabSessionMachine`, `Seance`) qui utilisaient `HasFactory` sans qu'aucune factory n'existe pour eux — trait mort, retiré.
- **14 `property.notFound`/`method.notFound`** : conséquence directe des generics manquants (une relation sans type précis rend tous ses modèles liés `Model` générique aux yeux de PHPStan) ; disparues une fois les generics posés.
- **Vrai bug trouvé** (`StockChaud::estUtilisable`) : la signature `array{nom: string, id: string}` ne déclarait pas la clé `instances`, pourtant testée par le même `isset()` — PHPStan jugeait ce test « toujours vrai » sur les deux clés déclarées et « sur une clé inexistante » sur la troisième. La vraie origine du doute (une valeur décodée du JSON de Redis, donc jamais garantie par le type) a été redonnée à la signature (`array<string, mixed>|null`), avec un contrôle de type explicite sur `nom`/`id` : les `isset()` redeviennent un vrai rempart, pas une façade.
- **`Redis::eval()`/`Redis::lrem()` mal typés par la façade** : la classe que la façade Laravel donne à lire à PHPStan (`Illuminate\Redis\Connections\Connection`, abstraite) porte elle-même `@mixin \Redis` (l'extension native), jamais la classe réellement choisie à l'exécution (`PhpRedisConnection`, qui réordonne les arguments) — un angle mort documenté de Laravel/Larastan, pas un bug de Syllabus. Contourné en appelant `Redis::command('eval'|'lrem', [...])` directement (méthode réelle, pas un mixin), avec les arguments dans l'ordre que `PhpRedisConnection` leur donnerait — même effet, correctement typé.
- Une fermeture de `CreerStackLab` retournait le booléen de `->save()` là où `FabriqueStack::fabriquer()` attendait une fermeture `void` : changée en bloc explicite.
- Vérifié : `./vendor/bin/phpstan analyse` → 0 erreur ; Pint → aucun changement ; 54 tests Pest toujours au vert.
- Dette retirée.
**Comprendre**
La plupart des 72 erreurs venaient d'une seule cause répétée dix fois (des relations Eloquent sans generics), pas de dix bugs différents — las de ça, régler la cause réelle (les generics) a fait disparaître les trois quarts du travail d'un coup. Les erreurs qui restaient ensuite étaient plus intéressantes : deux ne venaient pas du code de Syllabus mais d'une imprécision des annotations de Laravel lui-même sur sa façade Redis, et une révélait un vrai défaut (une signature de type qui en disait moins que ce que le code vérifiait vraiment). La règle du prompt (« ne jamais juste faire taire l'outil ») a forcé à distinguer ces trois cas plutôt qu'à tout traiter de la même façon.