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
| Tabel | Wat het bewaart |
|---|---|
topology_nodes | servers, vm’s, switches, externe SaaS — 30+ node types |
topology_edges | verbindingen met protocol, port, encryption, criticality |
topology_zones | netwerk-zones / VLANs / subnets / cloud-VPCs |
topology_certificates | TLS certs gekoppeld aan edges (CN, SAN, expiry) |
topology_node_configs | apparaat-specifieke configs (markdown), versie-historiek |
topology_snapshots | point-in-time JSONB dumps voor change tracking |
topology_changes | append-only audit log van wie wat wanneer wijzigde |
topology_detected_connections | tussentabel: 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:
- Maakt een
topology_nodevoor elkeis_active=trueagent die er nog geen heeft (label = naam, type = server, managed_by_monsys = true) - Expandeert
agent_connections×inventory_ports(alleen non-loopback) tot per-poort detection rows intopology_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_edgemetis_documented = true.
Hierdoor groeit het diagram organisch: elke nieuwe verbinding krijgt een “keur dit goed”-moment voor de operator.
API
| Methode | Pad |
|---|---|
GET /api/v1/topology/nodes | lijst nodes met agent_status + last_seen |
POST /api/v1/topology/nodes | nieuwe node (manueel — SaaS, switch, …) |
PATCH /api/v1/topology/nodes/:id | update (whitelist op editable fields) |
DELETE /api/v1/topology/nodes/:id | verwijderen |
GET /api/v1/topology/edges · POST · DELETE /:id | edges CRUD |
GET /api/v1/topology/zones · POST | zones CRUD |
GET /api/v1/topology/detected[?unmatched=1] | auto-detected lijst |
POST /api/v1/topology/detected/:id/promote | promote → edge |
GET /api/v1/topology/snapshots · POST | snapshots |
GET /api/v1/topology/export/mermaid | Mermaid 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), keyboardDeleteom 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