- /api/auth/verify-code Endpoint entfernt - generate_magic_code() entfernt - E-Mail: Nur noch Anmelde-Link, kein 6-stelliger Code - Login-Seite: Zeigt nach E-Mail-Eingabe Hinweis statt Code-Feld - Magic Link Token-Verifikation via URL bleibt bestehen
127 Zeilen
5.0 KiB
Markdown
127 Zeilen
5.0 KiB
Markdown
# 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)
|
|
|
|
## 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 |
|
|
|
|
## 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 |
|
|
|
|
## 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
|
|
|
|
## 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
|
|
- 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
|
|
- Alle Daten-APIs hinter Auth-Middleware
|
|
|
|
## Rendering-Architektur
|
|
|
|
### 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)
|
|
|
|
### Visual Modes
|
|
- STD: Photorealistisch
|
|
- NVG: Nachtsicht (gruener Monochrom-Filter)
|
|
- FLIR: Thermal (invertiert, Infrarot-Look)
|
|
- CRT: Retro-Monitor (Scanlines, Vignette)
|
|
|
|
## 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
|