{"id":6,"date":"2026-02-10T22:42:00","date_gmt":"2026-02-10T22:42:00","guid":{"rendered":"https:\/\/rpi.temporiti.net\/wordpress\/blog\/asset-management-per-il-tuo-homelab\/"},"modified":"2026-05-30T14:37:09","modified_gmt":"2026-05-30T12:37:09","slug":"asset-management-per-il-tuo-homelab","status":"publish","type":"post","link":"https:\/\/rpi.temporiti.net\/wordpress\/?p=6","title":{"rendered":"Asset management per il tuo homelab con Snipe-IT"},"content":{"rendered":"<p>Il mio homelab \u00e8 cresciuto a strati: prima un Raspberry Pi, poi due, poi un mini PC, poi un piccolo server ARM su un tier gratuito di un provider cloud, qualche switch managed, una decina di cavi etichettati male. A un certo punto, in un assemblaggio domenicale, ho passato venti minuti a cercare un cavetto da console seriale che ero sicuro di avere &#8220;in quella scatola l\u00ec&#8221;. Ho aperto tre scatole, non l&#8217;ho trovato, e ho ordinato il quarto in vita mia. Quella sera ho deciso di mettere ordine.<\/p>\n<p><a href=\"https:\/\/snipeitapp.com\/\">Snipe-IT<\/a> \u00e8 un asset management open source pensato per piccole aziende, ma scalato bene anche per chi ha un homelab di media complessit\u00e0. Lo uso da un anno e mezzo per tracciare hardware, licenze, accessori e dove ho messo cosa.<\/p>\n<h2>Installazione<\/h2>\n<p>Lo faccio girare su un Raspberry Pi 5 8GB con Debian Bookworm, in container Docker. La compose minima:<\/p>\n<pre><code class=\"language-bash\">\nmkdir -p ~\/snipeit &amp;&amp; cd ~\/snipeit\ncurl -fsSL https:\/\/raw.githubusercontent.com\/snipe\/snipe-it\/master\/docker-compose.yml -o docker-compose.yml\n<\/code><\/pre>\n<p>Edito il file <code>.env<\/code> per APP_URL, password DB e SMTP, poi:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose pull\ndocker compose up -d\n<\/code><\/pre>\n<p>Snipe-IT richiede MariaDB (incluso nel compose) e PHP 8.x. Il primo bootstrap inizializza il database ed emette la chiave APP_KEY: salvarla altrove subito, perch\u00e9 senza non si decifra il backup del database.<\/p>\n<p>Davanti metto un reverse proxy con Caddy o nginx e certificato Let&#8217;s Encrypt automatico. L&#8217;interfaccia parla HTTPS sul mio dominio interno, mai esposta su internet pubblica.<\/p>\n<h2>Modello dati che uso<\/h2>\n<p>Snipe-IT distingue Assets (oggetti seriali tipo un Raspberry Pi), Accessories (cose contate ma non singolarmente tracciate tipo cavi USB-C), Consumables (cose che si esauriscono tipo viti M3), Licenses (chiavi software con expiry), Components (RAM, dischi che sostituisco). Le categorie che ho creato:<\/p>\n<p>&#8211; <strong>SBC<\/strong>: Raspberry Pi, Orange Pi, NanoPi<\/p>\n<p>&#8211; <strong>Mini PC<\/strong>: NUC e simili<\/p>\n<p>&#8211; <strong>Network gear<\/strong>: switch, AP Wi-Fi, router<\/p>\n<p>&#8211; <strong>Storage<\/strong>: dischi USB, microSD etichettate, SSD da rotazione<\/p>\n<p>&#8211; <strong>Cavi e adattatori<\/strong>: contati, non seriali<\/p>\n<p>&#8211; <strong>Console<\/strong>: cavi seriali, programmer JTAG, alimentatori speciali<\/p>\n<p>Ogni asset seriale ha tag fisico stampato (DYMO 12mm) con asset tag univoco, modello, e tag categoria. Il tag fisico \u00e8 la chiave per arrivare al record digitale in pochi secondi.<\/p>\n<h2>Import bulk da CSV<\/h2>\n<p>Quando ho fatto il primo censimento, l&#8217;inserimento manuale di trenta asset era gi\u00e0 troppo. Ho preparato un CSV e usato l&#8217;importer:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose exec -T app php artisan snipeit:import --type=asset \/tmp\/assets.csv\n<\/code><\/pre>\n<p>Il CSV deve avere intestazioni che mappano i campi (Asset Tag, Serial, Model Name, Category, Location, Status). Per i custom field ho aggiunto colonne <code>mac_address<\/code> e <code>firmware_version<\/code> che ho creato dal pannello.<\/p>\n<h2>Un caso reale<\/h2>\n<p>Un gioved\u00ec pomeriggio, intorno alle 15:00, un cliente mi ha chiesto la documentazione di un audit hardware su un suo lab di test. Volevo presentare lista, posizione, data acquisto e stato di garanzia per una ventina di macchine. Avevo registrato tutto su Snipe-IT nei mesi precedenti, comprese le scansioni delle fatture allegate come file ai singoli asset. In quindici minuti ho generato l&#8217;export CSV via API:<\/p>\n<pre><code class=\"language-bash\">\ncurl -H \"Authorization: Bearer TOKEN\" \\\n  \"https:\/\/snipeit.example.lan\/api\/v1\/hardware?limit=100&amp;offset=0\" \\\n  -o assets.json\n<\/code><\/pre>\n<p>E ho consegnato il foglio pulito. Senza Snipe-IT sarebbe stata una giornata di archeologia fra ricevute. Risparmio puro che paga da solo il costo di mantenere il servizio attivo.<\/p>\n<h2>Cosa funziona bene<\/h2>\n<p>La gestione checkout\/checkin \u00e8 preziosa: quando presto un cavo console a un cliente o porto un Pi a casa di un familiare per ricostruire un disastro, lo segno come &#8220;checked out&#8221; con data e nota. Tornato il pezzo, lo checko di nuovo in casa. Mai pi\u00f9 &#8220;ma dove l&#8217;avevo lasciato?&#8221;. L&#8217;API REST \u00e8 completa, l&#8217;ho integrata con uno script che, quando installo un nuovo host, registra automaticamente serial number e MAC.<\/p>\n<h2>Limiti<\/h2>\n<p>Snipe-IT richiede una manutenzione minima per restare utile: se smetti di aggiornarlo quando aggiungi o rimuovi hardware, in tre mesi diventa rumore. Il primo censimento \u00e8 il lavoro pi\u00f9 ingrato, conviene farlo a step (categorie principali prima, dettagli dopo) e accettare che sar\u00e0 imperfetto per un po&#8217;.<\/p>\n<h2>In pratica<\/h2>\n<p>\u00e8 una di quelle infrastrutture che paga in tranquillit\u00e0 pi\u00f9 che in tempo risparmiato giornaliero. Tenere allineata la realt\u00e0 fisica al database costa qualche minuto a settimana e ti restituisce ore quando arriva il momento del troubleshooting, dell&#8217;audit o del trasloco. Per chi \u00e8 abituato a &#8220;tanto me lo ricordo&#8221;, il salto a Snipe-IT \u00e8 quasi rieducativo.<\/p>\n<hr>\n<blockquote>\n<p>Immagine generata con ComfyUI Mac M1 \/ RealVisXL V5 Lightning.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Il mio homelab \u00e8 cresciuto a strati: prima un Raspberry Pi, poi due, poi un mini PC, poi un piccolo server ARM su un tier gratuito di un provider cloud, qualche switch managed, una decina di cavi etichettati male. A un certo punto, in un assemblaggio domenicale, ho passato venti minuti a cercare un cavetto [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":185,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-self-hosting"],"_links":{"self":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6"}],"version-history":[{"count":9,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6\/revisions"}],"predecessor-version":[{"id":387,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/6\/revisions\/387"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/185"}],"wp:attachment":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}