vishal5589/secops-portal
GitHub: vishal5589/secops-portal
面向安全蓝队的单文件运营门户,统一追踪安全项目与日常 BAU 任务,提供仪表盘分析、审计日志和一键生成委员会报告。
Stars: 0 | Forks: 0
# SecOps 门户
一个面向安全(蓝队)运营职能的单文件运营门户——在一个地方跟踪以里程碑为驱动的**安全项目**和重复性的 **BAU** (Business As Usual) 任务,并提供仪表板、内联编辑、审计追踪和一键生成委员会报告的功能。
完全构建于 Cloudflare 的边缘计算上:**Workers + D1 (SQLite)**,原生 JS,无框架,无构建步骤。整个应用——UI、样式、客户端逻辑、REST API 和定时任务——全部集中在一个 `worker.js` 文件中。
## 开发初衷
安全团队需要同时处理两种截然不同的工作:有时间限制的项目(例如 PAM 推广、防火墙审计)和永无休止的日常运营(例如每日警报分类、每月补丁审查)。大多数跟踪工具只能处理其中一种。本门户将两者视为同等重要的一等公民,自动展示逾期或有风险的内容,并可一键将整体情况转化为可供委员会审阅的报告——从而让团队把时间花在做事上,而不是重新排版状态更新。
## 核心亮点
- **三大视图** —— Dashboard、Projects、BAU —— 带有支持刷新和书签的 URL 路由选项卡 (`?tab=`)。
- **Dashboard 分析** —— 动画 KPI 卡片、状态分布条、按负责人划分的项目环图、为期 9 周的 **workload heatmap**(负责人 × 周),以及一个带有 7/14/30 天时间窗口的统一 **upcoming-deadlines** 列表。
- **内联编辑** —— 状态、负责人、阶段、进度、频率、优先级和日期都可以直接通过弹出选择器在表格中进行编辑;无需弹出模态框。
- **审计日志** —— 每一次字段更改都会记录下操作者和时间,可按记录查看(旧值 → 新值差异比对)。
- **软删除与恢复** —— 删除的内容会进入 30 天的归档区;每日 cron 任务会清除过期项目并捕获指标快照。
- **数据导出** —— CSV(防注入)、Excel(SheetJS)、PDF(jsPDF),以及包含 KPI、表格、环图、工作负载图表、风险表和周环比趋势箭头的两页式 **board report** (PowerPoint) (PptxGenJS)。
- **智能建议** —— 上下文提示会标记过期的“On Track”项目、已过期的目标日期,以及进度超前于阶段的情况。
- **明亮/深色主题**、支持减弱动态效果,以及移动端响应式布局。
## 架构
```
worker.js (single file)
├── HTML/CSS/JS UI served at GET / (template literal)
├── REST API /api/projects · /api/bau · /api/subtasks · /api/audit · /api/archive · /api/metrics
└── scheduled() handler daily cron — metrics snapshot + 30-day archive purge
```
- **Runtime:** Cloudflare Workers
- **数据:** Cloudflare D1 (SQLite) —— 包含 `projects`、`bau_tasks`、`sub_tasks`、`audit_log`、`metric_snapshots` 表
- **前端:** 原生 JS + 内嵌 HTML/CSS,runtime 零依赖;导出库仅在使用时从 CDN 惰性加载
- **认证(生产环境):** 设计为部署在 Cloudflare Access (Zero Trust) 之后;API 从请求头中读取已认证的用户,以用于审计归属
- **演示模式:** 通过一个简单的 `PREVIEW_MODE` 标志,即可将 D1 后端替换为带有种子数据的 `localStorage`
## 运行说明
**作为在线演示:** 创建一个 Worker,粘贴 `worker.js`,然后部署。设置 `PREVIEW_MODE = true` 后,它无需 D1 绑定,也无需认证。
**连接真实后端:** 设置 `PREVIEW_MODE = false`,将一个 D1 数据库绑定为 `DB`,创建 schema,并为快照/清除任务添加一个 `0 2 * * *` 的 cron 触发器。
## 工程笔记
- 单文件,约 8k 行代码,无 bundler —— UI 是一个 template literal,这意味着需要小心处理内联处理程序的转义,并且在每次部署前需要进行两层语法检查(Worker JS + 内嵌的浏览器 JS)。
- 逾期状态是在渲染时根据日期计算的,而不是静态存储的,因此仪表板、横幅、过滤器和报告永远不会因过期的状态字段而出现不同步的情况。
- 入场动画在首次渲染时仅触发一次,并在刷新/内联编辑时被抑制,从而使仪表板感觉生动活泼,又不会在每次击键时都重新播放动画。
## 许可证
MIT
## 开发初衷
安全团队需要同时处理两种截然不同的工作:有时间限制的项目(例如 PAM 推广、防火墙审计)和永无休止的日常运营(例如每日警报分类、每月补丁审查)。大多数跟踪工具只能处理其中一种。本门户将两者视为同等重要的一等公民,自动展示逾期或有风险的内容,并可一键将整体情况转化为可供委员会审阅的报告——从而让团队把时间花在做事上,而不是重新排版状态更新。
## 核心亮点
- **三大视图** —— Dashboard、Projects、BAU —— 带有支持刷新和书签的 URL 路由选项卡 (`?tab=`)。
- **Dashboard 分析** —— 动画 KPI 卡片、状态分布条、按负责人划分的项目环图、为期 9 周的 **workload heatmap**(负责人 × 周),以及一个带有 7/14/30 天时间窗口的统一 **upcoming-deadlines** 列表。
- **内联编辑** —— 状态、负责人、阶段、进度、频率、优先级和日期都可以直接通过弹出选择器在表格中进行编辑;无需弹出模态框。
- **审计日志** —— 每一次字段更改都会记录下操作者和时间,可按记录查看(旧值 → 新值差异比对)。
- **软删除与恢复** —— 删除的内容会进入 30 天的归档区;每日 cron 任务会清除过期项目并捕获指标快照。
- **数据导出** —— CSV(防注入)、Excel(SheetJS)、PDF(jsPDF),以及包含 KPI、表格、环图、工作负载图表、风险表和周环比趋势箭头的两页式 **board report** (PowerPoint) (PptxGenJS)。
- **智能建议** —— 上下文提示会标记过期的“On Track”项目、已过期的目标日期,以及进度超前于阶段的情况。
- **明亮/深色主题**、支持减弱动态效果,以及移动端响应式布局。
## 架构
```
worker.js (single file)
├── HTML/CSS/JS UI served at GET / (template literal)
├── REST API /api/projects · /api/bau · /api/subtasks · /api/audit · /api/archive · /api/metrics
└── scheduled() handler daily cron — metrics snapshot + 30-day archive purge
```
- **Runtime:** Cloudflare Workers
- **数据:** Cloudflare D1 (SQLite) —— 包含 `projects`、`bau_tasks`、`sub_tasks`、`audit_log`、`metric_snapshots` 表
- **前端:** 原生 JS + 内嵌 HTML/CSS,runtime 零依赖;导出库仅在使用时从 CDN 惰性加载
- **认证(生产环境):** 设计为部署在 Cloudflare Access (Zero Trust) 之后;API 从请求头中读取已认证的用户,以用于审计归属
- **演示模式:** 通过一个简单的 `PREVIEW_MODE` 标志,即可将 D1 后端替换为带有种子数据的 `localStorage`
## 运行说明
**作为在线演示:** 创建一个 Worker,粘贴 `worker.js`,然后部署。设置 `PREVIEW_MODE = true` 后,它无需 D1 绑定,也无需认证。
**连接真实后端:** 设置 `PREVIEW_MODE = false`,将一个 D1 数据库绑定为 `DB`,创建 schema,并为快照/清除任务添加一个 `0 2 * * *` 的 cron 触发器。
## 工程笔记
- 单文件,约 8k 行代码,无 bundler —— UI 是一个 template literal,这意味着需要小心处理内联处理程序的转义,并且在每次部署前需要进行两层语法检查(Worker JS + 内嵌的浏览器 JS)。
- 逾期状态是在渲染时根据日期计算的,而不是静态存储的,因此仪表板、横幅、过滤器和报告永远不会因过期的状态字段而出现不同步的情况。
- 入场动画在首次渲染时仅触发一次,并在刷新/内联编辑时被抑制,从而使仪表板感觉生动活泼,又不会在每次击键时都重新播放动画。
## 许可证
MIT标签:Dashboard, Linux 内核安全, 任务追踪, 安全运营, 审计日志, 扫描框架, 程序员工具, 自定义脚本, 项目管理