Management and oversight application for aggregating data from multiple MeshMonitor instances and Meshtastic MQTT servers.
- Aggregate data from multiple MeshMonitor instances and MQTT brokers
- Interactive Leaflet map showing all nodes across all sources
- Prometheus-compatible metrics endpoint for monitoring
- OIDC authentication for admin access
- Configurable data retention policies
- Catppuccin-themed dark UI
Run the entire stack with a single command:
docker compose -f docker-compose.dev.yml up -d --buildAccess the application at http://localhost:8080
This starts:
- PostgreSQL database
- FastAPI backend
- React frontend
- Nginx reverse proxy
To view logs:
docker compose -f docker-compose.dev.yml logs -fTo stop:
docker compose -f docker-compose.dev.yml downThe easiest way to deploy MeshManager is using pre-built Docker images:
-
Create a
docker-compose.yml:services: postgres: image: postgres:16-alpine environment: POSTGRES_DB: meshmanager POSTGRES_USER: meshmanager POSTGRES_PASSWORD: meshmanager volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U meshmanager"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped meshmanager: image: ghcr.io/yeraze/meshmanager:latest ports: - "8080:8000" environment: DATABASE_URL: postgresql+asyncpg://meshmanager:meshmanager@postgres/meshmanager SESSION_SECRET: your-secret-here # Generate with: openssl rand -hex 32 depends_on: postgres: condition: service_healthy restart: unless-stopped volumes: postgres_data:
-
Start the stack:
docker compose up -d
-
Access the application at http://localhost:8080
To use a specific version instead of latest:
image: ghcr.io/yeraze/meshmanager:0.5.0If you prefer to build the images yourself:
-
Clone the repository and configure:
git clone https://github.com/Yeraze/meshmanager.git cd meshmanager cp .env.example .env # Edit .env with your settings
-
Start the production environment:
docker compose up -d
-
Access the application at http://localhost:8080
| Variable | Description | Default |
|---|---|---|
MESHMANAGER_VERSION |
Docker image version (prebuilt only) | latest |
POSTGRES_PASSWORD |
PostgreSQL password | meshmanager |
SESSION_SECRET |
Session signing secret (required) | - |
OIDC_ISSUER |
OIDC provider URL | - |
OIDC_CLIENT_ID |
OIDC client ID | - |
OIDC_CLIENT_SECRET |
OIDC client secret | - |
OIDC_REDIRECT_URI |
OIDC callback URL | - |
LOG_LEVEL |
Logging level | INFO |
HTTP_PORT |
HTTP port | 8080 |
To enable OIDC authentication:
- Configure your OIDC provider (Keycloak, Auth0, etc.)
- Set the OIDC environment variables
- The first user to log in becomes an admin
Without OIDC configured, the application runs in read-only mode.
GET /health- Health checkGET /metrics- Prometheus metricsGET /api/sources- List sources (names only)GET /api/nodes- List all nodes
GET /api/admin/sources- List sources with full configPOST /api/admin/sources/meshmonitor- Add MeshMonitor sourcePOST /api/admin/sources/mqtt- Add MQTT sourceDELETE /api/admin/sources/{id}- Remove source
The /metrics endpoint exposes:
meshmanager_source_healthy- Source collection status (1=healthy, 0=error)meshmanager_source_last_collection_timestamp- Last successful collection timestamp
meshmanager_node_battery_level- Node battery level (0-100)meshmanager_node_voltage- Node voltagemeshmanager_node_last_heard_timestamp- Node last heard timestamp (Unix seconds)meshmanager_node_channel_utilization- Node channel utilization (0-100)
meshmanager_active_nodes_total- Active nodes per source (heard in last hour)meshmanager_nodes_total- Total nodes ever seen per sourcemeshmanager_messages_last_hour- Messages received in last hour
meshmanager_db_rows_total- Database row counts by table (nodes, messages, telemetry, traceroutes)
┌─────────────────────────────────────────────────────────────────────┐
│ MeshManager │
├─────────────────────────────────────────────────────────────────────┤
│ ┌───────────────────────────────────┐ ┌─────────────┐ │
│ │ meshmanager │ │ PostgreSQL │ │
│ │ (FastAPI + React SPA bundled) │◄─┤ Database │ │
│ └──────────────┬────────────────────┘ └─────────────┘ │
│ │ │
│ ┌────────────┼────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │MeshMonitor│ │MeshMonitor│ │ MQTT │ │
│ │ Collector │ │ Collector │ │ Collector│ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────────┘
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
uvicorn app.main:app --reloadcd frontend
npm install
npm run dev# Backend
cd backend
pytest
# Frontend
cd frontend
npm run lintBSD-3-Clause
