Field report: the radio died and kept restarting. The log chain is
unambiguous - "Daemon startup failed" (pulse), then Connection refused on
input.pulseaudio_0 / buffer.consumer_0 / pulse_out, then "Shutdown
started!", then round again.
Three fixes:
* Clear stale pulse runtime state before starting the daemon. /run is part
of the container's writable layer, so "docker restart" - and the loop that
restart:unless-stopped produces - preserves /run/pulse/pid from the killed
daemon; the next start then refuses with "Daemon startup failed", which is
what makes the loop self-sustaining. We only remove it when no pulseaudio
process is actually alive.
* When pulse still won't start, say so loudly and explain the consequence
and the way out (Icecast needs no sound device; comment the pulse tor out),
instead of a one-line WARNING that gets lost above the traceback.
* output.pulseaudio(fallible=true): the local monitor output can now fail
without failing its clock and tearing down the radio. The mic input stays
a hard dependency - documented inline, since removing it changes audio
behaviour and cannot be verified without a liquidsoap runtime.
Also: RADIO_FORCE_SCRIPT=1 re-seeds radio_conjurer.liq from the image
(keeping a .bak). The live script is deliberately never overwritten so hand
edits win - but that also means image fixes never reached volumes seeded
long ago, which is why a running radio can still hold a stale script.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Per review of the first radio-container cut:
- radio_conjurer.liq: replace the cargo-culted /home/pi/Conjurer and
/home/pi/MediaFolder paths with the container layout -
/srv/betoniarka/data (playlists, script.params, persistence/radio logs),
/srv/betoniarka/music (library + emergency track) and
/srv/betoniarka/secrets/icecast_credentials.json;
interactive.persistent now uses an absolute path;
output.icecast targets host="localhost" (icecast lives in the container)
- Icecast2 now runs INSIDE the radio container: entrypoint renders
/etc/icecast2/icecast.xml from docker/icecast.xml.tpl, filling
source/admin/relay passwords from the secret provisioned at install time
(same pattern as the bot's netrc); optional admin_password/relay_password
fields default to password; icecast starts as its unprivileged user;
port 8000 exposed for listeners; extra_hosts hack removed
- compose.radio.yaml: same-path mounts for /srv/betoniarka/{data,music,secrets}
- ffmpeg.pref removed from the repo (the pin only mattered against the
RPi OS repo; bookworm ships the right FFmpeg 5.x natively) - verdict
preserved in the docs and the legacy installer note updated
- docs: updated radio section (volumes, secret provisioning, wire-up)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* New requirement
* SMall fixes for tunnel
* First step towards cogization
* Tmp chng
* Testing of new functions in conjurer_musician.py and radio_conjurer.liq
* Fixes!
* Fix fix
* Mostly working ?
* Requests
* Fixes
* Fix
* Radio requests
* Radio hardkor
* Fix
* Fixes
* Change log to print
* Clearing fetch failed
* Small fix
* sx
* Fix fix fix
* test
* el fixo stupido
* test
* Maybe fix ?
* FIX!
* Fix fix fix
* FIx of volume