allsmog/SignalTrace

GitHub: allsmog/SignalTrace

一个专注于中东地区的实时OSINT情报仪表板,将地缘政治、军事、环境和人道主义等多元信号聚合到单一地图界面的开源项目。

Stars: 0 | Forks: 0

# SignalTrace 专注于中东地区的实时 OSINT 情报仪表板。将地缘政治、军事、环境和人道主义信号聚合到单一的地图简报界面中。 前端使用 React + Leaflet 构建,API 基于 Cloudflare Workers 上的 Hono。 ## 功能 | 层级 | 来源 | 更新频率 | |---|---|---| | OSINT Feed (Telegram + X) | Telegram 公共频道,可选 X 桥接 | ~4 分钟 | | 武装冲突事件 | ACLED | 10 分钟 | | 热点 | NASA FIRMS | 2 分钟 | | 船舶追踪 (AIS) | AISStream.io via Durable Object WebSocket | 实时 | | 军用飞机 | ADS-B Exchange (RapidAPI) | 25 秒 | | 导弹 / 火箭警报 | Israel Home Front Command (Oref) | 10 秒 | | 地震 | USGS | 2 分钟 | | 辐射监测 | Safecast + GMCMap | 5 分钟 | | 互联网中断 (IODA) | Georgia Tech / CAIDA | 5 分钟 | | BGP 异常 | RIPEstat | 5 分钟 | | 已报告事件 | GDELT | 5 分钟 | | 人道主义报告 | ReliefWeb | 15 分钟 | | 卫星观测 | Copernicus Data Space | 20 分钟 | | 紧急启动 | Copernicus EMS | 20 分钟 | | KiwiSDR 接收器 | 公共 KiwiSDR 网络 | 5 分钟 | | 制裁筛查 | OFAC / UN / UK 列表 | 按需 | | 实时摄像头 | 公共 RTSP/HLS 流 | 直播 | ## 架构 ``` signaltrace/ packages/ web/ Vite + React + Tailwind SPA (Cloudflare Pages) api/ Hono API + Durable Object (Cloudflare Workers) .env.example Environment variable template packages/api/wrangler.toml.example Workers config template scripts/ Utility scripts (demo recorder) ``` 前端是一个部署在 **Cloudflare Pages** 的单页应用。API 是一个 **Cloudflare Worker**,包含一个用于持久船舶追踪 WebSocket 连接的 Durable Object,以及一个用于缓存上游数据的 KV namespace。cron 触发器每 15 分钟刷新一次 OSINT 和辐射数据。 ## 前置条件 - Node.js >= 18 - npm >= 9 - 一个 [Cloudflare 账户](https://dash.cloudflare.com/sign-up)(免费套餐即可) - [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/install-and-update/)(`npm i -g wrangler`) ## 快速开始 ### 1. 克隆并安装 ``` git clone https://github.com//SignalTrace.git cd SignalTrace npm install ``` ### 2. 配置 API 密钥 复制配置模板并填入你的密钥: ``` cp .env.example .env.local ``` 使用你的 API 凭证编辑 `.env.local`。所有密钥均为可选——缺少密钥的层级将在数据健康面板中显示 "missing_key" 状态,并能正常降级运行。 对于 Cloudflare Workers API,还需创建一个本地开发变量文件: ``` cp .env.example packages/api/.dev.vars ``` 有关每个密钥的详情,请参阅下方的 [配置](#configuration)。 ### 3. 设置 Cloudflare Workers 配置 复制 Wrangler 模板并创建一个 KV namespace: ``` cp packages/api/wrangler.toml.example packages/api/wrangler.toml cd packages/api wrangler kv namespace create DATA_CACHE ``` 将打印出的 namespace ID 粘贴到 `packages/api/wrangler.toml` 中的 `[[kv_namespaces]]` 下。 ### 4. 本地运行 在单独的终端中: ``` npm run dev:api # Starts Worker on http://localhost:8787 npm run dev:web # Starts Vite on http://localhost:5173 (proxies /api to Worker) ``` ## 配置 所有配置均通过环境变量完成。仓库根目录下的 `.env.example` 文件是权威模板。 | 变量 | 必需 | 描述 | 注册地址 | |---|---|---|---| | `FIRMS_MAP_KEY` | 否 | NASA FIRMS 热点 API 密钥 | [firms.modaps.eosdis.nasa.gov](https://firms.modaps.eosdis.nasa.gov/api/area/) | | `ACLED_CLIENT_ID` | No | ACLED OAuth client ID (首选) | [acleddata.com](https://acleddata.com/register/) | | `ACLED_CLIENT_SECRET` | No | ACLED OAuth client secret (首选) | 同上 | | `ACLED_EMAIL` | No | ACLED email (备选认证) | 同上 | | `ACLED_PASSWORD` | No | ACLED password (备选认证) | 同上 | | `AISSTREAM_API_KEY` | 否 | AISStream 船舶追踪密钥 | [aisstream.io](https://aisstream.io/) | | `ADSB_EXCHANGE_API_KEY` | 否 | ADS-B Exchange (RapidAPI) 密钥 | [rapidapi.com](https://rapidapi.com/adsbx/api/adsbexchange-com1) | | `OSINT_X_BRIDGE_URL` | 否 | X/Twitter OSINT 桥接 URL | 自托管 | | `OSINT_X_BRIDGE_TOKEN` | 否 | X/Twitter OSINT 桥接 bearer token | 自托管 | | `USAJOBS_API_KEY` | 否 | USAJobs API 密钥 | [developer.usajobs.gov](https://developer.usajobs.gov/) | | `USAJOBS_EMAIL` | 否 | USAJobs 账户邮箱 | 同上 | | `RELIEFWEB_APPNAME` | 否 | ReliefWeb 应用标识符 | [reliefweb.int](https://reliefweb.int/help/api) | | `VITE_API_BASE_URL` | 否 | 覆盖 API 源(见 [API 路由](#api-url-routing)) | -- | 上面列出的所有上游 API 均提供免费注册。 ### 本地开发 - **前端**:从仓库根目录的 `.env.local` 读取 `VITE_*` 变量。 - **API Worker**:从 `packages/api/.dev.vars`(Wrangler 开发变量)读取所有其他变量。 ### 生产环境 (Cloudflare) 在 Worker 上设置密钥: ``` cd packages/api wrangler secret put FIRMS_MAP_KEY wrangler secret put ACLED_CLIENT_ID wrangler secret put ACLED_CLIENT_SECRET wrangler secret put AISSTREAM_API_KEY wrangler secret put ADSB_EXCHANGE_API_KEY # ... 等 ``` 如果你的前端和 API 位于不同的源,请将 `VITE_API_BASE_URL` 设置为 Cloudflare Pages 环境变量。 ## 部署 ### 部署 API Worker ``` npm run deploy:api ``` ### 部署 Web (Pages) ``` npm run deploy:web ``` 或者将仓库连接到 Cloudflare Pages,构建命令为 `npm run build:web`,输出目录为 `packages/web/dist`。 ## API URL 路由 Web 应用通过 `VITE_API_BASE_URL` 解析 API 请求。 **选项 A -- 同源(推荐用于自定义域名)** - Pages 托管 `https://yourdomain.com` - Worker 路由处理 `https://yourdomain.com/api/*` - 保持 `VITE_API_BASE_URL` 未设置。更新 `packages/api/wrangler.toml` 中的 `[[routes]]` 块。 **选项 B -- 分离源** - Pages 位于 `*.pages.dev`,Worker 位于 `*.workers.dev` 或自定义 API 子域名 - 将 `VITE_API_BASE_URL` 设置为 Worker 源(例如 `https://signaltrace-api..workers.dev`) - CORS 已在 `/api/*` 上启用。 ## 数据健康 访问 `GET /api/data-health` 以查看每个上游源的状态。响应包括每个源的 `live`、`stale`、`missing_key`、`error` 和其他状态,便于验证哪些密钥配置正确。 ## 项目结构 ``` packages/web/ src/ components/ React components (map layers, panels, feeds) services/ Frontend data fetchers lib/ Shared utilities, store, constants index.html Entry point packages/api/ src/ routes/ Hono route handlers (one per data source) services/ Upstream data fetching logic do/ Durable Object (ShipTracker) lib/ Shared utilities (caching, HTTP, geo) data/ Static data files types.ts Shared TypeScript types wrangler.toml.example Cloudflare Workers config template ``` ## 贡献 1. Fork 本仓库 2. 创建一个功能分支 (`git checkout -b feature/my-feature`) 3. 提交你的更改 4. 推送到你的分支并开启一个 Pull Request ## 许可证 [MIT](LICENSE)
标签:ACLED, ADS-B, AIS, BGP异常, Durable Objects, ESC4, GDELT, Hono, HTTP/HTTPS抓包, Leaflet, MITM代理, NASA FIRMS, OSINT, OSINT工具, React, Serverless, Syscalls, Tailwind CSS, Vite, 中东局势, 互联网中断, 人道主义援助, 仪表盘, 信号情报, 军事动态, 冲突监测, 制裁筛查, 卫星图像, 地图应用, 地缘政治, 地震监测, 实时数据流, 导弹预警, 态势感知, 情报分析, 程序员工具, 突发事件, 网络安全, 网络诊断, 自动化攻击, 船舶追踪, 辐射监测, 隐私保护, 飞机追踪