docs: 建立 devdocs 开发文档集(13 份模块文档)

This commit is contained in:
AskaEth committed 2026-09-09 16:10:40 +08:00
1 parent 3e9592b006
commit 3b3496559b
15 files changed
+1685 -2

No files matched your search

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