使用Cloudflare Workers、Vectorize和Nostr的自托管AI新闻聚合器

Lobsters Hottest 工具

摘要

一个自托管的AI新闻聚合器,使用Cloudflare Workers、Vectorize、D1和Nostr抓取Hacker News、Lobsters和Reddit等来源,生成AI嵌入向量,并根据点赞历史提供个性化信息流。

<p>我构建这个主要是为了解决自己在HN、Lobsters和Reddit之间切换阅读的疲劳,同时将数据完全保留在自己的基础设施内。</p> <strong>架构与存储选择:</strong> <p>整个技术栈构建在Cloudflare免费/低成本套餐上,以便让自托管变得触手可及。</p> <ul> <li> <strong>后端与API:</strong> 使用Workers上的Hono实现。</li> <li> <strong>数据库与状态:</strong> Cloudflare D1用于严格的关系型存储(来源、定时任务追踪、用户状态)。</li> <li> <strong>向量搜索:</strong> Cloudflare Vectorize管理通过<code>@cf/baai/bge-base-en-v1.5</code>原生生成的768维嵌入向量。</li> </ul> <strong>摄取详情:</strong> <p>对于Lobsters,后台定时任务会轮询其<code>.json</code>端点,而非抓取原始HTML。为了引导历史偏好,我提供了端点来摄取过去的JSON或RSS活动导出,以便余弦相似度计算能有一个基线向量配置档进行匹配。</p> <strong>当前限制与权衡:</strong> <ol> <li> <strong>模型选择:</strong> 我选择了<code>bge-base-en-v1.5</code>,因为它完全在Workers AI内部执行,无外部冷启动,但我也在尝试更高效的嵌入模型,前提是它们能原生在边缘端使用。</li> <li> <strong>Nostr身份验证:</strong> 我没有发明自定义的OAuth或JWT层,而是使用NIP-07(浏览器扩展如Alby)进行用户身份验证。这使得关注者能轻松地将你整理后的精选信息流重新发布到公共中继上。</li> </ol> <p>仓库中包含一个<code>Makefile</code>,它处理完整的远程配置(<code>make db-init</code>、<code>make vectorize-init</code>、<code>make deploy</code>),这样你就不需要手动操作Cloudflare UI了。</p> <p>非常欢迎对边缘端向量索引策略,以及如何处理语义搜索历史随时间修剪的问题提出反馈。</p> <p><a href="https://lobste.rs/s/u7ls6b/self_hosted_ai_news_aggregator_using">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/03 16:25

delirehberi/news

来源:https://github.com/delirehberi/news

AI 策展新闻

一个完全自主运行、自托管的 AI 新闻聚合器,由 Cloudflare Workers、Vectorize、D1 和 Nostr 驱动。

该项目持续抓取你喜爱的信息源(Hacker News、Lobsters 和 Reddit),使用 Cloudflare Workers AI(@cf/baai/bge-base-en-v1.5)为每篇文章生成 AI 嵌入,并将它们与你个人的点赞历史进行比对,从而创建一份超个性化、专属于你的新闻源。

功能特性

  • AI 向量搜索:利用语义搜索(余弦相似度)查找与你过往点赞内容相匹配的文章。
  • Nostr 集成:通过 NIP-07(Nostr 浏览器扩展)验证你的点赞行为以训练 AI,并允许关注者轻松地将你的策展源重新发布到全球 Nostr 中继。
  • 多源抓取:通过定时 Cron 任务自动从 HackerNews、Lobsters 和 Reddit 拉取内容。
  • 隐私至上:完全自托管于 Cloudflare。你拥有数据库、向量索引和 AI 执行权。
  • 现代 UI:基于 Vite、Tailwind CSS v4 和 Vanilla JS 构建的玻璃拟态前端。内置交错流、图片预览和关注者计数功能。

架构

  • 前端:Vite + Tailwind CSS(frontend/ 目录)。
  • 后端 API:Cloudflare Workers 上的 Hono(worker/ 目录)。
  • 数据库:Cloudflare D1(SQL)。
  • 向量数据库:Cloudflare Vectorize(元数据 + 768 维嵌入)。
  • AI 模型@cf/baai/bge-base-en-v1.5 用于文本嵌入。

安装与部署

前提条件

  • Node.js(v22+)
  • Cloudflare 账户(npx wrangler login
  • Nostr 扩展(如 Alby 或 nos2x)——如需使用 NIP-07 功能。

1. 初始化项目

首次克隆仓库后,运行初始化脚本: bash make init 这将自动安装依赖项、复制配置模板(.envwrangler.jsonc),并在终端打印部署检查清单。

2. 配置基础设施

在 Cloudflare 上创建 D1 数据库和 Vectorize 索引: bash make db-init make vectorize-init 更新 worker/wrangler.jsonc(在 make init 时创建),填入新的 database_id 和 Vectorize index_name。 你还可以在 vars 块中启用或禁用特定信息源(例如 "ENABLE_REDDIT": "false")。

3. 配置密钥

应用需要 Reddit OAuth 凭据和一个用于身份识别的 Nostr 公钥。 将它们导出到环境变量(或使用 .envrc 文件),并自动推送到 Cloudflare: ``bash export REDDIT_CLIENT_ID=“your_client_id” export REDDIT_CLIENT_SECRET=“your_client_secret” export REDDIT_REFRESH_TOKEN=“your_refresh_token” export GMAIL_CLIENT_ID=“your_client_id” export GMAIL_CLIENT_SECRET=“your_client_secret” export GMAIL_REFRESH_TOKEN=“your_refresh_token” export AUTHORIZED_NOSTR_PUBKEY=“your_nostr_pubkey_in_hex”

make push-secrets `` make push-secrets 命令会安全地将本地环境变量直接传入 Cloudflare 的密钥存储,无需手动交互。

4. 配置前端

更新 frontend/.env(在 make init 时创建),填入所需 API URL、自定义副标题和主题偏好。

5. 初始化数据库

将 SQL 模式应用到远程 D1 实例,以创建数据表: bash make db-apply-remote

6. 部署全栈

一次性将 Hono 后端 API 和 Vite 前端部署到 Cloudflare: bash make deploy 此命令顺序执行 make deploy-workermake deploy-frontend。它会自动构建 Vite 应用并部署到 Cloudflare Pages,同时将后端部署到 Cloudflare Workers。

引导你的 AI 模型

为了让 AI 了解你的喜好,需要历史数据。你可以使用提供的端点从 Lobsters、Reddit 或 HackerNews 的原始 JSON 导出中导入已有的点赞记录。一旦引导配置文件导入完成,每日 Cron 任务将处理其余工作!

许可证

MIT 许可证。欢迎 fork、修改并部署你自己的个性化新闻 AI。

相似文章

无AI的Hacker News

Hacker News Top

据报道,Hacker News 正在从其平台上移除或过滤与人工智能相关的内容。

Ask HN: 为AI生成的文章添加标记

Hacker News Top

Hacker News 版主 Dang 讨论社区对AI生成文章的态度,并考虑添加一种标记选项来标识此类内容,反映了AI与人类读者之间不断演变的军备竞赛。