@echo off setlocal EnableDelayedExpansion rem Double-click (cmd /c): re-launch under cmd /k so the window stays open if /i not "%~1"=="__run__" ( echo %CMDCMDLINE% | find /i " /c " >nul if not errorlevel 1 ( cmd /k "%~f0" __run__ %* exit /b ) ) shift set "ROOT=%~dp0.." cd /d "%ROOT%" || goto :fail_cd set "COMPOSE=docker\docker-compose.yml" set "ENV_FILE=docker\.env" set "COMPOSE_PROJECT=soondesign" set "ACTION=%~1" set "WEB_PORT=8100" set "ELECTRON_PORT=8101" set "BACKEND_PORT=8102" if /i "%ACTION%"=="stop" goto :do_stop if /i "%ACTION%"=="reset" goto :do_reset goto :do_start :compose docker compose -p "%COMPOSE_PROJECT%" -f "%COMPOSE%" --env-file "%ENV_FILE%" %* exit /b !ERRORLEVEL! :compose_noenv docker compose -p "%COMPOSE_PROJECT%" -f "%COMPOSE%" %* exit /b !ERRORLEVEL! :do_stop if exist "%ENV_FILE%" (call :compose down) else (call :compose_noenv down) echo. echo [OK] Stopped project %COMPOSE_PROJECT%. DB volume kept. exit /b 0 :do_reset if exist "%ENV_FILE%" (call :compose down -v) else (call :compose_noenv down -v) echo. echo [OK] Project %COMPOSE_PROJECT% stopped. DB volume removed. exit /b 0 :do_start echo [SoonDesign] Starting local Docker environment... echo [INFO] Compose project: %COMPOSE_PROJECT% echo. docker info >nul 2>&1 if errorlevel 1 ( echo [ERROR] Docker is not running. Please start Docker Desktop first. goto :fail ) if not exist "soonModels\manifest.json" ( echo [ERROR] Missing soonModels\manifest.json echo Project root: %CD% goto :fail ) if not exist "docker\docker-compose.yml" ( echo [ERROR] Missing docker\docker-compose.yml goto :fail ) if not exist "%ENV_FILE%" ( if not exist "docker\.env.example" ( echo [ERROR] Missing docker\.env.example goto :fail ) copy /Y "docker\.env.example" "%ENV_FILE%" >nul ) powershell -NoProfile -ExecutionPolicy Bypass -File "docker\sync-config.ps1" -EnvFile "%ENV_FILE%" if errorlevel 1 ( echo [ERROR] Config sync failed. goto :fail ) for /f "usebackq eol=# tokens=1,* delims==" %%A in ("%ENV_FILE%") do ( if /i "%%A"=="WEB_PORT" set "WEB_PORT=%%B" if /i "%%A"=="ELECTRON_PORT" set "ELECTRON_PORT=%%B" if /i "%%A"=="BACKEND_PORT" set "BACKEND_PORT=%%B" ) echo [INFO] Removing legacy compose project "docker" if present... docker compose -p docker -f "%COMPOSE%" --env-file "%ENV_FILE%" down >nul 2>&1 docker network rm docker_default >nul 2>&1 call :compose down >nul 2>&1 echo [INFO] Ports: Web=%WEB_PORT% Electron=%ELECTRON_PORT% API=%BACKEND_PORT% echo [INFO] Starting containers - project %COMPOSE_PROJECT%... call :compose up -d set "DC_EXIT=!ERRORLEVEL!" if not "!DC_EXIT!"=="0" ( echo. echo [ERROR] docker compose failed with exit code !DC_EXIT!. echo Ensure Docker Desktop is running. echo First API start may install pdo_mysql for about 1 minute. goto :fail ) echo [INFO] Waiting for API - first run may take up to 2 min for pdo_mysql install... set /a RETRY=0 :wait_health set /a RETRY+=1 curl.exe -sf "http://localhost:%BACKEND_PORT%/health" >nul 2>&1 if not errorlevel 1 goto :ready if !RETRY! GEQ 60 goto :show_urls ping -n 3 127.0.0.1 >nul goto :wait_health :ready echo [OK] Backend is ready. :show_urls echo. echo ======================================== echo Project: %COMPOSE_PROJECT% echo Web: http://localhost:%WEB_PORT%/pages/index.web.html echo Admin: http://localhost:%WEB_PORT%/pages/admin/index.html echo Electron: http://localhost:%ELECTRON_PORT%/pages/index.html echo API: http://localhost:%BACKEND_PORT%/health echo ======================================== echo Login: admin@local.test / admin123 echo Stop: scripts\start.bat stop echo. curl.exe -sf "http://localhost:%BACKEND_PORT%/health" >nul 2>&1 if errorlevel 1 ( echo [WARN] API not ready yet. Check: docker logs soondesign-api goto :done_ok ) curl.exe -sf "http://localhost:%BACKEND_PORT%/api/v1/settings" >nul 2>&1 if errorlevel 1 ( echo [WARN] API routes not responding. Check: docker logs soondesign-api ) else ( echo [OK] API routes verified. ) start "" "http://localhost:%WEB_PORT%/pages/index.web.html" start "" "http://localhost:%WEB_PORT%/pages/admin/index.html" call :launch_electron goto :done_ok :launch_electron where node >nul 2>&1 if errorlevel 1 ( echo [WARN] Node.js not found. Open Electron preview in browser instead. start "" "http://localhost:%ELECTRON_PORT%/pages/index.html" exit /b 0 ) if not exist "frontend-electron\package.json" ( echo [WARN] frontend-electron not found. Opening browser preview. start "" "http://localhost:%ELECTRON_PORT%/pages/index.html" exit /b 0 ) if not exist "frontend-electron\node_modules\electron" ( echo [INFO] Installing Electron dependencies - first run only... pushd frontend-electron call npm install --no-audit --no-fund if errorlevel 1 ( popd echo [WARN] npm install failed. Opening browser preview. start "" "http://localhost:%ELECTRON_PORT%/pages/index.html" exit /b 0 ) popd ) echo [INFO] Launching Electron desktop app... start "SoonDesign Desktop" /D "%CD%\frontend-electron" cmd /c "npm start" exit /b 0 :fail_cd echo [ERROR] Cannot cd to project root: %ROOT% goto :fail :fail echo. echo [FAILED] See messages above. exit /b 1 :done_ok echo. echo [DONE] SoonDesign is running under Docker project %COMPOSE_PROJECT%. exit /b 0