Files
Omika/infra/deploy/Install-OmikaDiagnosticsWorker.ps1
T
2026-10-23 18:46:50 +02:00

147 lines
6.3 KiB
PowerShell

# ============================================================
# 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 <InstallRoot>\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=<SECRET>'
' Observability__Remote__Directory=<IDENTIQUE a celui de Omika.Api>'
' Diagnostics__Import__CheckpointDirectory=<dossier Checkpoint du service>'
' 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
}