# ============================================================ # Omika - Installation du service Windows OmikaDiagnosticsApi (deploiement 5/6) # ============================================================ # CIBLE : Windows Server 2025 (SRV-OMIKA), PowerShell ADMINISTRATEUR. # NE PAS executer depuis le poste de developpement. # # A QUOI SERT CE SERVICE : # API centrale qui RECOIT les lots de diagnostics envoyes par les serveurs # clients distants (multi-serveur uniquement). Sur un SRV-OMIKA mono-serveur # (l'API ecrit son JSONL localement), ce service est INUTILE : ne pas le # deployer, ou le laisser arrete. # # CE QUE CE SCRIPT FAIT : # 1. Cree le dossier du spool central + journalisation. # 2. Pose les ACL NTFS minimales (Modifier sur le spool central). # 3. Valide le compte de service (existence + droit de connexion). # 4. Cree le service Windows OmikaDiagnosticsApi (idempotent, Manual). # 5. Verifie ce qui a ete reellement cree. # # CE QU'IL NE FAIT PAS : # - AUCUN demarrage de service, AUCUN secret ecrit, AUCUNE migration SQL. # - AUCUNE cle de client Diagnostics (se cree dans l'interface Web). # # PREREQUIS MANUELS : # - Compte local dedie + droit « Ouvrir une session en tant que service ». # - Publication copiee dans \Apps\DiagnosticsApi. # - La table des clients Diagnostics existe (migration 006). # - Au moins un client enregistre (OmikaDiagnosticsWeb -> Clients Diagnostics). # # IDEMPOTENT - prend en charge -WhatIf. # # EXEMPLES : # .\Install-OmikaDiagnosticsApi.ps1 # .\Install-OmikaDiagnosticsApi.ps1 -WhatIf # .\Install-OmikaDiagnosticsApi.ps1 -Desinstaller # ============================================================ [CmdletBinding(SupportsShouldProcess = $true)] param( [string]$InstallRoot = 'C:\Omika', [string]$ServiceName = 'OmikaDiagnosticsApi', [string]$Account = '.\svc_omika_diagapi', # Compte du service OmikaDiagnosticsWorker : lecteur du spool central. [string]$AccountWorker = '.\svc_omika_diag', [ValidateSet('Manual', 'Automatic', 'Disabled')] [string]$StartupType = 'Manual', [switch]$Desinstaller ) $ErrorActionPreference = 'Stop' Import-Module (Join-Path $PSScriptRoot 'Omika.Deploy.Common.psm1') -Force # Le module a son propre etat de session : $WhatIfPreference ne s'y propage pas. $Simulation = [bool]$WhatIfPreference # --- Definition du service --------------------------------------------------- $NomAffiche = 'Omika Diagnostics Api' $DossierApps = 'DiagnosticsApi' $Executable = 'Omika.Diagnostics.Api.exe' $Description = 'Omika - API centrale de reception des lots de diagnostics (multi-serveur, cle client, spool central).' $DossiersModifier = @( 'Logs\DiagnosticsApi', 'Data\DiagnosticsApi\Central' ) try { Assert-OmikaAdmin $chemins = Get-OmikaPaths -InstallRoot $InstallRoot $cheminExe = Join-Path (Join-Path $chemins.Apps $DossierApps) $Executable # --- Rollback ------------------------------------------------------------ if ($Desinstaller) { Write-OmikaStep "Desinstallation du service $ServiceName" Remove-OmikaService -Name $ServiceName -WhatIf:$Simulation | Out-Null Write-OmikaServiceSummary -Name $ServiceName -Supprime exit 0 } # --- 1. Dossiers --------------------------------------------------------- Write-OmikaStep 'Dossiers du service' foreach ($relatif in $DossiersModifier) { New-OmikaDirectory -Path (Join-Path $InstallRoot $relatif) -WhatIf:$Simulation | Out-Null } # --- 2. ACL -------------------------------------------------------------- Write-OmikaStep 'ACL NTFS minimales' # 2a. Spool central + logs : ce service ecrit. foreach ($relatif in $DossiersModifier) { Grant-OmikaAcl -Path (Join-Path $InstallRoot $relatif) -Account $Account -Right 'M' ` -RequireExisting -WhatIf:$Simulation | Out-Null } # 2b. Le Worker Diagnostics doit pouvoir LIRE le spool central. # Le dossier vient d'etre cree ci-dessus, il existe donc forcement. Grant-OmikaAcl -Path (Join-Path $InstallRoot 'Data\DiagnosticsApi\Central') ` -Account $AccountWorker -Right 'R' -RequireExisting -WhatIf:$Simulation | Out-Null # --- 3. Compte de service ------------------------------------------------ Write-OmikaStep 'Compte de service' Assert-OmikaServiceAccount -Account $Account | Out-Null # --- 4. Service Windows -------------------------------------------------- Write-OmikaStep "Creation du service Windows ($StartupType)" Install-OmikaService -Name $ServiceName -DisplayName $NomAffiche ` -ExePath $cheminExe -Account $Account -Description $Description ` -StartupType $StartupType -WhatIf:$Simulation | Out-Null # --- 5. Recapitulatif ---------------------------------------------------- Write-OmikaServiceSummary -Name $ServiceName -ExePath $cheminExe -Account $Account -Rappels @( 'Injecter les secrets en variables MACHINE (aucun secret dans ce script) :' ' ConnectionStrings__DiagnosticsDatabase=' ' Diagnostics__Central__Directory=' ' ASPNETCORE_ENVIRONMENT=Production' ' ASPNETCORE_URLS=http://127.0.0.1:' 'ENREGISTRER LES CLIENTS : OmikaDiagnosticsWeb -> Clients Diagnostics -> Nouveau client.' ' La cle n''est affichee QU''UNE FOIS : la copier immediatement.' 'Cote serveur client, activer alors DiagnosticsForwarding__Enabled=true + Endpoint + ApiKey.' 'Exposer en HTTPS via le reverse proxy Apache : jamais Kestrel en direct.' 'Sur un serveur MONO-SERVEUR, ce service n''est pas necessaire.' ) exit 0 } catch { Write-OmikaFail $_.Exception.Message exit 1 }