Add Nginx web server for browsing recordings

Serves the recordings directory over HTTP with autoindex on port 8080.
Users can browse by date and play MP3 files natively in the browser.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Michael Smith
2026-03-19 11:42:45 +00:00
parent 97879a9f59
commit 9ff0506cae
8 changed files with 154 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
## Context
RTLSDR-Airband records CB transmissions as MP3 files into `/home/m/recordings/` on the Pi, organized by channel subdirectories with dated subdirectories inside. The recorder runs as a Docker container via `docker-compose.yml`.
## Goals / Non-Goals
**Goals:**
- Serve the recordings directory over HTTP with browsable directory listings
- Allow MP3 playback via the browser's native audio handling
- Deploy as a Docker container alongside the existing `sdr-recorder` service
**Non-Goals:**
- Custom web UI, styling, or JavaScript
- Authentication (local network only)
- Modifying, uploading, or deleting recordings
- Live streaming or transcription
## Decisions
### Use Nginx with HTML autoindex, no custom frontend
**Decision**: Use `nginx:alpine` with `autoindex on` to serve the recordings directory. No custom HTML, JS, or CSS.
**Rationale**: Nginx's built-in directory listing is fully functional for browsing channel/date directories. Modern browsers play MP3 files natively when clicked. This requires only an Nginx config file and a docker-compose service — zero application code.
**Alternatives considered**:
- **Custom SPA frontend**: Adds complexity (build tools, JS code) for marginal UX improvement over native directory listing.
- **Python http.server**: Simpler but less performant and no Alpine image parity.
## Risks / Trade-offs
- **[No search or filtering]** → Users browse by directory structure. Acceptable given the channel/date organization.
- **[Plain directory listing]** → No styled UI. Acceptable for a local utility tool.
- **[No auth]** → Anyone on the LAN can access. Acceptable per non-goals.