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, 大语言模型, 威胁情报, 开发者工具, 新闻聚合, 测试用例, 版权保护, 网络安全资讯