tr-docker

May 26, 2026 · View on GitHub

Pre-built Trunk Recorder Docker image with all common plugins included. Drop in as a replacement for a manual trunk-recorder build.

docker pull ghcr.io/trunk-reporter/trunk-recorder:latest

Included Plugins

PluginSourcePurpose
mqtt_statusTrunkRecorder/tr-plugin-mqttCall/unit/recorder events over MQTT
mqtt_dvcftrunk-reporter/tr-plugin-dvcfRaw IMBE codec frames → DVCF files + MQTT (for IMBE-ASR)
mqtt_avcftrunk-reporter/tr-plugin-avcfAnalog audio + metadata → AVCF files + MQTT
symbolstreamtrunk-reporter/symbolstreamLive codec frame streaming over TCP/UDP
simplestreamupstream (patched)Audio streaming to remote consumers
openmhz_uploaderupstreamUpload calls to OpenMHz
broadcastify_uploaderupstreamUpload calls to Broadcastify
unit_scriptupstreamRun scripts on unit events

Usage

docker run -d \
  --name trunk-recorder \
  --restart unless-stopped \
  --privileged \
  --device /dev/bus/usb:/dev/bus/usb \
  -v /var/run/dbus:/var/run/dbus \
  -v ./config.json:/app/config.json:ro \
  -v ./audio:/app/audio \
  ghcr.io/trunk-reporter/trunk-recorder:latest

Mount your existing config.json — everything else is the same as a standard trunk-recorder setup.

Reproducible Builds

The Dockerfile accepts build args for all git checkouts:

docker build \
  --build-arg TRUNK_RECORDER_REF=<tag-or-sha> \
  --build-arg TR_PLUGIN_MQTT_REF=<tag-or-sha> \
  --build-arg TR_PLUGIN_DVCF_REF=<tag-or-sha> \
  --build-arg TR_PLUGIN_AVCF_REF=<tag-or-sha> \
  --build-arg SYMBOLSTREAM_REF=<tag-or-sha> \
  -t trunk-recorder:local .

Defaults track the main development branches for weekly images; release builds should pin exact tags or commit SHAs.

Plugin Configuration

Add plugins to the plugins array in your config.json. See each plugin's README for full config options.

mqtt_status (call/unit events)

{
  "name": "mqtt_status",
  "library": "libmqtt_status_plugin",
  "broker": "tcp://YOUR_BROKER:1883",
  "topic": "tr/feeds",
  "unit_topic": "tr/units",
  "instanceId": "my-site"
}

mqtt_dvcf (IMBE-ASR integration)

{
  "name": "mqtt_dvcf",
  "library": "libmqtt_dvcf",
  "write_enabled": true,
  "mqtt_enabled": true,
  "broker": "tcp://YOUR_BROKER:1883",
  "topic": "tr/feeds"
}

mqtt_avcf (analog capture)

{
  "name": "mqtt_avcf",
  "library": "libmqtt_avcf",
  "write_enabled": true,
  "mqtt_enabled": true,
  "analog_only": true,
  "broker": "tcp://YOUR_BROKER:1883",
  "topic": "tr/feeds"
}

symbolstream (live streaming)

{
  "name": "symbolstream",
  "library": "libsymbolstream",
  "streams": [
    {
      "address": "YOUR_TR_ENGINE_HOST",
      "port": 9090,
      "TGID": 0,
      "useTCP": true,
      "sendJSON": true
    }
  ]
}

Full Stack

For the complete P25 transcription stack (tr-engine + tr-dashboard + imbe-asr + postgres + mosquitto), see trunk-reporter/tr-stack.

Notes

  • Weekly images track the configured default refs; release images should pin build args to exact refs
  • simplestream includes a pending dangling-pointer fix (TR PR #1107) that will be removed once merged upstream
  • Requires voice_codec_data() API (merged in TR commit c996900) — already in this image