M17 web proxy that connects to M17 reflectors and streams audio/data to WebSocket clients.
Reflector discovery uses the ham-dht distributed hash table network via OpenDHT as the primary method. When a reflector is not found on the DHT, the proxy falls back to the RefCheck.Radio M17 host file for address resolution.
| Variable | Description | Default |
|---|---|---|
| M17WEB_PROXY_CALLSIGN | Callsign of the proxy | SWLXXXXX |
| M17WEB_PROXY_LISTENER | Address:Port to listen on | 0.0.0.0:3000 |
| M17WEB_PROXY_SUBSCRIPTION | Format is Designator_Modules,Designator_Modules, ... | M17-XOR_ABC |
| M17WEB_PROXY_DHT_BOOTSTRAP | Bootstrap node for the ham-dht network | xrf757.openquad.net |
| M17WEB_PROXY_DHT_PORT | Port for the ham-dht bootstrap node | 17171 |
| M17WEB_PROXY_HOSTFILE_URL | URL for the M17 reflector host file (fallback) | https://hostfiles.refcheck.radio/M17Hosts.json |
| RUST_LOG | Log level (e.g. info, debug, warn) |
(unset — defaults to error) |
docker build -t m17web-proxy .
docker run -dp 3000:3000 --name m17web-proxy \
-e M17WEB_PROXY_SUBSCRIPTION=M17-XOR_ABC,M17-DEV_DEF \
m17web-proxy
Tested on Ubuntu 24.04
Install dependencies:
sudo apt update && sudo apt install -y \
curl build-essential pkg-config libssl-dev \
cmake ninja-build \
libgnutls28-dev libmsgpack-dev libargon2-dev \
libasio-dev libfmt-dev nettle-dev \
libclang-dev clang
curl https://sh.rustup.rs -sSf | bash -s -- -y
PATH="$HOME/.cargo/bin:${PATH}"Clone and build:
git clone https://github.com/OE3ANC/m17web-proxy
cd m17web-proxy
cargo build --release
./target/release/m17web-proxyAt startup, the proxy:
- Initializes an OpenDHT node and bootstraps into the ham-dht network
- Fetches the M17 host file from RefCheck.Radio as a fallback data source (in parallel with DHT bootstrap)
- For each subscribed reflector (e.g.,
M17-XOR):- First tries to resolve the address via DHT lookup
- If DHT lookup fails, falls back to the host file data
- Logs a warning when DHT fails and fallback is used
- Connects to each reflector module via UDP
- Streams received M17 voice/data frames to connected WebSocket clients
The ham-dht network is a decentralized system where M17 reflectors publish their configuration directly. The host file from RefCheck.Radio serves as a fallback for reflectors that are not registered on the DHT or when the DHT bootstrap is not working.