{"id":102,"date":"2026-10-08T09:30:27","date_gmt":"2026-10-08T09:30:27","guid":{"rendered":"https:\/\/anderlini.com\/?p=102"},"modified":"2026-10-08T09:30:27","modified_gmt":"2026-10-08T09:30:27","slug":"vedettavip-monitoraggio-di-rete-con-mappa-topologica-live","status":"publish","type":"post","link":"https:\/\/anderlini.com\/?p=102","title":{"rendered":"VedettaVip: monitoraggio di rete con mappa topologica live"},"content":{"rendered":"<blockquote>\n<p><strong>Una precisazione prima di iniziare:<\/strong> VedettaVip non \u00e8 interamente \u201cfarina del mio sacco\u201d. Ho ideato e sviluppato il progetto appoggiandomi in modo sostanziale a <strong>Claude Code<\/strong>, che mi ha affiancato nella progettazione e nell\u2019implementazione. Il risultato nasce quindi dalla mia esperienza e dalle mie esigenze di rete, ma anche da un importante lavoro svolto con l\u2019assistenza dell\u2019intelligenza artificiale.<\/p>\n<\/blockquote>\n<p>VedettaVip \u00e8 il mio ultimo progetto: un sistema open source di monitoraggio di rete costruito intorno a una <strong>mappa topologica aggiornata in tempo reale<\/strong>. L\u2019idea nasce dalla nostalgia per la semplicit\u00e0 visiva di MikroTik The Dude e dal desiderio di avere uno strumento moderno, gradevole su uno schermo NOC e rapido da configurare.<\/p>\n<figure class=\"wp-block-image\" style=\"width:100%;max-width:900px;margin:2rem auto;text-align:center;\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/dummy1969\/vedettavip\/main\/docs\/images\/map.png\" alt=\"Mappa topologica live di VedettaVip con dispositivi, collegamenti e stati\" style=\"display:block;width:100%;height:auto;margin:auto;border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.10);\"\/><figcaption class=\"wp-element-caption\">La mappa dimostrativa di VedettaVip: nodi colorati per stato, collegamenti e sottomappe.<\/figcaption><\/figure>\n<h2>Che cos\u2019\u00e8 VedettaVip<\/h2>\n<p>VedettaVip controlla apparati e collegamenti tramite ICMP, SNMP e API RouterOS, rappresentandoli su una mappa SVG interattiva. Non vuole sostituire piattaforme generaliste come Zabbix o LibreNMS: il suo punto centrale \u00e8 la topologia, con informazioni immediatamente leggibili e una configurazione visuale basata sul drag &amp; drop.<\/p>\n<p>I nodi assumono un colore in base allo stato \u2014 verde per <em>Up<\/em>, arancione per <em>Partial<\/em>, rosso per <em>Down<\/em> e grigio per <em>Unknown<\/em> \u2014 mentre i collegamenti mostrano separatamente traffico trasmesso e ricevuto, variando colore e spessore in funzione dell\u2019utilizzo.<\/p>\n<h2>Funzionalit\u00e0 principali<\/h2>\n<ul>\n<li><strong>Mappa topologica live:<\/strong> pan, zoom, snap alla griglia, etichette personalizzabili e modalit\u00e0 di sola visualizzazione per gli schermi NOC.<\/li>\n<li><strong>Sottomappe:<\/strong> stato aggregato calcolato sullo stato peggiore dei dispositivi discendenti, aggiornato in tempo reale.<\/li>\n<li><strong>Polling:<\/strong> ICMP con isteresi, SNMP v1\/v2c, inventario delle interfacce e traffico ricavato dai contatori a 64 bit, con fallback a 32 bit.<\/li>\n<li><strong>Integrazione MikroTik RouterOS:<\/strong> CPU, memoria, temperatura, tensione, uptime, versione, interfacce sorvegliate e peer WireGuard.<\/li>\n<li><strong>Discovery:<\/strong> vicini RouterOS, LLDP e CDP, tabelle ARP e lease DHCP, scansioni di subnet, DNS, SNMP, porte TCP e riconoscimento del produttore dal MAC address.<\/li>\n<li><strong>Metriche storiche:<\/strong> traffico, latenza, perdita e dati RouterOS conservati e aggregati tramite TimescaleDB.<\/li>\n<li><strong>Notifiche:<\/strong> email e Telegram, dipendenze padre\/figlio, soppressione dei flap, finestre di manutenzione, promemoria e presa in carico.<\/li>\n<li><strong>Gestione:<\/strong> utenti con ruoli Admin, Operatore e Lettura, oltre a importazione ed esportazione CSV dei dispositivi.<\/li>\n<\/ul>\n<h2>Un agente di polling separato<\/h2>\n<p>Il polling \u00e8 eseguito da un processo indipendente che non accede direttamente al database. L\u2019agente comunica esclusivamente con l\u2019API tramite HTTPS e una chiave dedicata. Questa scelta semplifica la sicurezza e prepara il terreno per l\u2019uso futuro di agenti remoti installati nelle reti dei clienti.<\/p>\n<h2>Architettura del progetto<\/h2>\n<pre><code>Browser (Blazor WebAssembly)\n        \u2502 SignalR \/ REST\n        \u25bc\nVedettaVip.Api \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba PostgreSQL + TimescaleDB\n        \u25b2\n        \u2502 HTTPS \/ X-Agent-Key\n        \u2502 SignalR\nVedettaVip.Worker\n(ICMP, SNMP, RouterOS, discovery)<\/code><\/pre>\n<p>Lo stack utilizza <strong>.NET 10<\/strong>, ASP.NET Core, Blazor, SignalR, Entity Framework Core, PostgreSQL 17 con TimescaleDB, SharpSnmpLib, MailKit, ApexCharts e Caddy. Nell\u2019installazione Docker il Worker richiede soltanto la capability <code>NET_RAW<\/code>, necessaria per ICMP.<\/p>\n<h2>Avvio rapido con Docker Compose<\/h2>\n<p>Per una prova \u00e8 sufficiente un host Linux con Docker Engine e il plugin Compose:<\/p>\n<pre><code>git clone https:\/\/github.com\/dummy1969\/vedettavip.git\ncd vedettavip\ncp deploy\/.env.example deploy\/.env\nchmod 600 deploy\/.env<\/code><\/pre>\n<p>Nel file <code>deploy\/.env<\/code> vanno impostati almeno l\u2019indirizzo o il nome DNS del server, la password PostgreSQL e una chiave sicura per l\u2019agente. Successivamente si pu\u00f2 avviare lo stack:<\/p>\n<pre><code>docker compose -f deploy\/docker-compose.yml up -d --build\n\ndocker compose -f deploy\/docker-compose.yml logs api | grep \"Codice di setup\"<\/code><\/pre>\n<p>Il codice riportato nei log consente di creare il primo amministratore. La mappa iniziale contiene dispositivi dimostrativi con indirizzi fittizi, che possono essere sostituiti dalla pagina <em>Dispositivi<\/em>.<\/p>\n<h2>Configurazione e sicurezza<\/h2>\n<p>I valori specifici dell\u2019installazione restano fuori dal repository: variabili d\u2019ambiente, override di Docker Compose e file locali di configurazione .NET sono ignorati sia da Git sia dal contesto di build. Le credenziali inserite dall\u2019interfaccia \u2014 community SNMP, password RouterOS e SMTP, token Telegram \u2014 vengono cifrate con ASP.NET Core Data Protection.<\/p>\n<p>Poich\u00e9 le chiavi di cifratura risiedono nel database, i backup devono essere protetti e trattati come dati sensibili.<\/p>\n<h2>Roadmap<\/h2>\n<p>Tra gli sviluppi previsti ci sono agenti remoti e accesso multi-tenant per scenari MSP, autenticazione TOTP e OIDC, sfondi per planimetrie o mappe geografiche, auto-layout dei nodi scoperti, propagazione live delle modifiche, SNMPv3 e nuove integrazioni RouterOS.<\/p>\n<h2>Codice sorgente e licenza<\/h2>\n<p>VedettaVip \u00e8 pubblicato con licenza <strong>GNU AGPL v3 o successiva<\/strong>, accompagnata da un termine di attribuzione. Il repository contiene il codice sorgente, la documentazione italiana e inglese, le istruzioni per il deploy e le informazioni sulle licenze dei componenti di terze parti.<\/p>\n<p><a href=\"https:\/\/github.com\/dummy1969\/vedettavip\" target=\"_blank\" rel=\"noopener\"><strong>Repository GitHub di VedettaVip \u2192<\/strong><\/a><\/p>\n<p>Il progetto \u00e8 ancora giovane e la versione attuale rappresenta soprattutto il punto di partenza di uno strumento costruito sulle mie esigenze reali di monitoraggio. Suggerimenti, segnalazioni e contributi sono naturalmente benvenuti.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una precisazione prima di iniziare: VedettaVip non \u00e8 interamente \u201cfarina del mio sacco\u201d. Ho ideato e sviluppato il progetto appoggiandomi in modo sostanziale a Claude Code, che mi ha affiancato nella progettazione e nell\u2019implementazione. Il risultato nasce quindi dalla mia esperienza e dalle mie esigenze di rete, ma anche da un importante lavoro svolto con [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-102","post","type-post","status-publish","format-standard","hentry","category-networking"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"_links":{"self":[{"href":"https:\/\/anderlini.com\/index.php?rest_route=\/wp\/v2\/posts\/102","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/anderlini.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/anderlini.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/anderlini.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/anderlini.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=102"}],"version-history":[{"count":1,"href":"https:\/\/anderlini.com\/index.php?rest_route=\/wp\/v2\/posts\/102\/revisions"}],"predecessor-version":[{"id":103,"href":"https:\/\/anderlini.com\/index.php?rest_route=\/wp\/v2\/posts\/102\/revisions\/103"}],"wp:attachment":[{"href":"https:\/\/anderlini.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anderlini.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anderlini.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}