Alpine-based sdr-cleanup container runs a find loop every 5 minutes, deleting MP3 files under 3 KB (configurable via SIZE_THRESHOLD env var) to keep the web browser and Samba share free of false-positive recordings. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.6 KiB
Context
The SDR recorder running in Docker on sdr-pi writes MP3 files to /home/m/recordings/ (mounted from the host). Despite squelch tuning, many files are noise — today's data shows 91 files totaling 476 KB, with the majority under 2 KB. These clutter the Nginx web browser and Samba share, making it hard to find real transmissions.
The recorder container runs as root (required for USB/SDR hardware access) and writes files owned by root, so cleanup must also run as root.
Goals / Non-Goals
Goals:
- Automatically remove recordings that are too small to contain real audio
- Make the size threshold easily adjustable via environment variable
- Keep everything version-controlled in docker-compose
- Run frequently enough that the web/Samba views stay clean
Non-Goals:
- Duration-based or content-based analysis (too complex, needs extra tools)
- Age-based retention policy (handled manually for now)
Decisions
Dedicated cleanup container in docker-compose
Add a lightweight Alpine container (sdr-cleanup) to docker-compose that shares the /home/m/recordings volume. This follows Docker's separation-of-concerns model — one container per responsibility. The container runs a simple find -delete loop with sleep instead of requiring a cron daemon. Since it runs as root (Alpine default), it can delete the root-owned files written by the recorder.
Alternatives considered:
- Host crontab: Simplest, but files are root-owned so needs
sudo crontab, and isn't version-controlled in docker-compose - Cron inside recorder container: Not our image, would need custom build
- Systemd timer on host: More ceremony than cron for the same result
File size threshold as the filter heuristic
Use file size (default 3 KB) rather than MP3 duration. This avoids needing ffprobe or similar tools. From today's data, files under 3 KB are consistently noise — real transmissions start around 5 KB. Configurable via SIZE_THRESHOLD environment variable in docker-compose.
5-minute sleep loop
Run every 5 minutes via sleep 300 in a loop. Lightweight and keeps the browsing experience clean.
Only delete files older than 1 minute
Add a minimum age filter (-mmin +1) to avoid deleting files still being written by rtl_airband.
Risks / Trade-offs
- Threshold too aggressive → Real short transmissions deleted. Mitigation: start conservative at 3 KB, tune via environment variable.
- Race condition with active writes → The
-mmin +1guard ensures we never delete a file rtl_airband is still writing. - Container restart → If the cleanup container crashes,
restart: unless-stoppedbrings it back. No state to lose.