# MeshCore Hub - Environment Configuration # Copy this file to .env and customize values # # Configuration is grouped by service. Most deployments only need: # - Common Settings (always required) # - MQTT Settings (always required) # - Interface Settings (for receiver/sender services) # # The Collector, API, and Web services typically run as a combined "core" # profile and share the same data directory. # # ----------------------------------------------------------------------------- # QUICK START: Receiver/Sender Only # ----------------------------------------------------------------------------- # For a minimal receiver or sender setup, you only need these settings: # # MQTT_HOST=your-mqtt-broker.example.com # MQTT_PORT=1883 # MQTT_USERNAME=your_username # MQTT_PASSWORD=your_password # MQTT_TLS=false # SERIAL_PORT=/dev/ttyUSB0 # # Serial ports are typically /dev/ttyUSB[0-9] or /dev/ttyACM[0-9] on Linux. # ----------------------------------------------------------------------------- # ============================================================================= # COMMON SETTINGS # ============================================================================= # These settings apply to all services # Docker image version tag to use # Options: latest, main, v1.0.0, etc. IMAGE_VERSION=latest # Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) LOG_LEVEL=INFO # Base directory for runtime data (database, etc.) # Default: ./data (relative to docker-compose.yml location) # Inside containers this is mapped to /data # # Structure: # ${DATA_HOME}/ # └── collector/ # └── meshcore.db # SQLite database DATA_HOME=./data # Directory containing seed data files for import # Default: ./seed (relative to docker-compose.yml location) # Inside containers this is mapped to /seed # # Structure: # ${SEED_HOME}/ # ├── node_tags.yaml # Node tags for import # └── members.yaml # Network members for import SEED_HOME=./seed # ============================================================================= # MQTT SETTINGS # ============================================================================= # MQTT broker connection settings for interface, collector, and API services # MQTT Broker host # When using the local MQTT broker (--profile mqtt), use "mqtt" # When using an external broker, set the hostname/IP MQTT_HOST=mqtt # MQTT Broker port (default: 1883, or 8883 for TLS) MQTT_PORT=1883 # MQTT authentication (optional) MQTT_USERNAME= MQTT_PASSWORD= # MQTT topic prefix for all MeshCore messages MQTT_PREFIX=meshcore # Enable TLS/SSL for MQTT connection # When enabled, uses TLS with system CA certificates (e.g., for Let's Encrypt) MQTT_TLS=false # MQTT transport protocol # Options: tcp, websockets MQTT_TRANSPORT=tcp # MQTT WebSocket path (used only when MQTT_TRANSPORT=websockets) # Common values: /mqtt, / MQTT_WS_PATH=/mqtt # External port mappings for local MQTT broker (--profile mqtt only) MQTT_EXTERNAL_PORT=1883 MQTT_WS_PORT=9001 # ============================================================================= # INTERFACE SETTINGS (Receiver/Sender) # ============================================================================= # Settings for the MeshCore device interface services # Serial port for receiver device SERIAL_PORT=/dev/ttyUSB0 # Serial port for sender device (if using separate device) SERIAL_PORT_SENDER=/dev/ttyUSB1 # Baud rate for serial communication SERIAL_BAUD=115200 # Optional device/node name to set on startup # This name is broadcast to the mesh network in advertisements MESHCORE_DEVICE_NAME= # Optional node address override (64-char hex string) # Only set if you need to override the device's public key NODE_ADDRESS= NODE_ADDRESS_SENDER= # ------------------- # Contact Cleanup Settings (RECEIVER mode only) # ------------------- # Automatic removal of stale contacts from the MeshCore companion node # Enable automatic removal of stale contacts from companion node CONTACT_CLEANUP_ENABLED=true # Remove contacts not advertised for this many days CONTACT_CLEANUP_DAYS=7 # ============================================================================= # COLLECTOR SETTINGS # ============================================================================= # The collector subscribes to MQTT events and stores them in the database # Collector MQTT ingest mode # - native: expects //event/ topics # - letsmesh_upload: expects LetsMesh observer uploads on # //(packets|status|internal) COLLECTOR_INGEST_MODE=native # LetsMesh decoder support (used only when COLLECTOR_INGEST_MODE=letsmesh_upload) # Set to false to disable external packet decoding COLLECTOR_LETSMESH_DECODER_ENABLED=true # Decoder command (must be available in container PATH) # Examples: meshcore-decoder, /usr/local/bin/meshcore-decoder, npx meshcore-decoder COLLECTOR_LETSMESH_DECODER_COMMAND=meshcore-decoder # Optional: channel secret keys (comma or space separated) used to decrypt GroupText # packets. This supports unlimited keys. # Note: Public + #test keys are built into the collector code by default. # To show friendly channel names in the web feed, use label=hex (example: bot=ABCDEF...). # Without keys, encrypted packets cannot be shown as plaintext. # COLLECTOR_LETSMESH_DECODER_KEYS= # Timeout in seconds per decode invocation COLLECTOR_LETSMESH_DECODER_TIMEOUT_SECONDS=2.0 # ------------------- # Webhook Settings # ------------------- # Webhooks forward mesh events to external HTTP endpoints as POST requests # Webhook for advertisement events (node discovery) WEBHOOK_ADVERTISEMENT_URL= WEBHOOK_ADVERTISEMENT_SECRET= # Webhook for all message events (channel and direct messages) WEBHOOK_MESSAGE_URL= WEBHOOK_MESSAGE_SECRET= # Optional: Separate URLs for channel vs direct messages # These override WEBHOOK_MESSAGE_URL if set # WEBHOOK_CHANNEL_MESSAGE_URL= # WEBHOOK_CHANNEL_MESSAGE_SECRET= # WEBHOOK_DIRECT_MESSAGE_URL= # WEBHOOK_DIRECT_MESSAGE_SECRET= # Webhook behavior settings WEBHOOK_TIMEOUT=10.0 WEBHOOK_MAX_RETRIES=3 WEBHOOK_RETRY_BACKOFF=2.0 # ------------------- # Data Retention Settings # ------------------- # Automatic cleanup of old event data (advertisements, messages, telemetry, etc.) # Enable automatic cleanup of old event data DATA_RETENTION_ENABLED=true # Number of days to retain event data # Events older than this are deleted during cleanup DATA_RETENTION_DAYS=30 # Hours between automatic cleanup runs # Applies to both event data and node cleanup DATA_RETENTION_INTERVAL_HOURS=24 # ------------------- # Node Cleanup Settings # ------------------- # Automatic removal of inactive nodes # Enable automatic cleanup of inactive nodes # Nodes with last_seen=NULL (never seen on network) are NOT removed NODE_CLEANUP_ENABLED=true # Remove nodes not seen for this many days (based on last_seen field) NODE_CLEANUP_DAYS=7 # ============================================================================= # API SETTINGS # ============================================================================= # REST API for querying data and sending commands # External API port API_PORT=8000 # API Keys for authentication # Generate secure keys for production: openssl rand -hex 32 # Leave empty to disable authentication (not recommended for production) API_READ_KEY= API_ADMIN_KEY= # ------------------- # Prometheus Metrics # ------------------- # Prometheus metrics endpoint exposed at /metrics on the API service # Enable Prometheus metrics endpoint # Default: true METRICS_ENABLED=true # Seconds to cache metrics output (reduces database load) # Default: 60 METRICS_CACHE_TTL=60 # External Prometheus port (when using --profile metrics) PROMETHEUS_PORT=9090 # External Alertmanager port (when using --profile metrics) ALERTMANAGER_PORT=9093 # ============================================================================= # WEB DASHBOARD SETTINGS # ============================================================================= # Web interface for visualizing network status # External web port WEB_PORT=8080 # API endpoint URL for the web dashboard # Default: http://localhost:8000 # API_BASE_URL=http://localhost:8000 # API key for web dashboard queries (optional) # If API_READ_KEY is set on the API, provide it here # API_KEY= # Default theme for the web dashboard (dark or light) # Users can override via the theme toggle; their preference is saved in localStorage # Default: dark # WEB_THEME=dark # Locale/language for the web dashboard # Default: en # Supported: en (see src/meshcore_hub/web/static/locales/ for available translations) # WEB_LOCALE=en # Locale used for date/time formatting in the web dashboard # Controls date ordering only; 24-hour clock is still used by default # Examples: en-US (MM/DD/YYYY), en-GB (DD/MM/YYYY) # Default: en-US # WEB_DATETIME_LOCALE=en-US # Auto-refresh interval in seconds for list pages (nodes, advertisements, messages) # Set to 0 to disable auto-refresh # Default: 30 # WEB_AUTO_REFRESH_SECONDS=30 # Enable admin interface at /a/ (requires auth proxy in front) # Default: false # WEB_ADMIN_ENABLED=false # Timezone for displaying dates/times on the web dashboard # Uses standard IANA timezone names (e.g., America/New_York, Europe/London) # Default: UTC TZ=UTC # Directory containing custom content (pages/, media/) # Default: ./content # CONTENT_HOME=./content # ------------------- # Network Information # ------------------- # Displayed on the web dashboard homepage # Network domain name (optional) # NETWORK_DOMAIN= # Network display name NETWORK_NAME=MeshCore Network # Network location NETWORK_CITY= NETWORK_COUNTRY= # Radio configuration (comma-delimited) # Format: ,,,,, # Example: EU/UK Narrow,869.618MHz,62.5kHz,SF8,CR8,22dBm NETWORK_RADIO_CONFIG= # Welcome text displayed on the homepage (optional, plain text) # If not set, a default welcome message is shown NETWORK_WELCOME_TEXT= # ------------------- # Feature Flags # ------------------- # Control which pages are visible in the web dashboard # Set to false to completely hide a page (nav, routes, sitemap, robots.txt) # FEATURE_DASHBOARD=true # FEATURE_NODES=true # FEATURE_ADVERTISEMENTS=true # FEATURE_MESSAGES=true # FEATURE_MAP=true # FEATURE_MEMBERS=true # FEATURE_PAGES=true # ------------------- # Contact Information # ------------------- # Contact links displayed in the footer NETWORK_CONTACT_EMAIL= NETWORK_CONTACT_DISCORD= NETWORK_CONTACT_GITHUB= NETWORK_CONTACT_YOUTUBE=