Files
Scoreboard/deploy/backup.bat
T
AskaEth 005b51b2ec fix: 数据目录移出安装目录,修掉「覆盖安装/卸载即丢数据」
根因:数据目录是 <安装目录>\data(config.yaml 的 dataDir 相对服务端工作目录),
而 electron-builder 的卸载器结尾执行 RMDir /r $INSTDIR,且覆盖安装会先跑旧卸载器
(installSection.nsh:52 的 uninstallOldVersion)→ 赛事库/规则/用户/审计/上传图片
连同安装目录被整个删除,再装新版。卸载一次同样如此。

- 服务端新增 -data <dir>(主命令、backup、passwd 三处),非空时覆盖 config.yaml 的
  dataDir;不传时行为完全不变(兼容便携/手工运行)
- Console 把数据指到当前用户目录 %LOCALAPPDATA%\ScoreboardConsole\data(卸载器不会碰
  这里;没有用 app.getPath('userData'),因为 %APPDATA%\<AppName> 正是被删的那个)
- 一次性迁移:目标为空且 <安装目录>\data 有数据时整体改名过去;两边都有数据时不动作
  只记警告;任何失败都保留原地数据、绝不删除
- passwd 也带 -data(否则重置的是安装目录下那个空库里的账号)
- deploy/backup.bat 指向同一数据目录
- 文档:部署指南新增「数据放在哪里(升级/卸载都不会删)」+ 备份/恢复/迁移路径改写,
  上线检查清单与使用手册同步

自检:服务端 12 包全绿;console 语法 14 文件 + datadir 单测 11/11;backup.bat 保持纯 ASCII。
2026-09-10 09:17:56 +08:00

99 lines
3.6 KiB
Batchfile

@echo off
REM ============================================================================
REM Scoreboard one-click backup (Windows)
REM
REM Calls scoreboard.exe's backup subcommand (VACUUM INTO), so it is safe to
REM run while the service is up and does not need an external sqlite3.exe.
REM Output goes to <data dir>\backups\; the server keeps the newest 20 per DB
REM (system / each event).
REM The data dir is the one the Console uses, i.e. %LOCALAPPDATA%\ScoreboardConsole\data
REM (falling back to <root>\data when that does not exist yet). It lives outside
REM the install dir on purpose: reinstalling over an existing install wipes the
REM install dir, so data must not be kept there.
REM NOTE: only .db snapshots are taken. Background images / emblems under
REM <data dir>\event_projs\<project>\uploads\ are NOT included; copy that
REM directory separately if you need them on the archive.
REM
REM Usage: deploy\backup.bat manual backup (reason=manual)
REM deploy\backup.bat publish pre-publish backup (reason=publish)
REM
REM Keep this file ASCII-only. cmd.exe mis-parses UTF-8 non-ASCII text inside
REM batch files (especially inside if(...) blocks). See deploy\build.bat.
REM ============================================================================
setlocal enabledelayedexpansion
chcp 65001 >nul 2>&1
cd /d "%~dp0.."
set "ROOT=%CD%"
REM Same data dir the Console hands to the server via -data.
set "DATA=%ROOT%\data"
if defined LOCALAPPDATA if exist "%LOCALAPPDATA%\ScoreboardConsole\data" set "DATA=%LOCALAPPDATA%\ScoreboardConsole\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 [ERROR] data directory not found: %DATA%
echo Start Scoreboard_Console.exe once so the service creates it,
echo or point this script at the data dir via -data manually.
exit /b 1
)
REM ---- locate 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 [ERROR] scoreboard.exe not found.
echo Run deploy\build.bat first, or put it in the project root / PATH.
exit /b 1
)
REM config.yaml is still needed for port / backup settings; -data below picks the
REM data dir explicitly, so the current directory no longer decides it.
if not exist "%ROOT%\config.yaml" (
echo [ERROR] %ROOT%\config.yaml not found.
exit /b 1
)
echo === Scoreboard backup ===
echo Data dir : %DATA%
echo Server : %EXE%
echo Reason : %REASON%
echo.
set /a OK=0
set /a FAIL=0
REM The server backs up one event DB at a time (system.db is always included),
REM so loop over the project directories. A typical deployment has one project.
set "FOUND="
for /d %%D in ("%DATA%\event_projs\*") do (
set "FOUND=1"
echo backup event %%~nxD
"%EXE%" backup -config config.yaml -project "%%~nxD" -data "%DATA%" -reason "%REASON%"
if errorlevel 1 (set /a FAIL+=1) else (set /a OK+=1)
)
if not defined FOUND (
echo backup default event
"%EXE%" backup -config config.yaml -data "%DATA%" -reason "%REASON%"
if errorlevel 1 (set /a FAIL+=1) else (set /a OK+=1)
)
echo.
echo === backup done: ok=!OK! fail=!FAIL! ===
dir /b "%DATA%\backups\*.db" 2>nul
if !FAIL! GTR 0 (
endlocal
exit /b 1
)
endlocal
exit /b 0