Skip to content

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            Schnellstart

Kompatibilitaetsregeln

  • 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         │
└───────────────────────────────────────────────────────────┘

Veröffentlicht unter der AGPL-3.0 Lizenz.