Dati e registro delle installazioni¶
Verificato in prod il 27/10/2026 con conteggi in sola lettura (nessun dato dei clienti riportato qui).
Dove sta cosa¶
| Dato | Dove | Note |
|---|---|---|
| Elenco dei box e loro stato | Redis, chiave = MAC, valore = ultimo stato JSON, senza scadenza | è l'unico registro. Il pannello lo legge con /installation/get_all (chiavi stringa con last_update). |
| Box online | Redis, MAC_<mac> con scadenza (intervallo di sync + 20 s) |
alla scadenza il box diventa offline e parte una notifica |
| Risposte ai comandi | Redis, liste con nome = token | consumate dal midserver con brpop |
| Eventi verso qAlarm | Redis Stream event_stream |
gruppo notification_consumers |
| Code celery | Redis | |
| Backup delle configurazioni dei box | MySQL q_alarm_mid.installations |
una riga per ogni backup fatto dal pannello; la colonna mac contiene per lo più codici installazione |
| Registrazioni in corso | MySQL new_installations (colonna uuid, non mac) |
2 al 27/10 |
| Log richieste pannello, errori, eventi, utenti, trigger, pianificazioni | MySQL q_alarm_mid |
|
| Anagrafiche clienti, installazioni lato gestionale | database BSQ su AWS RDS | non gestito dal midserver |
| Immagini allarmi, chat, log dei box, audio trombe | S3 | vedi aws.md |
Numeri al 27/10/2026¶
- 38 chiavi di stato in Redis = 38 righe nel pannello (comprese le "sotto installazioni"
…-1,…-2, che sono box distinti con il proprio MAC). - 35 online, 3 offline (uno dal 26/10, due da agosto: probabilmente dismessi).
- 0 box con
has_pin: true(tutti e 38 inviano il campo). - 29 righe in
installations(backup), di cui solo 4 con un MAC corrispondente a una chiave Redis.
Implicazioni¶
- Redis va trattato come un database, non come una cache: volume con nome, AOF attivo, backup. Oggi ha solo un volume anonimo e snapshot RDB.
- Se Redis si svuota, l'elenco dei box si ricostruisce da solo in circa un minuto (i box rimandano lo stato), ma si perdono lo stream eventi, i contatori e le code.
- Migrazione alla v3: l'elenco dei box da portare va preso dalle chiavi di stato in Redis, non da MySQL. I backup in MySQL vanno migrati a parte come archivio.
- I box dismessi restano nel pannello: serve una procedura (e poi una funzione) per rimuoverli.
- Non esiste un registro "ufficiale" che leghi MAC, codice impianto, cliente, peer VPN, relè Sonoff e interno della tromba: queste informazioni sono sparse tra Redis, BSQ, pfSense, il database del Raspberry di Michele e FreePBX.
- Il registro più completo oggi è il database del Raspberry di Michele (
ganzcortrol_controls.system): 68 impianti con tipo (37 MDM, 31 GANZ), indirizzo VPN e relè Sonoff, coerente con i peer WireGuard (65 su 66). Manca il MAC, quindi il collegamento con Redis va fatto per indirizzo VPN o per nome. Dettagli in televigilanza-mdm.md.
Fonte unica: proposta¶
Il confronto completo tra tutti gli elenchi (database BSQ, Redis, Raspberry, pfSense, FreePBX) e la proposta di un registro tecnico nel midserver collegato all'anagrafica BSQ sono in sorgenti-dati-installazioni.md.
Comandi di verifica¶
Nel runbook dei comandi di sola lettura.
Censimento del 28/10/2026¶
Eseguito con tools/censimento_impianti.py (procedura) da un PC sulla VPN aziendale di Cava, in sola lettura, sui 68 impianti del database del Raspberry, senza l'opzione SSH. Dettaglio per impianto in raw/censimento/ (riservato).
| Classe | Impianti | Di cui mdm nel DB |
Di cui ganz nel DB |
|---|---|---|---|
Box MDM che risponde (/status OK) |
29 righe, 28 box distinti | 28 | 1 (riga duplicata con lo stesso IP di un box MDM) |
| Linux con SSH ma API 5005 non raggiungibile | 5 | 5 | 0 |
| Windows (RDP aperto, probabile GANZ) | 8 | 0 | 8 |
| Risponde solo su altre porte (quasi sempre solo la 80) | 10 | 1 | 9 |
| Nessuna risposta, nemmeno al ping | 16 | 3 (uno disattivato nel DB) | 13 (uno disattivato nel DB) |
Box MDM che rispondono:
| Versione box (dichiarata) | Box | Detector | Frigate | Wrapper (generazione) |
|---|---|---|---|---|
| 3.2.9 | 15 | Frigate | 0.17.1 | FastAPI, API di salute (impronta 1c493731, uguale su tutti) |
| 3.2.2 | 2 | Frigate | 0.17.1 | Flask vecchio (Werkzeug 3.1.5) |
| 3.2.1 | 2 | Frigate | 0.17.1 | Flask vecchio (Werkzeug 3.1.5) |
| 3.1.9 | 6 | Frigate | 0.17.1 | Flask vecchio (Werkzeug 3.1.3) |
| 3.1.9 | 4 | GANZ | — | — |
(Una riga duplicata è inclusa nei 3.1.9 con Frigate.)
Attenzione: la versione che il box dichiara non è per forza quella in esecuzione. Il compose del box monta dall'host il file .env.build_tag dentro il container (./.env.build_tag:/app/.env.build_tag), e il box legge la propria versione da lì (INTERNAL_BUILD_TAG, app/config/app_config.py). L'aggiornamento remoto fa prima git pull (che cambia il file) e poi docker compose pull + up -d (dev_scripts/updater.py): se il secondo passo fallisce, il box dichiara la versione nuova ma esegue ancora l'immagine vecchia. Lo stesso file indica anche WRAPPER_BUILD_TAG e DSNIFF_BUILD_TAG (sul main di oggi: installation 3.2.9, wrapper 3.4.0, dsniff 1.0.0, Frigate fissato a 0.17.1 nel compose), ma nessuna API li espone. L'unica fonte affidabile dei tag in esecuzione è docker ps sul box (opzione --ssh-user del censimento).
- Frigate: stessa versione su tutti i 25 box Frigate (0.17.1), detector Coral su tutti, inferenza tra 8 e 16 ms. Registrazioni tra il 6% e il 41% dello spazio.
- Telecamere: 268 in totale, 260 online; 7 a 0 FPS in Frigate.
- Hardware: 4–8 core, circa 15 GB di RAM; nessun box con disco oltre l'80% o RAM oltre l'85%; 2 box con avviso
memory_usage. - Stato: la maggior parte risulta disinserita al momento della lettura (orario diurno). Nessun box ha
has_pin. - Webhook degli allarmi: sui 15 box 3.2.9 il wrapper manda gli allarmi a
http://0.0.0.0/alarm/operativecenter/alarm.php, cioè a un servizio PHP sullo stesso box (porta 80), con ogni probabilità la parte del sistema di Michele installata localmente, che poi inoltra a Telegram. Da confermare con Michele (corregge l'ipotesi del webhook diretto verso l'API BSQ in flussi.md). - Porte 10101–10106: aperte su 28 box su 29 e rispondono in HTTP: è il proxy nginx del box verso i dispositivi locali (NVR, telecamere), non un indizio di cluster.
- 5 box MDM con API locale non raggiungibile dalla rete di Cava: SSH e RDP rispondono, la 5005 no.
- Due righe del database hanno lo stesso IP VPN (
172.16.16.21): unaganzdisattivata, senza relè e con un cliente diverso, e unamdmattiva, che corrisponde al box trovato (3.1.9, 18 telecamere). Probabilmente l'IP è stato riassegnato dopo la dismissione del vecchio impianto. Conseguenza: l'IP VPN non è una chiave stabile; nei confronti vanno usate solo le righe attive, e il registro tecnico deve tenere lo storico delle assegnazioni. - 13 impianti GANZ non rispondono da Cava: confrontare con pfSense (ultimo handshake) prima di concludere che siano spenti.
- 28 box che rispondono più 5 senza API fanno 33, contro i 38 del registro Redis e i 37
mdmdel database: la differenza va riconciliata nell'inventario (T0.5). - Tag delle immagini ECR (wrapper, dsniff, Mosquitto): non raccolti in questa corsa; servono l'opzione
--ssh-usere una chiave SSH autorizzata sui box.