Vai al contenuto

Architettura

Come sono fatti e come parlano tra loro i componenti software. Per server, rete e firewall vedi 03-infrastruttura. I flussi passo per passo sono in flussi.md.

Mappa dei componenti (stato al 27/10/2026)

flowchart LR
  subgraph Cliente["Sede del cliente"]
    CAM[Telecamere / NVR]
    BOX["Box MDM<br/>mdm_installation<br/>+ Frigate o GANZ<br/>+ frigate_wrapper"]
    TROMBA[Tromba IP]
    SONOFF[Relè Sonoff]
    CAM --> BOX
    BOX --> TROMBA
  end

  subgraph Netsons["Server Netsons (Proxmox)"]
    PF["pfSense<br/>firewall + VPN WireGuard"]
    subgraph SIT["VM ServerIT 170.10.0.108 (prod)"]
      NPM[Nginx Proxy Manager]
      MID["Midserver v2 (Flask)<br/>:5000"]
      MQ[Mosquitto :1883]
      RD[(Redis)]
      DB[(MySQL q_alarm_mid)]
      OME[OvenMediaEngine]
      PANEL[Pannello MDM]
      EWL[ewelink-integration :8080]
    end
    subgraph DEV["VM MidServerDEV 170.10.0.107 (Coolify dev)"]
      MID3["Midserver v3 + qAlarm 2 BE/FE<br/>+ pannello dev"]
    end
    PBX[FreePBX trombe]
  end

  subgraph AWS["AWS eu-west-1"]
    S3[(S3: snapshot, log, audio)]
    ECR[(ECR immagini)]
    BSQ["API BSQ / RDS<br/>(sistema vecchio)"]
  end

  subgraph Cava["Sede aziendale (Cava)"]
    OPS["Centrale operativa<br/>+ Raspberry progetto Michele"]
  end

  BOX <-- "VPN 172.16.16.x" --> PF
  PF -- "172.16.16.253 → NAT" --> MID
  PF --> MQ
  BOX -- "SRT video" --> OME
  BOX -- "webhook allarmi" --> BSQ
  BSQ --> TG[Telegram]
  OPS <-- "site-to-site 171.16.16.x" --> PF
  OPS --> TG
  MID <--> MQ
  MID <--> RD
  MID <--> DB
  PANEL --> MID
  NPM --> PANEL
  NPM --> MID
  OPS -- "watchdog" --> EWL
  EWL -- "cloud eWeLink" --> SONOFF
  TROMBA <-- SIP --> PBX
  BOX -- "log, snapshot" --> S3
Hold "Ctrl" to enable pan & zoom

Componenti

Componente Repository Tecnologia Dove gira Scheda
Software del box mdm_installation Python, Docker, MQTT dal cliente installazione.md
Frigate wrapper mdm_frigate_wrapper FastAPI dal cliente installazione.md
Privacy mode mdm_privacy_mode ARP spoofing dal cliente installazione.md
Cluster master/slave mdm_installation (stage) MQTT tra box dal cliente cluster-master-slave.md
Midserver mdm_mid_server v2 Flask (prod), v3 FastAPI (dev) ServerIT / Coolify dev mid-server.md
Pannello MDM mdm_web_panel Flutter web ServerIT / Coolify dev web-panel.md
qAlarm 2 qAlarm2_be, qAlarm2_fe FastAPI + Socket.IO, React solo Coolify dev qalarm.md
Streaming video (config in mdm_mid_server) OvenMediaEngine ServerIT ome-streaming.md
App clienti e sistema BSQ protexia, api.bsq, lambdaFunctionsPython Flutter, PHP, Lambda telefoni, AWS protexia-e-bsq.md
Relè Sonoff ewelink-integration PHP ServerIT ewelink-integration.md
Sistema di Michele televigilanza-mdm script, Raspberry Cava + Netsons televigilanza-mdm.md
Ambienti e avvio del box infra-lib Python (infra-cli) dentro il box (linea stage) infra-lib.md
Monitoraggio monitoring Grafana, Prometheus, Loki, Tempo, Alertmanager solo Coolify dev monitoring.md
Centralino trombe — FreePBX VM FreePBXnew ../03-infrastruttura/freepbx-trombe.md

Approfondimento: chi apre una connessione verso le telecamere (limite di sessioni RTSP, rischio per il rilevamento). Anti-manomissione (telecamera coperta o spostata): anti-manomissione-telecamere.md. Inventario delle funzioni del box e di chi usa il loro risultato: funzioni-del-box.md.

Principi dell'architettura nuova

  • Il midserver è l'unico punto di contatto con i box. Pannello e qAlarm non parlano mai direttamente con un box.
  • Comandi via MQTT, risposte via HTTP. Il midserver pubblica un comando su MQTT con un token, il box risponde chiamando un endpoint HTTP con quel token, e il midserver aspetta la risposta su una lista Redis.
  • Stato via HTTP periodico. Ogni box manda il proprio stato (sync_state) a intervalli regolari. Se smette, una chiave Redis scade e il box viene segnato offline.
  • Eventi verso qAlarm via Redis Stream (event_stream, gruppo notification_consumers), letto dal worker di qAlarm.
  • I box conoscono il midserver per indirizzo IP VPN (172.16.16.253), non per dominio.
  • v3 compatibile con i box vecchi: per le versioni sotto la 10.0.0 la v3 usa i topic MQTT "vecchi" (TARGETED_TOPIC_MIN_VERSION in app/core/mqtt/installation_command_publish_router.py).