- Introduced a new section in the web viewer documentation detailing how to set up a reverse proxy using Nginx with basic authentication for enhanced security when exposing the web viewer outside the local network. - Updated instructions for network access to recommend setting a password or using a reverse proxy for authentication. - Included example Nginx server block configuration and necessary proxy parameters for proper functionality.
10 KiB
MeshCore Bot Data Viewer
A web-based interface for viewing and analyzing data from your MeshCore Bot.
Features
- Dashboard: Overview of database statistics and bot status
- Repeater Contacts: View active repeater contacts with location and status information
- Contact Tracking: Complete history of all heard contacts with signal strength and routing data
- Config panel: Structured settings with categorized topics and database tools
- Purging Log: Audit trail of contact purging operations
- Real-time Updates: Auto-refreshes every 30 seconds
- API Endpoints: JSON API for programmatic access
Quick Start
Option 1: Standalone Mode
# Install Flask if not already installed
pip3 install flask
# Start the web viewer (reads config from config.ini)
python3 -m modules.web_viewer.app
# Or use the restart script for standalone mode
./restart_viewer.sh
# Override configuration with command line arguments
python3 -m modules.web_viewer.app --port 8080 --host 0.0.0.0
Option 2: Integrated with Bot
-
Edit
config.iniand set:[Web_Viewer] enabled = true auto_start = true host = 127.0.0.1 port = 5000 -
The web viewer will start automatically with the bot
Configuration
The web viewer can be configured in the [Web_Viewer] section of config.ini:
[Web_Viewer]
# Enable or disable the web data viewer
enabled = true
# Web viewer host address
# 127.0.0.1: Only accessible from localhost
# 0.0.0.0: Accessible from any network interface
host = 127.0.0.1
# Web viewer port
port = 5000
# Enable debug mode for the web viewer
debug = false
# Auto-start web viewer with bot
auto_start = false
# Optional: enable the multibyte monitor page and API
multibyte_monitor_enabled = false
Accessing the Viewer
Once started, open your web browser and navigate to:
- Local access: http://localhost:5005 (or your configured port)
- Network access: http://YOUR_BOT_IP:5005 (if host is set to 0.0.0.0)
Reverse Proxy With Nginx Basic Auth
If you expose the web viewer outside your local network, run it behind HTTPS and authentication. One option is to bind the viewer locally, then put Nginx in front with basic auth:
[Web_Viewer]
enabled = true
auto_start = true
host = 127.0.0.1
port = 8080
Example Nginx server block:
server {
# [...]
auth_basic "Login required";
auth_basic_user_file /etc/nginx/.meshcore-bot.htpasswd;
location / {
# Local web viewer instance
proxy_pass http://127.0.0.1:8080;
proxy_buffering off;
include /etc/nginx/proxy_params;
}
# Socket.IO websocket path for live updates
location /socket.io/ {
if ($http_connection !~* "upgrade") {
return 403;
}
if ($http_upgrade !~* "websocket") {
return 403;
}
proxy_pass http://127.0.0.1:8080;
include /etc/nginx/proxy_params;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
With the config above, /etc/nginx/proxy_params should include the standard forwarded headers:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
Pages Overview
Dashboard
- Database status and statistics
- Contact counts and cache information
- Quick navigation to other sections
Repeater Contacts
- Active repeater contacts
- Location information (city/coordinates)
- Device types and status
- First/last seen timestamps
- Purge count tracking
Contact Tracking
- Complete history of all heard contacts
- Signal strength indicators
- Hop count and routing information
- Advertisement data
- Currently tracked status
Config
- Categorized configuration topics in a left navigation column
- Core settings such as notifications, log rotation, backup, and maintenance status
- Database operations and database information views in the same tab
Purging Log
- Audit trail of contact purging operations
- Timestamps and reasons
- Contact names and public keys
API Endpoints
The viewer also provides JSON API endpoints:
GET /api/stats- Database statisticsGET /api/contacts- Repeater contacts dataGET /api/tracking- Contact tracking data
Example usage:
curl http://localhost:5000/api/stats
Database Requirements
The viewer uses the same database as the bot by default ([Bot] db_path, typically meshcore_bot.db). That single file holds repeater contacts, mesh graph, packet stream, and other data so the viewer can show everything.
Dashboard stats (message/command counts, top users, etc.) come from the stats tables (message_stats, command_stats, path_stats). To populate these when the stats chat command is disabled, you can set the optional config under [Stats_Command]: collect_stats = true.
Migrating from a separate web viewer database
If you previously had the web viewer using a separate database (e.g. [Web_Viewer] db_path = bot_data.db), you can switch to the shared database so the viewer shows repeater/graph data and uses one file.
-
Stop the bot and web viewer so neither has the databases open.
-
Optionally preserve packet stream history from the old viewer DB into the main DB:
- From the project root, run:
Use your actual paths if they differ (e.g. full paths or different filenames). The script copies the
python3 migrate_webviewer_db.py bot_data.db meshcore_bot.dbpacket_streamtable from the first file into the second and skips rows that would duplicate IDs. - If you don’t care about old packet stream data, skip this step; the viewer will create a new
packet_streamtable in the main DB.
- From the project root, run:
-
Point the viewer at the main database in
config.ini:[Web_Viewer] db_path = meshcore_bot.db(Or the same value as
[Bot] db_pathif you use a different path.) -
Start the bot (and viewer as usual). The viewer will now read and write to the same database as the bot.
You can keep or remove the old bot_data.db file after verifying the viewer works with the shared DB.
Troubleshooting
Web viewer not accessible (e.g. Orange Pi / SBC)
If the viewer does not load from another device (e.g. from your phone or PC while the bot runs on an Orange Pi), work through these steps on the Pi.
-
Confirm config
- In
config.iniunder[Web_Viewer]:enabled = trueauto_start = true(if you want it to start with the bot)host = 0.0.0.0(required for access from other devices;127.0.0.1is localhost only)port = 8080(or another port 1024–65535)
- Restart the bot after changing config.
- In
-
Check that the viewer process is running
# From project root on the Pi ss -tlnp | grep 8080 # or netstat -tlnp | grep 8080If nothing listens on your port, the viewer did not start or has exited.
-
Inspect viewer logs
- When run by the bot, the viewer writes to:
logs/web_viewer_stdout.loglogs/web_viewer_stderr.log
- Look for Python tracebacks, "Address already in use", or missing dependencies (e.g. Flask, flask-socketio).
- Optional: run the viewer manually to see errors in the terminal:
cd /path/to/meshcore-bot python3 modules/web_viewer/app.py --config config.ini --host 0.0.0.0 --port 8080
- When run by the bot, the viewer writes to:
-
Check integration startup
- Bot logs may show:
Web viewer integration failed: ...orWeb viewer integration initialized. - If integration failed, the viewer subprocess is never started; fix the error shown (e.g. invalid
hostorportin config).
- Bot logs may show:
-
Firewall
- Many SBC images (e.g. Orange Pi, Armbian minimal) do not ship with a firewall; if
curlto localhost works andhost = 0.0.0.0, the blocker may be network (Wi‑Fi client isolation, different subnet, or router). Check from a device on the same LAN usinghttp://<PI_IP>:8080. - If your system uses ufw:
sudo ufw status sudo ufw allow 8080/tcp sudo ufw reload - If
ufwis not installed (e.g.sudo: ufw: command not found), you may have no host firewall—that’s common on embedded images. To allow the port with iptables (often available when ufw is not):(Rules may not persist across reboots unless you use a persistence method for your distro.)sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT - If you prefer ufw, install it (e.g.
sudo apt install ufw) and use the ufw commands above.
- Many SBC images (e.g. Orange Pi, Armbian minimal) do not ship with a firewall; if
-
Test from the Pi first
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/If this returns
200, the viewer is running and the issue is binding or firewall. If you usehost = 0.0.0.0, then try from another device:http://<PI_IP>:8080. -
Standalone run (no bot)
- To rule out bot integration issues, start the viewer by itself (same config path so it finds the DB):
python3 modules/web_viewer/app.py --config config.ini --host 0.0.0.0 --port 8080 - If
restart_viewer.shis used, note it binds to127.0.0.1by default; for network access run the command above with--host 0.0.0.0or edit the script.
- To rule out bot integration issues, start the viewer by itself (same config path so it finds the DB):
Flask Not Found
pip3 install flask flask-socketio
Database Not Found
- Ensure the bot has been run at least once to create the databases
- Check file permissions on database files
Port Already in Use
- Change the port in
config.inior stop the conflicting service - Use
ss -tlnp | grep 8080orlsof -i :8080(if available) to find what's using the port
Permission Denied
chmod +x restart_viewer.sh
Security Notes
- The web viewer is designed for local network use
- Set
host = 127.0.0.1for localhost-only access - Set
host = 0.0.0.0for network access (use with caution) - For network access, set
web_viewer_passwordor use a reverse proxy with authentication and firewall rules
Future Enhancements
- Live packet streaming
- Real-time message monitoring
- Interactive contact management
- Export functionality
- Additional authentication options
- Mobile-responsive design improvements