[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 $projectWindowsPath = $PSScriptRoot $wslProjectPath = (wsl wslpath $projectWindowsPath).Trim() $envFilePath = Join-Path $PSScriptRoot '.env' function Get-EnvValue { param( [string]$FilePath, [string]$Key ) if (-not (Test-Path $FilePath)) { return $null } $line = Get-Content $FilePath | Where-Object { $_ -match "^$Key=" } | Select-Object -First 1 if (-not $line) { return $null } return ($line -split '=', 2)[1].Trim() } function Test-TcpPortFast { param( [string]$HostName, [int]$Port, [int]$TimeoutMs = 3000 ) $client = New-Object System.Net.Sockets.TcpClient try { $asyncResult = $client.BeginConnect($HostName, $Port, $null, $null) if (-not $asyncResult.AsyncWaitHandle.WaitOne($TimeoutMs, $false)) { $client.Close() return $false } $client.EndConnect($asyncResult) $client.Close() return $true } catch { $client.Close() return $false } } Write-Host "============================================" -ForegroundColor Cyan Write-Host " HM ITAM WSL Docker Start" -ForegroundColor Cyan Write-Host "============================================" -ForegroundColor Cyan Write-Host "" Write-Host "[INFO] Checking WSL..." wsl -l -v if ($LASTEXITCODE -ne 0) { Write-Host "[ERROR] WSL is not available." -ForegroundColor Red exit 1 } Write-Host "[INFO] Checking Docker in WSL..." wsl sh -lc "docker --version" if ($LASTEXITCODE -ne 0) { Write-Host "[ERROR] Docker is not available inside WSL." -ForegroundColor Red exit 1 } $dbHost = Get-EnvValue -FilePath $envFilePath -Key 'DB_HOST' $dbPort = Get-EnvValue -FilePath $envFilePath -Key 'DB_PORT' if (-not $dbPort) { $dbPort = '3306' } if (-not $dbHost) { Write-Host "[WARN] .env is missing DB_HOST. Containers will still start, but backend DB calls will fail until DB settings are fixed." -ForegroundColor Yellow } if ($dbHost) { Write-Host "[INFO] Checking external DB reachability..." $dbReachable = Test-TcpPortFast -HostName $dbHost -Port ([int]$dbPort) if (-not $dbReachable) { Write-Host "[WARN] External DB is unreachable: $dbHost`:$dbPort" -ForegroundColor Yellow Write-Host "[HINT] Containers will still start. Check VPN/private network connection, firewall rules, DB host/port in .env, or whether the DB server is running." -ForegroundColor Yellow } } Write-Host "[INFO] Starting ITAM containers in WSL..." wsl sh -lc "cd '$wslProjectPath' && docker compose up --build -d --remove-orphans" if ($LASTEXITCODE -ne 0) { Write-Host "[WARN] Build-based startup failed. Retrying with cached images/containers..." -ForegroundColor Yellow wsl sh -lc "cd '$wslProjectPath' && docker compose up -d --remove-orphans" if ($LASTEXITCODE -ne 0) { Write-Host "[ERROR] Failed to start containers." -ForegroundColor Red exit 1 } } Write-Host "" Write-Host "============================================" -ForegroundColor Green Write-Host " [OK] WSL Docker stack started." -ForegroundColor Green Write-Host " [INFO] Frontend: http://localhost:8080" Write-Host " [INFO] Backend : http://localhost:3000/api/assets/master" Write-Host "============================================" -ForegroundColor Green Start-Process "http://localhost:8080"