Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Latest commit

 

History

92 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UpdateRadar

全网软件与组件更新监控系统。为开发者、IT 运维与极客玩家打通版本情报的信息差。

UpdateRadar 将 GitHub Releases、应用商店、开源组件和 SaaS 官方更新日志收敛为统一的更新流。用一个本地部署、可扩展的控制台,第一时间追踪重要软件和服务的版本变化。

UpdateRadar 控制台截图

核心能力

  • 多渠道采集:开箱即用支持 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

Docker Compose 部署

监控配置和事件数据都保存在 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 部署与持久化

在 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,建议保持在 26,以降低 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

API

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、可读的 namekindtags。可用的 kind

{
  "id": "nodejs",
  "name": "Node.js",
  "kind": "github-releases",
  "enabled": true,
  "owner": "nodejs",
  "repo": "node",
  "includePrereleases": false,
  "tags": ["runtime", "opensource"]
}

rss 使用 feedUrlapp-storemac-app-store 使用 appId、可选的 country。iPhone / iPad 应用还可填写 subscriptionIdplanNamestorefrontId 来监控同一应用的内购套餐;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,并为每个来源记录轮询失败和速率限制状态。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages