meshcore-mqtt-live-map/.env.example
2026-04-17 10:57:10 -04:00

185 lines
5.4 KiB
Text

# =========================
# Debug / Logging
# =========================
DEBUG_PAYLOAD=false
DEBUG_PAYLOAD_MAX=400
DEBUG_LAST_MAX=50
DEBUG_STATUS_MAX=50
PAYLOAD_PREVIEW_MAX=800
# =========================
# Server / Storage
# =========================
WEB_PORT=8080
STATE_DIR=/data
BACKUP_ENABLED=false
BACKUP_INTERVAL_SECONDS=43200
BACKUP_DIR=/backup
BACKUP_RETENTION_DAYS=7
STATE_FILE=/data/state.json
DEVICE_ROLES_FILE=/data/device_roles.json
DEVICE_COORDS_FILE=/data/device_coords.json
NEIGHBOR_OVERRIDES_FILE=/data/neighbor_overrides.json
CHANNEL_SECRETS_FILE=/data/channel_secrets.json
STATE_SAVE_INTERVAL=5
# =========================
# Access Control
# =========================
PROD_MODE=false
PROD_TOKEN=change-me
TURNSTILE_ENABLED=false
TURNSTILE_SITE_KEY=
TURNSTILE_SECRET_KEY=
TURNSTILE_API_URL=https://challenges.cloudflare.com/turnstile/v0/siteverify
TURNSTILE_TOKEN_TTL_SECONDS=86400
TURNSTILE_BOT_BYPASS=true
TURNSTILE_BOT_ALLOWLIST=discordbot,twitterbot,slackbot,facebookexternalhit,linkedinbot,telegrambot,whatsapp,skypeuripreview,redditbot
# =========================
# Site / UI
# =========================
SITE_TITLE=Anonymous Mesh Live Map
SITE_DESCRIPTION=Live view of mesh nodes, message routes, and advert paths.
SITE_OG_IMAGE=
SITE_URL=https://your-domain.example/
SITE_ICON=/static/logo.png
SITE_FEED_NOTE=Feed: MQTT broker.
CUSTOM_LINK_URL=
PACKET_ANALYZER_URL=
QR_CODE_BUTTON_ENABLED=false
PEERS_DEFAULT_LIMIT=8
DISTANCE_UNITS=km
NODE_MARKER_RADIUS=8
HISTORY_LINK_SCALE=1
MAP_START_LAT=42.3601
MAP_START_LON=-71.1500
MAP_START_ZOOM=10
MAP_RADIUS_KM=241.4
MAP_RADIUS_SHOW=false
MAP_BOUNDARY_MODE=radius
MAP_BOUNDARY_FILE=/data/map_boundary.json
MAP_BOUNDARY_SHOW=false
MAP_DEFAULT_LAYER=light
# Optional coverage map integration (leave blank to hide Coverage button)
# Legacy example:
# COVERAGE_API_URL=https://coverage.example.com
# MeshMapper example:
# COVERAGE_API_URL=https://meshmapper.net
# The envs below are MeshMapper-only and are not used by legacy coverage maps.
# COVERAGE_API_KEY=your_meshmapper_api_key
# COVERAGE_MAX_AGE_DAYS=30
# COVERAGE_RATE_LIMIT_COOLDOWN_SECONDS=3600
# COVERAGE_CACHE_FILE=/data/coverage_cache.json
# COVERAGE_SYNC_INTERVAL_SECONDS=3600
COVERAGE_API_URL=
COVERAGE_API_KEY=
COVERAGE_MAX_AGE_DAYS=30
COVERAGE_RATE_LIMIT_COOLDOWN_SECONDS=3600
COVERAGE_CACHE_FILE=/data/coverage_cache.json
COVERAGE_SYNC_INTERVAL_SECONDS=3600
# =========================
# Weather Overlay
# =========================
# Master radar feature flag. Set false to remove radar from the Weather panel.
WEATHER_RADAR_ENABLED=true
# Set true to clip radar tiles to the resolved country around current map center.
WEATHER_RADAR_COUNTRY_BOUNDS_ENABLED=false
# Optional override. Keep default unless you host a custom country-bounds endpoint.
WEATHER_RADAR_COUNTRY_LOOKUP_URL=/weather/radar/country-bounds
# Master wind feature flag. Set false to remove wind from the Weather panel.
WEATHER_WIND_ENABLED=true
# Wind API endpoint. Must return Open-Meteo compatible current wind fields.
WEATHER_WIND_API_URL=https://api.open-meteo.com/v1/forecast
# Wind sample density per map view (1-5). Higher = more detail + more API requests.
WEATHER_WIND_GRID_SIZE=3
# Wind refresh interval in seconds (minimum 30).
WEATHER_WIND_REFRESH_SECONDS=180
# =========================
# MQTT
# =========================
MQTT_HOST=your-mqtt-host
MQTT_PORT=443
# For michaelhart/meshcore-mqtt-broker, use a broker SUBSCRIBER_N account here.
# Example broker side: SUBSCRIBER_1=meshmap:change-this-password:2
MQTT_USERNAME=meshmap
MQTT_PASSWORD=change-this-password
# Comma-separated list supported, e.g. meshcore/BOS/#,meshcore/CON/#
MQTT_TOPIC=meshcore/#
MQTT_TRANSPORT=websockets
MQTT_WS_PATH=/
MQTT_TLS=true
MQTT_TLS_INSECURE=false
MQTT_CA_CERT=
MQTT_CLIENT_ID=
MQTT_ONLINE_SECONDS=300
MQTT_ONLINE_STATUS_TTL_SECONDS=300
MQTT_ONLINE_INTERNAL_TTL_SECONDS=300
MQTT_ACTIVITY_PACKETS_TTL_SECONDS=300
# Legacy compatibility setting; primary MQTT presence now uses status/internal TTL envs.
MQTT_ONLINE_TOPIC_SUFFIXES=/status,/internal
MQTT_ONLINE_FORCE_NAMES=
MQTT_SEEN_BROADCAST_MIN_SECONDS=5
MQTT_STATUS_OFFLINE_VALUES=offline,disconnected
# =========================
# Device / Route Behavior
# =========================
DEVICE_TTL_HOURS=96
PATH_TTL_SECONDS=172800
TRAIL_LEN=0
HEAT_TTL_SECONDS=600
ROUTE_TTL_SECONDS=120
ROUTE_PAYLOAD_TYPES=8,9,2,5,4
ROUTE_PATH_MAX_LEN=16
ROUTE_MAX_HOP_DISTANCE=100
ROUTE_INFRA_ONLY=true
ROUTE_ALLOW_AMBIGUOUS_ONE_BYTE_FALLBACK=false
MESSAGE_ORIGIN_TTL_SECONDS=300
ROUTE_HISTORY_ENABLED=true
ROUTE_HISTORY_HOURS=24
ROUTE_HISTORY_MAX_SEGMENTS=40000
ROUTE_HISTORY_COMPACT_INTERVAL=120
ROUTE_HISTORY_FILE=/data/route_history.jsonl
ROUTE_HISTORY_PAYLOAD_TYPES=8,9,2,5,4
ROUTE_HISTORY_ALLOWED_MODES=path
# =========================
# Decoder
# =========================
DECODE_WITH_NODE=true
NODE_DECODE_TIMEOUT_SECONDS=2.0
DIRECT_COORDS_MODE=topic
DIRECT_COORDS_TOPIC_REGEX=(position|location|gps|coords)
DIRECT_COORDS_ALLOW_ZERO=false
# =========================
# LOS / Elevation
# =========================
LOS_ELEVATION_URL=https://api.opentopodata.org/v1/srtm90m
LOS_ELEVATION_PROXY_URL=/los/elevations
LOS_SAMPLE_MIN=10
LOS_SAMPLE_MAX=80
LOS_SAMPLE_STEP_METERS=250
ELEVATION_CACHE_TTL=21600
LOS_CURVATURE_ENABLED=true
LOS_CURVATURE_FACTOR=1.333333
LOS_PEAKS_MAX=4
# =========================
# Update Checks
# =========================
GIT_CHECK_ENABLED=false
GIT_CHECK_FETCH=false
GIT_CHECK_PATH=/repo
GIT_CHECK_INTERVAL_SECONDS=43200