📡 Fleet Control Console
🌍 Read in English | 🇮🇹 Leggi in Italiano
🇬🇧 English
Fleet Control Console is a professional, real-time command and control (C2) dashboard designed for amateur radio repeater networks (MMDVM). It allows administrators to monitor and manage a "fleet" of remote digital voice nodes (DMR, NXDN, YSF, P25) through a single, elegant web interface.
🏗️ System Architecture
The ecosystem consists of three main parts:
- The Central Dashboard (
app.py): A Flask web server that handles the UI (with modern Glassmorphism design), user permissions (SQLite), and WebSocket connections for zero-latency updates. - The Remote Agent (
system_monitor.py): A lightweight script running on each repeater (Raspberry Pi/Linux) that monitors hardware and executes commands. - The MQTT Broker: The communication backbone. All data and commands flow through MQTT for near-instant responsiveness.
✨ Features
- Zero-Latency Real-Time UI: Powered by WebSockets (Socket.IO), the dashboard updates instantly upon radio traffic or telemetry changes, completely eliminating heavy HTTP polling overhead.
- Web Push Notifications: Get instant alerts directly on your desktop or mobile device when a node goes offline, comes back online, or a critical service fails (even when the app is closed or in the background).
- Centralized Telemetry: Real-time CPU, RAM, Temperature, and Disk usage for all nodes.
- Service Management: Start, Stop, or Restart system daemons (MMDVMHost, DMRGateway, etc.) remotely.
- Smart Auto-Healing: The agent automatically detects crashed services and attempts to revive them before raising critical alerts (includes Telegram notifications).
- Hardware Reset (GPIO): Physically reboot the MMDVM radio HAT via GPIO pins directly from the dashboard, automatically restarting the host daemon for a fail-proof serial connection recovery.
- Remote Configuration: Built-in web editor for
.inifiles—no SSH required. - Live Heard Log: Unified, real-time view of radio traffic across the entire network.
- Global Operations: Switch profiles (e.g., Profile A/B) or force network-wide configuration updates instantly on all repeaters with one click.
- PWA Ready (Mobile App): Fully responsive design that can be installed directly on Android/iOS as a Progressive Web App for a native, full-screen mobile experience.
🚀 Installation & Setup
1. Server Setup (Central Hub)
- Install dependencies using the provided file:
pip install -r requirements.txt - Configure
config.json(useconfig.example.jsonas template) with your MQTT and WebPush VAPID credentials. - Define your repeaters in
clients.json. - Run:
python3 app.py
🔑 Generating VAPID Keys (Push Notifications)
To enable Web Push Notifications, you must generate a unique VAPID key pair for your server.
- Go to a free online generator like vapidkeys.com.
- Generate the keys.
- Open your
config.jsonand paste them in thewebpushsection:vapid_public_key: Your newly generated Public Keyvapid_private_key: Your newly generated Private Keyvapid_claim_email: A contact email formatted as"mailto:your@email.com"
2. Agent Setup (Remote Nodes)
The system_monitor.py must be installed on every node you wish to monitor.
- (Optional) Install
RPi.GPIO(pip install RPi.GPIOorapt install python3-rpi.gpio) if you plan to use the physical Hardware Reset feature. - Place
system_monitor.pyandnode_config.jsonin a folder (e.g.,/opt/node_agent/). - Edit
node_config.jsonto set theclient_id(must match the ID inclients.json) and MQTT credentials. - (Recommended) Set up a systemd service to run the agent automatically at boot.
⚙️ Running as a System Service (systemd)
To keep the system running continuously and start automatically at boot, use the provided .service files:
- Copy the appropriate file to the systemd directory:
- For Server:
sudo cp systemd/fleet-console.service /etc/systemd/system/ - For Nodes:
sudo cp systemd/fleet-agent.service /etc/systemd/system/
- For Server:
- Reload the systemd daemon:
sudo systemctl daemon-reload - Enable it to start on boot:
sudo systemctl enable fleet-console(orfleet-agent) - Start the service:
sudo systemctl start fleet-console - Check the status:
sudo systemctl status fleet-console
🇮🇹 Italiano
Fleet Control Console è una dashboard di comando e controllo (C2) professionale in tempo reale, progettata per le reti di ripetitori radioamatoriali (MMDVM). Permette ai gestori di monitorare e gestire un'intera "flotta" di nodi digitali (DMR, NXDN, YSF, P25) da un'unica interfaccia web raffinata.
🏗️ Architettura del Sistema
L'ecosistema si compone di tre parti principali:
- Dashboard Centrale (
app.py): Un server web Flask che gestisce l'interfaccia (con design moderno in stile Glassmorphism), i permessi utenti (SQLite) e connessioni WebSocket per aggiornamenti a latenza zero. - Agente Remoto (
system_monitor.py): Uno script leggero in esecuzione su ogni ripetitore (Raspberry Pi/Linux) che raccoglie i dati hardware ed esegue i comandi. - Broker MQTT: Il centro nevralgico della comunicazione. Tutti i dati e i comandi viaggiano su MQTT per una reattività istantanea.
✨ Funzionalità
- Interfaccia Real-Time a Latenza Zero: Grazie all'integrazione di WebSockets (Socket.IO), la dashboard scatta all'istante al passaggio di traffico radio o ai cambi di telemetria, eliminando totalmente il carico del polling HTTP continuo.
- Notifiche Push Web: Ricevi avvisi immediati su desktop o smartphone quando un nodo va offline, torna operativo o un servizio critico si blocca (anche quando l'app è chiusa o in background).
- Telemetria Centralizzata: Stato in tempo reale di CPU, RAM, Temperatura e Disco di tutti i nodi.
- Gestione Servizi: Avvio, arresto o riavvio dei demoni di sistema (MMDVMHost, DMRGateway, ecc.) da remoto.
- Auto-Healing Intelligente: L'agente rileva automaticamente i servizi andati in blocco e tenta di rianimarli prima di inviare allarmi critici (include notifiche Telegram).
- Reset Hardware (GPIO): Invia un impulso di reset fisico alla scheda radio MMDVM tramite i pin GPIO direttamente dalla dashboard, riavviando automaticamente il demone host per ripristinare la comunicazione seriale.
- Configurazione Remota: Editor web integrato per i file
.ini: modifica i parametri senza accedere in SSH. - Log Ascolti Live: Vista unificata e in tempo reale del traffico radio di tutta la rete.
- Operazioni Globali: Commuta tra diversi assetti (es. Profilo A/B) o forza l'aggiornamento dei dati contemporaneamente su tutta la rete con un solo clic.
- PWA Ready (App Mobile): Design completamente responsivo, installabile su smartphone Android e iOS come Progressive Web App per un'esperienza fluida e nativa a schermo intero.
🚀 Installazione e Configurazione
1. Setup del Server (Hub Centrale)
- Installa le dipendenze usando il file fornito:
pip install -r requirements.txt - Configura
config.json(usaconfig.example.jsoncome base) con le credenziali MQTT e le chiavi VAPID per le notifiche Push. - Definisci i tuoi ripetitori nel file
clients.json. - Avvia:
python3 app.py
🔑 Generare le chiavi VAPID (Notifiche Push)
Per abilitare le Notifiche Push, devi generare una coppia di chiavi VAPID univoca per il tuo server.
- Vai su un generatore online gratuito come vapidkeys.com.
- Genera la coppia di chiavi.
- Apri il tuo file
config.jsone incollale nella sezionewebpush:vapid_public_key: La tua Chiave Pubblica appena generatavapid_private_key: La tua Chiave Privata appena generatavapid_claim_email: Un indirizzo di contatto formattato come"mailto:tua@email.com"
2. Setup dell'Agente (Nodi Remoti)
Il file system_monitor.py va installato su ogni nodo che vuoi monitorare.
- (Opzionale) Installa
RPi.GPIO(pip install RPi.GPIOoapt install python3-rpi.gpio) se intendi utilizzare la funzione di Reset Hardware fisico della scheda. - Copia
system_monitor.pyenode_config.jsonin una cartella (es./opt/node_agent/). - Modifica
node_config.jsonimpostando ilclient_id(deve corrispondere all'ID inclients.json) e le credenziali MQTT. - (Consigliato) Crea un servizio systemd per avviare l'agente automaticamente al boot.
⚙️ Esecuzione come Servizio di Sistema (systemd)
Per mantenere il sistema sempre attivo e avviarlo in automatico all'accensione, usa i file .service forniti:
- Copia il file appropriato nella cartella di systemd:
- Per il Server:
sudo cp systemd/fleet-console.service /etc/systemd/system/ - Per i Nodi:
sudo cp systemd/fleet-agent.service /etc/systemd/system/
- Per il Server:
- Ricarica i demoni di sistema:
sudo systemctl daemon-reload - Abilita l'avvio automatico:
sudo systemctl enable fleet-console(oppurefleet-agent) - Avvia il servizio:
sudo systemctl start fleet-console - Controlla lo stato:
sudo systemctl status fleet-console
Created by IV3JDV @ ARIFVG - 2026
