@echo off REM ============================================================================ REM Scoreboard 一键备份(Windows) REM REM 调用 scoreboard.exe 的 backup 子命令(内置 VACUUM INTO),服务运行中也能 REM 安全执行,不需要停服务、不依赖外部 sqlite3.exe。 REM 产物落在 data\backups\,服务端按库(system / 各赛事)各自滚动保留 20 份。 REM 注意:只快照 .db,不含 event_projs\<项目>\uploads\ 里的背景图/会标等资源; REM 需要连资源一起留档时,请另行拷贝 data\event_projs\<项目>\uploads\。 REM REM 用法:deploy\backup.bat 手动备份(原因记 manual) REM deploy\backup.bat publish 发布前备份(原因记 publish) REM ============================================================================ setlocal enabledelayedexpansion chcp 65001 >nul 2>&1 cd /d "%~dp0.." set "ROOT=%CD%" set "DATA=%ROOT%\data" set "REASON=manual" if not "%~1"=="" set "REASON=%~1" set "REASON=%REASON: =_%" set "REASON=%REASON:/=-%" set "REASON=%REASON:\=-%" set "REASON=%REASON:"=%" if not exist "%DATA%" ( echo [错误] 找不到数据目录:%DATA% echo 请在项目根目录执行本脚本。 exit /b 1 ) REM ---- 定位 scoreboard.exe ---------------------------------------------------- set "EXE=" if exist "%~dp0..\dist\scoreboard.exe" set "EXE=%~dp0..\dist\scoreboard.exe" if not defined EXE if exist "%ROOT%\scoreboard.exe" set "EXE=%ROOT%\scoreboard.exe" if not defined EXE if exist "%~dp0scoreboard.exe" set "EXE=%~dp0scoreboard.exe" if not defined EXE for %%I in (scoreboard.exe) do if exist "%%~$PATH:I" set "EXE=%%~$PATH:I" if not defined EXE ( echo [错误] 找不到 scoreboard.exe。 echo 请先执行 deploy\build.bat,或把它放到项目根目录 / 加入 PATH。 exit /b 1 ) REM dataDir 是相对路径,服务端按当前工作目录解析,所以必须在项目根目录调用 if not exist "%ROOT%\config.yaml" ( echo [错误] 找不到 %ROOT%\config.yaml,无法定位 dataDir。 exit /b 1 ) echo === Scoreboard 备份 === echo 数据目录:%DATA% echo 服务端 :%EXE% echo 原因 :%REASON% echo. set /a OK=0 set /a FAIL=0 REM 服务端一次只备份一个赛事库(system.db 每次都会一并快照),按目录逐个调用; REM 部署形态通常只有一个 default 项目,这里就只跑一次。 set "FOUND=" for /d %%D in ("%DATA%\event_projs\*") do ( set "FOUND=1" echo 备份赛事 %%~nxD "%EXE%" backup -config config.yaml -project "%%~nxD" -reason "%REASON%" if errorlevel 1 (set /a FAIL+=1) else (set /a OK+=1) ) if not defined FOUND ( echo 备份默认赛事 "%EXE%" backup -config config.yaml -reason "%REASON%" if errorlevel 1 (set /a FAIL+=1) else (set /a OK+=1) ) echo. echo === 备份完成:成功 !OK! 个,失败 !FAIL! 个 === dir /b "%DATA%\backups\*.db" 2>nul if !FAIL! GTR 0 ( endlocal exit /b 1 ) endlocal exit /b 0