11 KiB
11 KiB
AegisSight Globe — Entwicklungsdokumentation
Projektueberblick
Eigenstaendige GEOINT-Anwendung (Geospatial Intelligence) auf globe.aegis-sight.de. CesiumJS 3D-Globus mit Echtzeit-Datenfusion aus oeffentlichen Quellen. Inspiriert vom WorldView/God's Eye Konzept, komplett eigenentwickelt.
Server & Deployment
- Server: 178.104.43.177 (Monitor-Server, 8GB RAM, Ubuntu 22.04)
- Port: 8890
- URL: https://globe.aegis-sight.de
- Service: systemd globe.service (auto-start, Memory-Limit 1GB)
- Venv: ~/.venvs/globe/ (Python 3.10)
- Verzeichnis: ~/AegisSight-Globe/
- Nginx: /etc/nginx/sites-enabled/globe.aegis-sight.de (SSL via Certbot)
- Git: Gitea gitea-undso.aegis-sight.de/AegisSight/AegisSight-Globe
Tech-Stack
- Backend: FastAPI + uvicorn
- Frontend: CesiumJS (CDN v1.125), Vanilla JS, kein Build-Step
- 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 | 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 | 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
- Bild hochladen (Drag&Drop, PNG/JPG/WEBP, max 10MB)
- Claude Code headless (Sonnet, --json-schema) analysiert das Bild
- Ergebnis: Szene, Objekte, Terrain, geschaetzte Koordinaten, Landschaftsmerkmale
- User waehlt Objekte aus -> Overpass-Queries werden generiert
- 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)
- EXIF-GPS (verifiziert)
- estimated_coordinates mit confidence_radius_km
- identified_features (Gewaesser, Region -> _REGION_BBOX)
- estimated_location_type (Kontinent/Region)
- 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
Alle in ~/AegisSight-Globe/.env (nicht in Git):
- AISSTREAM_KEY — AISStream.io WebSocket API
- CESIUM_ION_TOKEN — Cesium Ion (Free-Tier, Commercial noetig fuer Vertrieb)
- JWT_SECRET — Gleicher wie Monitor
- SMTP_* — E-Mail-Versand fuer Magic Link
- MONITOR_API_KEY — Public API Key des Monitors
- DISASTER_INCIDENT_ID=45 — Naturkatastrophen-Lage fuer Auto-Push
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 -> Globe (Feed)
- /api/public/globe-feed?incident_id=X liefert GeoJSON
- Lage-Auswahl im Globe-Header bestimmt welche Daten angezeigt werden
Auth-System
- Magic Link Login: E-Mail -> Link per Mail -> JWT
- Prueft: users.is_active=1 UND users.globe_access=1
- JWT-Tokens: 24h Gueltigkeit, akzeptiert auch Monitor-Tokens (Cross-Service)
- Alle Daten-APIs hinter Auth-Middleware
Rendering-Architektur
Performance
- Flugzeuge/Schiffe: PointPrimitiveCollection (GPU-beschleunigt)
- Zoom-adaptiv: Cluster bei Uebersicht, Einzelpunkte bei Detail
- Katastrophen/Satelliten: Entity API (kleinere Mengen)
- 3D-Gebaeude: Cesium3DTileset (Streaming, LOD)
Visual Modes
- STD: Photorealistisch
- NVG: Nachtsicht (gruener Monochrom-Filter)
- FLIR: Thermal (invertiert, Infrarot-Look)
- CRT: Retro-Monitor (Scanlines, Vignette)
Services neustarten
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
- NASA GIBS NRT-Layer: Tagesaktuelle Bilder haben ~3-12h Verzoegerung
- VLM-Bildanalyse: Max 1 gleichzeitig (Semaphore), Timeout 90s