OpsWeave — Architekturuebersicht
Systemarchitektur
┌─────────────────────────────────────────────────────────────────┐
│ BROWSER (React SPA) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Ticket │ │ CMDB │ │ Workflow │ │ Service │ ... │
│ │ Board │ │ Graph │ │ Designer │ │ Katalog │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ └─────────────┴─── react-i18next (de/en) ┘ │
│ │ REST + WebSocket │
└─────────────────────────┼───────────────────────────────────────┘
│
┌────────────────┴─────────────────┐
│ │
Single-Container Multi-Container
(docker run) (docker compose)
│ │
▼ ┌─────┴─────┐
┌─────────────────┐ │ NGINX │ :80
│ Node.js :8080 │ └──┬─────┬──┘
│ Express + │ /api/* │ │ /*
│ Static Files │ ┌─────┘ └─────┐
│ SQLite │ ▼ ▼
│ better-queue │ ┌──────────┐ ┌──────────┐
└─────────────────┘ │ BACKEND │ │ FRONTEND │
│ Express │ │ Vite │
│ :3000 │ │ :5173 │
└────┬─────┘ └──────────┘
│
┌────┴────┐
│ BullMQ │
└────┬────┘
┌──────┴──────┐
▼ ▼
┌──────────┐ ┌──────────┐
│PostgreSQL│ │ Redis │
│ :5432 │ │ :6379 │
└──────────┘ └──────────┘Dual-Database-Strategie
┌──────────────────────┐
│ Drizzle ORM │
│ (DB-agnostisch) │
└─────────┬────────────┘
│
┌──────────┴──────────┐
│ │
DB_DRIVER=pg DB_DRIVER=sqlite
│ │
┌─────┴─────┐ ┌─────┴─────┐
│PostgreSQL │ │ SQLite │
│ + Redis │ │ (Datei) │
│ + BullMQ │ │ + better │
│ │ │ -queue │
└───────────┘ └───────────┘
Multi-Container Single-Container
Produktion SchnellstartKompatibilitaetsregeln
- Alle Queries ueber Drizzle ORM — KEIN Raw SQL ausser in
/lib/db-specific/ - ENUM → varchar + Zod-Validierung (SQLite hat keine ENUMs)
- INET → varchar(45), TEXT[] → JSON-Text, TIMESTAMPTZ → ISO 8601 Text
- BOOLEAN → integer (0/1) fuer SQLite-Kompatibilitaet
- UUIDs in der Anwendungsschicht generiert (nicht in der DB)
Freemium-Lizenz-Durchsetzung
Request-Flow:
┌───────────┐
POST /api/v1/assets ──────────► │ Lizenz │
│ Guard │
│ Middleware │
└─────┬─────┘
│
┌───────────┴───────────┐
│ │
Unter Limit Ueber Limit
(< 50 Assets) (≥ 50 Assets)
│ │
▼ ▼
┌──────────┐ ┌──────────────┐
│ Weiter │ │ 403 Antwort │
│ zum │ │ ASSET_LIMIT │
│ Handler │ │ _REACHED │
└──────────┘ │ + Upgrade │
│ Info │
└──────────────┘
Limits (Community Edition):
Assets: 50
Benutzer: 5
Workflows: 3
Frameworks: 1
Monitoring: 1 Quelle
Enterprise: Unbegrenzt (aktiviert per Lizenzschluessel)i18n-Flow
┌──────────────┐ Accept-Language: de
│ Browser │ ──────────────────────────► API-Antwort auf Deutsch
│ │ Accept-Language: en
│ i18next │ ──────────────────────────► API-Antwort auf Englisch
│ (Frontend) │
│ │ User.language = 'de'
│ locales/ │ ──────────────────────────► Gespeicherte Praeferenz
│ ├── de/ │ hat Vorrang
│ └── en/ │
└──────────────┘
Prioritaet: Benutzer-Einstellung > Accept-Language Header > System-Standard (de)Datenfluss: Check_MK → Auto-Incident
Check_MK Ereignis (CRIT)
│
▼
POST /api/v1/monitoring/events
│
▼
┌─ Ereignisverarbeitung ─────────────────────────────────┐
│ 1. Webhook-Secret validieren │
│ 2. Asset matchen: Hostname/IP → CMDB-Abgleich │
│ 3. Dedup: Offener Incident fuer gleiches Asset+Service?│
│ → JA: Kommentar anfuegen, kein neues Ticket │
│ → NEIN: Weiter │
│ 4. Incident erstellen mit: │
│ • SLA aus Asset → Service-Kette │
│ • Prioritaet aus Status-Mapping (CRIT→critical) │
│ 5. Workflow instanziieren falls Vorlage passt │
│ 6. WebSocket-Push ans Frontend │
└────────────────────────────────────────────────────────┘SLA-Vererbungs-Validierung
Asset: VM "app-server-01" (SLA: Gold)
│
├── runs_on ──► Cluster "vmw-cluster-01" (Gold) ✅
│ ├── member_of ──► Host "esxi-01" (Bronze) ⚠️
│ └── member_of ──► Host "esxi-02" (Gold) ✅
│
├── stored_on ──► Storage "san-01" (Silver) ⚠️
└── connected_to ──► Switch "sw-core-01" (Gold) ✅
Ergebnis: 2 Konflikte → Warnung in der UI (kein Blocking)Service Katalog: 3-Ebenen-Aufloesung
┌─ Vertikaler Katalog: "Banking Edition" ──────────────────┐
│ Basis: Horizontal "Managed Linux Server" │
│ │
│ Overrides: │
│ ERSETZEN: SD-PATCH-001 → SD-PATCH-DORA-001 │
│ HINZUFUEGEN: SD-AUDIT-BANKING-001 │
│ ENTFERNEN: SD-REMOTE-001 │
│ │
│ Effektiv = Horizontal − Entfernungen + Hinzugefuegt │
│ + Ersetzungen │
│ │
│ Verknuepfte Assets: app-server-01, db-server-02 │
└───────────────────────────────────────────────────────────┘