Dateien
AegisSight-Globe/CLAUDE.md
2026-03-27 23:19:42 +01:00

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

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

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