# Openspace-Satellite-Watcher **Repository Path**: open-source-space_1_0/openspace-satellite-watcher ## Basic Information - **Project Name**: Openspace-Satellite-Watcher - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-08 - **Last Updated**: 2026-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 卫星守望者 · Satellite Watcher 一个开源的 Web 端空间态势感知(SSA, Space Situational Awareness)应用,基于 TLE 轨道数据实时计算并可视化近地轨道卫星的位置与轨迹。支持 2D / 3D 双视角切换、时间回放、星座导入与卫星管理;内置 **TREA-01 遥感任务仿真闭环**(任务规划 → 变轨可视化 → 成像仿真 → 报告导出)与 **第一视角驾驶舱**,并集成 **AI 大模型辅助任务规划**。 *** ## 功能介绍 ### 可视化引擎 - **2D / 3D 双视角**:基于 MapLibre GL 的 2D 地图与基于 CesiumJS 的 3D 地球,一键无缝切换 - **默认东亚视角**:打开页面时地球/地图自动聚焦中国区域(经度 110°E,纬度 35°N) - **实时轨道渲染**:使用 satellite.js 的 SGP4/SDP4 算法实时计算卫星位置,绘制多圈预测轨道线 - **高清地球底图**:统一使用 **Esri World Imagery 高清卫星影像。** - **卫星定位**:点击详情面板的定位图标,相机平滑飞至卫星当前位置 - **3D 模型**:部分卫星预置 GLB 3D 模型 ### 卫星管理 - **卫星搜索**:支持按 NORAD ID / 名称快速搜索 - **批量操作**:一键显示/隐藏卫星 - **详情面板**:展示卫星元数据、TLE 原文、轨道参数(近地点 / 远地点 / 周期 / 倾角 / 偏心率)、图片和3D模型 ### TREA-01 遥感任务仿真闭环 进入"任务中心"后,主屏切换为 TREA-01 专用任务视图: - **任务规划**:左侧面板自动计算未来 48 小时内 TREA-01 对两个 AOI(南海西沙—菲律宾海域 / 霍尔木兹海峡)的过境窗口(最大仰角、持续时间、中心时刻),支持单选 AOI 进入规划 - **AI 辅助规划**:调用 LLM 大模型(火山引擎 Doubao)综合分析轨道力学、光学遥感约束、卫星资源,输出 AOI 评分对比、推荐窗口、机动建议、风险评估与执行步骤,一键应用建议 - **变轨可视化**:执行相位调整机动后,渲染 5 秒新旧轨道渐变对比动画(旧轨道灰色虚线渐隐、新轨道青色发光实线渐显),TLE 自动更新驱动位置传播切换 - **成像仿真**:任务状态机驱动 EXECUTING → IMAGING → COMPLETED 转换,实时渲染传感器成像足迹(200km 刈幅),扫描覆盖 AOI - **任务报告**:任务完成后弹出报告模态框,含任务摘要、成像时间、AOI 覆盖、机动记录与模拟遥感影像,支持导出打印 - **电影回放**:对地遥感任务可用 - **紧急避撞任务**:突发碎片接近警报触发红色预警模态框,生成 3 个躲避计划(沿迹微调/径向机动/组合机动)供选择;选择计划后执行机动切换轨道,避撞机动视频,随后自动回到大屏 - **TREA-01 卫星视图**:右侧遥测面板上方展示卫星线框示意图,含跟踪按钮 - **面板折叠**:左侧"任务规划"面板与右侧"遥测仪表盘"面板均支持一键缩进折叠,大屏复位键可将视角重置为东亚上空 ### 第一视角驾驶舱(First-Person Cockpit) 通过任务中心或直接访问 `/cockpit` 进入 TREA-01 第一视角追尾驾驶舱,沉浸式体验卫星轨道飞行: - **追尾视角相机**:相机锁定在 TREA-01 卫星后方,支持滚轮缩放调整距离、方向键控制视角偏转 - **交通卫星系统**:5 颗交通卫星以 3D 模型形式从视野中飞越,支持距离判断与可见时长控制 - **昼夜变化**:地球随光照自转呈现真实昼夜过渡 - **遥测仪表盘**:向第一视角驾驶舱与任务中心复用高密度紧凑遥测面板,3×3 网格无需滚动即展示位置、速度、姿态、燃料、电池、载荷、链路、告警与轨道参数 - **卫星线框示意图**:驾驶舱内显示 TREA-01 卫星线框图,增强驾驶舱沉浸感 ### 数据导入 - **Celestrak 导入**:按分类(stations/visual/starlink/gps等)或 NORAD ID/名称 从 Celestrak 实时拉取 TLE - **星座批量导入**:预置主流星座(Starlink、GPS、北斗、风云等)一键导入,响应体体积优化 95%+(base64 图片分离为独立请求) - **文件导入**:支持标准 TLE 格式文本文件 ### 数据管理(需密码) - **轨道数据刷新(TLE)**:输入密码后从 Celestrak 同步所有默认卫星的最新 TLE - **图片上传**:输入密码后为卫星上传自定义图片 ### 时间控制 - **时间回放**:可拖动时间轴查看历史或未来时刻的卫星位置 - **播放控制**:默认 **10× 倍速播放**(非暂停),支持多档倍速 / 暂停 / 重置至当前时刻 - **轨道预测**:基于 TLE 轨道根数预测未来多圈轨迹 - **轨道缓存**:自动缓存计算好的轨道点,重复查看同一时刻无需重新计算 *** ## API 服务 | 路由 | 方法 | 需要密码 | 说明 | | ------------------------------- | -------- | ----- | ------------------------------ | | `/api/space-objects` | GET | 否 | 获取所有默认卫星(含 TLE、图片),5min 内存缓存 | | `/api/tle/refresh` | POST | **是** | 从 Celestrak 刷新 TLE 并写入数据库 | | `/api/tle/import/celestrak` | POST | 否 | 按分类从 Celestrak 导入(代理,单次≤100颗) | | `/api/satellite-image/[noradId]` | GET | 否 | 按需返回卫星图片(base64 → 短 URL,浏览器缓存 24h) | | `/api/tle/import/constellation` | GET/POST | 否 | 获取/导入星座列表(自动过滤非 PAYLOAD) | | `/api/tle/import/search` | GET | 否 | 按名称/ID搜索 Celestrak | | `/api/nasa-media` | GET | 否 | 检索 NASA 媒体库 | | `/api/nasa-image/proxy` | GET | 否 | NASA 图片代理(解决跨域) | | `/api/admin/verify` | POST | 否 | 密码验证(敏感操作前置校验) | | `/api/admin/upload-image` | POST | **是** | 上传卫星图片到数据库(base64) | | `/api/admin/seed` | POST | **是** | 初始化种子数据 | | `/api/ai/task-planning` | POST | 否 | AI 辅助任务规划(代理 LLM,需配置 LLM 环境变量) |
*** ## 安全防护 应用部署在公网环境下,已实施多层防护抵御 DDoS 与滥用: | 防护层 | 机制 | | ------------------------ | ------------------------------------------------------------------------------------------------- | | **Vercel 平台层** | 自带 DDoS 防护、全球 CDN 加速、自动 HTTPS;Serverless Functions 自动扩缩容 | | **Next.js Middleware 层** | 内存级 IP 限流;全局并发≤50 返回 503;安全响应头(X-Frame-Options、X-Content-Type-Options、CSP) | | **API 参数校验层** | Celestrak GROUP 白名单防注入;搜索参数长度≤100字符;pageSize 上限100;导入结果截断到100颗;星座导入过滤非 PAYLOAD;AI 路由输入校验 + 55s 超时 | | **密码验证** | `crypto.timingSafeEqual` 时序安全比较;敏感操作(TLE刷新、图片上传)需先经 `/api/admin/verify` 前置校验;密码保存在 sessionStorage | | **密钥隔离** | LLM API key/EP 通过环境变量读取,仅存于 Vercel 服务器环境变量(`.env.local` 本地开发),绝不返回前端;`.env.local` 已在 `.gitignore` | *** ## 技术框架 | 层级 | 技术 | 说明 | | ---------- | -------------------------- | ---------------------------------------------- | | **框架** | Next.js 14 (App Router) | React 全栈框架,支持 SSR / API Routes / Standalone 输出 | | **语言** | TypeScript 5.5 | 全量类型安全 | | **UI 库** | React 18 | 函数组件 + Hooks | | **样式** | Tailwind CSS 3 + shadcn/ui | 原子化 CSS + 可定制组件库 | | **图标** | lucide-react | 轻量 SVG 图标 | | **3D 地球** | CesiumJS (@cesium/engine) | WebGL 3D 地球渲染 | | **2D 地图** | MapLibre GL JS | 开源矢量瓦片地图 | | **轨道计算** | satellite.js | SGP4/SDP4 轨道传播算法 | | **3D 模型** | Cesium 内置 GLB 渲染 | 选中卫星时加载 GLB 模型(统一初始大小 + 滚轮缩放) | | **状态管理** | Zustand | 轻量全局状态,支持选择器订阅 | | **数据库** | PostgreSQL + Prisma ORM | 关系型数据库与类型安全 ORM | | **AI/LLM** | 火山引擎方舟 Ark(Doubao) | OpenAI 兼容协议,AI 辅助任务规划 | ### 项目结构 ``` src/ ├── app/ # Next.js App Router │ ├── api/ # API 路由 │ │ ├── admin/ # 管理员接口(verify 密码校验、seed、图片上传,需密码) │ │ ├── ai/task-planning/ # AI 辅助任务规划(代理 LLM) │ │ ├── nasa-image/ # NASA 图片代理 │ │ ├── nasa-media/ # NASA 媒体检索 │ │ ├── space-objects/ # 卫星数据查询(5min 内存缓存) │ │ ├── satellite-image/ # 卫星图片按需加载(base64→短URL,浏览器缓存24h) │ │ ├── tags/ # 标签查询 │ │ └── tle/ │ │ ├── import/ # TLE 导入(Celestrak代理/星座/搜索) │ │ └── refresh/ # TLE 刷新(需密码,写DB) │ ├── cockpit/ │ │ └── page.tsx # 第一视角驾驶舱页面(SSR disabled) │ ├── layout.tsx │ └── page.tsx # 主页面 ├── components/ │ ├── HomePage.tsx # 主页面布局与逻辑(含密码弹窗、任务模式切换、面板折叠) │ ├── cockpit/ │ │ └── ChaseCockpit.tsx # 第一视角驾驶舱主组件(追尾视角 + 遥测 + 线框图) │ ├── trea/ # TREA-01 任务中心组件 │ │ ├── MissionHeader.tsx # 任务中心顶部栏(含电影回放按钮) │ │ ├── TaskListPanel.tsx # 任务规划面板(过境窗口 + AI 辅助按钮) │ │ ├── AiPlanningModal.tsx # AI 规划结果展示模态框 │ │ ├── TelemetryDashboard.tsx # 遥测仪表盘(任务中心与驾驶舱共用,紧凑高密度) │ │ ├── TreaSatelliteView.tsx # TREA-01 卫星线框示意图 + 跟踪 │ │ ├── ManeuverPanel.tsx # 变轨控制面板 │ │ ├── MissionSimulator.tsx # 任务仿真状态机(纯逻辑) │ │ ├── MissionReportModal.tsx # 任务报告模态框(含导出) │ │ ├── CinematicController.tsx # 电影回放控制器(4 阶段流程调度) │ │ ├── CinematicOverlay.tsx # 电影回放 UI 覆盖层(字幕/视频/报告) │ │ ├── ScanVideoModal.tsx # 成像扫描视频播放窗口 │ │ ├── AvoidanceVideoModal.tsx # 避撞机动视频播放窗口 │ │ └── CollisionAlertModal.tsx # 碰撞警报模态框(躲避计划选择) │ ├── FullscreenButton.tsx # 全屏切换按钮(三处界面复用,支持 ESC) │ ├── ui/ # 业务 UI 组件 │ │ ├── ImportModal.tsx # 导入弹窗(支持滚动) │ │ ├── SatelliteDetailPanel.tsx # 卫星详情面板 │ │ ├── SatelliteList.tsx # 卫星列表 │ │ ├── TimeControlBar.tsx # 时间控制 │ │ └── ... │ └── visualization/ # 可视化组件 │ ├── CesiumGlobe.tsx # 3D 地球(默认东亚视角 + 任务模式 + 变轨可视化) │ ├── MapLibreMap.tsx # 2D 地图(默认东亚视角) │ └── ... ├── hooks/ │ ├── useCesium.ts # Cesium 主视图封装(实体管理、跟踪、AOI、变轨弧) │ ├── useChaseViewer.ts # Cesium 驾驶舱封装(追尾视角、交通卫星调度、滚轮缩放) │ └── useFullscreen.ts # 全屏状态管理(全屏/退出 + fullscreenchange 监听 + webkit 兼容) ├── lib/ │ ├── api/client.ts # API 客户端 │ ├── security.ts # 密码验证(timingSafeEqual) │ ├── cesium/ │ │ └── imagery.ts # 地球影像源模块(Esri World Imagery / NaturalEarthII 可切换) │ ├── cockpit/ │ │ └── traffic-sats.ts # 交通卫星 TLE 生成与调度算法(Round-robin) │ ├── tle/ # TLE 解析与轨道计算(SSOT) │ │ ├── parser.ts # TLE 解析 │ │ ├── orbit.ts # SGP4 轨道传播与参数计算 │ │ ├── generateMissionTle.ts # 生成经过 AOI 上空的虚拟任务轨道 TLE │ │ └── tleFormat.ts # TLE 字段替换与校验和工具 │ ├── trea/ # TREA-01 任务逻辑 │ │ ├── constants.ts # AOI 定义、传感器参数、初始 TLE │ │ ├── access.ts # 过境窗口计算(仰角/持续时间) │ │ ├── ai-prompt.ts # AI Prompt 设计(SSOT)+ 请求体构造 │ │ ├── cinematicShots.ts # 电影回放镜头脚本(4 阶段配置) │ │ └── report.ts # 任务报告生成 │ ├── prisma.ts # Prisma 客户端 │ ├── translations.ts # 国家/类型翻译 │ └── mock/satellites.ts # 默认卫星数据(DB不可用时fallback) ├── middleware.ts # 全局IP限流+安全头 └── store/ # Zustand 状态 ├── satelliteStore.ts # 卫星列表/选中/跟踪 ├── timeStore.ts # 时间播放(默认 10x) ├── treaMissionStore.ts # TREA-01 任务状态(TLE/轨道/燃料/任务阶段/避撞) └── cinematicStore.ts # 电影回放播放状态(当前镜头/暂停/已用时长) prisma/ └── schema.prisma # 数据库模型定义 public/ ├── models/ # 预置 3D 模型(GLB) ├── textures/ # 地球纹理(Black Marble 夜间灯光) ├── trea/ # TREA-01 资源(模拟遥感影像 + 成像/避撞视频 + 线框图) └── cesium/ # Cesium 静态资源(Workers、Assets) deploy/ # Docker 自托管部署 ├── Dockerfile # 三阶段构建(deps → builder → runner) ├── docker-compose.yml # 四服务编排(postgres + migrate + app + caddy) ├── Caddyfile # Caddy 反向代理 + 自动 HTTPS ├── deploy.sh # 一键部署脚本 └── README.md # 部署详细文档 ``` *** ## 生产架构 支持两种部署方式:**Vercel Serverless**(零运维)与 **Docker Compose 自托管**(全可控)。 ### Vercel 部署架构 ``` ┌─────────────┐ HTTPS ┌──────────────────────────┐ HTTPS ┌──────────────────┐ │ 全球用户 │ ───────────→ │ Vercel (Serverless) │ ────────→ │ Celestrak / NASA │ │ │ (CDN) │ │ │ (外部数据API) │ │ │ │ · 自动 HTTPS / CDN │ └──────────────────┘ │ │ │ · Next.js SSR + API │ │ │ │ · API内存缓存 │ ────┐ │ │ │ · 密码验证+限流 │ │ │ │ │ · 客户端状态隔离 │ ↓ └─────────────┘ │ │ Vercel Postgres (Neon) │ │ · 14颗默认卫星 │ │ · TLE/标签/图片 └──────────────────────────┘ ``` ### Docker Compose 自托管架构 ``` ┌─────────────┐ HTTPS ┌───────────┐ 反代 ┌─────────────┐ │ 用户 │ ───────────→ │ Caddy │ ─────→ │ Next.js App │ │ │ │ (自动HTTPS)│ :3000 │ (Standalone) │ └─────────────┘ └─────┬─────┘ └──────┬──────┘ │ │ │ ┌────▼──────┐ │ │ PostgreSQL │ │ │ (卷持久化) │ │ └───────────┘ │ └─ migrate 一次性服务: prisma db push + seed ``` - **Caddy**:自动申请/续期 Let's Encrypt 证书,HTTP→HTTPS 跳转,反向代理到 Next.js - **Next.js Standalone**:Node 服务运行 `server.js`,Cesium 走 CDN - **PostgreSQL**:14 颗默认卫星 + 8 星座 + 标签,Docker 卷持久化 - **migrate**:容器启动时一次性跑 `prisma db push` + 幂等 seed,完成后退出 详细部署文档见 [deploy/README.md](deploy/README.md)。 *** ## 本地开发 ### 环境要求 - Node.js ≥ 18.17 - PostgreSQL ≥ 14(或使用 Neon 云端数据库;本地无数据库时自动使用内置默认数据) - npm ≥ 9 ### 安装与启动 ```bash # 1. 安装依赖 npm install # 2. 配置环境变量 cp .env.example .env # 编辑 .env,填入 DATABASE_URL 和 ADMIN_PASSWORD(本地开发可不填DATABASE_URL,使用内置默认数据) # 3. 启动开发服务器 npm run dev ``` 访问 > 本地开发无需配置 PostgreSQL,API 会自动 fallback 到内置的 13 颗默认卫星数据。 ### 环境变量 | 变量 | 说明 | 必填 | | --------------------------- | --------------------------------------------------------------------------- | ------- | | `DATABASE_URL` | PostgreSQL 连接字符串 | 生产必填 | | `POSTGRES_URL_NON_POOLING` | Prisma schema 使用的数据库连接字符串 | 生产必填 | | `ADMIN_PASSWORD` | 操作密码(TLE刷新、图片上传) | ✅ | | `NODE_ENV` | 运行环境 | 生产必填 | | `LLM_API_KEY` | 火山引擎方舟 API key(AI 辅助任务规划) | AI 功能必填 | | `LLM_API_URL` | LLM 接入点 base URL(如 `https://ark.cn-beijing.volces.com/api/v3`) | AI 功能必填 | | `LLM_MODEL` | LLM 模型 EP(如 `ep-xxxxxxxxxxxx-xxxxxx`) | AI 功能必填 | | `NEXT_PUBLIC_EARTH_IMAGERY` | 地球影像源:`esri`(World Imagery 高清卫星影像,默认)或 `naturalearth`(回退至低清 NaturalEarthII) | 否 | > LLM 凭据仅存于服务器端(`.env.local` 本地开发 / Vercel 环境变量),已在 `.gitignore`,不入库。未配置时 AI 路由返回 503 `MISSING_CONFIG`,其余功能不受影响。 ### 默认卫星 初始化后包含 14 颗默认卫星: | NORAD ID | 名称 | 说明 | | -------- | ---------------- | --------------- | | 25544 | ISS (ZARYA) | 国际空间站 | | 48274 | CSS (TIANHE) | 中国空间站-天和核心舱 | | 53239 | CSS (WENTIAN) | 中国空间站-问天实验舱 | | 54216 | CSS (MENGTIAN) | 中国空间站-梦天实验舱 | | 20580 | HST | 哈勃太空望远镜 | | 27424 | AQUA | NASA 地球观测卫星 | | 25994 | TERRA | NASA 地球观测卫星 | | 28376 | AURA | NASA 大气观测卫星 | | 39084 | LANDSAT 8 | NASA 陆地观测卫星 | | 39634 | SENTINEL-1A | 欧空局雷达卫星 | | 43013 | NOAA 20 (JPSS-1) | NOAA 气象卫星 | | 44714 | STARLINK-1008 | Starlink 卫星 | | 41270 | NOAA 16 DEB | NOAA 16 碎片(演示用) | | 41173 | 悟空 (DAMPE) | 暗物质粒子探测卫星 | *** ## 部署方式 支持两种部署方式,按需选择。 ### Vercel 部署(零运维,推荐) 1. 将代码推送到 GitHub 2. 在 Vercel 控制台导入仓库 3. 创建 Vercel Postgres 数据库(Storage → Create Database → Postgres) 4. 添加环境变量:`DATABASE_URL`(使用 `POSTGRES_URL_NON_POOLING` 值)、`ADMIN_PASSWORD`、`LLM_API_KEY`、`LLM_API_URL`、`LLM_MODEL` 5. Deploy 6. 部署成功后,在本地执行 `npm run db:seed` 初始化数据库表结构和种子数据 7. AI 路由已配置 `maxDuration = 60`,Hobby plan 支持(AI 调用实测 \~23s);添加环境变量后需 Redeploy 生效 ### Docker Compose 自托管 适用于有自有服务器、需要完全控制权的场景。使用 Caddy 自动申请 HTTPS 证书,PostgreSQL 数据卷持久化,一键部署。 **前置条件:** - Linux 服务器(已装 Docker Engine + Docker Compose v2) - 域名已解析到服务器 IP(用于 HTTPS 证书) - 防火墙开放 80 和 443 端口 **快速开始:** ```bash # 克隆代码 git clone <你的仓库地址> cd satellite-watcher # 配置环境变量 cp deploy/.env.example deploy/.env # 编辑 deploy/.env,填入 DOMAIN / ACME_EMAIL / LLM_API_KEY / ADMIN_PASSWORD 等 # 一键部署 sh deploy/deploy.sh ``` 部署后首次启动会自动: - 构建 Next.js 镜像(三阶段 Dockerfile) - 启动 PostgreSQL 并持久化数据卷 - 跑 `prisma db push` + 幂等 seed(14 颗默认卫星 + 8 星座 + 标签) - Caddy 自动申请 Let's Encrypt HTTPS 证书 - 反向代理到 Next.js 应用 详细文档见 [deploy/README.md](deploy/README.md)。 ### 部署更新流程 **Vercel**:代码推送到 GitHub 后自动重新部署。 **Docker 自托管**: ```bash git pull docker compose -f deploy/docker-compose.yml up -d --build ``` *** ## 许可证 Apache License 2.0