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