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