2026-06-12 09:14:49 -05:00
|
|
|
@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
|
2026-07-12 23:14:29 -05:00
|
|
|
REM OVERLORD_CLIENT_PRESENCE_SYNC_MS=60000
|
|
|
|
|
REM OVERLORD_VIEWER_BACKPRESSURE_BYTES=2097152
|
|
|
|
|
REM OVERLORD_MEDIA_VIEWER_BACKPRESSURE_BYTES=524288
|
2026-06-12 09:14:49 -05:00
|
|
|
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
|
2026-07-12 23:14:29 -05:00
|
|
|
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
|
2026-06-12 09:14:49 -05:00
|
|
|
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%
|
2026-07-12 23:14:29 -05:00
|
|
|
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%
|
2026-06-12 09:14:49 -05:00
|
|
|
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
|