SoCloseSociety/camforge

GitHub: SoCloseSociety/camforge

自托管的全球公共摄像头地理空间聚合平台,集成实时视频流中继、本地优先 AI 视觉分析与授权资产暴露监控功能。

Stars: 2 | Forks: 0

CamForge

一个自托管的全球公共摄像头智能平台。
在实时地图上汇聚全球 公共设计 的摄像头源,通过您自己的 media server 进行中继,并使用 本地优先的 AI 视觉中继 (Ollama) 分析帧 -- 加上仅限授权的 OSINT 暴露监控。

TypeScript Next.js PostGIS Ollama License: MIT PRs welcome

CamForge 将数千个 **公共交通、天气、旅游、海洋和航空摄像头** 映射到一个可搜索的地理空间目录中,从 **您自己的中继** 播放它们(去除音频),并通过 **结构化的 AI 视觉中继** 处理任何帧 -- 字幕、对象计数、场景、警报级别和自然语言问答 -- 默认 **在您本地的 GPU 上** 运行。它还附带一个 **防御性 OSINT** 模块(Shodan,仅限元数据),范围限定为您获得授权测试的资产,并具有协调的披露工作流程。

CamForge multiview -- a live wall of public traffic cameras
Multiview: a live wall of the filtered camera set, refreshed in place.

CamForge map -- global public cameras on a dark MapLibre map with geo search and filters CamForge AI relay and observation history
Map: geo-targeted search + live panel + AI relay In-app guide: every source, endpoint & feature

CamForge exposure OSINT dashboard with coordinated-disclosure workflow
Exposure OSINT: authorized-only, metadata-only, with a coordinated-disclosure state machine.

