# ============================================================ # Omika - Installation du service Windows OmikaApi (deploiement 1/6) # ============================================================ # CIBLE : Windows Server 2025 (SRV-OMIKA), PowerShell ADMINISTRATEUR. # NE PAS executer depuis le poste de developpement. # # CE QUE CE SCRIPT FAIT : # 1. Cree les dossiers propres a l'API (journalisation + spool JSONL). # 2. Pose les ACL NTFS minimales (avec CONTROLE du code retour d'icacls). # 3. Valide le compte de service (existence + droit de connexion). # 4. Cree le service Windows OmikaApi (idempotent, StartupType Manual). # 5. Verifie ce qui a ete reellement cree (binaire, compte, etat). # # CE QU'IL NE FAIT PAS : # - AUCUN demarrage de service. # - AUCUN secret ecrit (variables d'environnement = action manuelle). # - AUCUNE regle firewall, AUCUN IIS, AUCUNE modification HFSQL/PostgreSQL. # - AUCUNE copie de binaires (voir Install-OmikaServerFiles.ps1). # # PREREQUIS MANUELS : # - Le compte local dedie existe et possede le droit « Ouvrir une session en # tant que service » (secpol.msc). Ce script le VERIFIE et avertit. # - La publication est deja copiee dans \Apps\OmikaApi # (Omika.Api.exe present). # # IDEMPOTENT : une seconde execution ne recree rien et signale toute divergence # entre le service existant et le binaire/compte attendus. # Prend en charge -WhatIf (aucune modification reelle). # # EXEMPLES : # .\Install-OmikaApi.ps1 # .\Install-OmikaApi.ps1 -WhatIf # .\Install-OmikaApi.ps1 -Desinstaller # rollback du service # ============================================================ [CmdletBinding(SupportsShouldProcess = $true)] param( [string]$InstallRoot = 'C:\Omika', [string]$ServiceName = 'OmikaApi', [string]$Account = '.\svc_omika_api', [ValidateSet('Manual', 'Automatic', 'Disabled')] [string]$StartupType = 'Manual', # Rollback : supprime le service (refuse si le service tourne encore). [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 Api' $DossierApps = 'OmikaApi' $Executable = 'Omika.Api.exe' $Description = 'Omika - API metier (Kestrel) : bootstrap mobile, synchronisation, documents, exposition SRV_LANGUES.' # Dossiers dont CE service est proprietaire (droit Modifier). $DossiersModifier = @( 'Logs\Api', 'Data\Api\Diagnostics\Jsonl' ) 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' foreach ($relatif in $DossiersModifier) { Grant-OmikaAcl -Path (Join-Path $InstallRoot $relatif) -Account $Account -Right 'M' ` -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) :' ' Hfsql / LicenseConnection / SyncConnection / ServiceConnection / FilePasswords' ' ConnectionStrings__DiagnosticsDatabase (si l''API lit PostgreSQL)' ' DiagnosticsIdentity__HmacKey (ActorKey, min 256 bits Base64)' ' MobileAuth__SigningKey (OBLIGATOIRE : echec au demarrage sinon)' ' DiagnosticDeployment__ClientCode / __ServerInstanceId' ' Observability__Remote__Directory (IDENTIQUE au Worker Diagnostics)' ' ASPNETCORE_ENVIRONMENT=Production' ' ASPNETCORE_URLS=http://127.0.0.1:' 'Verifier le provider OLE DB PCSOFT.HFSQL (64 bits) enregistre.' 'Installer LibreOffice si la generation PDF des rapports est utilisee.' 'DiagnosticsForwarding__Enabled reste false : ne l''activer que pour un serveur client distant.' ) exit 0 } catch { Write-OmikaFail $_.Exception.Message exit 1 }