docs: CLAUDE.md auf den echten Stand gebracht
Korrigiert: DB-Pfad (/home/claude-dev/osint-data, nicht /mnt/gitea), Dienstname aegis-monitor.service, Ein-Prozess-Hinweis, Scheduler-Jobs vollstaendig, Pipeline-Reihenfolge (Faktencheck VOR Lagebild), Reiter-Ansicht statt gridstack, Tabellenliste vervollstaendigt (keine feedback-Tabelle, dafuer refresh_pipeline_steps, incident_events, fact_check_runs, billing_tariff, user_activity_days, system_status u.a.), Mandantentrennungs-Aussage praezisiert, Staging-DB-Pfad + .env-Realitaet, veralteter Workflow-Abschnitt ersetzt (Auto-Deploy laeuft laengst), erledigte offene Punkte raus, stattdessen ehrliche Baustellen-Liste Stand 26.07.2026, UI-Sync-Unterschiede in beide Richtungen aktualisiert. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dieser Commit ist enthalten in:
205
CLAUDE.md
205
CLAUDE.md
@@ -10,9 +10,9 @@ url: https://monitor.aegis-sight.de
|
||||
server: ssh monitor (46.225.141.13, User: claude-dev)
|
||||
pfad: /home/claude-dev/AegisSight-Monitor
|
||||
quellcode: /home/claude-dev/AegisSight-Monitor/src/
|
||||
datenbank: /mnt/gitea/osint-data/osint.db (SQLite WAL, geteilt mit Verwaltungsportal + Globe)
|
||||
datenbank: /home/claude-dev/osint-data/osint.db (SQLite WAL, geteilt mit Verwaltungsportal + Globe; data/ im Projekt ist ein Symlink darauf)
|
||||
gitea: https://gitea-undso.aegis-sight.de/AegisSight/AegisSight-Monitor
|
||||
service: osint-monitor.service (systemd, Port 8891, Nginx Reverse Proxy)
|
||||
service: aegis-monitor.service (systemd, Port 8891, Nginx Reverse Proxy, EIN uvicorn-Prozess - Orchestrator und WebSockets halten Zustand im Speicher, niemals --workers setzen)
|
||||
venv: /home/claude-dev/.venvs/osint/ (Python 3.12)
|
||||
```
|
||||
|
||||
@@ -23,21 +23,21 @@ backend:
|
||||
framework: FastAPI + Uvicorn
|
||||
datenbank: SQLite WAL (aiosqlite, async)
|
||||
auth: Magic-Link-Login per E-Mail (JWT HS256, 24h)
|
||||
scheduler: APScheduler (Auto-Refresh 1min, Cleanup 1h, Health-Check taeglich 04:00)
|
||||
scheduler: APScheduler (PDF-Ingest 1min, Auto-Refresh 1min, Cleanup 1h, Health-Check taeglich 04:00, Telegram-Status taeglich 04:30)
|
||||
websocket: FastAPI native (Echtzeit-Updates an Clients)
|
||||
ki: Claude CLI als Subprocess (WebSearch + WebFetch Tools)
|
||||
ki_modelle:
|
||||
schnell: CLAUDE_MODEL_FAST (Haiku) — Feed-Selektion, Geoparsing, Chat, QC
|
||||
mittel: CLAUDE_MODEL_MEDIUM (Sonnet) — Entity-Extraktion, Netzwerkanalyse
|
||||
standard: CLI-Default (Opus) — Recherche, Analyse, Faktencheck
|
||||
schnell: CLAUDE_MODEL_FAST (Haiku) — Feed-Selektion, Topic-Filter, Geoparsing, Uebersetzung, Chat, QC
|
||||
mittel: CLAUDE_MODEL_MEDIUM (Sonnet) — nur Netzwerkanalyse (entity_extractor hat aktuell keinen Aufrufer in der App)
|
||||
standard: CLAUDE_MODEL_STANDARD (Opus) — Recherche, Lagebild, Faktencheck
|
||||
email: aiosmtplib (smtp.ionos.de:587 TLS)
|
||||
|
||||
frontend:
|
||||
typ: Vanilla JS (kein Framework, kein Build-Step)
|
||||
design: AegisSight Dark/Light Theme (Navy/Gold)
|
||||
fonts: Poppins (Titel), Inter (Body)
|
||||
layout: gridstack.js (Drag-and-Drop Dashboard-Kacheln)
|
||||
karte: Leaflet + MarkerCluster
|
||||
layout: Reiter-Ansicht je Lage (layout.js; gridstack wurde abgeloest, nur Legacy-Stubs uebrig)
|
||||
karte: Leaflet + MarkerCluster (lokal in vendor/, Kacheln von tile.openstreetmap.de)
|
||||
echtzeit: WebSocket mit Auto-Reconnect und Ping/Pong
|
||||
```
|
||||
|
||||
@@ -63,25 +63,35 @@ src/:
|
||||
feedback.py: "E-Mail-Feedback mit Bild-Anhaengen"
|
||||
tutorial.py: "Tutorial-Fortschritt pro User"
|
||||
|
||||
routes/:
|
||||
version_router.py: "GET /api/version + /api/release-notes (OHNE Auth, fuer das Update-Fenster im Frontend). Historischer Zweitordner neben routers/"
|
||||
|
||||
agents/:
|
||||
orchestrator.py: "Queue-basierte Refresh-Steuerung, Research Multi-Pass (3 Durchlaeufe), Retry, Cancel, Credits-Tracking"
|
||||
researcher.py: "WebSearch-Recherche (Standard + 4-Phasen-Tiefenrecherche), Feed-Selektion, Keyword-Extraktion"
|
||||
analyzer.py: "Analyse-Agent (Lagebild/Briefing, Erst- + inkrementell, Inline-Zitate)"
|
||||
factchecker.py: "Faktencheck (Erst/Inkrementell/Zwei-Phasen mit Triage), Claim-Matching, Dedup"
|
||||
geoparsing.py: "Haiku-basierte Ortsextraktion, Geocoding via geonamescache"
|
||||
entity_extractor.py: "Netzwerkanalyse: Entity-Extraktion (Sonnet), Beziehungsanalyse, Dedup"
|
||||
claude_client.py: "Shared Claude CLI Client, Usage-Tracking (Token, Kosten), Rate-Limit-Erkennung"
|
||||
orchestrator.py: "Queue-basierte Refresh-Steuerung (eine Lane je Organisation), Research Multi-Pass (3 Durchlaeufe), Retry, Cancel, Credits-Buchung. _run_refresh ist ~1450 Zeilen, Aenderungen dort nur mit Vorsicht"
|
||||
stage_runners.py: "Studio-Bausteine: analyze/factcheck einzeln auf vorhandenem Datenbestand, bewusst NEBEN _run_refresh gebaut"
|
||||
researcher.py: "WebSearch-Recherche (Standard + 4-Phasen-Tiefenrecherche), Feed-/Kanal-/Account-Selektion, Keyword-Extraktion, Google-News-Suchfeeds je Sprache"
|
||||
analyzer.py: "Analyse-Agent (Lagebild/Briefing, Erst- + inkrementell, Inline-Zitate, Topic-Filter, Neueste Entwicklungen, Stimmungsbild)"
|
||||
factchecker.py: "Faktencheck (Erst/Inkrementell/Zwei-Phasen mit Haiku-Triage ab 25 Fakten), Claim-Matching, Dedup, Schutz gegen Massen-Downgrades"
|
||||
geoparsing.py: "Haiku-basierte Ortsextraktion, Geocoding offline via geonamescache"
|
||||
entity_extractor.py: "Netzwerkanalyse (Sonnet). ACHTUNG: aktuell ohne Aufrufer in der App, nur regenerate_relations.py im Repo-Root nutzt es"
|
||||
translator.py: "Haiku-Uebersetzung in Batches a 5 (groessere Batches rissen den JSON-Output ab)"
|
||||
claude_client.py: "Shared Claude CLI Client, Usage-Tracking (Token, Kosten), Rate-Limit-Erkennung, Cancel via ContextVar"
|
||||
|
||||
feeds/:
|
||||
rss_parser.py: "RSS-Feed-Parsing (feedparser + httpx), Keyword-Matching, Domain-Cap"
|
||||
telegram_parser.py: "Telethon-basierter Telegram-Parser, Kanal-Validierung"
|
||||
rss_parser.py: "RSS-Feed-Parsing (feedparser + httpx), adaptive Keyword-Schwelle, Frische-Bonus, Domain-Cap"
|
||||
telegram_parser.py: "Telethon-basierter Telegram-Parser (eine gemeinsame Session), Kanal-Validierung"
|
||||
x_parser.py: "X/Twitter via twscrape (Account-Store ~/.x-scraper/accounts.db, optional Mobilfunk-Proxy)"
|
||||
podcast_parser.py: "Podcast-Feeds inkl. Transkript-Extraktoren (transcript_extractors/)"
|
||||
|
||||
services/:
|
||||
post_refresh_qc.py: "Post-Refresh Quality Check: Faktencheck-Duplikate, Location-Korrektur"
|
||||
fact_consolidation.py: "Periodisches Haiku-Clustering, Auto-Resolve veralteter Fakten"
|
||||
source_health.py: "Quellen-Health-Checks (Erreichbarkeit, Feed-Validitaet, Stale)"
|
||||
source_suggester.py: "KI-Quellen-Vorschlaege via Haiku"
|
||||
license_service.py: "Lizenz-Pruefung (Org, Ablauf, Nutzer-Limit)"
|
||||
pipeline_tracker.py: "Die 11 Pipeline-Schritte (DE/EN, Laien-Tooltips), schreibt refresh_pipeline_steps + WebSocket-Events"
|
||||
post_refresh_qc.py: "Post-Refresh Quality Check: Faktencheck-Duplikate, Location-Korrektur, Umlaut-Normalisierung"
|
||||
fact_consolidation.py: "Periodisches Haiku-Clustering. ACHTUNG: als 6h-Job dokumentiert, aber NICHT im Scheduler eingeplant"
|
||||
source_health.py: "Quellen-Health-Checks (Erreichbarkeit, Feed-Validitaet, Stale, fetch_strategy-Logik)"
|
||||
source_suggester.py: "KI-Quellen-Vorschlaege via Haiku + Karteileichen-Heuristik"
|
||||
pdf_ingest.py: "Minutenjob: hochgeladene PDFs einlesen (pdfplumber + OCR-Fallback), uebersetzen, als Pool-Artikel ablegen"
|
||||
org_settings.py: "Key-Value-Einstellungen je Organisation (output_language etc.) mit 60s-Cache"
|
||||
license_service.py: "Lizenz-Pruefung, Credits-Buchung (charge_usage_to_tenant), Periodenwechsel, Budget-Warnung. expire_licenses() existiert, hat aber KEINEN Scheduler-Job"
|
||||
|
||||
middleware/:
|
||||
license_check.py: "Dependencies: require_active_license, require_writable_license"
|
||||
@@ -98,17 +108,25 @@ src/:
|
||||
report.html: "HTML-Template fuer PDF/DOCX-Export"
|
||||
|
||||
static/:
|
||||
index.html: "Login-Seite (Magic-Link)"
|
||||
dashboard.html: "Hauptdashboard (Sidebar + GridStack + Modals)"
|
||||
index.html: "Login-Seite (Magic-Link), JS inline"
|
||||
dashboard.html: "Hauptdashboard (Sidebar + Reiter-Ansicht + 8 Modals + Chat-Widget)"
|
||||
studio.html: "Studio (3-Spalten-Werkstatt, online nur fuer info@ sichtbar - Gating rein clientseitig)"
|
||||
css/:
|
||||
style.css: "AegisSight Design System (Dark/Light Theme, alle Komponenten)"
|
||||
studio.css: "Studio-spezifische Styles"
|
||||
js/:
|
||||
api.js: "REST-API-Client (fetch, Auth-Header, 30s Timeout)"
|
||||
app.js: "Hauptlogik: ThemeManager, NotificationCenter, App-Objekt"
|
||||
components.js: "UI-Rendering: Sidebar, Faktenchecks, Toasts, Progress-Bar, Karte"
|
||||
chat.js: "Chat-Assistent Widget"
|
||||
layout.js: "gridstack.js Wrapper (Drag/Resize, localStorage)"
|
||||
tutorial.js: "Interaktiver 32-Schritte Rundgang mit Animationen"
|
||||
api.js: "REST-API-Client (fetch, Auth-Header, 30s Timeout, 403 -> Nur-Lese-Modus)"
|
||||
app.js: "Hauptlogik: ThemeManager, NotificationCenter, App-Objekt (181 KB)"
|
||||
components.js: "UI-Rendering: Sidebar, Faktenchecks, Toasts, Progress, Karte (geteilt mit Studio)"
|
||||
studio.js: "Kompletter Studio-Controller (109 KB)"
|
||||
chat.js: "Chat-Assistent Widget (Bedienfragen)"
|
||||
pipeline.js: "Grafische Analysepipeline (11 Schritte, Live-Animation)"
|
||||
layout.js: "Reiter-Umschalter je Lage (merkt letzten Reiter; enthaelt noch gridstack-Legacy-Stubs)"
|
||||
tutorial.js: "32-Schritte-Rundgang (140 KB). AKTUELL DEAKTIVIERT, alle Einstiege auskommentiert"
|
||||
a11y.js: "Barrierefreiheits-Panel (identische Datei wie im Verwaltungsportal)"
|
||||
update-system.js: "Was-ist-neu-Modal aus RELEASES.json + Update-Banner"
|
||||
ai-disclaimer.js: "KI-Haftungshinweis beim ersten Besuch"
|
||||
i18n.js: "Mini-Uebersetzung de/en (nur teilweise verdrahtet, Studio/Login komplett deutsch)"
|
||||
ws.js: "WebSocket-Client (Reconnect, Ping/Pong)"
|
||||
vendor/:
|
||||
leaflet.js: "Karten-Bibliothek"
|
||||
@@ -138,37 +156,51 @@ incident_typen:
|
||||
cancel: "Zwischen und innerhalb der Durchlaeufe moeglich"
|
||||
|
||||
refresh_pipeline:
|
||||
1: "Feed-Selektion (Haiku) + dynamische Keywords"
|
||||
2: "Parallel: RSS + WebSearch + optional Telegram"
|
||||
3: "URL-Verifizierung (HEAD-Requests)"
|
||||
4: "Duplikaterkennung (URL + Headline)"
|
||||
5: "Relevanz-Scoring + DB-Dedup"
|
||||
6: "Geoparsing (Haiku + geonamescache)"
|
||||
7: "Parallel: Analyse + Faktencheck"
|
||||
8: "Post-Refresh QC"
|
||||
9: "Notifications (DB + E-Mail + WebSocket)"
|
||||
10: "Credits-Tracking (Token auf Lizenz buchen)"
|
||||
11: "Background: Source-Discovery"
|
||||
hinweis: "Die 11 nutzersichtbaren Schritte definiert services/pipeline_tracker.py. Interner Ablauf in _run_refresh:"
|
||||
1: "Feed-/Kanal-/Account-Selektion (Haiku) + dynamische Keywords je Sprache"
|
||||
2: "Parallel sammeln: RSS + Google-News-Suchfeeds + WebSearch (Opus) + optional Telegram + X + Podcasts (nur adhoc)"
|
||||
3: "URL-Verifizierung (HEAD-Requests, tote URLs werden zu site:-Suchlinks repariert)"
|
||||
4: "Duplikaterkennung (URL + Headline, dann gegen DB-Bestand)"
|
||||
5: "Relevanz-Scoring + semantischer Topic-Filter (Haiku)"
|
||||
6: "Geoparsing (Haiku + geonamescache offline)"
|
||||
7: "Faktencheck ZUERST (liefert Faktenkontext), DANN Lagebild/Briefing (Opus). Optional Stimmungsbild aus Foren-Quellen"
|
||||
8: "Uebersetzung fehlender DE-Texte (Haiku, nur wenn TRANSLATOR_ENABLED) + Neueste Entwicklungen (nur adhoc)"
|
||||
9: "Post-Refresh QC (Fakten-Dubletten, Karten-Kategorien, Umlaute)"
|
||||
10: "Notifications (DB + E-Mail + WebSocket), Credits-Buchung (flat: adhoc 45 / research 40 je Durchlauf)"
|
||||
11: "Background: Source-Discovery + Executive Summary"
|
||||
|
||||
multi_tenancy: "Volle Mandantentrennung (tenant_id auf allen Tabellen)"
|
||||
multi_tenancy: |
|
||||
Mandantentrennung ueber tenant_id-Filter je Abfrage (keine Middleware). Bei Lagen zentral
|
||||
ueber _check_incident_access. ACHTUNG, nicht alle Tabellen haben tenant_id
|
||||
(source_health_checks, source_suggestions, incident_subscriptions, billing_tariff),
|
||||
und der WebSocket-Broadcast filtert Stand 07/2026 NICHT nach Mandant.
|
||||
|
||||
dashboard_kacheln:
|
||||
- "Lagebild (Markdown + Inline-Zitate)"
|
||||
lage_reiter:
|
||||
- "Neueste Entwicklungen (research: Zusammenfassung)"
|
||||
- "Lagebild (research: Recherchebericht, Markdown + Inline-Zitate)"
|
||||
- "Ereignis-Timeline (horizontale Achse, Bucketing, Filter)"
|
||||
- "Geografische Verteilung (Leaflet, Kategorie-Marker, Legende)"
|
||||
- "Faktencheck (Status-Icons, Evidence, Filter)"
|
||||
- "Quellenübersicht (nach Domain gruppiert)"
|
||||
- "Timeline (horizontale Achse, Bucketing, Filter)"
|
||||
- "Karte (Leaflet, Kategorie-Marker, Legende)"
|
||||
- "Oeffentliche Stimmung (nur bei Foren-Quellen)"
|
||||
- "Analysepipeline (grafisch, 11 Schritte)"
|
||||
- "Quellenuebersicht (nach Domain gruppiert)"
|
||||
```
|
||||
|
||||
## Datenbank (25+ Tabellen)
|
||||
## Datenbank (30+ Tabellen)
|
||||
|
||||
```yaml
|
||||
kern: "organizations, licenses, users, magic_links, portal_admins"
|
||||
lagen: "incidents, articles, incident_snapshots, fact_checks, refresh_log"
|
||||
quellen: "sources, source_health_checks, source_suggestions, user_excluded_domains"
|
||||
kern: "organizations, licenses, users, magic_links, organization_settings, portal_admins (gehoert dem Portal)"
|
||||
lagen: "incidents, articles, incident_snapshots, fact_checks, incident_events, fact_check_runs"
|
||||
pipeline: "refresh_log, refresh_pipeline_steps"
|
||||
quellen: "sources, source_alignments, source_health_checks, source_suggestions, user_excluded_domains, podcast_transcripts"
|
||||
geo: "article_locations"
|
||||
netzwerk: "network_analyses, network_analysis_incidents, network_entities, network_entity_mentions, network_relations, network_generation_log"
|
||||
system: "notifications, incident_subscriptions, feedback, token_usage_monthly"
|
||||
netzwerk: "network_analyses, network_analysis_incidents, network_entities, network_entity_mentions, network_relations, network_generation_log (alle leer, kein Endpoint im Monitor)"
|
||||
abrechnung: "token_usage_monthly, billing_tariff, user_activity_days"
|
||||
system: "notifications, incident_subscriptions, system_status"
|
||||
hinweise:
|
||||
- "Es gibt KEINE feedback-Tabelle, Feedback geht direkt per E-Mail raus"
|
||||
- "Portal-Tabellen (portal_audit_log, portal_magic_links, source_health_history u.a.) liegen in derselben Live-DB, werden aber nur vom Verwaltungsportal angelegt/genutzt"
|
||||
- "users.is_global_admin/globe_access/network_access legt NUR das Portal an. Eine frisch per init_db erzeugte Monitor-DB kann daher keinen Login (no such column)"
|
||||
```
|
||||
|
||||
## Verwandte Projekte (gleicher Server)
|
||||
@@ -199,7 +231,7 @@ regeln:
|
||||
- "Jede Aenderung MUSS sofort committed und nach Gitea gepusht werden"
|
||||
- "Echte Umlaute in UI-Texten (ue, ae, oe, ss), keine Umschreibungen"
|
||||
- "Keine Passwoerter oder Secrets in den Code committen"
|
||||
- "Service nach Backend-Aenderungen: sudo systemctl restart osint-monitor"
|
||||
- "Service nach Backend-Aenderungen: sudo systemctl restart aegis-monitor (Staging startet der Auto-Deploy selbst neu)"
|
||||
- "Frontend-Aenderungen (HTML/JS/CSS) brauchen keinen Neustart"
|
||||
- "Backup-Dateien (.bak) nicht committen, vor Push loeschen"
|
||||
```
|
||||
@@ -222,8 +254,13 @@ ui_sync:
|
||||
wortlaut: "Die Verbrauchseinheit heißt in BEIDEN Monitoren 'Credits' (Entscheidung Nutzer 2026-07-25). Nicht Guthaben, nicht Einheiten."
|
||||
gewollte_unterschiede:
|
||||
- "Online: Studio nur für info@aegis-sight.de freigegeben (Gating in studio.js init, Studio-Link im Dashboard-Header versteckt). Lokal ohne Gating, Knopf immer sichtbar."
|
||||
- "Lokal: X-Zugänge-Oberfläche (twscrape) in Sidebar/Modal/Quellenübersicht. Online bewusst nicht vorhanden."
|
||||
- "Lokal: Takt-Features (Untergrenze 30 Min, Kostenvorschau im Anlege-Dialog, Fork-Commit 5b0b578). Online noch nicht portiert. Die Credits-Abrechnung selbst ist seit 25.07.2026 auf beiden Seiten (docs/ABRECHNUNG.md)."
|
||||
- "Lokal: X-Zugänge-Oberfläche (twscrape) in Sidebar/Modal/Quellenübersicht. Online bewusst nicht vorhanden (kein x-Router im Online-Backend)."
|
||||
- "Lokal: Auto-Login über /api/auth/dev-login (Demo-Modus). Online ausschließlich Magic-Link."
|
||||
- "Lokal: Kostenvorschau im Anlege-Dialog (updateIntervalCostHint, Fork-Commit 5b0b578). Online noch nicht portiert."
|
||||
bekannter_drift_stand_2026_07_26:
|
||||
- "Die Takt-Untergrenze ist inzwischen AUCH online (dort _getMinIntervalMinutes, 30 Min; lokal _intervalMinMinutes mit Vorgabe 12 Std). Ältere Angaben, sie fehle online, sind überholt."
|
||||
- "Online-only, noch nicht in den Fork portiert: Reiter 'Öffentliche Stimmung' (renderPublicMood) und die Fall-Chat-Rückfrage /clarify."
|
||||
- "Echter Inhalts-Drift in rund 11 Dateien (app.js, components.js, api.js, studio.js, style.css u.a.), weitere ~7 Dateien unterscheiden sich nur durch Umlaute in Kommentaren."
|
||||
stolperfalle_zeilenenden: |
|
||||
Die Frontend-Dateien (src/static) sind CRLF, die Python-Dateien dieses Repos sind LF
|
||||
(im Lokal-Fork teils anders). Beim Portieren keine Werkzeuge einsetzen, die Zeilenenden
|
||||
@@ -262,20 +299,22 @@ staging:
|
||||
zugriff: Magic-Link-Login an info@aegis-sight.de (Cookie 30 Tage)
|
||||
|
||||
datenbank:
|
||||
pfad: ~/AegisSight-Monitor-staging/data/osint.db
|
||||
pfad: /home/claude-dev/osint-data-staging/osint.db (per DB_PATH in .env gesetzt)
|
||||
achtung: "~/AegisSight-Monitor-staging/data/osint.db ist eine UNBENUTZTE Altkopie"
|
||||
initial: einmalige Kopie der Live-DB
|
||||
drift: gewollt - Aenderungen in Staging beeinflussen Live nicht
|
||||
reseed_von_live: |
|
||||
sudo systemctl stop aegis-monitor-staging
|
||||
cp ~/AegisSight-Monitor/data/osint.db ~/AegisSight-Monitor-staging/data/osint.db
|
||||
cp /home/claude-dev/osint-data/osint.db /home/claude-dev/osint-data-staging/osint.db
|
||||
sudo systemctl start aegis-monitor-staging
|
||||
|
||||
besonderheiten_env:
|
||||
JWT_SECRET: eigener fuer Staging (nicht Live-JWT)
|
||||
MAGIC_LINK_BASE_URL: https://staging.monitor.aegis-sight.de (sonst leitet App zu Live)
|
||||
TELEGRAM_API_ID: 0 # deaktiviert - verhindert Doppel-Login mit Live
|
||||
TELEGRAM_API_HASH: 0
|
||||
DB-Pfad: relative aus config.py (nutzt automatisch ~/AegisSight-Monitor-staging/data/)
|
||||
DB_PATH: /home/claude-dev/osint-data-staging/osint.db (Live setzt KEIN DB_PATH, dort greift der Default data/ = Symlink auf ~/osint-data)
|
||||
STAGING_MODE: 1 (unlimited_budget, kein Credits-Hard-Stop)
|
||||
TRANSLATOR_ENABLED: false
|
||||
TELEGRAM_SESSION_PATH: ~/.telegram-staging/ (eigene Session, dort ist NIEMAND eingeloggt - Telegram-Recherche auf Staging liefert nichts, die Status-Karte im Portal zeigt das ehrlich an)
|
||||
|
||||
auth_service:
|
||||
pfad: /opt/aegis-staging-auth
|
||||
@@ -288,33 +327,29 @@ staging:
|
||||
|
||||
### Workflow Staging -> Live
|
||||
|
||||
1. **Aenderung in develop machen** (im Staging-Verzeichnis):
|
||||
```bash
|
||||
cd ~/AegisSight-Monitor-staging
|
||||
git checkout develop
|
||||
# Aenderung
|
||||
git add . && git commit -m ... && git push origin develop
|
||||
```
|
||||
Der gueltige Ablauf steht unten unter "Vollstaendiger Workflow": develop pushen,
|
||||
Auto-Deploy aktualisiert Staging von selbst, auf Staging pruefen, Promote ueber
|
||||
https://deploy.aegis-sight.de, Live-Check. Manuelles git pull auf dem Server ist
|
||||
NICHT noetig und sollte unterbleiben (der Deploy-Listener macht git reset --hard,
|
||||
lokale Aenderungen in den Server-Verzeichnissen gehen dabei verloren).
|
||||
|
||||
2. **Staging aktualisieren** (aktuell manuell):
|
||||
```bash
|
||||
ssh claude-dev@46.225.141.13 'cd ~/AegisSight-Monitor-staging && git pull && sudo systemctl restart aegis-monitor-staging'
|
||||
```
|
||||
Stolperfalle bei der Warteschlangen-Pruefung: das Staging-Verzeichnis fetcht per
|
||||
Fetch-Regel NUR develop. Fuer "wie viele Commits warten auf Promote" immer erst
|
||||
git fetch origin main ausfuehren, sonst zeigt main..develop veraltete Zahlen.
|
||||
|
||||
3. **In https://staging.monitor.aegis-sight.de testen**
|
||||
### Bekannte Baustellen (Stand 2026-07-26)
|
||||
|
||||
4. **Promote zu Live**: Pull Request develop -> main in Gitea, dann:
|
||||
```bash
|
||||
ssh claude-dev@46.225.141.13 'cd ~/AegisSight-Monitor && git pull'
|
||||
# Live laeuft als loser uvicorn-Prozess (kein systemd) - manueller Restart
|
||||
# bei Backend-Aenderungen noetig
|
||||
```
|
||||
|
||||
### Offen (noch nicht implementiert)
|
||||
|
||||
- Auto-Deploy bei Push auf develop (Webhook-Listener)
|
||||
- Promote-UI mit Ein-Klick-Button
|
||||
- Live-Monitor auf systemd umstellen (~10s Downtime einmalig)
|
||||
- WebSocket-Broadcast filtert nicht nach Mandant (main.py broadcast_for_incident bekommt tenant_id, nutzt ihn nicht)
|
||||
- POST /api/public/globe-ingest schreibt ohne Eigentuemer-Pruefung in beliebige Lagen, Artikel ohne tenant_id
|
||||
- fact_consolidation und expire_licenses existieren, haben aber keinen Scheduler-Job
|
||||
- entity_extractor/Netzwerkanalyse ohne Aufrufer in der App (nur regenerate_relations.py)
|
||||
- tutorial.js deaktiviert (Einstiege auskommentiert), laedt aber weiter bei jedem Login
|
||||
- dashboard.html laedt nicht existierende cluster-data.js (404) und ungenutztes d3.js vom CDN
|
||||
- Reiter "Oeffentliche Stimmung" fehlt in layout.js TAB_ORDER und ist dadurch nicht anklickbar
|
||||
- X-Schalter im Anlege-Dialog hat online keine Funktion (kein X-Backend online)
|
||||
- i18n unvollstaendig (Studio und Login nur deutsch), Begriffs-Mix Fall/Lage/Vorfall, zweimal "Token-Budget" statt "Credits" in app.js
|
||||
- Unter 768px verschwindet die Sidebar ersatzlos (mobil unbenutzbar)
|
||||
- Budget-Warnung geht nur in die Glocke, nicht per E-Mail (siehe docs/ABRECHNUNG.md)
|
||||
|
||||
## Auto-Deploy + Promote-UI
|
||||
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren