Vai al contenuto

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

  1. 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.
  2. 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.
  3. 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.
  4. I box dismessi restano nel pannello: serve una procedura (e poi una funzione) per rimuoverli.
  5. 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.
  6. 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): una ganz disattivata, senza relè e con un cliente diverso, e una mdm attiva, 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 mdm del 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-user e una chiave SSH autorizzata sui box.