From 7f6ddddf5460966c881b37641e9c60bbcf7a93c4 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 12 Sep 2026 00:29:58 +0000 Subject: [PATCH] Prepare FreeDMR v1.5.0 release --- README.md | 3 + docker-configs/docker-compose.yml | 2 +- docker-configs/docker-compose_install.sh | 2 +- docs/release-notes-v1.5.0.md | 81 ++++++++++++++++++++++++ tests/test_hdstack.py | 5 +- 5 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 docs/release-notes-v1.5.0.md diff --git a/README.md b/README.md index 94dde3e..4f7395b 100755 --- a/README.md +++ b/README.md @@ -10,3 +10,6 @@ For the single-client SQL importer and dashboard reporting relay, see For the CPU-sized one-to-five-worker HDStack container deployment and reporting MUX, including the default separate Data Gateway service, see [docs/hdstack.md](docs/hdstack.md). + +See the [FreeDMR v1.5.0 release notes](docs/release-notes-v1.5.0.md) before +upgrading an existing container deployment. diff --git a/docker-configs/docker-compose.yml b/docker-configs/docker-compose.yml index 0e2ffd7..a57fb87 100644 --- a/docker-configs/docker-compose.yml +++ b/docker-configs/docker-compose.yml @@ -68,7 +68,7 @@ services: container_name: freedmr-data-gateway depends_on: - freedmr - image: 'gitlab.hacknix.net:5050/freedmr/freedmr-data-gateway:development-latest' + image: 'gitlab.hacknix.net:5050/freedmr/freedmr-data-gateway:latest' restart: "unless-stopped" read_only: true tmpfs: diff --git a/docker-configs/docker-compose_install.sh b/docker-configs/docker-compose_install.sh index e559af2..6d7616b 100644 --- a/docker-configs/docker-compose_install.sh +++ b/docker-configs/docker-compose_install.sh @@ -311,7 +311,7 @@ net.netfilter.nf_conntrack_udp_timeout_stream=35 EOF /usr/sbin/sysctl -p -echo 'Starting the FreeDMR release-candidate container...' +echo 'Starting the FreeDMR container...' cd /etc/freedmr docker compose up -d diff --git a/docs/release-notes-v1.5.0.md b/docs/release-notes-v1.5.0.md new file mode 100644 index 0000000..24e8d00 --- /dev/null +++ b/docs/release-notes-v1.5.0.md @@ -0,0 +1,81 @@ +# FreeDMR v1.5.0 release notes + +FreeDMR v1.5.0 introduces HDStack, a multi-process deployment for the standard +container. It raises aggregate HBP capacity by distributing active hotspot and +repeater sessions across up to five FreeDMR workers while retaining the +existing 100-connection boundary for each worker. + +## Before upgrading + +- The standard container now chooses the number of HDStack workers from the + available CPU count minus one, clamped to one through five. Set `HDSTACK=1` + explicitly to retain the established single-process layout. +- Set `HDSTACK_BASEID` to the aggregator server ID. Workers use successive IDs + beginning at `HDSTACK_BASEID + 1`. +- The read-only FreeDMR container requires a writable `/tmp`. The shipped + Compose file provides this with `tmpfs: /tmp`; retain that setting in custom + deployments. +- Existing deployments must update their Compose configuration to receive new + services and mounts; pulling the FreeDMR image alone does not rewrite an + existing `docker-compose.yml`. + +## HDStack + +- New HBP sessions are assigned round-robin across workers. A DMR ID remains + pinned to its exact worker port for the active session, preserving its login, + bridge and `OPTIONS` state. +- A no-HBP aggregator owns external FBP and OBP relationships. Workers connect + to it over private FBP v5/FBCP links. +- Each worker has an isolated Loro playback process and private ECHO link when + ECHO is enabled. +- The reporting MUX presents worker reports through the existing reporting + socket. It prefixes system names with the stable worker number, for example + `1:SYSTEM-001`, to avoid collisions. +- The optional separate `bridge.py` process is disabled by default. Set + `HDSTACK_BRIDGE=1`, assign it a distinct server ID and configure its skeleton + config and rules files when bridge routing is required. +- HDStack does not provide active worker failover, live migration or persistent + session affinity. A failed worker's active sessions are not moved. + +See [HDStack multi-process deployment](hdstack.md) for configuration, generated +ports, reporting and operational limitations. + +## Data Gateway + +New installations include the stable FreeDMR Data Gateway container. Each +worker has a direct FBP v5/FBCP relationship to the gateway for locally +originated DMR traffic. Existing installations retain the legacy D-APRS path +unless the native `DATA_GATEWAY` setting and relationship are enabled. + +The installer requests the APRS-IS login and passcode and writes the matching +worker relationships. The gateway remains a separate container and is not a +fallback when its native links are unavailable. + +## Other operator-visible changes + +- Network direct dial is available and defaults to local TG9 on TS1. Set + `NETWORK_DIRECT_DIAL_SLOT: 0`, or session option `NDD_SLOT=0`, to disable it. +- Dial-a-TG control, defaults and timers can be configured independently for + TS1 and TS2. Existing TS2 option aliases remain supported. +- `DIAL_A_TG` and `DYNAMIC_TG_ROUTING` can disable their respective dynamic + routing behaviours. +- HBP `OPTIONS` input is bounded to 255 bytes. Oversized values are + acknowledged but ignored. +- Optional DMR data observability is available through `DATA_PACKET_LOGGING`. + It is disabled by default because decoded logs may contain message or + location content. +- Reporting includes source server and repeater metadata without changing the + existing leading report fields. +- The shipped `ALLOW_UNREG_ID` default is now `True` for established FreeDMR + access compatibility. +- The installer uses the current Docker repository setup on Debian 12. + +## Compatibility + +FBP v5 and OBP v1 remain distinct supported peer protocols. The HDStack +internal topology uses FBP v5/FBCP and consumes one additional FBP hop; the +accepted maximum is therefore 11 hops for all FBP relationships. + +The tagged container build publishes `latest`, the tag-specific +`v1.5.0-with-proxy` image and `development-latest` through the existing release +pipeline. diff --git a/tests/test_hdstack.py b/tests/test_hdstack.py index dec38d8..1ae3286 100644 --- a/tests/test_hdstack.py +++ b/tests/test_hdstack.py @@ -499,7 +499,8 @@ class HDStackContainerTests(unittest.TestCase): ) self.assertIn("62041-62045:62041-62045/udp", compose) self.assertIn("container_name: freedmr-data-gateway", compose) - self.assertIn("freedmr-data-gateway:development-latest", compose) + self.assertIn("freedmr-data-gateway:latest", compose) + self.assertNotIn("freedmr-data-gateway:development-latest", compose) self.assertIn("FREEDMR_GATEWAY_INGRESS_MODE: fbp", compose) self.assertIn("FREEDMR_GATEWAY_FBP_RELATIONSHIPS:", compose) self.assertIn("/etc/freedmr/json/:/data/:ro", compose) @@ -548,6 +549,8 @@ class HDStackContainerTests(unittest.TestCase): installer, ) self.assertIn('docker compose up -d', installer) + self.assertIn('Starting the FreeDMR container...', installer) + self.assertNotIn('release-candidate container', installer) self.assertNotIn('apt-key', installer) self.assertNotIn('add-apt-repository', installer)