Files
Scoreboard/devdocs/08-安全与可靠性.md
T

3.5 KiB
Raw Blame History

08 · 安全与可靠性

所属:运动会积分榜系统 · 开发文档集 版本:v0.1(讨论稿) · 2026-09-09 上游:README · 相关:10-部署与现场方案


第一部分 · 安全与权限

1. 认证

项 方案
密码存储 argon2id(次选 bcrypt cost ≥ 12)
会话 HttpOnly + SameSite=Lax Cookie,12h 过期,服务端可强制下线
CSRF 双提交 Cookie / @fastify/csrf-protection
默认账号 首次启动生成随机强密码并打印到控制台,强制首次登录修改
限流 登录 5 次/分钟/IP,写操作 30 次/分钟/用户

2. 授权

角色 权限
admin 全部 + 用户管理 + 赛事配置 + 备份恢复
chief 录入、修改、审核、发布、撤销、登记破纪录、加减分、控制大屏
recorder 仅录入草稿、查看自己录入的内容
viewer 只读
  • 路由级 + 服务级双重校验:不信任前端隐藏按钮,服务端每个写接口独立校验权限。
  • 大屏端只读、免登录;可选 display_key 参数防止无关人员误开。

3. 审计

  • 所有写操作记录:操作人、时间、IP、request_id、before_json、after_json。
  • 审计日志只读、不可删(仅管理员可导出/归档)。
  • 关键动作单独标记:发布、撤销发布、作废成绩、人工加减分、用户管理。

4. 传输安全

  • 内网 HTTP 即可。
  • 若 D9 选「外网可访问」:必须 HTTPS + 反向代理 + 访问口令,并单独做一次安全评审。

5. 其他

  • 备份文件放 data/backups/,不随 git 提交;可选加密。
  • 上传的 logo 做类型与大小校验,存储路径不暴露原始文件名。
  • 生产环境关闭详细错误堆栈,仅返回 error.code。

第二部分 · 可靠性、备份与容灾

6. 数据可靠性

项 做法
SQLite 模式 WAL + synchronous=NORMAL(现场断电风险高则用 FULL,性能足够)
自动备份 每 5 分钟一次 + 每次发布前一次
备份方式 VACUUM INTO 生成一致性快照(比直接复制文件安全)
保留策略 滚动保留最近 20 份
全量导出 一键导出全量 JSON;一键恢复

7. 进程可靠性

平台 方案
Linux systemd 服务,Restart=always,日志进 journald
Windows 包装成服务(nssm)或计划任务 + 开机自启
健康检查 /api/health,异常自动重启

8. 现场容灾预案

故障 预案
服务端主机死机 备机启动同一份部署包,恢复最新备份,改 IP 或切换路由器 DHCP 保留
数据库损坏 用最近备份恢复(丢失 ≤5 分钟数据),必要时手工补录
大屏机死机 备用笔记本打开同一 URL 即可顶替
网络中断 大屏继续显示缓存数据;恢复后自动补增量
断电 建议主机接 UPS;恢复后 systemd 自动拉起
误发布 撤销发布 → 修正 → 重新发布,全程 ≤1 分钟

彩排要求:正式比赛前至少做一次「全流程 + 断网 + 断电 + 恢复」演练。

9. 监控与告警

  • /api/health 返回:进程存活、数据库可读写、版本号、最近一次备份时间。
  • 管理面板「系统」页展示:数据库大小、备份列表、磁盘剩余空间。
  • 磁盘剩余空间低于阈值时在管理端告警(现场最容易踩的坑之一)。