You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.5 KiB
108 lines
3.5 KiB
# dev start - clean env then mysql/redis + migrate + workers + next dev
|
|
# Usage:
|
|
# npm run dev:start
|
|
# npm run dev:start -- -SkipClean
|
|
# npm run dev:start -- -DeepClean
|
|
# npm run dev:start -- -NoWorkers
|
|
|
|
param(
|
|
[switch]$SkipClean,
|
|
[switch]$DeepClean,
|
|
[switch]$NoWorkers,
|
|
[ValidateSet("auto", "docker", "native")]
|
|
[string]$InfraMode = "auto"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
. (Join-Path $PSScriptRoot "lib.ps1")
|
|
|
|
$root = $script:DevConfig.ProjectRoot
|
|
$port = $script:DevConfig.NextPort
|
|
$bindHost = $script:DevConfig.NextBindHost
|
|
$lanHost = Resolve-DevLanHost -Configured $script:DevConfig.LanHost
|
|
|
|
Write-DevLog "=== chajia dev start (clean) ===" "Info"
|
|
|
|
if ($DeepClean) {
|
|
& (Join-Path $PSScriptRoot "clean.ps1") -Deep
|
|
}
|
|
elseif (-not $SkipClean) {
|
|
# Redis flush 延后到 Ensure-DevInfra 之后,避免 WSL 未就绪时长时间阻塞
|
|
& (Join-Path $PSScriptRoot "clean.ps1") -SkipRedis
|
|
}
|
|
else {
|
|
Stop-AllDevProcesses
|
|
}
|
|
|
|
if (-not (Test-Path (Join-Path $root ".env"))) {
|
|
Copy-Item (Join-Path $root ".env.example") (Join-Path $root ".env")
|
|
Write-DevLog "created .env from .env.example" "Warn"
|
|
}
|
|
|
|
Push-Location $root
|
|
try {
|
|
$infra = Ensure-DevInfra -Root $root -Mode $InfraMode
|
|
Apply-DevInfraEnv -Root $root
|
|
Write-DevLog "infra backend: $infra (db host resolved)" "Ok"
|
|
|
|
Write-DevLog "prisma generate + migrate..."
|
|
Invoke-PrismaGenerateSafe -Root $root
|
|
|
|
Invoke-NpmScript -ScriptName "db:deploy" -FailMessage "db:deploy failed"
|
|
|
|
Write-DevLog "db seed..."
|
|
Invoke-NpmScript -ScriptName "db:seed" -FailMessage "db:seed failed"
|
|
|
|
Write-DevLog "smoke connect..."
|
|
Invoke-NpmScript -ScriptName "smoke:connect" -FailMessage "smoke:connect failed"
|
|
|
|
Invoke-FlushRedis -Root $root
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|
|
|
|
if (-not $NoWorkers) {
|
|
Start-DevBackgroundProcess -Name "worker-rpa" -Command "npm run worker:rpa" -Root $root
|
|
Assert-DevWorkerHealthy -Name "worker-rpa"
|
|
Start-Sleep -Seconds 1
|
|
Start-DevBackgroundProcess -Name "worker-scheduler" -Command "npm run worker:scheduler" -Root $root
|
|
Start-Sleep -Seconds 1
|
|
}
|
|
|
|
Ensure-DevLanFirewall
|
|
|
|
Start-DevBackgroundProcess -Name "next-dev" -Command "npx next dev -H $bindHost -p $port" -Root $root
|
|
|
|
Write-DevLog "wait next.js (max $($script:DevConfig.HttpTimeoutSec)s)..."
|
|
Wait-HttpOk -Url "http://localhost:$port" -TimeoutSec $script:DevConfig.HttpTimeoutSec
|
|
if ($lanHost) {
|
|
$lanUrl = "http://${lanHost}:$port"
|
|
if (Wait-HttpOk -Url $lanUrl -TimeoutSec 15) {
|
|
Write-DevLog "LAN $lanUrl OK (share this with colleagues, not 172.x WSL IP)" "Ok"
|
|
}
|
|
else {
|
|
Write-DevLog "LAN $lanUrl not reachable (check firewall or Wi-Fi AP isolation)" "Warn"
|
|
}
|
|
}
|
|
else {
|
|
Write-DevLog "LAN host not detected; colleagues cannot reach this PC" "Warn"
|
|
}
|
|
|
|
Write-Host ""
|
|
Write-DevLog "=== ready ===" "Ok"
|
|
$lanBase = if ($lanHost) { "http://${lanHost}:$port" } else { "http://localhost:$port" }
|
|
Write-Host " -- local --"
|
|
Write-Host " home http://localhost:$port"
|
|
Write-Host " embed demo http://localhost:$port/embed-demo"
|
|
Write-Host " admin login http://localhost:$port/login (admin_demo / Demo@123)"
|
|
Write-Host ""
|
|
Write-Host " -- LAN (share with colleagues) --"
|
|
Write-Host " home $lanBase"
|
|
Write-Host " embed demo $lanBase/embed-demo"
|
|
Write-Host " admin login $lanBase/login (admin_demo / Demo@123)"
|
|
Write-Host ""
|
|
Write-Host " logs $($script:DevConfig.LogDir)"
|
|
Write-Host " stop/clean npm run dev:stop | npm run dev:clean"
|
|
Write-Host ""
|