Compose Postgres (PostGIS + pgvector épinglé par digest), scripts de bootstrap du premier SuperAdmin, de lancement local du service et de migration des données, et le README du flux en huit étapes. Le port est lié à 127.0.0.1 et non publié : le Postgres précédent, exposé par un simple "5432:5432" avec mym/mym, a encaissé 1 074 465 échecs d'authentification entre juin et octobre 2025. Le compte mym n'a jamais été tenté — c'est le seul hasard qui a sauvé la base. Les limites de log viennent du même serveur, où un conteneur avait atteint 516 Mo sur un disque de 20 Go. Le SuperAdmin passe par le token de réinitialisation plutôt que par un INSERT : les mots de passe étant hachés en scrypt, seule l'application peut produire le bon format, et personne d'autre que l'opérateur ne connaît le mot de passe. MigrationController l'exige et la migration n'en crée aucun, MongoDB n'ayant pas de champ Role. Éprouvé sur la préprod le 07/09 : 4 instances, 315 sections migrées et 20 signalées sur 335, 2383 ressources, tout réconcilié avec MongoDB. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
56 lines
2.7 KiB
PowerShell
56 lines
2.7 KiB
PowerShell
<#
|
|
Lance manager-service EN LOCAL, branche sur un Mongo source et sur la base
|
|
cible (preprod ou prod) a travers un tunnel SSH.
|
|
|
|
Pourquoi en local plutot que sur le serveur : la migration ne demande pas de
|
|
tester un deploiement, et builder l'image evite d'affronter en meme temps le
|
|
Dockerfile de manager-app (Flutter 3.7 = Dart 2.19, alors que le pubspec exige
|
|
>= 3.1) et la source NuGet git.dev-espaces-naturels.lu qui repond 401.
|
|
|
|
Rien n'est ecrit dans appsettings : les variables d'environnement ASP.NET Core
|
|
(double underscore = ':') prennent le dessus. Aucun secret ne part dans le depot.
|
|
#>
|
|
param(
|
|
[string]$MongoUri = "mongodb://localhost:27018", # Mongo SOURCE (dump restaure)
|
|
[string]$PgHost = "127.0.0.1",
|
|
[int] $PgPort = 5433, # extremite locale du tunnel SSH
|
|
[string]$EnvFile = "$PSScriptRoot\.env"
|
|
)
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
if (-not (Test-Path $EnvFile)) { throw "Fichier introuvable : $EnvFile (copier .env.example)" }
|
|
$cfg = @{}
|
|
Get-Content $EnvFile | Where-Object { $_ -match '^\s*[^#].*=' } | ForEach-Object {
|
|
$k,$v = $_ -split '=', 2 ; $cfg[$k.Trim()] = $v.Trim()
|
|
}
|
|
foreach ($k in 'POSTGRES_USER','POSTGRES_PASSWORD','POSTGRES_DATABASE') {
|
|
if ([string]::IsNullOrWhiteSpace($cfg[$k])) { throw "$k absent ou vide dans $EnvFile" }
|
|
}
|
|
|
|
# Le repo est 3 niveaux au-dessus : Deployment/provisioning -> Deployment -> ManagerService -> repo
|
|
$repo = (Resolve-Path "$PSScriptRoot\..\..\..").Path
|
|
|
|
Write-Host "Verifications..." -ForegroundColor Cyan
|
|
$mongoPort = if ($MongoUri -match ':(\d+)') { [int]$Matches[1] } else { 27017 }
|
|
if (-not (Test-NetConnection 127.0.0.1 -Port $mongoPort -InformationLevel Quiet -WarningAction SilentlyContinue)) {
|
|
throw "Mongo source injoignable sur $mongoPort. Le conteneur est-il demarre ?"
|
|
}
|
|
Write-Host " Mongo source $mongoPort : OK" -ForegroundColor Green
|
|
if (-not (Test-NetConnection $PgHost -Port $PgPort -InformationLevel Quiet -WarningAction SilentlyContinue)) {
|
|
throw "Postgres injoignable sur ${PgHost}:${PgPort}. Le tunnel SSH est-il ouvert ?"
|
|
}
|
|
Write-Host " Postgres ${PgHost}:${PgPort} : OK" -ForegroundColor Green
|
|
|
|
$env:ASPNETCORE_ENVIRONMENT = "Development"
|
|
$env:ConnectionStrings__TabletDb = $MongoUri
|
|
$env:ConnectionStrings__PostgresConnection = "Host=$PgHost;Port=$PgPort;Database=$($cfg['POSTGRES_DATABASE']);Username=$($cfg['POSTGRES_USER']);Password=$($cfg['POSTGRES_PASSWORD'])"
|
|
|
|
Write-Host ""
|
|
Write-Host " TabletDb -> $MongoUri" -ForegroundColor Yellow
|
|
Write-Host " PostgresConnection -> ${PgHost}:${PgPort}/$($cfg['POSTGRES_DATABASE'])" -ForegroundColor Yellow
|
|
Write-Host " Swagger -> http://localhost:5000/swagger" -ForegroundColor Cyan
|
|
Write-Host ""
|
|
|
|
Set-Location $repo
|
|
dotnet run --project ManagerService
|