Troubleshooting
Common problems with streams, broadcasts, schedules, and deploys.
Stream does not play
Symptom
/live.mp3 returns 404, silence, or "Connecting…" in the admin player.
Checks
- Icecast has a source: Liquidsoap must be running and connected to Icecast. On Fly, confirm the API machine is healthy.
- Fallback audio exists: place
v1-tone.mp3at/media/fallback/v1-tone.mp3on the API volume. - Liquidsoap started: if harbor ports accept TCP but return no HTTP response, Liquidsoap may have failed to start. Check container logs.
- API stream proxy: test
curl -I https://<api-host>/live.mp3directly.
BUTT stuck on "connecting"
Symptom
BUTT never connects; Broadcast view shows "Waiting for source".
Checks
- BUTT version: use 0.1.17 or newer.
- Server type: must be Icecast, not Shoutcast.
- Active live slot: a live broadcast schedule block must be current.
- Credentials: user
source, password from Broadcast view, mountbroadcast.mp3. - TLS: on port 8443, accept the self-signed certificate in BUTT.
- Network: try TLS (8443) if plain harbor (8005) is blocked.
- Harbor responding: port should return HTTP (401 without auth is normal).
See Live broadcast.
Schedule not switching
Symptom
Wrong audio plays, or fallback plays during a scheduled slot.
Checks
- Timezone: slot times use the station timezone from Settings.
- Slot kind: recording slots need media attached; live slots need BUTT connected.
- Overlaps: conflicting slots may prevent saves; reload the schedule.
- Past edits: confirm the slot was saved (watch for save errors in the calendar).
Media upload fails
Symptom
Upload errors in the Media view.
Checks
- R2 configured: all
R2_*variables set. See Cloudflare R2. - File size: under
MEDIA_UPLOAD_MAX_BYTES(default 500 MB). - Bucket permissions: API token has read/write on the bucket.
Auth / sign-in issues
Symptom
Login fails, CORS errors, or session drops.
Checks
- WEB_ORIGIN: includes the exact web admin URL (scheme + host + port).
- BETTER_AUTH_URL: matches the public API origin.
- BETTER_AUTH_SECRET: set and at least 32 characters; do not change casually in production.
Fly deploy failures
Symptom
fly deploy fails on build or machine update.
Checks
- Logged in:
fly auth login. - Depot errors: use
pnpm deploy:apiorfly deploy --local-only --depot=false. - npmrc: API Dockerfile requires
.npmrcin the build context. - Migrations: run
pnpm db:migrateagainst production Postgres after first deploy.
Database migrations
After first production deploy:
# With DATABASE_URL pointing at production
pnpm db:migrateOr SSH into the API machine and run migrations from a release shell if your workflow requires it.
Getting logs
Fly.io
fly logs --app <api-app-name>Look for Liquidsoap startup errors, Icecast connection failures, and playout state changes.
Local
docker compose logs liquidsoap
docker compose logs icecastStill stuck?
- Verify Environment variables.
- Walk through Fly.io deploy steps in order.
- Test harbor with a plain TCP connection to port 8005 after deploy.