docs(handoff): handoff sujet-scoppé installateur/MAJ/GPO — 2026-07-07
Some checks failed
tests / Lint (ruff + black) (push) Failing after 1m55s
tests / Tests unitaires (sans GPU) (push) Failing after 1m58s
tests / Tests sécurité (critique) (push) Has been skipped

Handoff auto-suffisant pour reprise parallèle du sujet installateur Léa
(install silencieuse dashboard + MAJ AD/GPO + procédure), isolé des autres
sujets. Sans secrets (renvois reference_credentials). Réf commit 48b1fc280.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-07-07 16:15:54 +02:00
parent 48b1fc2800
commit 6c258462ea

View File

@@ -0,0 +1,114 @@
# HANDOFF — Installateur Léa : install silencieuse + MAJ + déploiement AD/GPO
> **Handoff sujet-scoppé** (pour travail parallèle multi-agents). Portée = UNIQUEMENT
> l'installateur/MAJ/déploiement des clients Léa. NE couvre PAS le cœur v1 (ORALoop),
> R1/apprentissage, fusion sémantique — ces sujets ont leurs propres fils.
> Date : 2026-07-07. Un agent doit pouvoir reprendre ce sujet avec ce seul fichier.
> ⚠️ Aucun secret ici (fichier versionné/poussé gitea) — creds : voir §Infra.
## 0. Cap (rappel)
POC clinique Wallerstein : 5 postes Léa (TIM, logiciels métier web/RDP/Citrix, 2 écrans).
Ce sujet = **industrialiser l'install et la MAJ de l'agent client Léa** sans casser
l'enrôlement (identité par poste). L'installeur EXE `Lea-Setup-v1.0.2.exe` est
**per-user, upgrade-safe** (préserve `machine_id` + config, tue Léa, backup, purge).
## 1. Statut : ✅ LIVRÉ + DÉPLOYÉ cette session
Commit **`48b1fc280`** sur `feat/push-log-dgx` (**poussé gitea**, et route greffée sur la prod DGX).
| Livrable | Fichier | État |
|---|---|---|
| Install silencieuse **nouveau poste** (dashboard) | route `GET /api/fleet/installer` dans `web_dashboard/app.py` | ✅ **live + vérifiée sur DGX** (200, sert le ZIP) |
| Lanceur d'install manuel | `deploy/installer/silent/install_silencieux.bat` (+ `enroll.txt`, `LISEZMOI_SILENCIEUX.txt`) | ✅ **validé sur poste réel .11** (RC=0, upgrade-safe) |
| **MAJ via AD/GPO** | `deploy/gpo/Deploy-LeaUpdate.ps1` | ✅ **validé sur .11** (PS 5.1, 2 branches, DryRun) |
| Procédure opérateur | `docs/PROCEDURE_DEPLOIEMENT_LEA_JULIEN.md` | ✅ |
| EXE distribué | `deploy/installer/releases/Lea-Setup-v1.0.2.exe` (SHA256 `07105c4bd446…e36b520`, 24 896 371 o) | ✅ sur DGX (non versionné, `.gitignore`) |
## 2. Architecture — 2 voies DISTINCTES (ne pas confondre)
- **Install NEUVE** (poste sans Léa) → **dashboard, MANUELLE** : opérateur télécharge
`GET /api/fleet/installer` → ZIP `Lea-Install-Silencieux-vX.Y.Z.zip` {EXE +
`install_silencieux.bat` + `enroll.txt` (SERVER_URL+token pré-injectés par
`_resolve_public_server_url` + `RPA_API_TOKEN`) + LISEZMOI}. Remplir USER_NAME/EMAIL,
double-clic. L'EXE **génère un machine_id neuf** → pas de pré-enregistrement.
« Silencieuse » = sans fenêtre d'assistant (`/VERYSILENT`), **pas** « via GPO ».
- **MAJ d'un poste EXISTANT** → **AD/GPO, AUTOMATIQUE** : `Deploy-LeaUpdate.ps1`.
### Points d'archi non négociables (vérifiés en réel)
1. **Install PER-USER** (`PrivilegesRequired=lowest`, dossier `%LOCALAPPDATA%\Programs\Lea`,
clé désinstall sous **HKCU**) ⇒ le script GPO **DOIT** être un **Logon script
(User Configuration), contexte UTILISATEUR** — jamais Computer/Startup (SYSTEM ne
voit ni l'install per-user ni HKCU → ne mettrait rien à jour).
2. **Détection de version = `DisplayVersion` du registre HKCU** (clé Inno
`{B3F9A1E2-5C4D-4E7F-9A1B-2C3D4E5F6789}_is1`). Le `config.txt` généré par l'EXE
**ne contient PAS** la version (vérifié sur .11) ; fallback `RPA_AGENT_VERSION`
= installs via ZIP seulement.
3. Comparaison **semver** (piège `1.0.2 < 1.0.10`). `Deploy-LeaUpdate.ps1` : idempotent,
journalisation best-effort **silencieuse** (`-ErrorAction SilentlyContinue` — un
`try/catch` ne capture PAS les erreurs non-terminantes d'un partage injoignable),
non bloquant à l'ouverture de session. Options : `-DryRun`,
`-TargetVersionOverride`, `-LogShareOverride`.
4. Voie ZIP/Python historique (`download_agent_package`, `deploy/lea_package/`) =
séparée, ne pas la confondre avec la voie EXE.
## 3. Reste à faire (par ordre logique)
- **A. Mise en place réelle de la GPO dans le domaine clinique** (dépend DSI **Nicolas
Porquet**) : créer un **partage** `\\<serveur>\...\Lea\` (y déposer l'EXE), configurer
la **GPO Logon script** pointant sur `Deploy-LeaUpdate.ps1` (éditer les 3 params en
tête : `$ExeSource`, `$TargetVersion`, `$LogShare`), tester. → *Ce qu'un agent peut
produire : un **doc/pack de mise en place GPO dédié au DSI** (partage + import GPO +
test DryRun).*
- **B. (optionnel, CHANTIER NEUF) Install NEUVE aussi via AD/GPO** : aujourd'hui la
nouvelle install passe par le dashboard manuel. Si Dom veut que les nouveaux postes
se déploient par GPO → à construire (déploiement EXE + enroll/token par poste,
machine_id). **Non fait.**
- **C.** Valider `install_silencieux.bat` au **1er vrai poste neuf** (Dom) — cf.
option 1 du plan de validation.
- **D.** MAJ manuelle des **4 postes restants** (Dom + Julien) via l'EXE en double-clic
(upgrade-safe). Émilie (poste pilote) = déjà en 1.0.2.
- **E.** Réconciliation DGX (distinct) — voir §Infra.
## 4. Infra & accès (creds = NON écrits ici)
- **DGX clinique** : `aivanov@192.168.1.178` (VPN Stormshield, route /32 .178 ;
`.45` legacy). Repo runtime `/home/aivanov/ai/rpa_vision_v3`, venv **`venv_v3`**.
Dashboard :5001 = **service systemd SYSTEM** `rpa-vision-v3-dashboard.service`
**restart = `sudo systemctl restart` (mot de passe aivanov requis, pas de NOPASS)**.
Détail + état branche : mémoire `reference_dgx_runtime_repo_state`.
⚠️ Branche locale DGX nommée `poc-dgx` mais sur **lignée `feat/push-log-dgx`**
(`3ed9798` = ancêtre du tip gitea `c371c977`) → **pas divergente, juste en retard +
working tree sale** (workflows.db, learned_workflow_bridge.py, app.py greffé à
préserver). Réconciliation = fast-forward + préserver ces fichiers.
- **Poste Windows labo `.11`** (`DESKTOP-58D5CAC`) : source de l'EXE
`C:\lea_build\releases\Lea-Setup-v1.0.2.exe`. SSH par **password** (user `dom`) —
le cert MCP est cassé (`public_blob`), forcer
`-o PubkeyAuthentication=no -o PreferredAuthentications=password` (+ `sshpass`).
MCP `ssh-windows` corrigé (`SSH_AUTH_SOCK=""` ajouté à `~/.claude.json`) → **effectif
au prochain restart de Claude Code**.
- **gitea** : `http://localhost:3100/Dom/rpa_vision_v3.git` (sur le poste dev .40),
remote local nommé `gitea`, auth via helper `store`. `feat/push-log-dgx` = à jour
(`48b1fc280`). Auth dashboard = Basic (creds `DASHBOARD_USER`/`DASHBOARD_PASSWORD`
dans `.env.local` DGX). **Tous les creds** : mémoire `reference_credentials` /
demander à Dom.
## 5. Comment reprendre / re-vérifier (sans secrets)
- Route dashboard live (DGX, depuis la DGX) :
`curl -s -u "$U:$P" http://localhost:5001/api/fleet/installer`
`200` + ZIP si l'EXE est dans `releases/`, sinon `404` « EXE introuvable » (creds `$U/$P` = `.env.local`).
- Test GPO **sans rien installer** (sur un poste avec Léa) :
`powershell -NoProfile -ExecutionPolicy Bypass -File Deploy-LeaUpdate.ps1 -DryRun`
→ journalise « déjà à jour » ou « [DryRun] MAJ qui SERAIT appliquée ».
- Intégrité EXE : SHA256 attendu `07105c4bd446dded1dbdb0acaf337a38814e4760aa9361f5a7d4051a4e36b520`.
## 6. Pièges appris (gain de temps)
- **Escaping 4 couches** (bash→ssh→cmd→PowerShell) casse silencieusement → toujours
**uploader un `.ps1` et l'exécuter avec `-File`**, jamais du PowerShell inline complexe.
- **zsh ne word-split PAS** une variable non-quotée → mettre les options `-o …` de
ssh/scp **inline**, pas dans `$OPT`.
- **py_compile ne détecte que la syntaxe** — pour l'app.py DGX, valider aussi que la
route répond (404 propre) après restart + attendre ~1-5 s que le port 5001 écoute.
- Le test réel a rapporté **2 bugs** invisibles en test Linux (détection version
registre, erreur non-terminante) → sur ce sujet, **toujours valider sur un vrai
poste Windows** (`.11`).
## 7. Liens mémoire
`reference_dgx_runtime_repo_state` · `project_session_20260701_exe_emilie_v102` ·
`reference_windows_pc` · `reference_credentials` · `feedback_verify_physical_artifact_deploy` ·
`feedback_smoke_plus_reel`. Tableau d'avancement : `docs/TABLEAU_BORD_CHANTIERS_POC.md`.