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

90 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 08 · 安全与可靠性
> 所属:运动会积分榜系统 · 开发文档集
> 版本:v0.1(讨论稿) · 2026-09-09
> 上游:[README](./README.md) · 相关:[10-部署与现场方案](./10-部署与现场方案.md)
---
# 第一部分 · 安全与权限
## 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` 返回:进程存活、数据库可读写、版本号、最近一次备份时间。
- 管理面板「系统」页展示:数据库大小、备份列表、磁盘剩余空间。
- 磁盘剩余空间低于阈值时在管理端告警(现场最容易踩的坑之一)。