MLenngren/threatnoir-platform
GitHub: MLenngren/threatnoir-platform
一个可自托管的 AI 驱动网络安全新闻聚合平台,利用 LLM 自动完成安全资讯的摘要、分类、IOC 提取并通过多渠道分发。
Stars: 0 | Forks: 0
# ThreatNoir
**精选网络安全新闻。AI 赋能。支持自托管。**
**项目状态:** 可投入生产的 OSS。支持完整的 Docker Compose 部署(应用 + 自托管 Supabase + 内部 ai-gateway + 一次性 bootstrap),以及 Vercel + 托管版 Supabase 方案。AI 提供商包括:Claude、OpenRouter、Ollama 或本地 CLI 运行器。
**开发初衷:** 安全从业者希望拥有可以自托管和定制的 AI 策划新闻——没有 SaaS 锁定,没有不可预测的成本,也没有无法适应其组织需求的黑盒 pipeline。
ThreatNoir 从主要安全出版物抓取 RSS feed,使用 Claude 进行总结、分类、相关性评分,并提取 IOC(CVE、域名、哈希等),然后通过快速公开网站、JSON API、每周邮件摘要、每日播客音频以及自动生成的意识课程发布结果。参考部署运行于 [threatnoir.com](https://threatnoir.com)。
这是基于 Apache 2.0 的开源版本。部署您自己的实例并进行自定义——或者回馈社区。
## 功能
**数据获取与增强**
- RSS 从 6+ 个默认来源(BleepingComputer、The Hacker News、Krebs on Security、CISA Alerts、SecurityWeek、Dark Reading)抓取——可通过 admin UI 添加或删除
- 基于 URL 的文章去重
- AI 总结、30+ 个类别分类、IOC 提取、相关性评分(1-10)、实体标记——每篇文章仅需一次 Claude API 调用
- 自动批准高相关性文章;自动拒绝低相关性文章;介于两者之间的文章进入审核队列
- 可选的全文抓取,以获得更丰富的摘要
**内容分发**
- 公共网站:feed、每日简报、每周综述、焦点项目、意识课程、播客页面
- 包含订阅者偏好的每周邮件摘要(按渠道选择加入)
- 每日播客(音频),配备多主持人 TTS (ElevenLabs)
- 每日视频简报(可选,需要 HeyGen 或类似工具)
- 在 admin UI 中自动生成 LinkedIn / X / Mastodon 草稿,供人工在发布前审核
**意识与学习**
- 从已批准的文章中自动生成安全意识课程(根因分析 + 预防步骤)
- 提示提交流程(社区贡献)
- 针对特定受众的着陆页(SOC、学习者、领导者、开发者)
**公共 REST API**
- `GET /api/v1/iocs` — 可搜索的 IOC feed(CVE、IP、域名、哈希、MITRE TTP 等)
- `GET /api/v1/articles` — 文章列表
- `GET /api/v1/focus` — 高影响力警报
- `GET /api/v1/weekly` — 每周综述
- `GET /api/v1/awareness` — 意识课程
- `POST /api/v1/submit` — 社区提交
- 可选的 API key 认证 + 每个 key 的速率限制
**后台管理**
- 文章批准/编辑/批量操作
- 类别、来源、订阅者、用户、RBAC 管理
- AI 成本仪表盘(按 pipeline 划分的 Anthropic 支出明细、缓存命中率等)
- 所有管理员操作的审计日志
**系统运营**
- 每次调用的 AI 成本追踪(`ai_call_log` 表)——再也不会对账单感到惊讶
- 可配置的每日调用上限和每月预算上限
- 可选的内部 **AI gateway**(Docker Compose),使应用程序无需在应用容器中嵌入提供商密钥即可运行 AI 调用
- 一次性 **bootstrap 容器**(Docker Compose),在首次运行时初始化管理员用户并回填近期文章
- 自动发布到 YouTube(可选,用于视频简报)
- Discord 运维警报(可选)
## 快速开始(Docker,约 10 分钟)
通过 Docker Compose 在本地运行完整平台:应用(Nuxt SSR + API)、自托管 Supabase(Postgres + Auth + Storage)、内部 AI gateway、本地邮件(Inbucket),以及一个用于初始化管理员用户和回填近期文章的一次性 bootstrap 容器。
### 前置条件
- Docker + Docker Compose v2
- (可选)用于生成密钥的 `openssl`
### 步骤
1. 克隆仓库:
git clone https://github.com/MLenngren/threatnoir-platform
cd threatnoir-platform
2. 复制 compose env 文件:
cd deploy
cp .env.example .env
3. 编辑 `deploy/.env` 并设置最基本的内容:
- `AI_GATEWAY_INTERNAL_TOKEN`(必填;如果为空,gateway 将拒绝启动)
- 生成方式:`openssl rand -hex 32`
- `ADMIN_EMAIL` + `ADMIN_PASSWORD`(必填;由 bootstrap 容器用于初始化您的第一个管理员)
- 可选(在首次 bootstrap 运行期间启用 AI;会产生费用):
- `ANTHROPIC_API_KEY`
- `BOOTSTRAP_RUN_AI=true`
4. 启动技术栈:
docker compose up -d
5. 监视一次性 bootstrap 容器,直到它打印出 `[bootstrap] Done`:
docker compose logs -f bootstrap
6. 打开:
- 应用:http://localhost:7000
- Supabase Studio:http://localhost:7101
- Inbucket(接收密码重置/魔法链接邮件):http://localhost:7111
7. 登录管理后台:
- 前往 http://localhost:7000/auth/login
- 输入 `ADMIN_EMAIL` + `ADMIN_PASSWORD`(bootstrap 容器已自动确认
邮件,因此无需点击收件箱)
- 您应该会进入 `/admin`。如果忘记密码,请使用 `/auth/forgot-password`
重置链接将发送到位于 http://localhost:7111 的 Inbucket。
### 运行内容(URL 映射)
- `http://localhost:7000` → ThreatNoir 应用(Nuxt SSR + API)
- `http://localhost:7100` → Supabase API 网关(Kong)
- `http://localhost:7101` → Supabase Studio
- `http://localhost:7111` → Inbucket(本地邮件收件箱)
- `ai-gateway` **仅在内部**运行(无主机端口)
### 后续步骤
- 深入了解 compose 技术栈:[`docs/CONTAINERS.md`](docs/CONTAINERS.md)
- 运营商品牌 env vars:[`docs/OPERATOR-BRANDING.md`](docs/OPERATOR-BRANDING.md)
- AI gateway 端点 + pipeline 标签:[`docs/AI-GATEWAY.md`](docs/AI-GATEWAY.md)
- 非容器本地开发(Supabase CLI + `npm run dev`):[`docs/local-dev.md`](docs/local-dev.md)
## 架构
ThreatNoir 支持两种常见的部署模式:
- **Docker Compose(自托管):** 应用 + 自托管 Supabase + 内部 `ai-gateway` + Inbucket + 一次性 `bootstrap`
- **Vercel + Supabase(托管):** 应用部署在 Vercel 上,由托管的 Supabase 项目提供支持
核心组件:
- **前端 + API:** [Nuxt 4](https://nuxt.com)(Vue 3, SSR)
- **数据库 + 认证:** [Supabase](https://supabase.com)(Postgres + 行级安全)
- **AI:** [Anthropic Claude](https://anthropic.com)
- **邮件:** [Resend](https://resend.com)(生产环境)/ Inbucket(本地 compose)
Docker Compose 添加了两个面向运营商的容器:
- **`ai-gateway`**:内部服务,包装 AI 调用并使用 `pipeline` 标签将每次调用记录到 `ai_call_log`
- **`bootstrap`**:一次性初始化,在首次运行时(可选地)初始化管理员用户并回填近期文章
## 部署到 Vercel
在生产环境中,Docker Compose AI gateway 是可选的。如果您将应用部署到 Vercel,请将 `AI_GATEWAY_URL` 留空/未设置,服务器将直接调用 Anthropic。
### 1. Supabase 项目
1. 在 [supabase.com](https://supabase.com/dashboard) 创建一个项目
2. 应用迁移:从您的本地克隆中,设置项目 ref 并推送:
npx supabase link --project-ref
npx supabase db push
3. 从项目设置 → API 中记录 `SUPABASE_URL`、anon key 和 service-role key
### 2. Vercel 项目
1. 将此仓库推送到您自己的 GitHub
2. 导入到 Vercel
3. 设置 env vars(见下表)
4. 添加自定义域名(可选)
5. 推送到 `main` → 自动部署
### 3. 必需的 env vars(启动的最低要求)
| Var | Value |
| -- | -- |
| `SUPABASE_URL` | `https://.supabase.co` |
| `SUPABASE_KEY` | Supabase anon key |
| `SUPABASE_SERVICE_KEY` | Supabase service role key(仅限服务器端) |
| `NUXT_PUBLIC_SITE_URL` | `https://your-domain.com` |
| `CRON_SECRET` | `openssl rand -base64 32` |
| `RESEND_API_KEY` | 来自 [resend.com](https://resend.com)(交易邮件) |
| `ADMIN_EMAIL` | 接收管理员通知的邮箱 |
### 4. AI pipeline env vars(启用总结/意识/综述)
| Var | Value |
| -- | -- |
| `ANTHROPIC_API_KEY` | 来自 [console.anthropic.com](https://console.anthropic.com) |
| `AI_DAILY_LIMIT` | `500`(每天最大调用次数;安全上限) |
| `AI_MONTHLY_BUDGET_CENTS` | `40000`($400/月上限;根据您的预算调整) |
| `AI_AUTO_APPROVE_THRESHOLD` | `8`(评分 ≥ 此值 → 自动发布) |
| `AI_AUTO_REJECT_THRESHOLD` | `3`(评分 ≤ 此值 → 自动拒绝) |
### 5. 可选集成
有关完整矩阵,请参阅 `.env.example`。每个子系统都可以独立启用:
- **图像生成**(每周摘要封面图):`OPENROUTER_API_KEY` + `R2_*`
- **播客 pipeline**:`ELEVENLABS_API_KEY`、`ELEVENLABS_VOICE_ALEX`、`ELEVENLABS_VOICE_MARCUS`、`WONDERCRAFT_API_KEY`
- **YouTube 上传**:`YOUTUBE_CLIENT_ID/SECRET/REFRESH_TOKEN`
- **社交发布**:`X_*` (Twitter)、`MASTODON_*` (Mastodon)
- **运维警报**:`DISCORD_BOT_TOKEN`、`DISCORD_ALERTS_CHANNEL_ID`
## Cron 计划
Vercel Hobby 计划支持每日一次的 cron。包含的 `vercel.json` 将 `/api/cron/ingest` 安排在 UTC 时间 06:00。ingest cron 在内部串联下游 pipeline:
```
ingest (06:00 UTC) → summarize → awareness lessons → social drafts → focus refresh
```
要实现更高频率的运行(例如每 4 小时 ingest 一次),您需要 Vercel Pro,或者您可以使用自己的调度器在外部触发 cron 端点。每个 cron 端点都接受 `x-cron-secret` 标头。
位于 `/api/cron/generate-weekly-roundup` 和 `/api/cron/weekly-digest` 的每周综述和每周摘要邮件 cron 通常安排在周日——在 Hobby 计划上,您需要为这些任务准备一个外部调度器。
## 配置
- 运营商品牌(站点名称、logo、社交链接):[`docs/OPERATOR-BRANDING.md`](docs/OPERATOR-BRANDING.md)
- AI gateway 深入了解(端点、pipeline 标签、成本日志):[`docs/AI-GATEWAY.md`](docs/AI-GATEWAY.md)
- Docker Compose 深入了解(端口、bootstrap、Inbucket 与 Resend):[`docs/CONTAINERS.md`](docs/CONTAINERS.md)
### 硬编码 URL
代码库目前在 SEO meta 标签(规范 URL、OG 图像、Twitter card URL)中使用 `threatnoir.com` 作为规范域名。如果您在自有域名下部署并关注 SEO,请在 `app/pages/` 中搜索/替换 `threatnoir.com` 为您的域名。如果不进行此更改,站点本身也能正常运行——只有社交预览和搜索引擎规范化会受到影响。
### RSS 来源
通过位于 `/admin/sources` 的 admin UI 添加或删除来源,或直接在 Supabase 的 `sources` 表中操作(`type: 'rss'`,`is_active: true`)。
### 类别
直接或通过 `/admin/categories` 编辑 `categories` 表。30 多个默认类别涵盖了大多数网络安全领域;您可以根据需要自行删减或扩充。
### 品牌设置
`nuxt.config.ts`控制网站标题和 meta 描述。替换 `public/icon-*.png` 以更改 favicon。品牌颜色的 Tailwind 类(如 `tn-primary` 等)位于 `app/assets/css/main.css` 中。
## 路线图
- 阶段 1(已完成):开源发布 + 核心 pipeline
- 阶段 2(已完成):管理 + 基础分发
- 阶段 3(已完成):Docker Compose 运营商技术栈 + 文档
- 阶段 4(已完成):可插拔 AI 提供商(Claude / Ollama / OpenRouter / CLI)
- 阶段 5(进行中):compose profiles、healthchecks、优化的运营商 UX (LEN-1891)
- 未来:LEN-1888 — 混合模型研究
## 备份
我们在开源之前移除了特定于运营商的备份脚本。推荐用于生产环境的方法:
- **数据库:** Supabase Pro 层级包括每日 PITR 备份。对于 Free 层级,请通过您自己的定时任务每周运行一次 `pg_dump`,并使用 `gpg` + 密钥管理器中的密码进行加密。
- **Vercel env vars:** 定期使用 `npx vercel env pull` 导出并进行版本化 + 加密备份。
- **媒体 (R2/S3):** 版本化的 bucket 生命周期规则 + 生命周期类存储通常就足够了。
## 文档
- `docs/local-dev.md` — 本地开发设置
- `docs/CONTAINERS.md` — Docker Compose 快速开始 + 深入了解
- `docs/OPERATOR-BRANDING.md` — 运营商品牌 env vars
- `docs/AI-GATEWAY.md` — AI gateway 端点 + pipeline 标签
- `.env.example` — 每个环境变量及其用途
- `CONTRIBUTING.md` — 如何贡献
- `SECURITY.md` — 漏洞披露
- `CODE_OF_CONDUCT.md` — 社区标准
## API
- 公共 REST:`/api/v1/*` — 在运行中的实例上查看 `/developer` 以获取内联文档
- 管理:`/api/admin/*` — 受管理员认证保护
- Crons:`/api/cron/*` — 受 `x-cron-secret` 保护
- RSS feed:`/api/feed.xml`、`/api/articles/feed.xml`、`/api/awareness/feed.xml`、`/api/focus/feed.xml`、`/api/podcast/feed.xml`、`/api/weekly/feed.xml`
## 许可证
Apache License 2.0 — 请参阅 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。
简而言之:您可以自由使用、修改、重新分发本代码并将其商业化。您必须保留许可证和声明文件,并且(如果您修改了源代码)请标注您的更改。
标签:DLL 劫持, IOC提取, Nuxt, Supabase, 大语言模型, 威胁情报, 开发者工具, 新闻聚合, 测试用例, 版权保护, 网络安全资讯