Harden run.bat: full pipeline, foreground logs, reliable launch.

Rebuild deps and server, kill stale process, open browser after delay, keep terminal open with pause on exit or failure. Add start.bat alias.
This commit is contained in:
drjones
2026-05-28 18:44:18 -07:00
parent fabc632384
commit 3316a75f7a
2 changed files with 105 additions and 115 deletions

216
run.bat
View File

@@ -1,18 +1,25 @@
@echo off
setlocal EnableExtensions
title Crypto Miner Control Server
setlocal EnableExtensions EnableDelayedExpansion
title AetherForge Control Server
cd /d "%~dp0"
set "ROOT=%CD%"
echo.
echo ==================================================
echo Crypto Miner Control Server Builder
echo ==================================================
echo ==============================================================
echo AetherForge - Control Server Launcher
echo ==============================================================
echo This window stays open and shows live server logs.
echo Press Ctrl+C to stop the server.
echo ==============================================================
echo.
:: Common tool paths (Go/Node installs + user Go bin for garble)
set "PATH=C:\Program Files\Go\bin;%USERPROFILE%\go\bin;C:\Program Files\nodejs;%PATH%"
:: ============================================================
:: STEP 1: Auto-install Go if missing
:: STEP 1: Go
:: ============================================================
echo [1/5] Checking dependencies...
echo [1/5] Checking Go...
where go >nul 2>nul
if errorlevel 1 goto install_go
@@ -22,7 +29,6 @@ goto go_ready
:install_go
echo Go not found. Checking for existing installation...
if exist "C:\Program Files\Go\bin\go.exe" (
echo Found Go at C:\Program Files\Go\bin
set "PATH=C:\Program Files\Go\bin;%PATH%"
@@ -30,56 +36,46 @@ if exist "C:\Program Files\Go\bin\go.exe" (
)
echo Downloading and installing Go...
if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
set "GO_ARCH=amd64"
) else (
set "GO_ARCH=386"
)
set "GO_VERSION=1.22.2"
set "GO_URL=https://go.dev/dl/go%GO_VERSION%.windows-%GO_ARCH%.msi"
set "GO_MSI=%TEMP%\go-installer.msi"
echo Downloading Go %GO_VERSION% for Windows %GO_ARCH%...
echo This may take a moment...
powershell -NoProfile -Command "& { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest -Uri '%GO_URL%' -OutFile '%GO_MSI%' }"
if errorlevel 1 (
echo ERROR: Failed to download Go installer.
echo Please manually download from: https://go.dev/dl/
pause
exit /b 1
echo ERROR: Failed to download Go. Get it from https://go.dev/dl/
goto fatal_exit
)
echo Installing Go - administrator privileges may be required...
msiexec /i "%GO_MSI%" /quiet /norestart
if errorlevel 1 (
echo ERROR: Failed to install Go. Try running as Administrator.
pause
exit /b 1
echo ERROR: Go install failed. Run this script as Administrator.
goto fatal_exit
)
del "%GO_MSI%" 2>nul
set "PATH=C:\Program Files\Go\bin;%PATH%"
set "PATH=%USERPROFILE%\go\bin;%PATH%"
echo Go installed successfully!
set "PATH=C:\Program Files\Go\bin;%USERPROFILE%\go\bin;%PATH%"
echo Go installed.
:go_ready
:: ============================================================
:: STEP 1.5: Install Garble (Obfuscator) for Miner Builder
:: ============================================================
echo [1.5/5] Checking for Garble obfuscator...
:: Garble (optional, for Forge obfuscation — failure is non-fatal)
echo [1.5/5] Checking Garble (optional)...
where garble >nul 2>nul
if errorlevel 1 (
echo Garble not found. Installing via go install...
echo Installing garble via go install...
go install mvdan.cc/garble@latest
if errorlevel 1 echo WARNING: Garble install failed; Forge obfuscation may be unavailable.
)
:: ============================================================
:: STEP 2: Auto-install Node.js if missing (for frontend)
:: STEP 2: Node.js
:: ============================================================
echo [2/5] Checking Node.js...
where node >nul 2>nul
if errorlevel 1 goto install_node
echo Node.js found:
@@ -88,7 +84,6 @@ goto node_ready
:install_node
echo Node.js not found. Checking for existing installation...
if exist "C:\Program Files\nodejs\node.exe" (
echo Found Node.js at C:\Program Files\nodejs
set "PATH=C:\Program Files\nodejs;%PATH%"
@@ -96,160 +91,151 @@ if exist "C:\Program Files\nodejs\node.exe" (
)
echo Downloading and installing Node.js...
set "NODE_VERSION=20.12.2"
set "NODE_URL=https://nodejs.org/dist/v%NODE_VERSION%/node-v%NODE_VERSION%-x64.msi"
set "NODE_MSI=%TEMP%\node-installer.msi"
echo Downloading Node.js v%NODE_VERSION%...
echo This may take a moment...
powershell -NoProfile -Command "& { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest -Uri '%NODE_URL%' -OutFile '%NODE_MSI%' }"
if errorlevel 1 (
echo WARNING: Failed to download Node.js. Frontend will not be built.
echo You can manually download from: https://nodejs.org/
echo WARNING: Node.js download failed. Frontend build will be skipped.
set "SKIP_FRONTEND=1"
goto node_ready
)
echo Installing Node.js - administrator privileges may be required...
msiexec /i "%NODE_MSI%" /quiet /norestart
if errorlevel 1 (
echo WARNING: Failed to install Node.js. Frontend will not be built.
echo WARNING: Node.js install failed. Frontend build will be skipped.
set "SKIP_FRONTEND=1"
goto node_ready
)
set "PATH=C:\Program Files\nodejs;%PATH%"
del "%NODE_MSI%" 2>nul
echo Node.js installed successfully!
echo Node.js installed.
:node_ready
:: ============================================================
:: STEP 3: Create data directories
:: STEP 3: Data directories
:: ============================================================
echo [2/5] Creating data directories...
echo [3/5] Preparing data directories...
if not exist "data\builds" mkdir "data\builds"
if not exist "data\logs" mkdir "data\logs"
if not exist "data\blueprints" mkdir "data\blueprints"
if not exist "data\preps" mkdir "data\preps"
if not exist "bin" mkdir "bin"
echo Created: data\builds, data\logs, data\blueprints, data\preps, bin
echo OK: data\ and bin\
:: ============================================================
:: STEP 4: Build frontend
:: STEP 4: Frontend
:: ============================================================
if defined SKIP_FRONTEND goto skip_frontend
echo [3/5] Building frontend dashboard...
echo Running npm install and npm run build in server\web\
cd server\web
echo [4/5] Building dashboard (server\web)...
cd /d "%ROOT%\server\web"
if not exist "node_modules" (
echo Installing npm dependencies...
echo npm install...
call npm install
if errorlevel 1 (
echo ERROR: npm install failed
cd ..\..
pause
exit /b 1
cd /d "%ROOT%"
echo ERROR: npm install failed.
goto fatal_exit
)
echo npm install completed successfully.
)
echo Building frontend with Vite...
echo npm run build...
call npm run build
if errorlevel 1 (
echo ERROR: Frontend build failed
cd ..\..
pause
exit /b 1
) else (
echo Frontend built successfully: server\web\dist
cd /d "%ROOT%"
echo ERROR: Frontend build failed.
goto fatal_exit
)
cd ..\..
cd /d "%ROOT%"
echo Frontend built: server\web\dist
goto frontend_done
:skip_frontend
echo [3/5] Skipping frontend build - Node.js not available
echo [4/5] Skipping frontend build (Node.js unavailable)
if not exist "server\web\dist\index.html" (
echo WARNING: No server\web\dist\index.html — dashboard may not load.
)
:frontend_done
:: Copy frontend to webroot for server
if exist "server\web\dist\index.html" (
if not exist "server\webroot" mkdir "server\webroot"
xcopy /E /I /Y "server\web\dist\*" "server\webroot\" >nul
xcopy /E /I /Y /Q "server\web\dist\*" "server\webroot\" >nul
echo Copied dashboard to server\webroot
)
:: ============================================================
:: STEP 5: Build server
:: STEP 5: Server binary
:: ============================================================
echo [4/5] Building server...
echo Running go build in server\...
cd server
echo Downloading Go dependencies...
echo [5/5] Building control server...
cd /d "%ROOT%\server"
go mod download
if errorlevel 1 (
echo WARNING: go mod download failed, trying build anyway...
)
echo Compiling server binary...
if errorlevel 1 echo WARNING: go mod download had issues; continuing...
echo go build...
go build -ldflags="-s -w" -o "..\bin\miner-server.exe" .
if errorlevel 1 (
echo ERROR: Build failed
cd ..
pause
exit /b 1
cd /d "%ROOT%"
echo ERROR: Server build failed.
goto fatal_exit
)
cd ..
echo Server built successfully: bin\miner-server.exe
cd /d "%ROOT%"
if not exist "bin\miner-server.exe" (
echo ERROR: bin\miner-server.exe was not created.
goto fatal_exit
)
echo Server binary: bin\miner-server.exe
:: ============================================================
:: LAUNCH
:: LAUNCH (foreground — logs stay in this window)
:: ============================================================
echo [5/5] Starting server on port 8989...
echo.
echo Stopping any previous miner-server.exe...
taskkill /F /IM miner-server.exe >nul 2>nul
timeout /t 1 /nobreak >nul
set "LAN_IP=localhost"
for /f "usebackq delims=" %%I in (`powershell -NoProfile -Command "(Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.IPAddress -notlike '127.*' -and $_.PrefixOrigin -ne 'WellKnown' } | Select-Object -First 1 -ExpandProperty IPAddress)"`) do set "LAN_IP=%%I"
for /f "usebackq delims=" %%I in (`powershell -NoProfile -Command "(Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.IPAddress -notlike '127.*' -and $_.PrefixOrigin -ne 'WellKnown' } | Select-Object -First 1 -ExpandProperty IPAddress) 2>$null"`) do set "LAN_IP=%%I"
echo.
echo ==============================================================
echo SERVER IS NOW LIVE
echo STARTING CONTROL SERVER
echo ==============================================================
echo Dashboard: http://localhost:8989
echo LAN: http://%LAN_IP%:8989
echo Agents WS: ws://%LAN_IP%:8989/ws/agent
echo Data: %ROOT%\data\
echo.
echo Dashboard URL: http://0.0.0.0:8989
echo LAN Access: http://%LAN_IP%:8989
echo Local: http://localhost:8989
echo.
echo WebSocket agents: ws://%LAN_IP%:8989/ws/agent
echo WebSocket dash: ws://%LAN_IP%:8989/ws/dashboard
echo.
echo Quick Start:
echo 1. Open Dashboard in your browser
echo 2. Go to Calibrate - configure pool and wallet
echo 3. Go to Forge - build your miner installer .exe
echo 4. Run that .exe on each Windows machine
echo.
echo Data Directory: %CD%\data\
echo Config File: %CD%\data\config.json
echo Blueprints: %CD%\data\blueprints\
echo.
echo Press Ctrl+C in this window to stop the server
echo Live logs appear below. Ctrl+C stops the server.
echo ==============================================================
echo.
start http://localhost:8989
:: Open browser after a short delay (server starts in this window)
start "" cmd /c "timeout /t 3 /nobreak >nul && start http://localhost:8989/"
:: If an old server instance is running, stop it first to avoid bind errors.
taskkill /F /IM miner-server.exe >nul 2>nul
echo [Server] Starting miner-server.exe on 0.0.0.0:8989...
echo [Server] Log output below - Ctrl+C to stop:
echo [Server] miner-server.exe -port 8989 -data "%ROOT%\data"
echo.
.\bin\miner-server.exe -port 8989 -data ".\data"
.\bin\miner-server.exe -port 8989 -data "%ROOT%\data"
set "EXITCODE=!ERRORLEVEL!"
echo.
echo [Server] Server stopped.
if "!EXITCODE!"=="0" (
echo [Server] Stopped normally.
) else (
echo [Server] Exited with code !EXITCODE!.
echo If port 8989 was in use, close other miner-server windows and run again.
)
echo.
goto end_pause
:fatal_exit
echo.
echo ==============================================================
echo LAUNCH FAILED — fix the errors above and run run.bat again.
echo ==============================================================
echo.
:end_pause
pause
endlocal