Thème
Déploiement — Superviseur
Scripts et ressources pour compiler, packager et générer l'installateur Windows de la solution.
Prérequis sur la machine de build
| Outil | Requis | Notes |
|---|---|---|
| .NET 9 SDK | Oui | Pour compiler backend, client, manager |
| Node.js 20.19+ ou 22.12+ | Oui | Pour compiler le frontend Vue (voir engines dans vue/package.json) |
| Inno Setup 6 | Oui | Pour générer l'installateur .exe |
| Internet | Recommandé | Pour télécharger WebView2 automatiquement |
Inno Setup 6 : C:\Program Files (x86)\Inno Setup 6\ ou %LocalAppData%\Programs\Inno Setup 6\
Lancer le build
powershell
cd deployment
.\build-all.ps1Options :
| Option | Effet |
|---|---|
-SkipFrontend | Saute la construction Vue, utile si le frontend est inchangé |
-SkipWebView2 | Saute le téléchargement du runtime WebView2 (~150 Mo) |
-SkipPostgreSQL | Saute la copie des binaires PostgreSQL portables |
-RequireSigning | Refuse de produire un installateur non signé, et sort avant toute compilation si aucun certificat n'est configuré |
Sans -RequireSigning, un build sans certificat affiche un avertissement puis se termine par « SUCCESS » : un livrable non signé est alors facile à ne pas remarquer.
Étapes du build
| # | Étape | Description |
|---|---|---|
| 0 | Contrôles de déploiement | 58 contrôles Pester de deployment.tests.ps1 — cohérence des versions entre app.config.json, les manifestes et le changelog, remplacement des marqueurs de setup.iss, dépendance du service à PostgreSQL, installation à l'échelle de la machine. Un échec interrompt le build ; Pester absent, l'étape est ignorée |
| 1 | Génération setup.iss | Depuis app.config.json via generate-setup.ps1 |
| 2 | Nettoyage | Suppression de staging/ et Installer/ |
| 3 | Compilation | Backend, Client, Manager (autonomes), Frontend (npm run build) ; signature Authenticode horodatée des binaires et de l'installateur si un certificat est configuré |
| 3b | WebView2 | Téléchargement du runtime Standalone depuis Microsoft (optionnel, ~150 Mo) |
| 3c | PostgreSQL | Copie des binaires PostgreSQL portables dans staging/pgsql/ |
| 3d | Outil de licences | Publication en fichier unique dans staging/license-tool/ — hors installateur |
| 4 | Installateur | Génération via Inno Setup → Installer/Superviseur-Setup-<version>.exe |
| 5 | Résumé | Tailles des artefacts produits |
Mécanismes non évidents
Le build réécrit les manifestes de version
Avant toute compilation, build-all.ps1 lit AppVersion dans app.config.json et réaligne en place les fichiers qui portent une version en dur :
| Fichier | Champ réécrit |
|---|---|
vue/package.json | "version" |
dotnet/backend/backend.csproj | <Version> |
dotnet/manager/ServiceManager.csproj | <Version> |
Ces manifestes ne commandent rien — la ligne de publication passe -p:Version — mais les contrôles de l'étape 0 les confrontent à app.config.json. Le réalignement évite qu'une version oubliée dans l'un d'eux arrête le build. Corollaire : ces trois fichiers ne s'éditent pas à la main pour changer de version, app.config.json faisant seul foi, et un build laisse un dépôt modifié.
La signature de code est pilotée par variables d'environnement
| Variable | Effet |
|---|---|
SUPERVISEUR_CODESIGN_THUMBPRINT | Empreinte SHA-1 d'un certificat du magasin — signtool /sha1 |
SUPERVISEUR_CODESIGN_PFX | Chemin d'un fichier .pfx — signtool /f |
SUPERVISEUR_CODESIGN_PFX_PASSWORD | Mot de passe du .pfx, facultatif |
Horodatage RFC 3161 systématique, empreinte SHA-256. signtool.exe est cherché dans le PATH, puis dans le SDK Windows 10/11.
Le runtime C de Visual C++ est embarqué à la main
La distribution PostgreSQL ne livre pas le runtime dont tous ses exécutables dépendent. Le build le prend dans le dossier redistribuable de Visual Studio et le dépose auprès des binaires ; un contrôle de l'étape 0 vérifie sa présence.
Artefacts produits
staging/
├── backend/ Superviseur-Service.exe (autonome)
│ app.config.json, appsettings*.json, wwwroot/
├── client/ Superviseur.exe (autonome), wwwroot/
├── manager/ Superviseur-ServiceManager.exe (autonome)
├── license-tool/ Superviseur-Licences.exe — INTERNE, jamais livré
├── pgsql/ Binaires PostgreSQL portables (si non sauté)
└── webview2/ MicrosoftEdgeWebView2RuntimeInstallerX64.exe (si téléchargé)
Installer/
└── Superviseur-Setup-<version>.exe ← Installateur final livrable
staging/etInstaller/sont gitignorés.
Ce que fait l'installateur chez le client
- Fermeture automatique des instances en cours (
taskkill /f, arrêt service) - Copie des fichiers dans
C:\Program Files\Superviseur\ - Installation silencieuse de WebView2 (si embarqué dans l'installateur)
- PostgreSQL embarqué : initialisation de la base (
initdb), enregistrement du serviceSuperviseur-Service-PostgreSQL, création du rôle applicatif et de la base (mot de passe dérivé du secret applicatif). Une mise à jour préserve la base existante. - Certificat HTTPS : génération d'un certificat auto-signé (CN=localhost), installation dans le magasin racine de confiance de la machine (pour un accès navigateur local), et écriture de son chemin/mot de passe dans
appsettings.Crypto.prod.json(provision-https-cert.ps1). Le client de bureau accorde par ailleurs sa confiance au certificat directement pour la boucle locale (WebView2), sans dépendre du magasin racine. En cas d'échec, le service retombe sur un certificat auto-signé généré en mémoire. - Création du service Windows
Superviseur-Service(démarrage auto, redémarrage auto sur crash) - Raccourcis bureau et menu Démarrer
- Registre : démarrage automatique du gestionnaire à l'ouverture de session
Données utilisateur — jamais modifiées par l'installateur
Stockées dans C:\ProgramData\Superviseur\ :
pgdata/— cluster PostgreSQL embarqué (centrales, utilisateurs, logs, plans)logs/— journaux du serviceUploads/— images de plans interactifs
Une mise à jour par-dessus une installation existante préserve toutes ces données.
Désinstallation
Panneau de configuration → Programmes → Superviseur → DésinstallerL'installateur ferme l'application, supprime le service et les fichiers programme. C:\ProgramData\Superviseur\ est conservé pour permettre une réinstallation sans perte.
Fichiers de configuration
| Fichier | Rôle | Versionné |
|---|---|---|
app.config.json | Noms, version, éditeur et contacts, service Windows, port, configuration de l'installateur, marques, paramètres PostgreSQL, chemins de données | Oui |
backend/appsettings.json | Config runtime ASP.NET (Jwt, Auth, Https, logs, polling) | Oui |
backend/appsettings.Crypto.prod.json | Clés revendeurs. Le SuperAdminPassword en est neutralisé au staging : il est saisi à l'installation. Scellé au premier démarrage en appsettings.Crypto.prod.protected (DPAPI, portée machine) puis supprimé | Non (gitignored) |
appsettings.Crypto.prod.jsondoit être présent dansbackend/au moment dudotnet publish— il est inclus automatiquement dans le build.
Le SDK .NET embarque tous les appsettings*.json à la publication : build-all.ps1 retire donc explicitement du staging tout fichier appsettings.Crypto.* autre que le prod, les fichiers dev portant de vraies clés revendeurs en clair.
Contraintes actives
| Contrainte | Conséquence si elle est ignorée |
|---|---|
setup.iss est généré, jamais édité à la main | Le build suivant écrase la modification |
setup.iss, staging/ et Installer/ ne sont pas versionnés | — |
| Aucun secret applicatif n'entre dans l'installateur | Le mot de passe est saisi à la première installation et propagé de là au rôle PostgreSQL |
C:\ProgramData\Superviseur\ survit à une mise à jour comme à une désinstallation | La base, les journaux et les téléversements sont conservés pour permettre une réinstallation sans perte |
| Trois fichiers de version sont réécrits par le build | vue/package.json, backend.csproj et ServiceManager.csproj : un build laisse un dépôt modifié |
Inno Setup 6 est cherché dans C:\Program Files (x86)\Inno Setup 6\ ou %LocalAppData%\Programs\Inno Setup 6\ | L'étape 4 échoue si l'outil est ailleurs |
Modifier le nom ou la version
Éditer app.config.json à la racine du projet, puis relancer build-all.ps1. Le setup.iss est régénéré automatiquement à chaque build via generate-setup.ps1.