1cng-dev/SAW
GitHub: 1cng-dev/SAW
面向 security.1cloudng.com 的安全公告聚合器,统一接入 NVD、MITRE、GHSA 及厂商 RSS 等实时漏洞数据源,提供集中化的漏洞情报浏览与趋势追踪。
Stars: 0 | Forks: 0
# Sec-1CNG
一个专为 security.1cloudng.com 设计的安全公告聚合器。仅接入**真实、实时的**数据 —— 包括 NVD、MITRE、GitHub Security Advisories 以及安全新闻/供应商的 RSS feeds。整个 pipeline 中没有任何模拟或预置数据。
## 技术栈
- **Frontend**: React 18 + TypeScript + Vite, TanStack Query/Router/Table/Virtual/Form, Chakra UI, recharts
- **Backend**: Node.js + TypeScript + Fastify
- **Database**: PostgreSQL via Drizzle ORM
- **Cache/Queue**: Redis + BullMQ
- **Monorepo**: npm workspaces (`apps/api`, `apps/worker`, `apps/web`, `packages/db`, `packages/shared`)
## 前置条件
- Node.js >= 20
- Docker(用于运行 Postgres + Redis,或通过 `docker compose up` 运行完整环境)
- NVD API key 是可选的,但推荐使用 ——
(未认证:5 req/30s,认证后:50 req/30s)
- 必须提供 GitHub personal access token 才能进行 GitHub Security Advisory (GHSA)
的接入。如果没有该 token,GHSA 的接入逻辑虽然已完整配置,但会正常地空跳过
(输出日志 `skipped: no GITHUB_TOKEN configured`),而不会引发报错。
## 设置
```
cp .env.example .env
# 编辑 .env:如果你有的话,填写 NVD_API_KEY / GITHUB_TOKEN
npm install
# 仅启动 Postgres + Redis(用于直接在主机上运行 api/worker/web)
docker compose up -d postgres redis
# 运行 Drizzle migrations
npm run db:migrate
```
`npm run db:generate` 会在 schema 发生变更后,根据 `packages/db/src/schema/`
中的 Drizzle schema 重新生成迁移 SQL;`npm run db:studio` 将针对
正在运行的数据库打开 Drizzle Studio。
## 运行应用
API 服务器和接入 worker 是**独立的进程** —— 请在单独的终端中运行它们
(或通过 Docker Compose 运行,见下文):
```
npm run dev:api # Fastify API on http://localhost:4000
npm run dev:worker # BullMQ worker: runs scheduled ingestion + trending jobs
npm run dev:web # Vite dev server on http://localhost:5173
```
Worker 在启动时会注册可重复执行的 BullMQ 任务,并会立即将每个任务
加入队列执行一次,以便让接入工作立即可见地开始运行:
| Job | Interval |
|---|---|
| `sync-nvd-cves` | 每 2h(通过 `sync_state` 游标增量执行) |
| `sync-news-feeds` | 每 15m |
| `sync-vendor-advisories` | 每 6h |
| `sync-ghsa-advisories` | 每 6h(若无 `GITHUB_TOKEN` 则空跳过) |
| `recalculate-trending` | 每 30m |
随时检查 `GET /api/admin/sync-status`(或在浏览器中访问),以查看每个
Job 的上次运行时间、状态和记录数。
## 触发手动同步
在 worker/scheduler 运行之前,或任何你想要在计划外按需
拉取数据时,请使用一次性的 CLI 脚本(与 BullMQ 处理器调用的接入代码相同):
```
npm run sync:nvd # pulls NVD_PULL_DAYS (default 7) days of lastModified CVEs
npm run sync:news # pulls all 5 news RSS feeds once
npm run sync:vendors # pulls MSRC/Ubuntu/Cisco vendor advisory feeds once
```
每个脚本都会输出一份摘要(获取/插入/更新的记录数),并向
`sync_log` 写入一条记录。任何无法访问的数据源都会被明确记录 —— 绝不回退到使用占位符数据。
### 已知数据源注意事项
- **SecurityWeek** 自此版本构建起会拦截自动化/数据中心流量(HTTP 403) ——
每次运行都会将其记录为失败的 feed,而非伪造数据。
- **Red Hat** 自此版本构建起没有可用的纯 RSS/Atom feed;其
发布格式为 CSAF/ROLIE JSON。未包含在 `VENDOR_FEEDS`
(`packages/shared/src/constants.ts`)中 —— 若要添加,将需要专门的感知 CSAF 的接入模块。
## Docker Compose(完整技术栈)
```
docker compose up -d
```
启动 `postgres`、`redis`、一次性的 `migrate` 服务(运行 Drizzle
迁移后退出)、`api`(端口 4000)、`worker` 和 `web`(端口 5173,
Vite 开发服务器将 `/api` 代理到 `api` 容器)。`NVD_API_KEY` /
`GITHUB_TOKEN` 会自动从你的根目录 `.env` 中读取。
```
docker compose logs -f worker # watch ingestion jobs run
docker compose down # stop (add -v to also drop the Postgres volume)
```
## 项目结构
```
apps/
api/ Fastify HTTP API (reads only — never writes/ingests)
worker/ Ingestion modules, one-off CLI scripts, BullMQ processors/scheduler
web/ React frontend
packages/
db/ Drizzle schema, migrations, db client factory
shared/ Cross-cutting constants (feed URLs, CVE regex, severity colors), zod validation, types
```
标签:MITM代理, 前端工程, 后端开发, 搜索引擎查询, 数据库, 测试用例, 消息队列, 漏洞情报聚合, 请求拦截