# ============================================================ # Omika - Installation du service Windows OmikaDiagnosticsWorker (deploiement 3/6) # ============================================================ # CIBLE : Windows Server 2025 (SRV-OMIKA), PowerShell ADMINISTRATEUR. # NE PAS executer depuis le poste de developpement. # # CE QUE CE SCRIPT FAIT : # 1. Cree le dossier de checkpoint (propre au Worker) + journalisation. # 2. Pose les ACL : # - Modifier sur ses propres dossiers (checkpoint, logs) ; # - LECTURE SEULE sur le spool JSONL de l'API et le spool central. # 3. Valide le compte de service (existence + droit de connexion). # 4. Cree le service Windows OmikaDiagnosticsWorker (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 PostgreSQL appliquee. # - AUCUN demarrage du Worker pendant une migration (l'ordre est manuel). # # PREREQUIS MANUELS : # - Compte local dedie + droit « Ouvrir une session en tant que service ». # - Publication copiee dans \Apps\DiagnosticsWorker # (Omika.Diagnostics.Worker.exe). # - PostgreSQL joignable ET migrations 001 -> 010 appliquees # (l'ordre sur est : migration d'abord, binaires ensuite). # # IDEMPOTENT - prend en charge -WhatIf. # # EXEMPLES : # .\Install-OmikaDiagnosticsWorker.ps1 # .\Install-OmikaDiagnosticsWorker.ps1 -WhatIf # .\Install-OmikaDiagnosticsWorker.ps1 -Desinstaller # ============================================================ [CmdletBinding(SupportsShouldProcess = $true)] param( [string]$InstallRoot = 'C:\Omika', [string]$ServiceName = 'OmikaDiagnosticsWorker', [string]$Account = '.\svc_omika_diag', # Compte du service OmikaApi : proprietaire du spool JSONL. [string]$AccountApi = '.\svc_omika_api', # Compte du service OmikaDiagnosticsApi : proprietaire du spool central. [string]$AccountDiagApi = '.\svc_omika_diagapi', [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 Worker' $DossierApps = 'DiagnosticsWorker' $Executable = 'Omika.Diagnostics.Worker.exe' $Description = 'Omika - Importateur asynchrone des diagnostics JSONL vers PostgreSQL (fail-open, checkpoint persistant).' # Dossiers que CE service possede (crees ici + droit Modifier). $DossiersModifier = @( 'Logs\DiagnosticsWorker', 'Data\DiagnosticsWorker\Checkpoint' ) # Dossiers d'AUTRES services : lecture seule, jamais crees ici. # Absents = normal si le service proprietaire n'est pas encore deploye. $DossiersLecture = @( @{ Relatif = 'Data\Api\Diagnostics\Jsonl'; Proprietaire = 'Install-OmikaApi.ps1' }, @{ Relatif = 'Data\DiagnosticsApi\Central'; Proprietaire = 'Install-OmikaDiagnosticsApi.ps1' } ) 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 propres ------------------------------------------------- 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. Ses propres dossiers : droit Modifier. foreach ($relatif in $DossiersModifier) { Grant-OmikaAcl -Path (Join-Path $InstallRoot $relatif) -Account $Account -Right 'M' ` -RequireExisting -WhatIf:$Simulation | Out-Null } # 2b. Lecture seule sur les spools produits par d'autres services. foreach ($entree in $DossiersLecture) { $cible = Join-Path $InstallRoot $entree.Relatif if (-not (Test-Path -LiteralPath $cible)) { Write-OmikaWarn "Spool absent : $cible" Write-OmikaWarn (" -> normal si {0} n'est pas encore deploye ; relancez ce script ensuite." -f $entree.Proprietaire) continue } Grant-OmikaAcl -Path $cible -Account $Account -Right 'R' -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=Host=127.0.0.1;Port=5432;Database=omika_diagnostics;Username=omika_diagnostics_worker;Password=' ' Observability__Remote__Directory=' ' Diagnostics__Import__CheckpointDirectory=' ' Diagnostics__RetentionDays / Diagnostics__RetentionIntervalHours / Diagnostics__RetentionBatchSize' 'Appliquer les migrations PostgreSQL 001 -> 010 dans l''ordre AVANT de demarrer.' 'Verifier que la migration de retention (004) est appliquee (DELETE/SELECT).' 'Le spool central n''est utile qu''en architecture multi-serveur.' ) exit 0 } catch { Write-OmikaFail $_.Exception.Message exit 1 }