mirror of
https://github.com/ajvpot/meshexplorer.git
synced 2026-06-27 13:20:58 +02:00
c8792cb187a61c3f8cfefdbfb67935393fb388c5
Put a schema-first ConnectRPC contract in front of the API, served alongside the existing REST routes (kept live for a gradual cutover). - Proto: meshexplorer.v1 services (Map, Node, Neighbors, Stats, Chat, Packets) in proto/, generated to src/gen via buf + protoc-gen-es. Request messages carry buf.validate rules. - Server: per-service handlers in src/server/connect/ reuse the existing ClickHouse actions/streamers; mounted via @connectrpc/connect-next at src/pages/api/[[...connect]].ts. A protovalidate interceptor enforces the buf.validate rules on every request before handlers run. - Client: connect-web transport + connect-query TransportProvider. Simple hooks (stats, neighbors, all-neighbors) use connect-query; node/search/chat and the map's imperative fetch use generated promise clients. Hooks map the generated camelCase messages back to the existing snake_case shapes so components are unchanged. - Chat: live updates now come from the StreamChat server-streaming RPC (history still paged via GetChat), replacing the 5s polling query. - Two SSE endpoints become Connect server-streaming (StreamChat, StreamPackets). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
MeshExplorer
A real-time map, chat client, and packet-analysis tool for MeshCore mesh
networks. This repository ships the whole stack so it can be brought up with a
single docker compose up:
| Component | Path | Description |
|---|---|---|
| Web app | meshexplorer/ |
Next.js UI + API (map, chat, stats, packet analysis) |
| Ingest + DB | ingest/ |
Go MeshCore MQTT→ClickHouse ingest, ClickHouse image, and SQL migrations |
| Discord relay | meshexplorer/ (Dockerfile.bot) |
Optional bot that relays MeshCore channel messages to Discord |
| Grafana | grafana/ |
Dashboards with a pre-provisioned ClickHouse datasource (read-only user), on 127.0.0.1:3000 |
Architecture
MQTT brokers (you configure)
│
▼
┌──────────────┐ ┌──────────────┐
│ meshcoreingest│──▶│ ClickHouse │◀── migrate (one-shot, applies schema)
└──────────────┘ └──────┬───────┘
│ (readonly user)
┌──────────┴──────────┐
▼ ▼ ▼
meshexplorer discord-bot grafana
(web UI :3001) (--profile bot) (:3000)
Quick start
Requirements: Docker + Docker Compose.
cp .env.example .env
# Edit .env — at minimum set:
# CLICKHOUSE_PASSWORD (read/write user, used by ingest + migrations)
# MQTT_BROKERS (JSON array of meshcore MQTT brokers to ingest from)
# Optional, for the Discord relay: DISCORD_WEBHOOK_URL (+ run with --profile bot)
docker compose up --build
Then open http://localhost:3001.
Startup order is handled automatically: ClickHouse becomes healthy → migrate
applies the schema and exits → meshcoreingest and meshexplorer start.
To also run the Discord relay:
docker compose --profile bot up --build
Configuration
All configuration is via environment variables in .env (see
.env.example for the full list and defaults). Highlights:
- ClickHouse — two accounts. The read/write
defaultuser (CLICKHOUSE_PASSWORD) is used by the ingest daemon and the migration runner; thereadonlyuser (CLICKHOUSE_READONLY_PASSWORD) is used by the web app and the Discord bot. ClickHouse is only published to127.0.0.1for debugging and is otherwise reachable only on the internalmeshnetnetwork. - MQTT_BROKERS — a JSON array; each entry is
{ "url", "username", "password", "topics" }(topicsdefaults to["meshcore/#"]). The ingest daemon exits with a clear error if this is unset, so configure at least one broker.
Development
Each component can be run on its own:
- Web app: see
meshexplorer/README.md(npm install && npm run dev). - Ingest: see
ingest/README.md(go build ./...).
Security notes
.envis gitignored — keep real credentials out of version control.- If you previously used the bundled defaults, rotate any secrets before going to production.
Description
Languages
TypeScript
83.6%
Go
10.1%
JavaScript
3.7%
CSS
1.6%
Dockerfile
0.8%
Other
0.2%