Jump to content

Hamradio/reflector dashboard

From MediaWiki For Hamradio Analog/Digital and Debian v13 software/Raspberry PI v3/4/5 howto
Revision as of 15:09, 18 October 2026 by Sa7aux (talk | contribs) (Marked this version for translation)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

A guide to setting up R.A.D.A.R. (Reflector Activity Dashboard And Reporting): a web dashboard that shows, live, who is connected to your SvxReflector, who is talking, and how the network is wired — with user accounts, talkgroup lists and admin tools.

💡 In one sentence: R.A.D.A.R. runs on the same server as your SvxReflector, polls the reflector's status, and serves a live web page (nodes, last-heard, talkgroups, topology, CTCSS) with a sign-up/login account system.
The reflector's /status on port 8099 is polled by svxdr proxy (8090), then svxdr nodelist (8098), served through nginx over HTTPS to the browser; PHP-FPM handles accounts in Redis.
⚠ This one is for reflector operators, not beginners. Unlike the node dashboard, R.A.D.A.R. is a server install: nginx + PHP + Redis + a Go daemon + a real TLS certificate. If you just run a node, you don't need this — you want the SvxSpot Dashboard instead. The authoritative step-by-step is the repo's INSTALL.md; this page is the friendly overview.

Do I need this?

[edit | edit source]
  • You run a SvxReflector (specifically a GeuReflector build, which adds reflector-to-reflector trunking) and want a public/at-a-glance activity dashboard for it.
  • You're comfortable setting up a web server with HTTPS. This is a multi-service install on a Debian box.
  • If you only run a node (hotspot/repeater), stop here — use SvxSpot Dashboard.

What you need first

[edit | edit source]
Thing Why
A running SvxReflector (GeuReflector) on the same box R.A.D.A.R. reads its /status endpoint (example port 8099).
A domain name + TLS certificate (Let's Encrypt) Login uses a Secure cookie — it does not work over plain HTTP.
nginx, PHP 8.4 + FPM (redis, mbstring, openssl, json), Redis 6+ web server, account backend, and account/session store.
An MTA or SMTP relay sign-up verification and password-reset e-mail.
Go 1.24+ to compile the svxdr live-data daemon.

Install the packages (Debian 13 / Ubuntu 24.04):

sudo apt install nginx php8.4-fpm php8.4-redis php8.4-mbstring php8.4-cli \
                 redis-server certbot openssl rsync curl python3 sudo golang-go
💡 Debian 12 ships PHP 8.2; R.A.D.A.R. is developed on 8.4. Use Debian 13, or the sury.org PHP repo, and substitute your real version everywhere you see 8.4.

How the data flows (so the ports make sense)

[edit | edit source]

The single most common setup mistake is a mismatched port chain. Data flows:

reflector /status :8099 → svxdr proxy :8090 (caches, enriches) → svxdr nodelist :8098 (builds the API + live SSE stream, reads Redis for node events) → nginx (HTTPS, reverse-proxies /svxportal/api/ to :8098) → your browser. Accounts live in Redis; the PHP backend (auth/*.php) talks to it.

Keep those numbers lined up and most of the install "just works".

Install (overview)

[edit | edit source]

Clone the repo and follow its INSTALL.md steps 0–11; the key moves are:

  1. Get the code: git clone https://git.sa7aux.se/bjorne/reflector-dashboard.git
  2. Deploy the web files with rsync into /var/www/html/svxportal (owned by www-data).
  3. Set up a dedicated Redis instance on a unix socket, with a password; add www-data to the redis group.
  4. Add a second PHP-FPM pool (svxadmin) used only by the reflector-admin API.
  5. Create the talkgroup-list file /etc/svxlink/tglist.json (via the shipped tmpfiles rule).
  6. nginx + TLS: install the site template, run certbot for your hostname, enable the site.
  7. Build and run svxdr:
cd svxdr && CGO_ENABLED=0 go build -trimpath -o svxdr . && cd ..
sudo install -m0755 svxdr/svxdr /usr/local/bin/svxdr
sudo cp install/svxdr.json.example /etc/svxlink/svxdr.json   # then edit it
sudo cp install/systemd/svxdr.service /etc/systemd/system/svxdr.service
sudo systemctl daemon-reload && sudo systemctl enable --now svxdr
curl -s http://127.0.0.1:8098/healthz        # -> ok

Two config files hold the settings: auth/config.php (web backend — Redis password, mail, base_url, MQTT) and /etc/svxlink/svxdr.json (the daemon — Redis, the three ports, federation seeds). Copy each from its .example and edit.

Create the first admin

[edit | edit source]

A bundled CLI makes the first account (and marks its e-mail verified):

cd /var/www/html/svxportal
sudo -u www-data php svx-mkadmin.php

It asks for callsign, name, e-mail, location, admin level and a password. Levels: 1 = normal user, 2 = admin (accounts, nodes, certificates, talkgroups), 3 = super admin (also reflector/MQTT secrets and managing other admins). Everyone else self-registers on the site and verifies by e-mail.

Using it

[edit | edit source]

Open https://YOUR.HOST.NAME/. The top navigation has:

View Shows
Nodes Connected nodes, with a pop-up when someone is talking.
Reflector clients Searchable list of all connected clients.
Monitor → Nodes / Trunks / Topology Live monitor; Topology draws the whole network — your reflector in the centre, other reflectors in a ring, trunk links between them.
TG Monitor Who's on each talkgroup (SVX side and DMR side).
Lastheard Recent activity.
CTCSS Table Per-node TX/RX tones, 2 m vs UHF.
Changelog Project changelog.

A built-in Help page (/help.html) has tabs for the Portal, SvxLink, SvxReflector, GeuReflector, AllStar and more.

Good to know / honest caveats

[edit | edit source]
⚠ The reflector-admin pages need helper scripts you write yourself. The Admin → Reflector / Certificates / Node-control / MQTT pages call root-owned sudo helpers in /usr/local/sbin/ (svxreflector-pty, svxreflector-systemctl, svxreflector-users, svx-mqtt-provision) that are not shipped — they're specific to your box. Everything else works without them.
  • Login lost after one page? You're not on HTTPS (the cookie is Secure) or base_url is wrong.
  • Live views empty? svxdr isn't running — check systemctl status svxdr and curl http://127.0.0.1:8098/healthz. The reflector itself keeps working regardless.
  • No verification e-mail? PHP mail() fails silently without an MTA — configure an SMTP relay.
  • Admin API says “exec disabled”? Never add exec to PHP's disable_functions; the portal needs it.

Troubleshooting

[edit | edit source]
Symptom Check
500 on any auth/*.php /var/log/nginx/svxportal-error.log and journalctl -u php8.4-fpm — usually Redis password wrong, php-redis missing, or www-data not in group redis.
"Not connected" / empty views svxdr down → nothing on 127.0.0.1:8098.
Ports Confirm the chain 8099 → 8090 → 8098 → nginx in /etc/svxlink/svxdr.json and the nginx site.

See also

[edit | edit source]
  • SvxSpot Dashboard — the dashboard for a single node (much simpler).
  • Hamradio — SvxReflector and the rest of the digital-voice how-tos.
  • Author: SA7AUX <bjorne@sa7aux.se>. AGPL-3.0-or-later.