docs: CLAUDE.md komplett aktualisiert (NASA GIBS, FIRMS, 3D-Gebaeude, VLM-Fixes, UI-Gruppen)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
223
CLAUDE.md
223
CLAUDE.md
@@ -24,29 +24,160 @@ Inspiriert vom WorldView/God's Eye Konzept, komplett eigenentwickelt.
|
||||
- **Datenbank:** Geteilte SQLite /mnt/gitea/osint-data/osint.db (mit Monitor)
|
||||
- **Auth:** Magic Link Login (JWT, gleicher JWT_SECRET wie Monitor)
|
||||
|
||||
## Verzeichnisstruktur
|
||||
|
||||
```
|
||||
AegisSight-Globe/
|
||||
.env # API-Keys (nicht in Git)
|
||||
CLAUDE.md # Diese Datei
|
||||
src/
|
||||
main.py # FastAPI-App, Router-Einbindung, Background-Tasks
|
||||
config.py # DB-Pfad, JWT, SMTP, URLs
|
||||
database.py # aiosqlite async DB-Dependency
|
||||
auth.py # JWT create/decode, get_current_user, Cross-Service-Auth
|
||||
auth_router.py # Magic Link Login (request-link, verify, me)
|
||||
email_utils.py # Magic Link E-Mail-Versand
|
||||
data_flights.py # Ziviler Flugverkehr (adsb.lol + adsb.one Fallback)
|
||||
data_ships.py # Schiffsverkehr (AISStream WebSocket, Dark-Ship-Erkennung)
|
||||
data_military.py # Militaerflugzeuge (adsb.lol /v2/mil)
|
||||
data_quakes.py # Erdbeben (USGS GeoJSON)
|
||||
data_disasters.py # Naturkatastrophen (NASA EONET v3)
|
||||
data_satellites.py # Satelliten-Orbits (CelesTrak TLE)
|
||||
data_gdelt.py # Geokodierte Nachrichten (GDELT GEO 2.0)
|
||||
data_monitor.py # OSINT-Daten vom AegisSight Monitor
|
||||
data_push.py # Auto-Push: EONET+USGS M4.5+ -> Monitor Lage 45
|
||||
data_infra.py # Seekabel, AKWs, Militaerbasen, ISS
|
||||
data_geoint.py # EXIF-Extraktion, Sonnenstand, Hoehenprofil, Funkmasten
|
||||
data_vlm.py # VLM-Bildanalyse (Claude Code headless -> Geolocation)
|
||||
data_overpass.py # Overpass Turbo Queries + Template-Bibliothek
|
||||
milship_db.py # Militaerschiff-DB (~200 MID-Codes, 17 Marinen)
|
||||
static/
|
||||
index.html # Haupt-App (Auth, Header, Layer-Panel, Bottom Bar)
|
||||
login.html # Magic-Link Login-Seite
|
||||
favicon.svg # AegisSight Logo
|
||||
css/
|
||||
globe.css # Taktisches Dark Theme, alle UI-Styles
|
||||
js/
|
||||
app.js # Globe-Objekt: Viewer, Layer-Toggles, Gruppen, Stats
|
||||
layers/
|
||||
flights.js # FlightsLayer (zoom-adaptiv, Grid-Cluster)
|
||||
ships.js # ShipsLayer (Typfilter, Kurslinien, Dark-Ship)
|
||||
military.js # MilitaryLayer (rote Punkte + Labels)
|
||||
quakes.js # QuakesLayer (farbcodiert nach Alter)
|
||||
disasters.js # DisastersLayer (EONET + USGS + Monitor-Kontext)
|
||||
firms.js # FirmsLayer (NASA VIIRS Thermal Anomalies 375m)
|
||||
buildings.js # BuildingsLayer (OSM 3D-Gebaeude, farbcodiert)
|
||||
satellites.js # SatellitesLayer (Kreisbahnen, Orbitlinien)
|
||||
gdelt.js # GdeltLayer (orangene News-Punkte)
|
||||
monitor.js # MonitorLayer (OSINT-Artikel nach Lage)
|
||||
cables.js # CablesLayer (Seekabel GeoJSON)
|
||||
infra.js # InfraLayer (AKWs + Militaerbasen)
|
||||
nightlights.js # NightlightsLayer (NASA VIIRS Black Marble NRT)
|
||||
celltowers.js # CelltowersLayer (viewport-basiert, Overpass)
|
||||
iss.js # ISSLayer (Echtzeit-Position)
|
||||
weather.js # WeatherLayer (RainViewer Regenradar)
|
||||
terminator.js # TerminatorLayer (Tag/Nacht-Grenze)
|
||||
timezones.js # TimezonesLayer (24 UTC-Linien)
|
||||
overpass.js # OverpassLayer (Renderer fuer VLM-Ergebnisse)
|
||||
visualmodes.js # VisualModes (STD/NVG/FLIR/CRT)
|
||||
ui/
|
||||
vlm.js # VlmUI (Drag&Drop Upload, Analyse, Overpass-Kopplung)
|
||||
geoint.js # GeointTools (Sonnenstand, Hoehenprofil)
|
||||
imagery.js # ImagerySwitch (13 Quellen inkl. NASA GIBS)
|
||||
sidebar.js # Sidebar (rechts, Datenpunkt-Uebersicht)
|
||||
search.js # SearchUI (Nominatim + City Quick-Links)
|
||||
crosshairs.js # CrosshairsUI (Fadenkreuz-Overlay)
|
||||
```
|
||||
|
||||
## Datenquellen & Layer
|
||||
|
||||
| Layer | Quelle | API | Refresh | Menge |
|
||||
|-------|--------|-----|---------|-------|
|
||||
| Flugverkehr | adsb.lol | /v2/point/30/0/10000 | 15s | ~10.800 |
|
||||
| | adsb.one (Fallback) | /v2/point/30/0/10000 | - | ~7.000 |
|
||||
| Schiffsverkehr | AISStream.io | WebSocket wss://stream.aisstream.io | Echtzeit | ~15.000+ |
|
||||
| Erdbeben | USGS | earthquake.usgs.gov GeoJSON | 5min | ~50/Tag |
|
||||
| Katastrophen | NASA EONET | eonet.gsfc.nasa.gov/api/v3 | 10min | ~30-80 aktiv |
|
||||
| Nachrichten | GDELT | api.gdeltproject.org/v2/geo | 10min | ~200 |
|
||||
| Satelliten | CelesTrak | celestrak.org TLE JSON | 1h | ~500 |
|
||||
| Regenradar | RainViewer | api.rainviewer.com | 5min | Radar-Overlay |
|
||||
| Monitor OSINT | AegisSight Monitor | monitor.aegis-sight.de/api/public | 2min | variabel |
|
||||
| Layer | Quelle | Refresh | Menge |
|
||||
|-------|--------|---------|-------|
|
||||
| Flugverkehr | adsb.lol (Fallback: adsb.one) | 12s | ~10.000+ |
|
||||
| Militaerflug | adsb.lol /v2/mil | 15s | ~190 |
|
||||
| Schiffsverkehr | AISStream.io WebSocket | Echtzeit | ~15.000+ |
|
||||
| Nachrichten | GDELT GEO 2.0 | 60s | ~200 |
|
||||
| Katastrophen | NASA EONET v3 + USGS | 10min | ~50-100 |
|
||||
| Feuer (VIIRS) | NASA GIBS WMTS (Thermal Anomalies 375m) | Taeglich | Overlay |
|
||||
| 3D-Gebaeude | Cesium Ion OSM Buildings | Statisch | Weltweit |
|
||||
| Satelliten | CelesTrak TLE | 1h | ~500 |
|
||||
| Seekabel | submarinecablemap.com | 24h | GeoJSON |
|
||||
| AKWs/Basen | Overpass API | 24h | Punkte |
|
||||
| ISS | open-notify.org | 5s | 1 |
|
||||
| Nachtlichter | NASA VIIRS Black Marble NRT | Taeglich | Overlay |
|
||||
| Funkmasten | Overpass API (viewport-basiert) | On-Demand | Variabel |
|
||||
| Regenradar | RainViewer | 5min | Overlay |
|
||||
| Monitor OSINT | AegisSight Monitor API | 2-5min | Nach Lage |
|
||||
|
||||
## Satellitenbilder (Imagery Switcher)
|
||||
|
||||
| Quelle | URL-Template | Lizenz |
|
||||
|--------|-------------|--------|
|
||||
| Cesium Ion | (Default via Ion Token) | Free-Tier / Commercial |
|
||||
| Esri World Imagery | server.arcgisonline.com/.../tile/{z}/{y}/{x} | Frei fuer Display |
|
||||
| Sentinel-2 2018-2024 | tiles.maps.eox.at/wmts/.../s2cloudless-{YEAR} | CC-BY (ESA Copernicus) |
|
||||
| OpenTopoMap | tile.opentopomap.org/{z}/{x}/{y}.png | ODbL |
|
||||
| OpenStreetMap | a.tile.openstreetmap.org/{z}/{x}/{y}.png | ODbL |
|
||||
| Quelle | Typ | Update | Auth |
|
||||
|--------|-----|--------|------|
|
||||
| Cesium Ion (Standard) | Default Base Layer | - | Ion Token |
|
||||
| Esri World Imagery | URL-Template | Statisch | Keine |
|
||||
| NASA MODIS Terra (Heute) | GIBS WMTS REST | Taeglich ~3h | Keine |
|
||||
| NASA VIIRS SNPP (Heute) | GIBS WMTS REST | Taeglich ~3h | Keine |
|
||||
| NASA GOES East (Live) | GIBS WMTS REST | ~10-15 Min | Keine |
|
||||
| NASA GOES West (Live) | GIBS WMTS REST | ~10-15 Min | Keine |
|
||||
| Sentinel-2 (2018-2024) | EOX WMTS | Jaehrlich | Keine |
|
||||
| OpenTopoMap | URL-Template | Statisch | Keine |
|
||||
| OpenStreetMap | URL-Template | Laufend | Keine |
|
||||
|
||||
NASA GIBS Layer nutzen REST-URL mit Datum im Pfad (wie nightlights.js):
|
||||
`https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/{Layer}/default/{Date}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.{ext}`
|
||||
|
||||
## UI-Architektur
|
||||
|
||||
### Layer-Panel (links, einklappbar)
|
||||
5 Gruppen mit Auf-/Zuklapp-Funktion und Aktiv-Zaehler:
|
||||
- **ECHTZEIT** (gruen): Flugverkehr, Militaerflug, Schiffsverkehr
|
||||
- **INTELLIGENCE** (orange): Nachrichten, Katastrophen, Feuer (VIIRS)
|
||||
- **GEOINT** (lila): Bildanalyse, Nachtlichter, Funkmasten, Sonne/Hoehe
|
||||
- **INFRASTRUKTUR** (gelb): Satelliten, Seekabel, AKWs/Basen, ISS, 3D-Gebaeude
|
||||
- **UMGEBUNG** (blau): Regenradar, Tag/Nacht, Terminatur, Zeitzonen
|
||||
|
||||
Immer sichtbar: Satellitenbilder-Dropdown (oben), Fadenkreuz + Ortsnamen (unten), Koordinaten
|
||||
|
||||
### Bottom Bar
|
||||
Visual Modes (STD/NVG/FLIR/CRT) links, Stats rechts
|
||||
|
||||
### Rechte Sidebar
|
||||
Datenpunkt-Uebersicht mit Sections, FlyTo bei Klick, 5s Auto-Update
|
||||
|
||||
## VLM-Bildanalyse
|
||||
|
||||
### Workflow
|
||||
1. Bild hochladen (Drag&Drop, PNG/JPG/WEBP, max 10MB)
|
||||
2. Claude Code headless (Sonnet, --json-schema) analysiert das Bild
|
||||
3. Ergebnis: Szene, Objekte, Terrain, geschaetzte Koordinaten, Landschaftsmerkmale
|
||||
4. User waehlt Objekte aus -> Overpass-Queries werden generiert
|
||||
5. OSM-Treffer werden auf dem Globe gerendert + Suchbereich visualisiert
|
||||
|
||||
### Prompt-Regeln
|
||||
- objects-Array: NUR OSINT-relevante Infrastruktur (Flughaefen, Militaer, Haefen, etc.)
|
||||
- Generische Natur (forest, mountain, farmland) gehoert in terrain/landscape_clues
|
||||
- Bei reinen Landschaftsfotos: objects = [] (leeres Array)
|
||||
- Frontend zeigt "Keine OSINT-relevante Infrastruktur erkannt" und graut Button aus
|
||||
|
||||
### BBox-Aufloesung (Prioritaet)
|
||||
1. EXIF-GPS (verifiziert)
|
||||
2. estimated_coordinates mit confidence_radius_km
|
||||
3. identified_features (Gewaesser, Region -> _REGION_BBOX)
|
||||
4. estimated_location_type (Kontinent/Region)
|
||||
5. Weltweit (kein BBox)
|
||||
|
||||
### Overpass-Integration
|
||||
- Nur ueber VLM erreichbar (kein standalone)
|
||||
- 30+ OSINT-Templates in 6 Kategorien
|
||||
- _OBJECT_TO_OVERPASS: ~35 Objekttypen -> OverpassQL-Tags
|
||||
- Generische Tags (building, highway, landuse) werden gefiltert
|
||||
- Rate-Limit 10s, Cache 5min, Fallback-Server
|
||||
|
||||
## 3D-Gebaeude
|
||||
|
||||
- Cesium Ion OSM Buildings Tileset (createOsmBuildingsAsync)
|
||||
- Farbcodiert: Militaer (rot), Industrie (orange), Regierung/Oeffentlich (blau), Rest (grau)
|
||||
- Toggle in Gruppe INFRASTRUKTUR
|
||||
|
||||
## API-Keys & Credentials
|
||||
|
||||
@@ -58,36 +189,22 @@ Alle in ~/AegisSight-Globe/.env (nicht in Git):
|
||||
- MONITOR_API_KEY — Public API Key des Monitors
|
||||
- DISASTER_INCIDENT_ID=45 — Naturkatastrophen-Lage fuer Auto-Push
|
||||
|
||||
## Verzeichnisstruktur
|
||||
|
||||
|
||||
|
||||
## Bidirektionale Monitor-Verbindung
|
||||
|
||||
### Globe -> Monitor (Auto-Push)
|
||||
- data_push.py sendet alle 10min NASA EONET + USGS M4.5+ an Monitor
|
||||
- Ziel-Lage: ID 45 (Naturkatastrophen international)
|
||||
- Duplikat-Check per Headline im Monitor
|
||||
- Monitor verifiziert und erstellt Zusammenfassung
|
||||
|
||||
### Monitor -> Globe (Feed)
|
||||
- /api/public/globe-feed?incident_id=X liefert GeoJSON
|
||||
- Pro Standort: Ortsspezifische Artikel (Headline, Quelle, Auszug, Datum)
|
||||
- Lage-Auswahl im Globe-Header bestimmt welche Daten angezeigt werden
|
||||
- Nur aktive Live-Monitorings in der Auswahl
|
||||
|
||||
### Klick-Flow
|
||||
1. User waehlt Lage im Header (z.B. Naturkatastrophen)
|
||||
2. Monitor-Standorte erscheinen als rote Punkte auf dem Globus
|
||||
3. Klick auf Katastrophe zeigt: NASA-Daten + passende Monitor-Artikel
|
||||
4. Artikel sind ortsspezifisch (Kenia-Klick = Kenia-Artikel, nicht global)
|
||||
|
||||
## Auth-System
|
||||
|
||||
- Magic Link Login: E-Mail -> 6-stelliger Code per Mail -> JWT
|
||||
- Magic Link Login: E-Mail -> Link per Mail -> JWT
|
||||
- Prueft: users.is_active=1 UND users.globe_access=1
|
||||
- Globe-Zugang wird im Verwaltungsportal per An/Aus-Button gesteuert
|
||||
- JWT-Tokens: 24h Gueltigkeit, akzeptiert auch Monitor-Tokens
|
||||
- JWT-Tokens: 24h Gueltigkeit, akzeptiert auch Monitor-Tokens (Cross-Service)
|
||||
- Alle Daten-APIs hinter Auth-Middleware
|
||||
|
||||
## Rendering-Architektur
|
||||
@@ -95,10 +212,8 @@ Alle in ~/AegisSight-Globe/.env (nicht in Git):
|
||||
### Performance
|
||||
- Flugzeuge/Schiffe: PointPrimitiveCollection (GPU-beschleunigt)
|
||||
- Zoom-adaptiv: Cluster bei Uebersicht, Einzelpunkte bei Detail
|
||||
- Weit (>5.000km): 5-Grad-Raster mit Count-Labels
|
||||
- Mittel (1.000-5.000km): 2-Grad-Raster
|
||||
- Nah (<1.000km): Einzelne Punkte
|
||||
- Katastrophen/Satelliten: Entity API (kleinere Mengen)
|
||||
- 3D-Gebaeude: Cesium3DTileset (Streaming, LOD)
|
||||
|
||||
### Visual Modes
|
||||
- STD: Photorealistisch
|
||||
@@ -106,21 +221,29 @@ Alle in ~/AegisSight-Globe/.env (nicht in Git):
|
||||
- FLIR: Thermal (invertiert, Infrarot-Look)
|
||||
- CRT: Retro-Monitor (Scanlines, Vignette)
|
||||
|
||||
## Services neustarten
|
||||
|
||||
```bash
|
||||
sudo systemctl restart globe.service
|
||||
systemctl status globe.service --no-pager
|
||||
journalctl -u globe -f # Live-Logs
|
||||
```
|
||||
|
||||
## Entwicklungshinweise
|
||||
|
||||
- **CLAUDE.md aktuell halten:** Nach JEDER Aenderung (neue Dateien, Layer, Features, Strukturaenderungen) diese Datei aktualisieren. Sie ist die zentrale Referenz fuer alle Sessions.
|
||||
- Alle JS-Dateien werden als statische Dateien ausgeliefert (kein Build-Step)
|
||||
- Cache-Busting: Browser-Cache manuell mit Ctrl+Shift+R leeren
|
||||
- JS-Syntax pruefen: node --check ~/AegisSight-Globe/static/js/layers/DATEI.js
|
||||
- Python-Syntax: ~/.venvs/globe/bin/python -c 'import py_compile; py_compile.compile("src/DATEI.py", doraise=True)'
|
||||
- Inkrementelle Patches vermeiden — bei groesseren Aenderungen Datei komplett neu schreiben
|
||||
- .env Aenderungen erfordern Service-Restart
|
||||
- NASA GIBS WMTS: Kostenlos, kein API-Key, kein Rate-Limit, CORS offen
|
||||
|
||||
## Bekannte Limitierungen
|
||||
|
||||
- Cesium Ion Free-Tier: Nicht fuer kommerziellen Vertrieb (Commercial License noetig)
|
||||
- Satelliten-Positionen: Vereinfachte Kepler-Berechnung (nicht SGP4-exakt)
|
||||
- AISStream: Schiffsdaten brauchen ~1-2min bis globale Abdeckung nach Restart
|
||||
- OpenSky als Flug-Fallback: Aggressive Rate-Limits (429), daher adsb.lol als Primary
|
||||
|
||||
## Services neustarten
|
||||
|
||||
|
||||
|
||||
## Entwicklungshinweise
|
||||
|
||||
- Alle JS-Dateien werden als statische Dateien ausgeliefert (kein Build-Step)
|
||||
- Cache-Busting: Browser-Cache manuell mit Ctrl+Shift+R leeren
|
||||
- JS-Syntax pruefen: node --check ~/AegisSight-Globe/static/js/layers/DATEI.js
|
||||
- Inkrementelle Patches vermeiden — bei groesseren Aenderungen Datei komplett neu schreiben
|
||||
- .env Aenderungen erfordern Service-Restart
|
||||
- NASA GIBS NRT-Layer: Tagesaktuelle Bilder haben ~3-12h Verzoegerung
|
||||
- VLM-Bildanalyse: Max 1 gleichzeitig (Semaphore), Timeout 90s
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren