# Beacon configuration file # Copy to config.yaml and adjust as needed. iatas: YVR: name: Vancouver International lat: 49.1967 lng: -123.1815 # borderFile: borders/yvr.geojson # optional GeoJSON Feature (Polygon/MultiPolygon) # # for the region border map; path is relative to # # this file's directory; validated at boot. YYJ: name: Victoria International lat: 48.6469 lng: -123.4260 YYC: name: Calgary International lat: 51.1139 lng: -114.0200 YEG: name: Edmonton International lat: 53.3097 lng: -113.5797 YOW: name: Ottawa International lat: 45.3225 lng: -75.6692 YYZ: name: Toronto Pearson lat: 43.6777 lng: -79.6248 regions: - slug: western-canada name: Western Canada display_order: 1 center_lat: 51.0 center_lng: -114.0 zoom_level: 5 iatas: [YVR, YYJ, YYC, YEG] - slug: eastern-canada name: Eastern Canada display_order: 2 center_lat: 45.0 center_lng: -75.0 zoom_level: 5 iatas: [YOW, YYZ] channel_keys: # Hashtag channels: Beacon derives the PSK automatically from the tag name. # secret = SHA256("#tag")[:16], channel_hash = SHA256(secret)[0] # Hashtag names should be provided without the # prefix. # Beacon prepends # automatically before deriving the key. hashtags: - meshcore # Explicit keys: provide the channel hash (hex) and key (hex) directly. # An optional name can be set for display purposes. keys: "11": key: "8b3387e9c5cdea6ac9e5edbaa115cd72" name: "Public" # Regional transport scopes for matching TRANSPORT_FLOOD packets. # Plain names have # prepended automatically (e.g. "bc" → "#bc"). scopes: - name: bc - name: "#west" telemetry: retention: 672h # 4 weeks resolution: 1h # store one snapshot per observer per hour packets: retention: 720h # 30 days # Known-route retention. Routes are distilled packet history (the path a packet # took, hop by hop), so they may outlive packets.retention; there is no required # relationship between the two. routes: # How long a route is kept after it was last observed. Every new observation # of the same path resets this clock, so routes the mesh still uses never # expire -- only paths nothing has traveled for this long age out. retention: 336h # 14 days # Shorter window for rarely-seen routes: one observed fewer than # min_observations times in total is dropped once it goes unobserved for # this long. Must be shorter than retention, or it never applies. grace: 168h # 7 days # Lifetime observation count a route must reach to earn the full retention # window. Below it a route is treated as flood noise -- a path recorded once # or twice and never confirmed -- and only kept for the grace window. The # count never resets, so once a route crosses this bar it stays in the # retention tier for good. min_observations: 3 websocket: max_connections_per_ip: 5 # default: 5 # Node staleness, deletion, and clock-drift thresholds. #nodes: # stale_threshold: 24h # default: 24h # delete_after: 720h # default: 30 days, same default as packets.retention # clock_drift_threshold: 5m # default: 5m # CORS configuration. # Controls which origins, methods and headers are allowed for cross-origin requests. # Defaults to allowing all origins with GET/HEAD/OPTIONS if omitted — appropriate # for a public read-only API. Restrict allowed_origins if you expose write endpoints. #cors: # allowed_origins: # - "https://app.example.com" # allowed_methods: [GET, HEAD, OPTIONS, POST] # allowed_headers: [Accept, Authorization, Content-Type] # allow_credentials: false # max_age: 300 # Redis caching layer. # If REDIS_ADDR is not set, caching is disabled and all reads go directly to PostgreSQL. # TTLs are specified as duration strings e.g. "30m", "1h", "2h". # Per-category TTLs override the global ttl. Any category left unset inherits ttl. cache: # Global default TTL for all cached responses. Defaults to 1h if not set. ttl: "1h" ttls: # Aggregated stats endpoints (overview, observations, breakdowns, top nodes/observers, # radio presets, scope stats). Backed by materialized views refreshed hourly. stats: "1h" # Mostly-static reference data (IATAs, regions, scopes). # Only changes when new observers arrive or config is reseeded. reference: "1h" # Individual node detail. Also explicitly invalidated on upsert. nodes: "1h" # Individual observer detail. Also explicitly invalidated on upsert. observers: "1h" # Geographic ingest filter (optional). # Drop packets from observers outside the specified area at ingest time. # Country codes are ISO 3166-1 alpha-2 (e.g. CA, US, GB). # Continent codes: AF (Africa), AN (Antarctica), AS (Asia), # EU (Europe), NA (North America), OC (Oceania), SA (South America). # If both are set an IATA passes if it matches either (OR semantics). # Omit this section entirely to accept packets from all IATAs (default). #ingest: # allow_countries: [CA, US] # allow_continents: [NA] # Background task intervals. # Shorter intervals are useful during initial deployment to confirm data is # flowing. Back off to 1h or more once stable. #background: # view_refresh: 1h # default: 1h # reconfirm: 1h # default: 1h # cleanup: 1h # default: 1h