## ⚖️ 道德使用 -- 不可逾越的红线,已写入代码底层 CamForge 仅接触 **公共设计** 的数据流。聚合运营商发布的流(合法)与访问因默认凭据或漏洞而暴露的私人摄像头(根据 CFAA / 欧盟指令 2013/40/EU 属于未经授权的访问)之间的区别是通过 **结构层面** 强制执行的,而不是仅靠文档: - **公共设计摄入网关** ([`src/lib/policy.ts`](src/lib/policy.ts)) -- 每个摄像头必须携带有效的发布信号(平台 API、运营商页面、政府开放数据或主动选择加入)。如果源 URL 中包含凭据 → 会被拒绝并记录到 `audit_log` 中。 - **不提供凭据存储,不包含暴力破解模块。** 代码库在结构上无法登录任何设备。 - **OSINT 范围网关** -- 对于任何不在 `OSINT_AUTHORIZED_SCOPES` 中的范围,将拒绝进行暴露发现。**仅限元数据** -- 它绝不会对第三方设备进行身份验证、拉取流或截屏。 - **音频切断开关** -- 在中继边界使用 ffmpeg `-an`(音频在全球范围内没有安全的法律立场)。 - **检测,而非识别** -- AI 中继仅描述场景并统计对象类别;它绝不会识别个人或读取车牌,并且原始第三方图像不会被持久化存储。 请仅将其用于公共设计的流以及您拥有或获得授权评估的网络上。切勿他用。 ## ✨ 功能 - 🗺️ **全球摄像头地图** -- MapLibre 暗色地图,涵盖 100 多个国家/地区的 7,000 多个公共摄像头,按类型着色,支持地理定向搜索(地点 · 国家 · 城市 · 边界框 bbox · 半径)以及类型/来源/名称筛选。 - 🧱 **多视图监控墙** -- 动态刷新的过滤结果网格;点击任意图块即可聚焦。 - 🎥 **来自您自有中继的实时视频** -- MediaMTX 按需 HLS(适用于任何 H.264 流,极其可靠),并带有可选的亚秒级 **WebRTC/WHEP** 层级;已剥离音频;快照源会原地刷新;YouTube 将作为官方嵌入式播放。 - 🤖 **本地优先的 AI 视觉中继** -- **Ollama 优先**(在您的 GPU 上运行,无需云密钥),带有 **Claude** 视觉回退机制。无论哪种方式,都会返回相同的结构化 JSON:`caption`、`alert_level`、`objects[]`、`scene`、`answer`。每个摄像头都有观察历史记录。 - 🛰️ **防御性 OSINT** -- 受范围限制的 Shodan 暴露发现(仅限元数据),暴露评分 + CVE 匹配,以及协调披露仪表板(`discovered → reported → acknowledged → remediated → disclosed`)。 - 🔌 **可插拔的连接器** -- 每个源对应一个文件;内置 7 个(Caltrans, TfL, Windy, YouTube, WSDOT, US 511, Norway Vegvesen)。只需几分钟即可添加您自己的连接器。 - 🧭 **应用内指南** 位于 `/guide`,记录了每个工具、endpoint、源和命令。 - 🔒 **代码中的护栏** -- 摄入网关、OSINT 范围网关、防范 SSRF 的抓取、音频切断开关、检测而非识别。 ## 🏗️ 工作原理 ``` connectors/* ──ingest gate (policy.ts)──▶ cameras (PostGIS catalog) ──▶ /api/cameras/search ──▶ MapLibre UI + /multiview (public sources) │ │ osint/scan (authorized) ──▶ exposure_findings │ MediaMTX relay (HLS/WebRTC, audio stripped) ▼ AI relay (Ollama-first / Claude) ──▶ observations ``` - **Datastore** -- PostgreSQL 16 + **PostGIS**(独立的 Docker 容器)。使用 `GEOGRAPHY` + GiST 进行 bbox / 半径 / 最近距离查询。 - **App** -- Next.js 15 (App Router) + React 19 + TypeScript,ESM。Route handlers 充当 API;地图是一个 client component。 - **Media** -- MediaMTX (`latest-ffmpeg`) 按需中继路径;copy-mode remux + `-an`。`` 以 HLS 优先,可选支持 WHEP。 - **AI** -- 通过语法约束的 JSON 使用 Ollama 视觉模型(默认为 `qwen2.5vl:3b`),或使用 `@anthropic-ai/sdk` Claude 视觉模型作为回退方案。 ## 🤖 AI 中继 -- 本地优先 (Ollama) 中继会分析摄像头当前的公开帧并返回 **严格的结构化 JSON**。它是 **Ollama 优先** 的:无需云密钥,一切数据都保留在您的机器/GPU 上。 ``` ollama pull qwen2.5vl:3b # strong structured-output vision model, fits a 12GB GPU # CAMFORGE_AI_BACKEND=auto -> 优先使用 Ollama,仅在已配置时回退到 Claude ``` ``` // POST /api/relay/ {"question":"how busy is this scene?"} { "caption": "A busy highway with multiple lanes of traffic, cars and trucks in both directions...", "alert_level": "info", "objects": [{ "label": "car", "count": 10 }, { "label": "truck", "count": 3 }], "scene": { "weather": "clear", "lighting": "day" }, "answer": "The scene is busy with multiple lanes of traffic." } ``` 使用 `OLLAMA_VISION_MODEL`(`llama3.2-vision`、`moondream` 等)替换模型,或者设置 `CAMFORGE_AI_BACKEND=claude` + `ANTHROPIC_API_KEY` 切换至云端路径。 ## 🚀 快速开始 **前置要求:** Node 22,Docker,以及(可选)用于本地 AI 中继的 [Ollama](https://ollama.com)。 ``` git clone https://github.com/SoCloseSociety/camforge.git cd camforge cp .env.example .env # everything is optional except DATABASE_URL (defaults to the Docker DB) npm install npm run db:up # isolated PostGIS on :5443 (+ MediaMTX media relay) npm run db:migrate npm run ingest # pull public cameras through the ingest gate (Caltrans needs no key) npm run relay:sync # pre-register stream cams as on-demand relay paths # 可选:本地 AI 中继 ollama pull qwen2.5vl:3b npm run dev # http://localhost:3939 ``` 打开 **http://localhost:3939** -- 包含地图、`/multiview`、`/osint` 和 `/guide`。 导入单个源:`npm run ingest caltrans` · `npm run ingest windy` 等等。 ### 环境变量(除 `DATABASE_URL` 外均为可选) | 变量 | 用途 | |---|---| | `DATABASE_URL` | 所有功能的基础(默认指向 Docker DB) | | `CAMFORGE_AI_BACKEND` / `OLLAMA_VISION_MODEL` | 本地 AI 中继(`auto` \| `ollama` \| `claude`) | | `ANTHROPIC_API_KEY` | Claude 视觉回退 | | `TFL_APP_KEY`, `WINDY_WEBCAMS_API_KEY`, `YOUTUBE_API_KEY`, `WSDOT_ACCESS_CODE`, `FIVE11`, `VEGVESEN_DATEX_USER`/`PASS` | 获取更多摄像头源 | | `SHODAN_API_KEY` + `OSINT_AUTHORIZED_SCOPES` | 运行任何暴露扫描的 **必需项** | ## 🔌 连接器(来源) 仅限公共设计的内容。在 [`src/connectors/`](src/connectors/) 中添加新连接器并在 `registry.ts` 中注册。 | 连接器 | 覆盖范围 | 密钥 | 类型 | |---|---|---|---| | `caltrans` | 加州交通部 CCTV | 无 | 快照 | | `tfl-jamcams` | 伦敦 (TfL JamCams) | 可选 | 快照 + MP4 | | `windy` | **全球**摄像头目录 | 必需 | 快照(仅用于展示) | | `youtube-live` | 知名公共直播摄像头 | 必需 | 嵌入 | | `wsdot` | 华盛顿州交通部 | 免费代码 | 快照 | | `five11` | 美国 511 / 各州交通部 | 视各州而定 | 快照 | | `vegvesen` | 挪威 (Statens Vegvesen) | 免费凭据 | 快照 | ## 🌐 API | Endpoint | 用途 | |---|---| | `GET /api/cameras/search` | 地理/属性搜索(`bbox` · `type` · `source` · `q` · `region` · `city` · `limit`) | | `GET /api/cameras/:id` | 摄像头详情 + 最近的 AI 观察 | | `GET /api/stats` | 目录总计 + 按来源 / 类型 / 国家/地区的细分统计 | | `GET /api/geocode?q=` | 地点 → 边界框 (OSM Nominatim) | | `GET /api/thumb/:id` | 防范 SSRF 的缩略图代理(重新解析失效的预览图) | | `POST /api/relay/:id` | 对当前帧进行 AI 中继分析(`{question?}`) | | `POST /api/relay-stream/:id` | 注册/解析 MediaMTX 中继路径(HLS + WHEP) | | `POST /api/osint/scan` | 受范围限制的 Shodan 暴露发现(`{scope}`) -- 未授权返回 403 | | `GET /api/osint/findings` | 列出暴露发现结果(按分数排序) | | `POST /api/osint/findings/:id` | 推进协调披露状态 | ## 🧰 技术栈 Next.js 15 · React 19 · TypeScript 5.9 (ESM) · PostgreSQL 16 + PostGIS · postgres.js · MediaMTX · ffmpeg · MapLibre GL · hls.js · Ollama (qwen2.5vl / llama3.2-vision) · Anthropic Claude vision · Zod · Docker. ## 🗺️ 路线图 - [x] 聚合器 + 地理搜索 + 地图界面(7,000+ 摄像头) - [x] 实时中继(HLS 优先 + WebRTC/WHEP,音频剥离) - [x] 本地优先 AI 视觉中继(Ollama)+ Claude 回退 - [x] 防御性 OSINT + 协调披露工作流 - [ ] 持续分析 + 警报推送 - [ ] 更多连接器(FAA / NOAA / 更多国家级交通部) - [ ] GPU CV 层级(检测 + 追踪) ## 📄 许可证 [MIT](LICENSE) © SoCloseSociety. 仅提供用于合法和已授权的用途 -- 请参阅上方的 **道德使用**。
标签:AI视觉分析, AI风险缓解, 地理信息系统, 摄像头监控, 本地大模型, 测试用例, 自动化攻击, 自托管, 请求拦截