calesthio/Crucix
GitHub: calesthio/Crucix
一个自托管的OSINT情报聚合与态势感知平台,整合27个公开数据源,通过3D可视化仪表板和智能告报系统实时监控全球事件变化。
Stars: 5808 | Forks: 868
# Crucix
**属于你自己的情报终端。27个来源。一条命令。零云依赖。**
## [访问在线网站:crucix.live](https://www.crucix.live/)
[](https://www.crucix.live/)
[](https://www.crucix.live/)
[](#quick-start)
[](LICENSE)
[-orange)](#architecture)
[](#data-sources-27)
[](#docker)
**加入 Signal 网络**
[](https://x.com/crucixmonitor)
[](https://discord.gg/ChVy7SF4)

Crucix 从27个开源情报源拉取卫星火灾探测、航班追踪、辐射监测、卫星星座追踪、经济指标、实时市场价格、冲突数据、制裁名单和社交情绪——每15分钟并行一次——并将所有内容渲染在一个独立的 Jarvis 风格仪表板上。
将其连接到 LLM,它就会变成一个**双向情报助手**——当有意义的变化发生时,向 Telegram 和 Discord 推送多层级的警报,响应来自你手机的 `/brief` 和 `/sweep` 等命令,并基于真实的跨领域数据生成可操作的交易想法。这是你自己的分析师,在你睡觉时监视着世界。
请先在 [https://www.crucix.live/](https://www.crucix.live/) 试用在线演示,当你想要完整的本地堆栈时再克隆该仓库。
无云服务。无遥测。无订阅。只需 `node server.mjs` 即可运行。
## Token / 资产警告
## 为什么会有这个项目
世界上大部分实时情报——卫星图像、辐射水平、冲突事件、经济指标、航班追踪、海事活动——都是公开可用的。只是分散在几十个政府 API、研究机构和开放数据源中,没人有时间逐一查看。
Crucix 将所有这些集中到一个地方。不在付费墙之后,不锁在企业平台里,也不需要安全许可。只是开放数据,在你自己的机器上聚合和相互关联,每15分钟更新一次。
它的构建是为了任何想要了解当今世界真实状况的人——研究人员、记者、交易员、OSINT 分析师,或者只是那些认为获取信息不应取决于预算的好奇人士。
## 快速开始
```
# 1. Clone the repo
git clone https://github.com/calesthio/Crucix.git
cd Crucix
# 2. 安装依赖(仅需 Express)
npm install
# 3. 复制 env 模板并添加你的 API keys(见下方)
cp .env.example .env
# 4. 启动 dashboard
npm run dev
```
仪表板会在 `http://localhost:3117` 自动打开,并立即开始其第一次情报扫描。此初始扫描会并行查询所有27个来源,通常需要30–60秒——在扫描完成并推送第一次数据更新之前,仪表板将显示为空。之后,它会通过 SSE(Server-Sent Events)每15分钟自动刷新。无需手动刷新页面。
**要求:** Node.js 22+(使用原生 `fetch`、顶层 `await`、ESM)
### Docker
```
git clone https://github.com/calesthio/Crucix.git
cd Crucix
cp .env.example .env # add your API keys
docker compose up -d
```
仪表板地址为 `http://localhost:3117`。扫描数据通过卷挂载持久化在 `./runs/` 中。包含健康检查端点。
## 你将获得什么
### 实时仪表板
一个独立的 Jarvis 风格 HUD,具有:
- **3D WebGL 地球仪**(Globe.gl),带有大气辉光、星空背景和平滑旋转——外加经典的平面地图切换
- **9种标记类型**,跨越两种视图:火灾探测、空中交通、辐射点、海事咽喉点、SDR 接收器、OSINT 事件、健康警报、地理定位新闻、冲突事件
- **动画 3D 飞行走廊弧线**,连接空中交通热点和全球枢纽
- **区域过滤器**(世界、美洲、欧洲、中东、亚太、非洲)——旋转地球仪或缩放平面地图
- **实时市场数据**——通过 Yahoo Finance 获取指数、加密货币、能源、大宗商品(无需 API 密钥)
- **风险仪表**——VIX、高收益利差、供应链压力指数
- **OSINT 源**——来自17个 Telegram 情报频道的英文帖子(可扩展)
- **新闻滚动条**——合并的 RSS + GDELT 标题 + Telegram 帖子,自动滚动
- **扫描增量**——显示自上次扫描以来变化情况的实时面板(新信号、升级、降级及其严重程度)
- **跨源信号**——跨卫星、经济、冲突和社交领域的关联情报
- **核观察**——来自 Safecast + EPA RadNet 的实时辐射读数
- **太空观察**——CelesTrak 卫星追踪:近期发射、ISS、军事星座、Starlink/OneWeb 数量
- **可利用的想法**——AI 生成的交易想法(带 LLM)或信号相关的想法(不带)
### 性能模式
顶部栏中的 `VISUALS FULL` / `VISUALS LITE` 按钮仅更改渲染行为——它**不**移除数据源或减少扫描覆盖范围。
当你切换到 **VISUALS LITE** 时,仪表板会:
- 禁用装饰性背景效果,如径向/网格覆盖层和扫描线
- 移除面板和覆盖层上昂贵的模糊/背景滤镜效果
- 停止非必要的动画,如 Logo 环闪烁、冲突环和走廊流动效果
- 禁用地球仪自动旋转并关闭动画飞行弧线虚线
- 将水平新闻滚动条和 OSINT 流转换为静态的可滚动列表,而不是连续动画的跑马灯
移动端特定行为:
- 在移动设备上,如果你当前处于地球仪视图,`VISUALS LITE` 还会强制仪表板进入**平面地图模式**
- 只要启用了低性能模式,未来的移动端加载将继续以平面模式启动
该首选项保存在浏览器本地存储中,因此 UI 会记住你的上次设置。
### 自动刷新
服务器每15分钟运行一次扫描周期(可配置)。每个周期:
1. 并行查询所有27个来源(约30秒)
2. 将原始数据合成为仪表板格式
3. 计算与上一次运行的增量(变化了什么、升级了什么、降级了什么)——可在仪表板上的 **Sweep Delta** 面板中查看
4. 生成 LLM 交易想法(如果已配置)
5. 评估突发新闻警报——多层次(FLASH / PRIORITY / ROUTINE),带有语义去重。如果已配置,则发送到 Telegram 和/或 Discord。支持 LLM 评估,或者在 LLM 不可用时回退到基于规则的警报。
6. 通过 SSE 将更新推送到所有连接的浏览器
### Telegram 机器人(双向)
Crucix 同时充当交互式 Telegram 机器人。除了发送警报外,它还直接响应来自你聊天的命令:
| 命令 | 功能 |
|---------|-------------|
| `/status` | 系统健康状况、上次扫描时间、源状态、LLM 状态 |
| `/sweep` | 触发手动扫描周期 |
| `/brief` | 最新情报的简明文本摘要(方向、关键指标、顶部 OSINT) |
| `/portfolio` | 投资组合状态(如果已连接 Alpaca) |
| `/alerts` | 最近的警报历史及层级 |
| `/mute` / `/mute 2h` | 静音警报1小时(或自定义时长) |
| `/unmute` | 恢复警报 |
| `/help` | 显示所有可用命令 |
这需要在 `.env` 中设置 `TELEGRAM_BOT_TOKEN` 和 `TELEGRAM_CHAT_ID`。机器人每5秒轮询一次消息(可通过 `TELEGRAM_POLL_INTERVAL` 配置)。
### Discord 机器人(双向)
Crucix 还支持 Discord 作为功能齐全的机器人,具有斜杠命令和丰富的嵌入警报。它镜像了 Telegram 机器人的功能,并采用 Discord 原生格式。
| 命令 | 功能 |
|---------|-------------|
| `/status` | 系统健康状况、上次扫描时间、源状态、LLM 状态 |
| `/sweep` | 触发手动扫描周期 |
| `/brief` | 最新情报的简明文本摘要 |
| `/portfolio` | 投资组合状态(如果已连接 Alpaca) |
警报以带有颜色编码侧边栏的丰富嵌入形式传递:红色代表 FLASH,黄色代表 PRIORITY,蓝色代表 ROUTINE。每个嵌入包含信号详情、置信度分数和跨领域关联。
**设置需要:** `DISCORD_BOT_TOKEN`、`DISCORD_CHANNEL_ID`,以及可选的 `DISCORD_GUILD_ID` 用于即时斜杠命令注册。有关详细信息,请参阅 [API 密钥设置](#api-keys-setup)。
**Webhook 回退:** 如果你不想运行完整的机器人,请改为设置 `DISCORD_WEBHOOK_URL`。这启用了单向警报(无斜杠命令)且零依赖——不需要 `discord.js`。
**可选依赖:** 完整的机器人需要 `discord.js`。使用 `npm install discord.js` 安装它。如果未安装,Crucix 会自动回退到仅 Webhook 模式。
### 可选 LLM 层
连接6个 LLM 提供商中的任何一个以进行增强分析:
- **AI 交易想法**——量化分析师生成5-8个引用具体数据的可操作想法
- **更智能的警报评估**——LLM 将信号分类为 FLASH/PRIORITY/ROUTINE 层级,并附带跨领域关联和置信度评分
- 提供商:Anthropic Claude、OpenAI、Google Gemini、OpenRouter(统一 API)、OpenAI Codex(ChatGPT 订阅)、MiniMax、Mistral
- 优雅降级——当 LLM 不可用时,基于规则的引擎接管警报评估。LLM 故障永远不会导致扫描周期崩溃。
## API 密钥设置
将 `.env.example` 复制到项目根目录下的 `.env`:
```
cp .env.example .env
```
### 获得最佳效果所需(均为免费)
| 密钥 | 来源 | 如何获取 |
|-----|--------|------------|
| `FRED_API_KEY` | Federal Reserve Economic Data | [fred.stlouisfed.org](https://fred.stlouisfed.org/docs/api/api_key.html) — 即时,免费 |
| `FIRMS_MAP_KEY` | NASA FIRMS(卫星火灾数据) | [firms.modaps.eosdis.nasa.gov](https://firms.modaps.eosdis.nasa.gov/api/area/) — 即时,免费 |
| `EIA_API_KEY` | US Energy Information Administration | [api.eia.gov](https://www.eia.gov/opendata/register.php) — 即时,免费 |
这三个解锁了最有价值的经济和卫星数据。每一个大约需要60秒来注册。
### 可选(启用额外来源)
| 密钥 | 来源 | 如何获取 |
|-----|--------|------------|
| `ACLED_EMAIL` + `ACLED_PASSWORD` | 武装冲突事件数据 | [acleddata.com/register](https://acleddata.com/register/) — 免费,OAuth2 |
| `AISSTREAM_API_KEY` | 海事 AIS 船舶追踪 | [aisstream.io](https://aisstream.io/) — 免费 |
| `ADSB_API_KEY` | 未过滤的航班追踪 | [RapidAPI](https://rapidapi.com/adsbexchange/api/adsbexchange-com1) — 约$10/月 |
### LLM 提供商(可选,用于 AI 增强想法)
将 `LLM_PROVIDER` 设置为以下之一:`anthropic`、`openai`、`gemini`、`codex`、`openrouter`、`minimax`、`mistral`
| 提供商 | 所需密钥 | 默认模型 |
|----------|-------------|---------------|
| `anthropic` | `LLM_API_KEY` | claude-sonnet-4-6 |
| `openai` | `LLM_API_KEY` | gpt-5.4 |
| `gemini` | `LLM_API_KEY` | gemini-3.1-pro |
| `openrouter` | `LLM_API_KEY` | openrouter/auto |
| `codex` | 无(使用 `~/.codex/auth.json`) | gpt-5.3-codex |
| `minimax` | `LLM_API_KEY` | MiniMax-M2.5 |
| `mistral` | `LLM_API_KEY` | mistral-large-latest |
对于 Codex,运行 `npx @openai/codex login` 以通过你的 ChatGPT 订阅进行身份验证。
### Telegram 机器人 + 警报(可选)
| 密钥 | 如何获取 |
|-----|------------|
| `TELEGRAM_BOT_TOKEN` | 在 Telegram 上通过 [@BotFather](https://t.me/BotFather) 创建 |
| `TELEGRAM_CHAT_ID` | 通过 [@userinfobot](https://t.me/userinfobot) 获取 |
| `TELEGRAM_CHANNELS` | *(可选)* 除17个内置频道外,要监视的额外频道 ID(号分隔) |
| `TELEGRAM_POLL_INTERVAL` | *(可选)* 机器人命令轮询间隔(毫秒)(默认:5000) |
### Discord 机器人 + 警报(可选)
| 密钥 | 如何获取 |
|-----|------------|
| `DISCORD_BOT_TOKEN` | 在 [Discord Developer Portal](https://discord.com/developers/applications) 创建 → Bot → Token |
| `DISCORD_CHANNEL_ID` | 在 Discord 中右键点击频道(开启开发者模式) → Copy Channel ID |
| `DISCORD_GUILD_ID` | *(可选)* 右键点击服务器 → Copy Server ID。启用即时斜杠命令注册(否则全局命令最多可能需要1小时) |
| `DISCORD_WEBHOOK_URL` | *(可选)* 频道设置 → 整合 → Webhooks → New Webhook → Copy URL。用于仅警报模式,无需机器人 |
**Discord 机器人设置:**
1. 前往 [Discord Developer Portal](https://discord.com/developers/applications) 并创建一个新应用程序
2. 前往 **Bot** → 点击 **Reset Token** → 将令牌复制到 `DISCORD_BOT_TOKEN`
3. 在 **Privileged Gateway Intents** 下,启用 **Message Content Intent**
4. 前往 **OAuth2** → **URL Generator** → 选择 `bot` + `applications.commands` 作用域 → 选择 `Send Messages` + `Embed Links` 权限
5. 复制生成的 URL 并在浏览器中打开以邀请机器人加入你的服务器
6. 安装依赖项:`npm install discord.js`
在 Telegram 和 Discord 上,无论是否配置 LLM,警报都可以工作。配置了 LLM 后,信号评估会更丰富、更具上下文意识。如果没有,确定性规则引擎会根据严重程度、跨领域关联和信号计数来评估信号。
### 无需任何密钥
即使没有任何 API 密钥,Crucix 也能工作。18+ 个来源完全不需要身份验证。需要密钥的来源会返回结构化错误,其余扫描正常继续。
## 架构
```
crucix/
├── server.mjs # Express dev server (SSE, auto-refresh, LLM, bot commands)
├── crucix.config.mjs # Configuration with env var overrides + delta thresholds
├── diag.mjs # Diagnostic script — run if server fails to start
├── .env.example # All documented env vars
├── package.json # Runtime: express | Optional: discord.js
├── docs/ # Screenshots for README
│
├── apis/
│ ├── briefing.mjs # Master orchestrator — runs all 27 sources in parallel
│ ├── save-briefing.mjs # CLI: save timestamped + latest.json
│ ├── BRIEFING_PROMPT.md # Intelligence synthesis protocol
│ ├── BRIEFING_TEMPLATE.md # Briefing output structure
│ ├── utils/
│ │ ├── fetch.mjs # safeFetch() — timeout, retries, abort, auto-JSON
│ │ └── env.mjs # .env loader (no dotenv dependency)
│ └── sources/ # 27 self-contained source modules
│ ├── gdelt.mjs # Each exports briefing() → structured data
│ ├── fred.mjs # Can run standalone: node apis/sources/fred.mjs
│ ├── space.mjs # CelesTrak satellite tracking
│ ├── yfinance.mjs # Yahoo Finance — free live market data
│ └── ... # 23 more
│
├── dashboard/
│ ├── inject.mjs # Data synthesis + standalone HTML injection
│ └── public/
│ └── jarvis.html # Self-contained Jarvis HUD
│
├── lib/
│ ├── llm/ # LLM abstraction (5 providers, raw fetch, no SDKs)
│ │ ├── provider.mjs # Base class
│ │ ├── anthropic.mjs # Claude
│ │ ├── openai.mjs # GPT
│ │ ├── gemini.mjs # Gemini
│ │ ├── openrouter.mjs # OpenRouter (Unified API)
│ │ ├── codex.mjs # Codex (ChatGPT subscription)
│ │ ├── minimax.mjs # MiniMax (M2.5, 204K context)
│ │ ├── mistral.mjs # Mistral AI
│ │ ├── ideas.mjs # LLM-powered trade idea generation
│ │ └── index.mjs # Factory: createLLMProvider()
│ ├── delta/ # Change tracking between sweeps
│ │ ├── engine.mjs # Delta computation — semantic dedup, configurable thresholds, severity scoring
│ │ ├── memory.mjs # Hot memory (3 runs, atomic writes) + cold storage (daily archives)
│ │ └── index.mjs # Re-exports
│ └── alerts/
│ ├── telegram.mjs # Multi-tier alerts (FLASH/PRIORITY/ROUTINE) + two-way bot commands
│ └── discord.mjs # Discord bot (slash commands, rich embeds) + webhook fallback
│
└── runs/ # Runtime data (gitignored)
├── latest.json # Most recent sweep output
└── memory/ # Delta memory (hot.json + cold/YYYY-MM-DD.json)
```
### 设计原则
- **纯 ESM**——每个文件都是带有显式导入的 `.mjs`
- **最小依赖**——Express 是唯一的运行时依赖。`discord.js` 是可选的(用于 Discord 机器人)。LLM 提供商使用原始 `fetch()`,无需 SDK。
- **并行执行**——`Promise.allSettled()` 同时触发所有27个来源
- **优雅降级**——缺少密钥会产生错误,而不会崩溃。LLM 故障不会终止扫描。
- **每个源都是独立的**——运行 `node apis/sources/gdelt.mjs` 独立测试任何来源
- **独立的仪表板**——HTML 文件无论有没有服务器都能工作
## 数据来源(27个)
### 第1层:核心 OSINT 与地缘政治(11个)
| 来源 | 追踪内容 | 认证 |
|--------|---------------|------|
| **GDELT** | 全球新闻事件、冲突映射(100+种语言) | 无 |
| **OpenSky** | 跨6个热点区域的实时 ADS-B 航班追踪 | 无 |
| **NASA FIRMS** | 卫星火灾/热异常探测(3小时延迟) | 免费密钥 |
| **Maritime/AIS** | 船舶追踪、暗船、制裁逃避 | 免费密钥 |
| **Safecast** | 6个核设施附近的公民科学辐射监测 | 无 |
| **ACLED** | 武装冲突事件:战斗、爆炸、抗议 | 免费(OAuth2) |
| **ReliefWeb** | 联合国人道主义危机追踪 | 无 |
| **WHO** | 疾病爆发和卫生紧急情况 | 无 |
| **OFAC** | 美国财政部制裁(SDN 列表) | 无 |
| **OpenSanctions** | 聚合的全球制裁(30+个来源) | 部分 |
| **ADS-B Exchange** | 未过滤的航班追踪,包括军事航班 | 付费 |
### 第2层:经济与金融(7个)
| 来源 | 追踪内容 | 认证 |
|--------|---------------|------|
| **FRED** | 22个关键指标:收益率曲线、CPI、VIX、联邦基金、M2 | 免费密钥 |
| **US Treasury** | 国债、收益率、财政数据 | 无 |
| **BLS** | CPI、失业率、非农就业人数、PPI | 无 |
| **EIA** | WTI/布伦特原油、天然气、库存 | 免费密钥 |
| **GSCPI** | 纽约联储全球供应链压力指数 | 无 |
| **USAspending** | 联邦支出和国防合同 | 无 |
| **UN Comtrade** | 主要大国之间的战略商品贸易流 | 无 |
### 第3层:天气、环境、科技、社会、SIGINT(7个)
| 来源 | 追踪内容 | 认证 |
|--------|---------------|------|
| **NOAA/NWS** | 美国活跃天气警报 | 无 |
| **EPA RadNet** | 美国政府辐射监测 | 无 |
| **USPTO Patents** | 7个战略技术领域的专利申请 | 无 |
| **Bluesky** | 关于地缘政治/市场话题的社会情绪 | 无 |
| **Reddit** | 来自关键子版块的社会情绪 | OAuth |
| **Telegram** | 17个精选 OSINT/冲突/财经频道(网页抓取,可通过配置扩展) | 无 |
| **KiwiSDR** | 全球 HF 无线电接收器网络(约600个接收器) | 无 |
### 第4层:太空与卫星(1个)
| 来源 | 追踪内容 | 认证 |
|--------|---------------|------|
| **CelesTrak** | 卫星发射、ISS 追踪、军事星座、Starlink/OneWeb 数量 | 无 |
### 第5层:实时市场数据(1个)
| 来源 | 追踪内容 | 认证 |
|--------|---------------|------|
| **Yahoo Finance** | 实时价格:SPY、QQQ、BTC、黄金、WTI、VIX + 另外9种 | 无 |
## npm 脚本
| 脚本 | 命令 | 描述 |
|--------|---------|-------------|
| `npm run dev` | `node --trace-warnings server.mjs` | 启动仪表板并自动刷新 |
| `npm run sweep` | `node apis/briefing.mjs` | 运行单次扫描,将 JSON 输出到 stdout |
| `npm run inject` | `node dashboard/inject.mjs` | 将最新数据注入静态 HTML |
| `npm run brief:save` | `node apis/save-briefing.mjs` | 运行扫描 + 保存带时间戳的 JSON |
| `npm run diag` | `node diag.mjs` | 运行诊断(Node 版本、导入、端口检查) |
## 配置
所有设置都在 `.env` 中,具有合理的默认值:
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `PORT` | `3117` | 仪表板服务器端口 |
| `REFRESH_INTERVAL_MINUTES` | `15` | 自动刷新间隔 |
| `LLM_PROVIDER` | 禁用 | `anthropic`、`openai`、`gemini`、`codex`、`openrouter`、`minimax` 或 `mistral` |
| `LLM_API_KEY` | — | API 密钥(codex 不需要) |
| `LLM_MODEL` | 各提供商默认 | 覆盖模型选择 |
| `TELEGRAM_BOT_TOKEN` | 禁用 | 用于 Telegram 警报 + 机器人命令 |
| `TELEGRAM_CHAT_ID` | — | 你的 Telegram 聊天 ID |
| `TELEGRAM_CHANNELS` | — | 要监视的额外频道 ID(逗号分隔) |
| `TELEGRAM_POLL_INTERVAL` | `5000` | 机器人命令轮询间隔(毫秒) |
| `DISCORD_BOT_TOKEN` | 禁用 | 用于 Discord 警报 + 斜杠命令 |
| `DISCORD_CHANNEL_ID` | — | 用于警报的 Discord 频道 |
| `DISCORD_GUILD_ID` | — | 服务器 ID(即时斜杠命令注册) |
| `DISCORD_WEBHOOK_URL` | — | Webhook URL(仅警报回退,无需机器人) |
增量引擎阈值(系统对扫描之间变化的敏感程度)可以在 `crucix.config.mjs` 的 `delta.thresholds` 部分自定义。默认值经过调整,可过滤噪声同时捕捉有意义的变动。
## API 端点
运行 `npm run dev` 时:
| 端点 | 描述 |
|----------|-------------|
| `GET /` | Jarvis HUD 仪表板 |
| `GET /api/data` | 当前合成情报数据(JSON) |
| `GET /api/health` | 服务器状态、运行时间、源数量、LLM 状态 |
| `GET /events` | 用于实时推送更新的 SSE 流 |
## 故障排除
### `npm run dev` 静默退出(无输出,无错误)
这是一个已知问题,npm 的脚本运行器可能会吞掉错误,特别是在 Windows PowerShell 上。请按顺序尝试以下操作:
**1. 直接运行 Node(绕过 npm):**
```
node --trace-warnings server.mjs
```
这在功能上与 `npm run dev` 相同,但会给你完整的错误输出。
**2. 运行诊断脚本:**
```
node diag.mjs
```
这会逐个测试每个导入,检查你的 Node.js 版本,并验证端口 3117 是否可用。它会告诉你具体是什么失败了。
**3. 检查端口 3117 是否已被占用:**
之前的 Crucix 实例可能仍在后台运行。
```
# Windows PowerShell
netstat -ano | findstr 3117
taskkill /F /PID 更多截图
| 启动序列 | 世界地图 | |:---:|:---:| |  |  | | 3D 地球视图 | |:---:| |  |标签:Discord集成, Docker, ESC4, Express, GNU通用公共许可证, HTTP/HTTPS抓包, LLM集成, Node.js, OSINT, Telegram机器人, 人工智能助手, 仪表盘, 冲突监控, 制裁名单, 卫星监测, 多源数据融合, 安全防御评估, 市场行情, 态势感知, 情报分析, 情报收集, 情报终端, 本地部署, 漏洞研究, 监控告警, 离线运行, 经济指标, 网络安全, 网络诊断, 自定义脚本, 舆情分析, 航班追踪, 请求拦截, 辐射监测, 隐私保护