Ga naar inhoud

Topology & architectuur

/topology toont een graaf van nodes (servers, netwerk-apparatuur, externe diensten) en edges (verbindingen ertussen). Twee bronnen vullen die graaf:

  • Auto-detected — Monsys-agents rapporteren hun eigen IPs en luisterende poorten; de hub leidt daaruit potentiële verbindingen af tussen agents in hetzelfde subnet
  • Manueel — externe diensten die geen agent draaien (SaaS, ISP-uplink, CDN, externe cloud-provider) voeg je zelf toe via de UI of API

Datamodel

TabelWat het bewaart
topology_nodesservers, vm’s, switches, externe SaaS — 30+ node types
topology_edgesverbindingen met protocol, port, encryption, criticality
topology_zonesnetwerk-zones / VLANs / subnets / cloud-VPCs
topology_certificatesTLS certs gekoppeld aan edges (CN, SAN, expiry)
topology_node_configsapparaat-specifieke configs (markdown), versie-historiek
topology_snapshotspoint-in-time JSONB dumps voor change tracking
topology_changesappend-only audit log van wie wat wanneer wijzigde
topology_detected_connectionstussentabel: auto-gezien maar nog niet gedocumenteerd

Tenant-isolatie via Postgres RLS — elke rij heeft tenant_id en de policy matched dat tegen current_setting('app.current_tenant') op elke query.

Auto-bootstrap

TopologyMatcherWorker draait elke 10 min en:

  1. Maakt een topology_node voor elke is_active=true agent die er nog geen heeft (label = naam, type = server, managed_by_monsys = true)
  2. Expandeert agent_connections × inventory_ports (alleen non-loopback) tot per-poort detection rows in topology_detected_connections

Een nieuwe Monsys-agent verschijnt dus vanzelf in het diagram zodra hij inventaris pusht (~5 min na install).

Detected vs. documented

Auto-gedetecteerde verbindingen krijgen is_documented = false. In de Detected tab van de UI (of GET /api/v1/topology/detected?unmatched=1) zie je per verbinding:

  • src agent + dest IP + port + protocol
  • Eerste/laatste keer gezien
  • Knop Promote → waarmee je een target_node kiest. Dat creëert een echte topology_edge met is_documented = true.

Hierdoor groeit het diagram organisch: elke nieuwe verbinding krijgt een “keur dit goed”-moment voor de operator.

API

MethodePad
GET /api/v1/topology/nodeslijst nodes met agent_status + last_seen
POST /api/v1/topology/nodesnieuwe node (manueel — SaaS, switch, …)
PATCH /api/v1/topology/nodes/:idupdate (whitelist op editable fields)
DELETE /api/v1/topology/nodes/:idverwijderen
GET /api/v1/topology/edges · POST · DELETE /:idedges CRUD
GET /api/v1/topology/zones · POSTzones CRUD
GET /api/v1/topology/detected[?unmatched=1]auto-detected lijst
POST /api/v1/topology/detected/:id/promotepromote → edge
GET /api/v1/topology/snapshots · POSTsnapshots
GET /api/v1/topology/export/mermaidMermaid graph download

UI

Dashboard heeft 4 tabs:

  • Diagram — React Flow canvas met drag-to-position (positie wordt per drag-end opgeslagen via PATCH /nodes/:id), drag-to-connect tussen nodes (creëert nieuwe edge), keyboard Delete om edges te verwijderen
  • Detected — promote-flow (zie hierboven)
  • Snapshots — point-in-time snapshots met node/edge counts
  • Nodes & edges — read+delete tabel-view

Edge-styling:

  • groen solid = encrypted en documented
  • rood solid + animated = critical
  • amber dashed = auto-detected maar niet gedocumenteerd

Gerelateerd

  • Diagrammen — gebruikt deze topology als input voor PNG/SVG/PDF export met layout-algoritmen
  • Blast radius — gebruikt dezelfde edges voor 3-hop reachability per host