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, grupponotification_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_VERSIONinapp/core/mqtt/installation_command_publish_router.py).