@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_CLIENT_PRESENCE_SYNC_MS=60000 REM OVERLORD_VIEWER_BACKPRESSURE_BYTES=2097152 REM OVERLORD_MEDIA_VIEWER_BACKPRESSURE_BYTES=524288 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_CLIENT_PRESENCE_SYNC_MS set OVERLORD_CLIENT_PRESENCE_SYNC_MS=60000 if not defined OVERLORD_VIEWER_BACKPRESSURE_BYTES set OVERLORD_VIEWER_BACKPRESSURE_BYTES=2097152 if not defined OVERLORD_MEDIA_VIEWER_BACKPRESSURE_BYTES set OVERLORD_MEDIA_VIEWER_BACKPRESSURE_BYTES=524288 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_CLIENT_PRESENCE_SYNC_MS=%OVERLORD_CLIENT_PRESENCE_SYNC_MS% echo OVERLORD_VIEWER_BACKPRESSURE_BYTES=%OVERLORD_VIEWER_BACKPRESSURE_BYTES% echo OVERLORD_MEDIA_VIEWER_BACKPRESSURE_BYTES=%OVERLORD_MEDIA_VIEWER_BACKPRESSURE_BYTES% 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