SoCloseSociety/camforge
GitHub: SoCloseSociety/camforge
自托管的全球公共摄像头地理空间聚合平台,集成实时视频流中继、本地优先 AI 视觉分析与授权资产暴露监控功能。
Stars: 2 | Forks: 0
CamForge
一个自托管的全球公共摄像头智能平台。
在实时地图上汇聚全球 公共设计 的摄像头源,通过您自己的
media server 进行中继,并使用 本地优先的 AI 视觉中继 (Ollama) 分析帧 --
加上仅限授权的 OSINT 暴露监控。
CamForge 将数千个 **公共交通、天气、旅游、海洋和航空摄像头** 映射到一个可搜索的地理空间目录中,从 **您自己的中继** 播放它们(去除音频),并通过 **结构化的 AI 视觉中继** 处理任何帧 -- 字幕、对象计数、场景、警报级别和自然语言问答 -- 默认 **在您本地的 GPU 上** 运行。它还附带一个 **防御性 OSINT** 模块(Shodan,仅限元数据),范围限定为您获得授权测试的资产,并具有协调的披露工作流程。
Multiview: a live wall of the filtered camera set, refreshed in place.
 |
 |
| Map: geo-targeted search + live panel + AI relay |
In-app guide: every source, endpoint & feature |
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风险缓解, 地理信息系统, 摄像头监控, 本地大模型, 测试用例, 自动化攻击, 自托管, 请求拦截