#!/usr/bin/env pwsh # Script de démarrage rapide pour ObsiViewer en mode développement param( [string]$VaultPath = "./vault", [switch]$SkipMeili, [switch]$ResetMeili, [switch]$Help ) if ($Help) { Write-Host @" Usage: .\start-dev.ps1 [-VaultPath ] [-SkipMeili] [-Help] Options: -VaultPath Chemin vers votre vault Obsidian (défaut: ./vault) -SkipMeili Ne pas démarrer Meilisearch -ResetMeili Supprimer le conteneur et le volume Meilisearch avant de redémarrer -SkipMeili Ne pas démarrer Meilisearch -Help Afficher cette aide Exemples: .\start-dev.ps1 .\start-dev.ps1 -VaultPath C:\Users\moi\Documents\MonVault .\start-dev.ps1 -SkipMeili "@ exit 0 } $ErrorActionPreference = "Stop" Write-Host "🚀 Démarrage d'ObsiViewer en mode développement" -ForegroundColor Cyan Write-Host "" # Diagnostic: Vérifier les variables Meilisearch existantes $meiliVars = Get-ChildItem Env: | Where-Object { $_.Name -like 'MEILI*' } if ($meiliVars) { Write-Host "⚠️ Variables Meilisearch détectées dans l'environnement:" -ForegroundColor Yellow foreach ($var in $meiliVars) { Write-Host " $($var.Name) = $($var.Value)" -ForegroundColor Gray } Write-Host " Ces variables seront purgées..." -ForegroundColor Yellow Write-Host "" } # Vérifier que le vault existe if (-not (Test-Path $VaultPath)) { Write-Host "⚠️ Le vault n'existe pas: $VaultPath" -ForegroundColor Yellow Write-Host " Création du dossier..." -ForegroundColor Yellow New-Item -ItemType Directory -Path $VaultPath -Force | Out-Null } $VaultPathAbsolute = Resolve-Path $VaultPath Write-Host "📁 Vault: $VaultPathAbsolute" -ForegroundColor Green # Vérifier si .env existe if (-not (Test-Path ".env")) { Write-Host "⚠️ Fichier .env manquant" -ForegroundColor Yellow if (Test-Path ".env.example") { Write-Host " Copie de .env.example vers .env..." -ForegroundColor Yellow Copy-Item ".env.example" ".env" } } # Purger TOUTES les variables d'environnement Meilisearch conflictuelles $meiliVarsToPurge = Get-ChildItem Env: | Where-Object { $_.Name -like 'MEILI*' } if ($meiliVarsToPurge) { Write-Host "🧹 Purge des variables Meilisearch existantes..." -ForegroundColor Cyan foreach ($var in $meiliVarsToPurge) { Remove-Item "Env:\$($var.Name)" -ErrorAction SilentlyContinue Write-Host " ✓ $($var.Name) supprimée" -ForegroundColor Gray } Write-Host "" } # Définir les variables d'environnement pour la session $env:VAULT_PATH = $VaultPathAbsolute $env:MEILI_MASTER_KEY = "devMeiliKey123" $env:MEILI_HOST = "http://127.0.0.1:7700" $env:PORT = "4000" Write-Host "✅ Variables d'environnement définies:" -ForegroundColor Green Write-Host " VAULT_PATH=$env:VAULT_PATH" -ForegroundColor Gray Write-Host " MEILI_MASTER_KEY=devMeiliKey123" -ForegroundColor Gray Write-Host " MEILI_HOST=$env:MEILI_HOST" -ForegroundColor Gray # Démarrer Meilisearch si demandé if (-not $SkipMeili) { Write-Host "" Write-Host "🔍 Démarrage de Meilisearch..." -ForegroundColor Cyan if ($ResetMeili) { Write-Host "🧹 Réinitialisation de Meilisearch (conteneur + volume)..." -ForegroundColor Yellow try { Push-Location "docker-compose" docker compose down -v meilisearch 2>$null | Out-Null Pop-Location } catch { Pop-Location 2>$null } # Forcer la suppression ciblée si nécessaire docker rm -f obsiviewer-meilisearch 2>$null | Out-Null docker volume rm -f docker-compose_meili_data 2>$null | Out-Null } # Vérifier si Meilisearch est déjà en cours $meiliRunning = docker ps --filter "name=obsiviewer-meilisearch" --format "{{.Names}}" 2>$null if ($meiliRunning) { Write-Host " ✓ Meilisearch déjà en cours" -ForegroundColor Green } else { npm run meili:up Write-Host " ⏳ Attente du démarrage de Meilisearch..." -ForegroundColor Yellow } # Attendre la santé du service /health $healthTimeoutSec = 30 $healthUrl = "http://127.0.0.1:7700/health" $startWait = Get-Date while ($true) { try { $resp = Invoke-RestMethod -Uri $healthUrl -Method GET -TimeoutSec 3 if ($resp.status -eq "available") { Write-Host " ✓ Meilisearch est prêt" -ForegroundColor Green break } } catch { # ignore and retry } if (((Get-Date) - $startWait).TotalSeconds -ge $healthTimeoutSec) { Write-Host " ⚠️ Timeout d'attente de Meilisearch (continuer quand même)" -ForegroundColor Yellow break } Start-Sleep -Milliseconds 500 } Write-Host "" Write-Host "📊 Indexation du vault..." -ForegroundColor Cyan npm run meili:reindex } Write-Host "" Write-Host "✅ Configuration terminée!" -ForegroundColor Green Write-Host "" Write-Host "Les variables d'environnement sont définies dans cette session PowerShell." -ForegroundColor Yellow Write-Host "" Write-Host "Pour démarrer l'application, ouvrez 2 terminaux:" -ForegroundColor Yellow Write-Host "" Write-Host "Terminal 1 (Backend):" -ForegroundColor Cyan Write-Host " node server/index.mjs" -ForegroundColor White Write-Host " (Les variables VAULT_PATH, MEILI_MASTER_KEY sont déjà définies)" -ForegroundColor Gray Write-Host "" Write-Host "Terminal 2 (Frontend):" -ForegroundColor Cyan Write-Host " npm run dev" -ForegroundColor White Write-Host "" Write-Host "⚠️ IMPORTANT: Si vous fermez ce terminal, les variables seront perdues." -ForegroundColor Yellow Write-Host " Relancez ce script ou définissez manuellement:" -ForegroundColor Yellow Write-Host " `$env:VAULT_PATH='$VaultPathAbsolute'" -ForegroundColor Gray Write-Host " `$env:MEILI_MASTER_KEY='devMeiliKey123'" -ForegroundColor Gray Write-Host " Remove-Item Env:\MEILI_API_KEY -ErrorAction SilentlyContinue" -ForegroundColor Gray Write-Host "" Write-Host "Accès:" -ForegroundColor Yellow Write-Host " Frontend: http://localhost:3000" -ForegroundColor White Write-Host " Backend API: http://localhost:4000" -ForegroundColor White Write-Host " Meilisearch: http://localhost:7700" -ForegroundColor White Write-Host ""