Files
overlord/scripts/start-prod-tuned.bat
T
2026-06-12 09:14:49 -05:00

210 lines
9.6 KiB
Batchfile

@echo off
setlocal
set "SCRIPT_DIR=%~dp0"
for %%I in ("%SCRIPT_DIR%..") do set "ROOT=%%~fI\"
set "MODE=%~1"
REM Tuned production launcher for small VPS targets.
REM Usage:
REM scripts\start-prod-tuned.bat
REM scripts\start-prod-tuned.bat loadtest
REM scripts\start-prod-tuned.bat loadtest-baseline
REM scripts\start-prod-tuned.bat loadtest-profile
REM
REM Optional env overrides before running:
REM PORT=5173
REM HOST=0.0.0.0
REM OVERLORD_AGENT_TOKEN=change-me
REM OVERLORD_USER=admin
REM OVERLORD_PASS=change-me
REM OVERLORD_TLS_OFFLOAD=false
REM OVERLORD_HEARTBEAT_INTERVAL_MS=30000
REM OVERLORD_HEARTBEAT_SWEEP_TICK_MS=1000
REM OVERLORD_CLIENT_DB_SYNC_MS=15000
REM OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE=100
REM OVERLORD_EVENT_LOOP_SAMPLE_MS=100
REM OVERLORD_EVENT_LOOP_HISTORY_SECONDS=60
REM OVERLORD_DASHBOARD_DEBOUNCE_MS=1000
REM OVERLORD_DASHBOARD_EVENT_FLUSH_MS=1000
REM OVERLORD_DASHBOARD_EVENT_INLINE_LIMIT=20
REM OVERLORD_OFFLINE_BATCH_SIZE=250
REM OVERLORD_OFFLINE_BATCH_DELAY_MS=25
REM OVERLORD_LOAD_TEST_PROFILE=realistic
REM OVERLORD_LOAD_TEST_DEFER_SYNTHETIC_DB=true
REM OVERLORD_THUMBNAILS_DASHBOARD_ENABLED=false
REM MAX_WS_MESSAGE_BYTES_CLIENT=8388608
REM MAX_WS_MESSAGE_BYTES_VIEWER=1048576
if not defined HOST set HOST=0.0.0.0
if not defined PORT set PORT=5173
if not defined LOG_LEVEL set LOG_LEVEL=info
if not defined NODE_ENV set NODE_ENV=production
REM Small-host connection tuning. These are conservative for ~250 mostly-idle
REM agents on a 2 vCPU / 2 GB host.
if not defined OVERLORD_HEARTBEAT_INTERVAL_MS set OVERLORD_HEARTBEAT_INTERVAL_MS=30000
if not defined OVERLORD_HEARTBEAT_SWEEP_TICK_MS set OVERLORD_HEARTBEAT_SWEEP_TICK_MS=1000
if not defined OVERLORD_CLIENT_DB_SYNC_MS set OVERLORD_CLIENT_DB_SYNC_MS=15000
if not defined OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE set OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE=100
if not defined OVERLORD_EVENT_LOOP_SAMPLE_MS set OVERLORD_EVENT_LOOP_SAMPLE_MS=100
if not defined OVERLORD_EVENT_LOOP_HISTORY_SECONDS set OVERLORD_EVENT_LOOP_HISTORY_SECONDS=60
if not defined OVERLORD_DASHBOARD_DEBOUNCE_MS set OVERLORD_DASHBOARD_DEBOUNCE_MS=1000
if not defined OVERLORD_DASHBOARD_EVENT_FLUSH_MS set OVERLORD_DASHBOARD_EVENT_FLUSH_MS=1000
if not defined OVERLORD_DASHBOARD_EVENT_INLINE_LIMIT set OVERLORD_DASHBOARD_EVENT_INLINE_LIMIT=20
if not defined OVERLORD_OFFLINE_BATCH_SIZE set OVERLORD_OFFLINE_BATCH_SIZE=250
if not defined OVERLORD_OFFLINE_BATCH_DELAY_MS set OVERLORD_OFFLINE_BATCH_DELAY_MS=25
if not defined OVERLORD_STALE_MS set OVERLORD_STALE_MS=120000
if not defined OVERLORD_DISCONNECT_TIMEOUT_MS set OVERLORD_DISCONNECT_TIMEOUT_MS=10000
if not defined PRUNE_BATCH set PRUNE_BATCH=250
if not defined MAX_WS_MESSAGE_BYTES_CLIENT set MAX_WS_MESSAGE_BYTES_CLIENT=8388608
if not defined MAX_WS_MESSAGE_BYTES_VIEWER set MAX_WS_MESSAGE_BYTES_VIEWER=1048576
if not defined OVERLORD_WS_UPGRADE_RATE_WINDOW_MS set OVERLORD_WS_UPGRADE_RATE_WINDOW_MS=10000
set OVERLORD_PROFILE_SOURCE_MODE=false
REM Keep proxy trust disabled unless the deploy explicitly opts into it.
if not defined OVERLORD_TLS_OFFLOAD set OVERLORD_TLS_OFFLOAD=false
if not defined OVERLORD_TRUST_PROXY set OVERLORD_TRUST_PROXY=false
if not defined OVERLORD_TRUST_PROXY_HEADERS set OVERLORD_TRUST_PROXY_HEADERS=false
if not defined OVERLORD_AUTH_COOKIE_SECURE set OVERLORD_AUTH_COOKIE_SECURE=auto
if /I "%MODE%"=="loadtest" (
if not defined OVERLORD_AGENT_TOKEN (
echo [error] loadtest mode requires OVERLORD_AGENT_TOKEN to be set.
echo Example:
echo set OVERLORD_AGENT_TOKEN=some-long-random-token
echo scripts\start-prod-tuned.bat loadtest
endlocal
exit /b 1
)
set OVERLORD_LOAD_TEST_ALLOW_UNSIGNED_AGENTS=true
if not defined OVERLORD_LOAD_TEST_PROFILE set OVERLORD_LOAD_TEST_PROFILE=realistic
if not defined OVERLORD_LOAD_TEST_SKIP_SIDE_EFFECTS set OVERLORD_LOAD_TEST_SKIP_SIDE_EFFECTS=false
if not defined OVERLORD_LOAD_TEST_DEFER_SYNTHETIC_DB set OVERLORD_LOAD_TEST_DEFER_SYNTHETIC_DB=true
if "%OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE%"=="100" set OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE=500
if not defined OVERLORD_WS_UPGRADE_RATE_MAX set OVERLORD_WS_UPGRADE_RATE_MAX=2000
if not defined OVERLORD_THUMBNAILS_DASHBOARD_ENABLED set OVERLORD_THUMBNAILS_DASHBOARD_ENABLED=false
) else if /I "%MODE%"=="loadtest-profile" (
if not defined OVERLORD_AGENT_TOKEN (
echo [error] loadtest-profile mode requires OVERLORD_AGENT_TOKEN to be set.
echo Example:
echo set OVERLORD_AGENT_TOKEN=some-long-random-token
echo scripts\start-prod-tuned.bat loadtest-profile
endlocal
exit /b 1
)
set OVERLORD_PROFILE_SOURCE_MODE=true
set OVERLORD_LOAD_TEST_ALLOW_UNSIGNED_AGENTS=true
if not defined OVERLORD_LOAD_TEST_PROFILE set OVERLORD_LOAD_TEST_PROFILE=realistic
if not defined OVERLORD_LOAD_TEST_SKIP_SIDE_EFFECTS set OVERLORD_LOAD_TEST_SKIP_SIDE_EFFECTS=false
if not defined OVERLORD_LOAD_TEST_DEFER_SYNTHETIC_DB set OVERLORD_LOAD_TEST_DEFER_SYNTHETIC_DB=true
if "%OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE%"=="100" set OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE=500
if not defined OVERLORD_WS_UPGRADE_RATE_MAX set OVERLORD_WS_UPGRADE_RATE_MAX=2000
if not defined OVERLORD_THUMBNAILS_DASHBOARD_ENABLED set OVERLORD_THUMBNAILS_DASHBOARD_ENABLED=false
) else if /I "%MODE%"=="loadtest-baseline" (
if not defined OVERLORD_AGENT_TOKEN (
echo [error] loadtest-baseline mode requires OVERLORD_AGENT_TOKEN to be set.
echo Example:
echo set OVERLORD_AGENT_TOKEN=some-long-random-token
echo scripts\start-prod-tuned.bat loadtest-baseline
endlocal
exit /b 1
)
set OVERLORD_LOAD_TEST_ALLOW_UNSIGNED_AGENTS=true
if not defined OVERLORD_LOAD_TEST_PROFILE set OVERLORD_LOAD_TEST_PROFILE=baseline
if not defined OVERLORD_LOAD_TEST_SKIP_SIDE_EFFECTS set OVERLORD_LOAD_TEST_SKIP_SIDE_EFFECTS=true
if not defined OVERLORD_LOAD_TEST_DEFER_SYNTHETIC_DB set OVERLORD_LOAD_TEST_DEFER_SYNTHETIC_DB=true
if "%OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE%"=="100" set OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE=500
if not defined OVERLORD_WS_UPGRADE_RATE_MAX set OVERLORD_WS_UPGRADE_RATE_MAX=2000
if not defined OVERLORD_THUMBNAILS_DASHBOARD_ENABLED set OVERLORD_THUMBNAILS_DASHBOARD_ENABLED=false
) else (
set OVERLORD_LOAD_TEST_ALLOW_UNSIGNED_AGENTS=false
if not defined OVERLORD_WS_UPGRADE_RATE_MAX set OVERLORD_WS_UPGRADE_RATE_MAX=30
)
echo === Overlord tuned production server ===
echo HOST=%HOST%
echo PORT=%PORT%
echo NODE_ENV=%NODE_ENV%
echo LOG_LEVEL=%LOG_LEVEL%
echo OVERLORD_HEARTBEAT_INTERVAL_MS=%OVERLORD_HEARTBEAT_INTERVAL_MS%
echo OVERLORD_HEARTBEAT_SWEEP_TICK_MS=%OVERLORD_HEARTBEAT_SWEEP_TICK_MS%
echo OVERLORD_CLIENT_DB_SYNC_MS=%OVERLORD_CLIENT_DB_SYNC_MS%
echo OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE=%OVERLORD_CLIENT_DB_SYNC_BATCH_SIZE%
echo OVERLORD_EVENT_LOOP_SAMPLE_MS=%OVERLORD_EVENT_LOOP_SAMPLE_MS%
echo OVERLORD_EVENT_LOOP_HISTORY_SECONDS=%OVERLORD_EVENT_LOOP_HISTORY_SECONDS%
echo OVERLORD_DASHBOARD_DEBOUNCE_MS=%OVERLORD_DASHBOARD_DEBOUNCE_MS%
echo OVERLORD_DASHBOARD_EVENT_FLUSH_MS=%OVERLORD_DASHBOARD_EVENT_FLUSH_MS%
echo OVERLORD_DASHBOARD_EVENT_INLINE_LIMIT=%OVERLORD_DASHBOARD_EVENT_INLINE_LIMIT%
echo OVERLORD_OFFLINE_BATCH_SIZE=%OVERLORD_OFFLINE_BATCH_SIZE%
echo OVERLORD_OFFLINE_BATCH_DELAY_MS=%OVERLORD_OFFLINE_BATCH_DELAY_MS%
echo MAX_WS_MESSAGE_BYTES_CLIENT=%MAX_WS_MESSAGE_BYTES_CLIENT%
echo MAX_WS_MESSAGE_BYTES_VIEWER=%MAX_WS_MESSAGE_BYTES_VIEWER%
echo OVERLORD_WS_UPGRADE_RATE_MAX=%OVERLORD_WS_UPGRADE_RATE_MAX%
echo OVERLORD_WS_UPGRADE_RATE_WINDOW_MS=%OVERLORD_WS_UPGRADE_RATE_WINDOW_MS%
echo OVERLORD_TLS_OFFLOAD=%OVERLORD_TLS_OFFLOAD%
echo OVERLORD_TRUST_PROXY=%OVERLORD_TRUST_PROXY%
echo OVERLORD_TRUST_PROXY_HEADERS=%OVERLORD_TRUST_PROXY_HEADERS%
echo OVERLORD_AUTH_COOKIE_SECURE=%OVERLORD_AUTH_COOKIE_SECURE%
echo OVERLORD_LOAD_TEST_ALLOW_UNSIGNED_AGENTS=%OVERLORD_LOAD_TEST_ALLOW_UNSIGNED_AGENTS%
echo OVERLORD_LOAD_TEST_PROFILE=%OVERLORD_LOAD_TEST_PROFILE%
echo OVERLORD_LOAD_TEST_SKIP_SIDE_EFFECTS=%OVERLORD_LOAD_TEST_SKIP_SIDE_EFFECTS%
echo OVERLORD_LOAD_TEST_DEFER_SYNTHETIC_DB=%OVERLORD_LOAD_TEST_DEFER_SYNTHETIC_DB%
echo OVERLORD_THUMBNAILS_DASHBOARD_ENABLED=%OVERLORD_THUMBNAILS_DASHBOARD_ENABLED%
echo OVERLORD_PROFILE_SOURCE_MODE=%OVERLORD_PROFILE_SOURCE_MODE%
echo.
if /I "%OVERLORD_LOAD_TEST_ALLOW_UNSIGNED_AGENTS%"=="true" (
echo [warning] Synthetic unsigned load-test agents are enabled.
echo [warning] Do not use this mode for public production traffic.
echo.
)
pushd "%ROOT%Overlord-Server"
echo [build] installing deps...
call bun install
if errorlevel 1 goto :err
if /I "%OVERLORD_PROFILE_SOURCE_MODE%"=="true" (
echo [build] building server assets for source-profile mode...
call bun run build:css
if errorlevel 1 goto :err
call bun run vendor
if errorlevel 1 goto :err
) else (
echo [build] building server assets and bundle...
call bun run build
if errorlevel 1 goto :err
)
if /I "%OVERLORD_PROFILE_SOURCE_MODE%"=="true" (
echo [build] skipping compiled executable so profiler keeps source function names.
) else (
echo [build] compiling Windows production executable...
call bun run build:prod:win
if errorlevel 1 goto :err
)
echo [build] copying Overlord-Client source for runtime builds...
robocopy "%ROOT%Overlord-Client" "%ROOT%Overlord-Server\dist\Overlord-Client" /E /XD build .git .vscode /NFL /NDL /NJH /NJS >nul
if errorlevel 8 goto :err
set "OVERLORD_ROOT=%ROOT%Overlord-Server"
if /I "%OVERLORD_PROFILE_SOURCE_MODE%"=="true" (
echo [server] starting source-profile server with Bun...
call bun src/index.ts
) else (
echo [server] starting compiled production server...
call "%ROOT%Overlord-Server\dist\overlord-server.exe"
)
popd
echo Server stopped.
endlocal
exit /b 0
:err
popd >nul 2>&1
echo [error] Production start failed.
endlocal
exit /b 1