cp .env.example .env
# Edit .env with your deployment settings
nano .envKey settings for your deployment:
MESHTASTIC_MCAST_GRPandMESHTASTIC_MCAST_PORT— match your Meshtastic mesh networkMESHTASTIC_NODE_ID,MESHTASTIC_LONG_NAME,MESHTASTIC_SHORT_NAME— node identityVMA_GEOCODEandSMHI_GEOCODE— alerts for your region
Production:
docker compose up -dDevelopment:
docker compose -f compose.yml -f compose.dev.yml upChanges to files in app/ are instantly visible in the container. No rebuild needed. Just restart the container if the app crashes or enable watch using --watch.
The app must run with network_mode: host to receive UDP multicast packets from the Meshtastic mesh:
- Protocol: UDP
- Multicast Group: 224.0.0.69 (configurable via
MESHTASTIC_MCAST_GRP) - Port: 4403 (configurable via
MESHTASTIC_MCAST_PORT)
This means the container needs direct access to the host's network interfaces. The app will receive mesh packets from any Meshtastic device on the same LAN.
| File | Purpose |
|---|---|
.env.example |
Template with all supported environment variables |
Dockerfile |
Container image build configuration |
compose.yml |
Production deployment configuration |
compose.dev.yml |
Development overrides (live code reload via volume mount) |
- Verify Meshtastic device is on the same network and set to UDP mode
- Check firewall rules allow UDP 4403 on the host
- Confirm
MESHTASTIC_MCAST_GRPandMESHTASTIC_MCAST_PORTmatch your device configuration - Test connectivity:
docker exec meshdaemon_meshdaemon_1 python -c "import mudp; print('mudp available')"
The app runs as non-root user (uid 10001) for security. Multicast socket operations work fine as non-root. If you experience issues, verify:
- Host allows UDP multicast (not blocked by firewall rules)
- Network interface is accessible to the container (use
hostnetwork mode)
docker-compose logs -f meshdaemondocker-compose ps
# or
docker exec meshdaemon_meshdaemon_1 pgrep -f "python.*app.main"