Files
meshcore-hub/docs/observer.md
T
Louis King 973bf23fe8 docs: centralise env vars and split deployment/observer/maintenance docs
Move scattered configuration tables and operational sections out of the
README into dedicated reference documents:

- docs/configuration.md: single source of truth for all environment
  variables, grouped into 12 sections (Common, Database, Caching,
  Collector, Webhooks, Auth, Data Retention, API, Web Dashboard,
  Feature Flags, Traefik, Prometheus & Alertmanager)
- docs/deployment.md: production setup, reverse proxy, multi-instance,
  API scaling, Redis caching
- docs/observer.md: remote observers plus PACKETCAPTURE_* and
  SERIAL_PORT reference
- docs/maintenance.md: backup and restore

README is reduced from 712 to 385 lines; the ARM32/Raspberry Pi note
is dropped. database.md, auth.md, webhooks.md, and content.md have
their env-var tables removed and link back to configuration.md. Stale
cross-references in database.md, upgrading.md, and .env.example are
updated to point at the new locations.
2026-06-18 12:20:49 +01:00

6.0 KiB

Remote Observers

Other operators can run their own meshcore-packet-capture instance and publish decoded packets to your MeshCore Hub. They can also optionally contribute to the LetsMesh and MeshRank networks.

This document covers the local packet-capture observer (the observer compose profile) and the remote-observer contribution flow. The PACKETCAPTURE_* and SERIAL_PORT variables that configure the external capture image are documented at the bottom of this page; for everything else see configuration.md.

Prerequisite: Your MQTT broker must be accessible to remote observers. In production, this means exposing the WebSocket listener via a reverse proxy with TLS (e.g., wss://mqtt.example.com/mqtt).

Example: Contribute to MeshCore Hub, LetsMesh, and MeshRank

A ready-made Docker Compose setup is provided in contrib/packetcapture/. Download it and configure:

mkdir meshcore-observer && cd meshcore-observer

wget https://raw.githubusercontent.com/ipnet-mesh/meshcore-hub/main/contrib/packetcapture/docker-compose.yml
wget https://raw.githubusercontent.com/ipnet-mesh/meshcore-hub/main/contrib/packetcapture/.env.example

cp .env.example .env

Edit .env and update the following variables:

Variable Description
SERIAL_PORT Device path for your MeshCore companion device (e.g. /dev/ttyUSB0, or /dev/serial/by-id/... for a stable path)
IATA 3-letter area code for your location (e.g. STN, SEA)
ORIGIN Observer identifier (default: observer)
IPNET_ENABLE Set true to contribute packets to IPNet MeshCore Hub (default: true)
LETSMESH_ENABLE Set true to contribute to LetsMesh (default: false)
LETSMESH_REGION LetsMesh region: eu or us (default: eu)
MESHRANK_ENABLE Set true to contribute to MeshRank (default: false)
MESHRANK_UPLINK_KEY Your MeshRank uplink key (required if MeshRank enabled)
CUSTOM_ENABLE Set true to publish to a custom MQTT broker (default: false)
CUSTOM_MQTT_SERVER Custom MQTT broker hostname
CUSTOM_MQTT_PORT Custom MQTT broker port (default: 8883)
CUSTOM_MQTT_USE_TLS true for TLS, false for plain (default: true)
CUSTOM_MQTT_USERNAME Username for custom broker auth
CUSTOM_MQTT_PASSWORD Password for custom broker auth

Then start the observer:

docker compose up -d

Local network (no TLS): Set CUSTOM_MQTT_SERVER to the Hub's LAN IP (e.g. 192.168.1.100), CUSTOM_MQTT_PORT=1883, and CUSTOM_MQTT_USE_TLS=false.

Packet Capture Settings

The variables below configure the external meshcore-packet-capture image (ghcr.io/agessaman/meshcore-packet-capture), which is run by the observer compose profile. They are not consumed by MeshCore Hub itself — they are listed here because they live in the same .env and are needed by operators running an observer. See the meshcore-packet-capture documentation for full details.

Device

Variable Default Description
SERIAL_PORT /dev/ttyUSB0 Serial port for the packet-capture device (typically /dev/ttyUSB[0-9] or /dev/ttyACM[0-9] on Linux)
PACKETCAPTURE_IATA LOC 3-letter IATA airport/area code used in LetsMesh topic templates
PACKETCAPTURE_ORIGIN (device name) Observer display name (defaults to the device name from the MeshCore connection)
PACKETCAPTURE_IMAGE_VERSION latest Docker image tag for the packet-capture image

Connection behaviour

Variable Default Description
PACKETCAPTURE_TIMEOUT 30 Connection timeout in seconds
PACKETCAPTURE_MAX_CONNECTION_RETRIES 5 Max device-connection retries
PACKETCAPTURE_CONNECTION_RETRY_DELAY 5 Seconds between device-connection retries
PACKETCAPTURE_HEALTH_CHECK_INTERVAL 30 Seconds between health checks
PACKETCAPTURE_ADVERT_INTERVAL_HOURS 11 Send flood adverts at this interval in hours (0 = disabled)
PACKETCAPTURE_RF_DATA_TIMEOUT 15.0 RF data cache timeout in seconds

MQTT reconnection

Variable Default Description
PACKETCAPTURE_MAX_MQTT_RETRIES 5 Max MQTT reconnection attempts
PACKETCAPTURE_MQTT_RETRY_DELAY 5 Seconds between MQTT reconnection attempts
PACKETCAPTURE_EXIT_ON_RECONNECT_FAIL true Exit the process when MQTT reconnection fails

LetsMesh / custom MQTT brokers

The observer can publish to up to three MQTT brokers in parallel. Broker 3 is wired to the Hub's own MQTT_* settings by default.

Variable Default Description
PACKETCAPTURE_MQTT1_ENABLED false Publish to LetsMesh US
PACKETCAPTURE_MQTT1_SERVER mqtt-us-v1.letsmesh.net Broker 1 hostname
PACKETCAPTURE_MQTT1_PORT 443 Broker 1 port
PACKETCAPTURE_MQTT1_USE_TLS true Use TLS for broker 1
PACKETCAPTURE_MQTT1_USE_AUTH_TOKEN true Use JWT auth token for broker 1
PACKETCAPTURE_MQTT1_TOKEN_AUDIENCE mqtt-us-v1.letsmesh.net JWT audience claim for broker 1
PACKETCAPTURE_MQTT1_KEEPALIVE 120 Keepalive (seconds) for broker 1
PACKETCAPTURE_MQTT2_ENABLED false Publish to LetsMesh EU
PACKETCAPTURE_MQTT2_SERVER mqtt-eu-v1.letsmesh.net Broker 2 hostname
PACKETCAPTURE_MQTT2_PORT 443 Broker 2 port
PACKETCAPTURE_MQTT2_USE_TLS true Use TLS for broker 2
PACKETCAPTURE_MQTT2_USE_AUTH_TOKEN true Use JWT auth token for broker 2
PACKETCAPTURE_MQTT2_TOKEN_AUDIENCE mqtt-eu-v1.letsmesh.net JWT audience claim for broker 2
PACKETCAPTURE_MQTT2_KEEPALIVE 120 Keepalive (seconds) for broker 2
PACKETCAPTURE_MQTT3_ENABLED true Publish to the local Hub MQTT broker (wired to MQTT_*)
PACKETCAPTURE_MQTT3_KEEPALIVE 60 Keepalive (seconds) for broker 3