全网软件与组件更新监控系统。为开发者、IT 运维与极客玩家打通版本情报的信息差。
UpdateRadar 将 GitHub Releases、应用商店、开源组件和 SaaS 官方更新日志收敛为统一的更新流。用一个本地部署、可扩展的控制台,第一时间追踪重要软件和服务的版本变化。
- 多渠道采集:开箱即用支持 GitHub Releases、RSS/Atom、App Store、Mac App Store 和 Google Play。
- 统一更新流:将版本、发布时间、原始链接、摘要和标签规范为同一种事件记录,并自动去重。
- 网页控制台:查看更新总览、来源状态和最新情报,可按标签或来源快速筛选。
- 前端配置:直接在“设置”中新增、编辑、启停或删除数据源,不需要手动改配置文件。
- 可靠本地运行:JSON 原子写入,意外中断不会破坏事件或数据源配置。
- GitHub Releases:Docker Engine、NGINX 或任意 GitHub 项目的正式版发布。
- App Store:通过 Apple iTunes Lookup API 读取当前版本与发布说明。
- Mac App Store:在网页设置中搜索 macOS 应用,并从 Apple 官方目录监控版本、价格、发布说明与截图。
- App Store 与内购价格:通过 Apple 官方数据同时读取应用版本、发布说明,以及可选的订阅或其他内购套餐价格。
- Google Play:从公开应用详情页的结构化数据读取版本信息。
- Docker Hub:通过 Docker Hub 官方 Tags API 监控镜像标签、摘要和多架构镜像变更。
- QNAP App Center:通过 QNAP 官方 App Center API 监控 QTS、QuTS hero、QuTScloud 和 QVP 应用版本、更新说明及 QPKG 下载链接。
- Nintendo Switch 游戏更新:通过 Nintendo of America 官方新闻页,按游戏名称追踪已公开的更新、补丁和版本公告。
- SaaS 更新日志:支持 RSS/Atom,例如 GitHub Changelog,也可接入任意官方更新订阅。
要求:Node.js 22 或更高版本。
npm start打开 http://localhost:8787,进入控制台后点击“立即同步”开始采集。也可以使用 API 手动触发:
curl -X POST http://localhost:8787/v1/poll
curl 'http://localhost:8787/v1/events?tag=opensource'服务默认监听 http://localhost:8787。首次轮询会生成 data/events.json,该文件是本地运行数据,不纳入 Git。
在浏览器中打开 http://localhost:8787 即可使用监控控制台。首页包含数据源概览、标签/来源筛选、最新更新时间线和手动同步按钮。通过顶部“设置”或“管理数据源”可以在网页中新增、编辑、启停或删除数据源,配置会安全写入 data/sources.json。
监控配置和事件数据都保存在 data/ 目录:
data/sources.json:数据源配置。通过控制台新增、编辑、启停或删除数据源时会更新此文件。data/events.json:已采集的更新事件。首次同步时自动创建;默认不纳入 Git。
项目使用“写入临时文件后重命名”的方式保存这两个 JSON 文件,避免进程中断留下半写入的数据。使用 Docker Compose 时,./data 会挂载至容器中的 /app/data,因此重建或更新容器不会丢失监控配置和事件记录。
仓库已提供一键编排文件 docker-compose.yml。完整配置如下,可直接复制到云服务器目录:
services:
update-radar:
build: .
ports:
- "8787:8787"
volumes:
- ./data:/app/data
environment:
SOURCES_PATH: /app/data/sources.json
EVENTS_PATH: /app/data/events.json
SETTINGS_PATH: /app/data/settings.json
POLL_INTERVAL_MINUTES: "30"
POLL_TICK_SECONDS: "60"
POLL_BATCH_SIZE: "12"
POLL_CONCURRENCY: "4"
restart: unless-stopped在项目根目录执行一次即可构建、后台启动并自动重启:
docker compose up --build -d服务地址为 http://localhost:8787。查看运行状态可执行:
docker compose ps
docker compose logs -f update-radar停止服务但保留数据:
docker compose down在 Railway 服务中创建 Volume,并将挂载路径设为 /app/data。然后在 Variables 中设置:
SOURCES_PATH=/app/data/sources.json
EVENTS_PATH=/app/data/events.json
SETTINGS_PATH=/app/data/settings.json
POLL_INTERVAL_MINUTES=30
POLL_CONCURRENCY=4
POLL_TICK_SECONDS=60
POLL_BATCH_SIZE=12
服务器启动后会在 5 秒内开始后台轮询,之后每 60 秒从持久化队列中取出最多 12 个到期源;206 个新源可在约 18 分钟内完成首轮覆盖,而不会同时请求。POLL_INTERVAL_MINUTES 是单个成功源的常规检查间隔;POLL_TICK_SECONDS 是调度器取任务的频率,设为 0 可关闭服务器定时轮询;POLL_BATCH_SIZE 是每轮批量大小;POLL_CONCURRENCY 控制同时请求外部渠道的数量,默认 4,建议保持在 2 到 6,以降低 GitHub、Apple 等站点的限流风险。失败源会按 5、10、20、40 分钟指数退避后重试。
首次挂载空 Volume 时,服务会自动将镜像内置的默认 sources.json 复制到 Volume;以后始终使用 Volume 中的数据,不会在重新构建或重新部署时覆盖已添加的数据源。若需迁移已有配置,请先使用“导出设置”,部署后再通过“导入设置”恢复。
GitHub Releases 会保存每个发布包的名称、大小和官方下载地址。时间线中点击“发布详情”可查看完整发布说明;有发布包时,点击“下载发布包”即可展开下载列表。
在“数据源设置”的“更新显示数量”中可设置每个分类的最新更新数量,默认每类 200 条。首页的“全部”会合并每个分类各自保留的记录,不再由一个总数上限截断。
翻译服务使用 OpenAI 兼容的 Chat Completions 接口。在“数据源设置”底部填写接口地址(例如 https://api.example.com/v1)、模型和 API Key;密钥只保存于服务器的 data/settings.json,不会由读取设置接口返回,也不会提交到 Git。配置后可在发布详情中将说明翻译为简体中文。
监控卡片中的 GitHub、RSS、App Store 与 Google Play 图标通过 Simple Icons CDN 引用;其中 App Store 图标为 https://cdn.simpleicons.org/appstore/10232e。
| Method | Path | Purpose |
|---|---|---|
GET |
/health |
存活探针 |
GET |
/v1/sources |
返回已配置的数据源 |
POST |
/v1/sources |
创建数据源 |
PUT |
/v1/sources/:id |
更新数据源配置 |
DELETE |
/v1/sources/:id |
删除数据源 |
POST |
/v1/poll |
立即采集全部启用的数据源 |
GET |
/v1/events?sourceId=&kind=&tag=&limit= |
查询更新事件,单次最多 1000 条 |
GET / PUT |
/v1/settings/events |
读取或设置每个分类的显示数量 |
编辑 data/sources.json。每项都需要稳定的 id、可读的 name、kind 与 tags。可用的 kind:
{
"id": "nodejs",
"name": "Node.js",
"kind": "github-releases",
"enabled": true,
"owner": "nodejs",
"repo": "node",
"includePrereleases": false,
"tags": ["runtime", "opensource"]
}rss 使用 feedUrl;app-store 和 mac-app-store 使用 appId、可选的 country。iPhone / iPad 应用还可填写 subscriptionId、planName 与 storefrontId 来监控同一应用的内购套餐;google-play 使用 packageId、可选的 language/country。版本号和内购价格会显示在同一应用的更新卡片中,价格变更也会生成该应用的更新事件。
仓库已包含 ChatGPT 案例:app-store-6448311069。它监控 ChatGPT 应用版本与美国 App Store 的 ChatGPT Plus 内购套餐 oai_chatgpt_plus_1999_1m。预设支持美国、中国大陆、日本、英国、加拿大、澳大利亚、德国、法国、印度、韩国、中国香港、中国台湾、新加坡、菲律宾和巴西;其他地区可填写 Apple Storefront ID。
采集适配器位于 src/adapters,只输出标准化更新对象。src/radar.js 负责采集和去重,src/store.js 为存储边界,HTTP API 位于 src/server.js。这个分层让后续迁移 PostgreSQL、增加定时任务、Webhook、邮件/飞书通知、用户订阅和 Web 控制台时不需要重写渠道适配器。
Google Play 页面格式可能变化,适配器会在无法获取公开结构化版本信息时安全返回空结果。需要强 SLA 的生产系统应使用获授权的数据供应商或应用方 API,并为每个来源记录轮询失败和速率限制状态。
