Mesh: én sentral fordeler til flere soner
Flere anlegg – hovedscene, resepsjon, crew – og ett sted å sende fra, med avkryssing for hvilke soner meldingen skal til. Sentralen er en vanlig announcer med [zones] i config. En sone er en vanlig announcer med ANNOUNCER_MESH_SECRET. Samme image, ingen mode, og en sone kan brukes alene hvis sentralen faller ut. Hver avhengighet med C-kode har aarch64-wheel i uv.lock, så det samme bildet går på en Raspberry Pi uten å kompilere noe. Sentralen syntetiserer én gang og sender ferdig WAV (POST /api/play, multipart). Sonen trenger da verken nett, edge-tts eller Pipers 670 MB for det den får – Item.wav er hele endringen i avspillingen. Køene forblir per sone: dispatcheren har egen tråd og egen kø, leverer til hver sone i hver sin tråd med timeout, og går videre. En opptatt hovedscene holder ikke igjen resepsjonen, og en sone som er nede feiler alene – synlig per sone i UI og revisjonslogg. Auth gjenbrukes: ny leverandør mesh på header X-Mesh-Key (ikke Bearer – den leses av JWT-leverandøren, som avviser alt som ikke er et JWT før neste får prøve), med én handling, play. To regler som fulgte med: - play følger aldri med «alt åpent». Uten det kunne hvem som helst POSTe en WAV til en åpen sone og få den spilt. Testen for åpen modus fanget det. - En legitimasjon som vises fram og er feil gir 401 også der gjester ellers har lov. Før slapp en feil PIN i åpen modus stille gjennom som gjest. mesh teller ikke som innlogging for folk: en sone med bare nøkkelen har fortsatt åpen side lokalt. Planlagte sendinger husker sonene sine og fordeles gjennom dispatcheren; planen ender som sent hvis minst én sone tok imot, med «hovedscene: kø #3, crew: nede» som note. Hodeløs Pi: install.sh kjører loginctl enable-linger, ellers finnes ikke lydsocketen når ingen logger inn. docs/mesh.md tar også raspi-config for jack framfor HDMI. 38 nye tester, 148 totalt. Fordelingen testes uten nett med stubbet transport; selve HTTP-en testes mot en levende werkzeug-server, så den håndrullede multiparten møter Flask sin parser. Verifisert i compose med sentral og to soner: til alle, bare til én, og én sone stoppet. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
eb27a162d5
commit
c4a15799dd
17 changed files with 1486 additions and 23 deletions
17
install.sh
17
install.sh
|
|
@ -12,6 +12,7 @@
|
|||
# ANNOUNCER_PORT=8090 ./install.sh annen port
|
||||
# ANNOUNCER_TITLE="Utrop" ./install.sh annen tittel
|
||||
# BIND_IP=127.0.0.1 ./install.sh bare maskina selv
|
||||
# ANNOUNCER_MESH_SECRET=… ./install.sh sone i et mesh (samme nøkkel som sentralen)
|
||||
#
|
||||
# Kan kjøres på nytt; da bygges bildet om og containeren startes om. En .env
|
||||
# som finnes blir ikke overskrevet.
|
||||
|
|
@ -93,11 +94,22 @@ ANNOUNCER_PIN=${ANNOUNCER_PIN:-}
|
|||
ANNOUNCER_JWT_SECRET=${ANNOUNCER_JWT_SECRET:-}
|
||||
ANNOUNCER_OIDC_CLIENT_SECRET=${ANNOUNCER_OIDC_CLIENT_SECRET:-}
|
||||
ANNOUNCER_SECRET_KEY=
|
||||
ANNOUNCER_MESH_SECRET=${ANNOUNCER_MESH_SECRET:-}
|
||||
ENV
|
||||
chmod 600 .env # PIN og nøkler står i klartekst
|
||||
echo "skrev .env (PUID=$(id -u), BIND_IP=$BIND_IP)"
|
||||
fi
|
||||
|
||||
step "Lyd uten innlogging"
|
||||
# Lydsocketen ligger i /run/user/<uid>, som bare finnes når brukerens
|
||||
# systemd-instans kjører – normalt fra grafisk innlogging. En sone i et skap
|
||||
# (Raspberry Pi uten skjerm) har ingen som logger inn. Linger starter
|
||||
# brukerens tjenester (PipeWire inkludert) ved boot uansett. Harmløst på en
|
||||
# laptop, nødvendig på en Pi.
|
||||
if command -v loginctl >/dev/null 2>&1; then
|
||||
sudo loginctl enable-linger "$USER" && echo "linger på for $USER"
|
||||
fi
|
||||
|
||||
step "Datamapper"
|
||||
mkdir -p data/{voices,cache,chimes,logs,instance}
|
||||
[[ -f data/chimes/README.txt ]] || cp -n chimes/README.txt data/chimes/ 2>/dev/null || true
|
||||
|
|
@ -164,6 +176,11 @@ Tips for en laptop på arrangementet:
|
|||
sudo sed -i 's/^#\?HandleLidSwitch=.*/HandleLidSwitch=ignore/' /etc/systemd/logind.conf
|
||||
sudo systemctl restart systemd-logind
|
||||
|
||||
Mesh (flere anlegg): sett [zones] i data/config.toml på sentralen og samme
|
||||
ANNOUNCER_MESH_SECRET i .env på sentralen og hver sone. Se docs/mesh.md.
|
||||
På en Pi med både HDMI og jack: velg lydutgang med sudo raspi-config
|
||||
(System Options -> Audio), ellers går lyden til skjermen som ikke er der.
|
||||
|
||||
Drift:
|
||||
docker compose logs -f følg loggen
|
||||
docker compose restart etter endringer i data/config.toml
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue