Point the local lab at GeuReflector and document the Config window.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-13 17:58:32 +02:00
co-authored by Cursor
parent d21e7051d7
commit 3533b97d00
10 changed files with 76 additions and 54 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ TZ=Europe/Berlin
LISTEN_PORT=5300
# 0 = local lab only (default). 1 = append config/svxreflector.link.conf
# (Satellite/Trunk from DJ1JAY). Satellite dials out — no public DNS needed.
# (GeuReflector Satellite/Trunk). Satellite dials out — no public DNS needed.
ENABLE_FM_LINK=0
SVXREFLECTOR_CONF=/etc/svxlink/svxreflector.conf
+13 -11
View File
@@ -1,6 +1,7 @@
# Build jayReflector (DJ1JAY / FM-Funknetz) for the Funknetz local lab.
# Build GeuReflector (IW1GEU) for the Funknetz local lab.
# Binary name remains svxreflector; Trunk/Satellite are opt-in via config.
# Upstream pattern: dj1jay/jayReflector Dockerfile (clone + cmake, not stock sm0svx).
# Pin: audric/GeuReflector dbad88e8c3e0f1adb8342db190bb0b3ad00106f4
# (master, 2026-07-16; release line v1.3.17).
# =========================================================
# STAGE 1 — BUILD
@@ -13,27 +14,27 @@ RUN apt-get update && apt-get -y install --no-install-recommends \
build-essential cmake \
libsigc++-2.0-dev libssl-dev libjsoncpp-dev libpopt-dev \
libopus-dev libgsm1-dev \
libmosquitto-dev libhiredis-dev \
&& rm -rf /var/lib/apt/lists/*
ARG GIT_URL=https://github.com/dj1jay/jayReflector.git
ARG GIT_BRANCH=main
ARG GIT_URL=https://github.com/audric/GeuReflector.git
ARG GIT_BRANCH=master
ARG GIT_REF=
ARG NUM_CORES=4
WORKDIR /build
RUN set -eux; \
if [ -n "${GIT_REF}" ]; then \
git clone --recursive "${GIT_URL}" jayReflector; \
cd jayReflector && git checkout "${GIT_REF}"; \
git clone --recursive "${GIT_URL}" GeuReflector; \
cd GeuReflector && git checkout "${GIT_REF}"; \
else \
git clone --recursive --depth 1 --branch "${GIT_BRANCH}" "${GIT_URL}" jayReflector; \
git clone --recursive --depth 1 --branch "${GIT_BRANCH}" "${GIT_URL}" GeuReflector; \
fi
WORKDIR /build/jayReflector
WORKDIR /build/GeuReflector
RUN set -eux; \
cmake -S src -B build \
-DLOCAL_STATE_DIR=/var \
-DUSE_QT=OFF \
-DUSE_ALSA=OFF \
-DCMAKE_BUILD_TYPE=Release; \
cmake --build build --target svxreflector -j"${NUM_CORES}"
@@ -48,10 +49,11 @@ RUN apt-get update && apt-get -y install --no-install-recommends \
ca-certificates openssl \
libsigc++-2.0-0v5 libssl3 libjsoncpp25 libpopt0 \
libopus0 libgsm1 \
libmosquitto1 libhiredis0.14 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /build/jayReflector/build/bin/svxreflector /usr/bin/svxreflector
COPY --from=builder /build/jayReflector/build/lib/lib*.so* /usr/lib/
COPY --from=builder /build/GeuReflector/build/bin/svxreflector /usr/bin/svxreflector
COPY --from=builder /build/GeuReflector/build/lib/lib*.so* /usr/lib/
RUN mkdir -p /etc/svxlink /etc/svxlink/pki /var/log/svxlink /var/lib/svxlink && \
ldconfig && \
+3 -3
View File
@@ -1,5 +1,5 @@
###################################################################
# Local lab jayReflector for Funknetz (protocol 2.0 / ReflectorV2)
# Local lab GeuReflector for Funknetz (protocol 2.0 / ReflectorV2)
# Secrets here are placeholders — do not reuse production keys.
#
# Standalone by default: local clients only. FM-Funknetz Satellite/Trunk
@@ -17,8 +17,8 @@ CERT_PKI_DIR=/etc/svxlink/pki/
# Optional status JSON (publish 8080 in compose if you enable this):
# HTTP_SRV_PORT=8080
# jayReflector / modern SvxReflector bootstraps a local PKI even for
# protocol 2.0 AUTH_KEY clients. COMMON_NAME is required on first start.
# GeuReflector bootstraps a local PKI even for protocol 2.0 AUTH_KEY
# clients. COMMON_NAME is required on first start.
[SERVER_CERT]
COMMON_NAME=funknetz-lab.local
SUBJECT_ALT_NAME=DNS:funknetz-lab.local,DNS:localhost,IP:127.0.0.1
+23 -12
View File
@@ -1,33 +1,43 @@
###################################################################
# Optional FM-Funknetz link stub (jayReflector)
# Optional FM-Funknetz link stub (GeuReflector)
#
# Default: leave ENABLE_FM_LINK=0 in .env — this file is ignored.
# When DJ1JAY provides values:
# 1. Fill ONE of the blocks below (prefer Satellite for home/NAT labs).
# When the parent operator provides values:
# 1. Uncomment ONE of the blocks below (prefer Satellite for home/NAT labs).
# 2. Set ENABLE_FM_LINK=1 in .env
# 3. docker compose up -d
#
# The entrypoint appends this file after the base lab conf, which already
# ends in [PASSWORDS]. Satellite keys belong in [GLOBAL]; the section
# header below merges with the base [GLOBAL] section.
#
# Satellite (recommended): this reflector dials OUT to the parent on
# TCP 5303. No public DNS, no inbound peer port, no port-forward required
# for the link. Local Funknetz clients still use host :5300 only.
# SATELLITE_ID may contain only letters, digits, and dashes.
# Do not set LOCAL_PREFIX or a [TRUNK_x] section on a satellite.
#
# Trunk: equal mesh peer; needs mutual reachability on TCP 5302 and a
# matching [TRUNK_x] section name + SECRET on both sides.
# Do not enable Satellite and Trunk in the same file.
#
# Do not commit real secrets. Prefer a local override or keep secrets
# only in your private .env workflow if you copy this file.
# Docs: docs/research/2026-10-07-jayreflector-fm-funknetz.md
# README: https://github.com/dj1jay/jayReflector
# Do not commit real secrets.
# Docs: docs/research/2026-10-11-geureflector-lab-baseline.md
# README: https://github.com/audric/GeuReflector#satellite-reflectors
###################################################################
# --- Satellite (fill from DJ1JAY; uncomment to use) ---
# SATELLITE_OF=parent.example.org:5303
# --- Satellite (uncomment the section and keys to use) ---
# [GLOBAL]
# SATELLITE_OF=parent.example.org
# SATELLITE_PORT=5303
# SATELLITE_ID=lab-yourcall
# SATELLITE_SECRET="replace-with-secret-from-dj1jay"
# SATELLITE_SECRET="replace-with-secret-from-operator"
# Only these TGs cross to/from the parent (bidirectional). Omit for all TGs.
# Syntax: exact "26200", prefix "24*", range "2427-2438", comma-separated.
# SATELLITE_FILTER=2621,2629,20
# --- Trunk peer alternative (fill from DJ1JAY; usually leave commented) ---
# --- Trunk peer alternative (uncomment to use; leave Satellite commented) ---
# [GLOBAL]
# LOCAL_PREFIX=9
# TRUNK_LISTEN_PORT=5302
#
@@ -38,4 +48,5 @@
# REMOTE_PREFIX=262
# ALLOW_TGS=2621,2629,20
# # TG_MAP=1:2624100
# MQTT_NAME=Lab-YourCall
# MQTT stays off. If enabled later, MQTT_NAME belongs in a [MQTT] section,
# not under [TRUNK_x].
+7 -7
View File
@@ -1,8 +1,8 @@
# Local jayReflector lab for Funknetz.
# Local GeuReflector lab for Funknetz.
# Build once, then: docker compose up -d --build
# Connect the app with host/port/callsign/authKey from .env (see FUNKNETZ_*).
#
# FM-Funknetz link (optional): fill config/svxreflector.link.conf from DJ1JAY,
# FM-Funknetz link (optional): fill config/svxreflector.link.conf,
# set ENABLE_FM_LINK=1, recreate. Satellite mode is outbound-only (no DNS/inbound).
services:
@@ -11,11 +11,11 @@ services:
context: .
dockerfile: Dockerfile
args:
GIT_URL: https://github.com/dj1jay/jayReflector.git
GIT_BRANCH: main
# Optional pin (overrides branch clone when set), e.g.:
# GIT_REF: 50997ed21a37c7c05c132eca5ebb07bab4b80fc7
image: funknetz-jayreflector:local
GIT_URL: https://github.com/audric/GeuReflector.git
GIT_BRANCH: master
# Pin (overrides the branch clone). master on 2026-10-11; release line v1.3.17.
GIT_REF: dbad88e8c3e0f1adb8342db190bb0b3ad00106f4
image: funknetz-geureflector:local
container_name: funknetz-svxreflector
restart: unless-stopped
env_file:
+3 -3
View File
@@ -55,11 +55,11 @@ stop_all() {
trap 'stop_all; exit 0' INT TERM
command -v svxreflector >/dev/null 2>&1 || die "svxreflector binary not found (jayReflector build)"
command -v svxreflector >/dev/null 2>&1 || die "svxreflector binary not found (GeuReflector build)"
[ -f "$SVXREFLECTOR_CONF" ] || die "Config not found: $SVXREFLECTOR_CONF (expected volume mount)"
# Local-only by default. When ENABLE_FM_LINK=1, append the link stub
# (Satellite or Trunk keys from DJ1JAY) after the base lab conf.
# (GeuReflector Satellite or Trunk keys) after the base lab conf.
if [ "$ENABLE_FM_LINK" = "1" ]; then
[ -f "$SVXREFLECTOR_LINK_CONF" ] || die "ENABLE_FM_LINK=1 but link config missing: $SVXREFLECTOR_LINK_CONF"
{
@@ -82,7 +82,7 @@ mkdir -p /etc/svxlink/pki /var/lib/svxlink/pki
start_bg "svxreflector" svxreflector --config "$conf_path" $SVXREFLECTOR_ARGS
log "jayReflector (svxreflector) is running. Waiting…"
log "GeuReflector (svxreflector) is running. Waiting…"
exit_code=0
for pid in $pids; do